diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0991a0963..2bb8fda31 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,25 +9,32 @@ on: - "**" env: CI_XCODE_14: /Applications/Xcode_14.2.app/Contents/Developer + CI_XCODE_15: /Applications/Xcode_15.0.app/Contents/Developer jobs: tests: env: GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} - timeout-minutes: 60 + timeout-minutes: 30 strategy: matrix: script: - test:ios - test:macos - - test:facebook_utils:ios - - test:twitter_utils:ios - test:parseui:all - test:parse_live_query:all - build:starters - fail-fast: true - runs-on: macos-12 + - xcode15 # runs build:starters on XCode 15 + fail-fast: false + runs-on: macos-13 steps: - uses: actions/checkout@v3 + - name: Cache SPM + uses: actions/cache@v3 + with: + path: ~/Library/Developer/Xcode/DerivedData/Parse*/SourcePackages/ + key: ${{ runner.os }}-spm-${{ hashFiles('Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved') }} + restore-keys: | + ${{ runner.os }}-spm- - name: Setup Ruby uses: ruby/setup-ruby@359bebbc29cbe6c87da6bc9ea3bc930432750108 - name: Cache Gems @@ -47,27 +54,15 @@ jobs: - name: Submodules run: | git submodule update --init --recursive - sudo gem install bundler + sudo gem install bundler -v 2.4.22 bundle config set path 'vendor/bundle' - name: Bundle Install if: steps.cache-gems.outputs.cache-hit != 'true' run: bundle install - - name: Cache Carthage - uses: actions/cache@v3 - id: carthage-cache - with: - path: Carthage - key: ${{ runner.os }}-carthage-${{ hashFiles('**/Cartfile.resolved') }} - restore-keys: | - ${{ runner.os }}-carthage- - - name: Carthage - if: ${{ steps.carthage-cache.outputs.cache-hit != 'true' }} - run: | - carthage bootstrap --use-xcframeworks - name: Build-Test - run: set -o pipefail && env NSUnbufferedIO=YES bundle exec rake ${{ matrix.script }} + run: set -o pipefail && env NSUnbufferedIO=YES bundle exec rake ${{ matrix.script == 'xcode15' && 'build:starters' || matrix.script }} env: - DEVELOPER_DIR: ${{ env.CI_XCODE_14 }} + DEVELOPER_DIR: ${{ (matrix.script == 'xcode15' && env.CI_XCODE_15) || env.CI_XCODE_14 }} - name: Generate Environment Variables if: ${{ always() }} env: @@ -96,7 +91,8 @@ jobs: xcode: true xcode_archive_path: ${{ env.TEST_RESULTS }} docs: - runs-on: macos-12 + runs-on: macos-13 + timeout-minutes: 15 steps: - uses: actions/checkout@v3 - name: Setup Ruby @@ -112,7 +108,7 @@ jobs: - name: Submodules run: | git submodule update --init --recursive - sudo gem install bundler + sudo gem install bundler -v 2.4.22 bundle config path vendor/bundle - name: Bundle Install if: steps.cache-gems.outputs.cache-hit != 'true' diff --git a/.github/workflows/release-automated.yml b/.github/workflows/release-automated.yml index 470548d3c..c0e588b10 100644 --- a/.github/workflows/release-automated.yml +++ b/.github/workflows/release-automated.yml @@ -7,7 +7,7 @@ env: jobs: release: - runs-on: macos-12 + runs-on: macos-13 outputs: current_tag: ${{ steps.tag.outputs.current_tag }} steps: @@ -30,7 +30,7 @@ jobs: - name: Submodules and Bundle Install run: | git submodule update --init --recursive - sudo gem install bundler + sudo gem install bundler -v 2.4.22 bundle config set path 'vendor/bundle' bundle install - run: npm ci @@ -45,7 +45,7 @@ jobs: publish-docs: needs: release if: needs.release.outputs.current_tag != '' - runs-on: macos-12 + runs-on: macos-13 steps: - name: Checkout repository uses: actions/checkout@v3 @@ -64,7 +64,7 @@ jobs: - name: Submodules run: | git submodule update --init --recursive - sudo gem install bundler + sudo gem install bundler -v 2.4.22 bundle config path vendor/bundle - name: Bundle Install if: steps.cache-gems.outputs.cache-hit != 'true' diff --git a/.github/workflows/release-manual-docs.yml b/.github/workflows/release-manual-docs.yml index 33b08bc5f..b5f785d93 100644 --- a/.github/workflows/release-manual-docs.yml +++ b/.github/workflows/release-manual-docs.yml @@ -11,7 +11,7 @@ env: jobs: publish-docs: if: github.event.inputs.tag != '' - runs-on: macos-12 + runs-on: macos-13 steps: - name: Checkout repository uses: actions/checkout@v3 @@ -30,7 +30,7 @@ jobs: - name: Submodules run: | git submodule update --init --recursive - sudo gem install bundler + sudo gem install bundler -v 2.4.22 bundle config path vendor/bundle - name: Bundle Install if: steps.cache-gems.outputs.cache-hit != 'true' diff --git a/.gitignore b/.gitignore index 50d9a3bc8..c21100b94 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,6 @@ docs/ ## AppCode .idea/ -ParseFacebookUtils/Vendor ParseUI/Vendor # VSC diff --git a/.gitmodules b/.gitmodules index 49b3e0705..1eeefc253 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,12 +1,3 @@ [submodule "Vendor/xctoolchain"] path = Vendor/xctoolchain url = https://github.com/parse-community/xctoolchain.git -[submodule "Carthage/Checkouts/Bolts-ObjC"] - path = Carthage/Checkouts/Bolts-ObjC - url = https://github.com/BoltsFramework/Bolts-ObjC.git -[submodule "Carthage/Checkouts/OCMock"] - path = Carthage/Checkouts/OCMock - url = https://github.com/erikdoe/OCMock.git -[submodule "Carthage/Checkouts/facebook-ios-sdk"] - path = Carthage/Checkouts/facebook-ios-sdk - url = https://github.com/facebook/facebook-ios-sdk.git diff --git a/.ruby-version b/.ruby-version index f6ab44e9b..2eb2fe97a 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -ruby-2.6.6 +ruby-2.7.2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 91bcb4784..187ce5daa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +# [3.0.0](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/2.7.3...3.0.0) (2024-04-08) + + +### Features + +* Add `PFObject.isDataAvailableForKey` to check if data is available for individual key ([#1756](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1756)) ([dd05d41](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/dd05d411a54712ee927e5fb8af390ae36a60ed7e)) +* Remove `ParseFacebookUtils` and `ParseTwitterUtils` ([#1779](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1779)) ([f1311ee](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/f1311eee00a2419720e85d7ca90fe868e509e4ed)) + + +### BREAKING CHANGES + +* Removes convenience modules `ParseFacebookUtils` and `ParseTwitterUtils`, instead manually add the 3rd party authentication service SDK to log in and provide the authentication data to `PFUser.logInWithAuthType` to link the Parse User. ([f1311ee](f1311ee)) + ## [2.7.3](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/2.7.2...2.7.3) (2023-10-06) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 80b39d7fa..9411d42e9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,10 +12,8 @@ For analyzing bugs, creating bug fixes and features we recommend to clone this repository locally and add it as a local package to your Xcode project. This way you can edit and inspect the Parse SDK while running your app. You can find step-by-step instructions for how do that in the [Xcode docs](https://developer.apple.com/documentation/xcode/editing-a-package-dependency-as-a-local-package). 1. Fork the repository and create a new branch. -2. Add unit tests for any new code you add. +2. Add unit tests for any new code you add: - Core Module - [/Parse/Tests/Unit/](/Parse/Tests/Unit/) - - Facebook Utils - [/ParseFacebookUtils/Tests/Unit/](/ParseFacebookUtils/Tests/Unit/) - - Twitter Utils - [/ParseTwitterUtils/Tests/Unit/](/ParseTwitterUtils/Tests/Unit/) 3. If you've changed APIs, update the documentation and the [iOS Guide](https://github.com/parse-community/docs/tree/gh-pages/_includes/ios). 4. Ensure the test suite passes. You can run the tests in the command line with rake. @@ -23,7 +21,7 @@ For analyzing bugs, creating bug fixes and features we recommend to clone this r Install all dependencies: ``` git submodule update --init --recursive - gem install bundler + gem install bundler -v 2.4.22 bundle install ``` Run the tests: diff --git a/Cartfile b/Cartfile deleted file mode 100644 index 7fa27b6c7..000000000 --- a/Cartfile +++ /dev/null @@ -1,2 +0,0 @@ -github "BoltsFramework/Bolts-ObjC" ~> 1.9.1 -github "facebook/facebook-ios-sdk" == 15.1.0 diff --git a/Cartfile.resolved b/Cartfile.resolved deleted file mode 100644 index cea6faaa8..000000000 --- a/Cartfile.resolved +++ /dev/null @@ -1,2 +0,0 @@ -github "BoltsFramework/Bolts-ObjC" "1.9.1" -github "facebook/facebook-ios-sdk" "v15.1.0" diff --git a/Carthage/Checkouts/Bolts-ObjC b/Carthage/Checkouts/Bolts-ObjC deleted file mode 160000 index 74b67b3b8..000000000 --- a/Carthage/Checkouts/Bolts-ObjC +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 74b67b3b8be76a570cdbe193771927971f26e304 diff --git a/Carthage/Checkouts/OCMock b/Carthage/Checkouts/OCMock deleted file mode 160000 index 4a49ebb98..000000000 --- a/Carthage/Checkouts/OCMock +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4a49ebb985bc16fae9489771aa35482ccbea14a3 diff --git a/Carthage/Checkouts/facebook-ios-sdk b/Carthage/Checkouts/facebook-ios-sdk deleted file mode 160000 index 7fd8a930a..000000000 --- a/Carthage/Checkouts/facebook-ios-sdk +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7fd8a930a5b2c940a22efafe0e214ed0df671312 diff --git a/Gemfile b/Gemfile index 4edc6d84f..7beac3bbc 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,9 @@ source 'https://rubygems.org' -gem 'plist' -gem 'naturally', '~> 1.3.2' -gem 'jazzy', '~> 0.13.5' +# Docs +gem 'jazzy', '~> 0.14.4' + +# Development gem 'xcpretty' gem 'rake' +gem 'plist' diff --git a/Gemfile.lock b/Gemfile.lock index df892ce61..1a5d38730 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,28 +3,28 @@ GEM specs: CFPropertyList (3.0.6) rexml - activesupport (6.1.7.2) + activesupport (6.1.7.7) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) zeitwerk (~> 2.3) - addressable (2.8.1) + addressable (2.8.5) public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) atomos (0.1.3) claide (1.1.0) - cocoapods (1.11.3) + cocoapods (1.15.2) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.11.3) + cocoapods-core (= 1.15.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.4.0, < 2.0) + cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.4.0, < 2.0) + cocoapods-trunk (>= 1.6.0, < 2.0) cocoapods-try (>= 1.1.0, < 2.0) colored2 (~> 3.1) escape (~> 0.0.4) @@ -32,10 +32,10 @@ GEM gh_inspector (~> 1.0) molinillo (~> 0.8.0) nap (~> 1.0) - ruby-macho (>= 1.0, < 3.0) - xcodeproj (>= 1.21.0, < 2.0) - cocoapods-core (1.11.3) - activesupport (>= 5.0, < 7) + ruby-macho (>= 2.3.0, < 3.0) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-core (1.15.2) + activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) concurrent-ruby (~> 1.1) @@ -45,7 +45,7 @@ GEM public_suffix (~> 4.0) typhoeus (~> 1.0) cocoapods-deintegrate (1.0.5) - cocoapods-downloader (1.6.3) + cocoapods-downloader (2.1) cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.1) @@ -54,53 +54,55 @@ GEM netrc (~> 0.11) cocoapods-try (1.2.0) colored2 (3.1.2) - concurrent-ruby (1.2.0) + concurrent-ruby (1.2.2) escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) - ffi (1.15.5) + ffi (1.16.3) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) httpclient (2.8.3) - i18n (1.12.0) + i18n (1.14.1) concurrent-ruby (~> 1.0) - jazzy (0.13.5) + jazzy (0.14.4) cocoapods (~> 1.5) mustache (~> 1.1) - open4 + open4 (~> 1.3) redcarpet (~> 3.4) - rouge (>= 2.0.6, < 4.0) + rexml (~> 3.2) + rouge (>= 2.0.6, < 5.0) sassc (~> 2.1) sqlite3 (~> 1.3) xcinvoke (~> 0.3.0) json (2.6.3) liferaft (0.0.6) - minitest (5.17.0) + mini_portile2 (2.8.4) + minitest (5.20.0) molinillo (0.8.0) mustache (1.1.1) nanaimo (0.3.0) nap (1.1.0) - naturally (1.3.2) netrc (0.11.0) open4 (1.3.4) - plist (3.5.0) + plist (3.7.1) public_suffix (4.0.7) - rake (13.0.1) - redcarpet (3.5.0) - rexml (3.2.5) + rake (13.0.6) + redcarpet (3.6.0) + rexml (3.2.6) rouge (2.0.7) ruby-macho (2.5.1) sassc (2.4.0) ffi (~> 1.9) - sqlite3 (1.4.2) + sqlite3 (1.6.6) + mini_portile2 (~> 2.8.0) typhoeus (1.4.0) ethon (>= 0.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) xcinvoke (0.3.0) liferaft (~> 0.0.6) - xcodeproj (1.22.0) + xcodeproj (1.23.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -109,17 +111,16 @@ GEM rexml (~> 3.2.4) xcpretty (0.3.0) rouge (~> 2.0.7) - zeitwerk (2.6.6) + zeitwerk (2.6.13) PLATFORMS ruby DEPENDENCIES - jazzy (~> 0.13.5) - naturally (~> 1.3.2) + jazzy (~> 0.14.4) plist rake xcpretty BUNDLED WITH - 2.1.4 + 2.4.22 diff --git a/Package.resolved b/Package.resolved index c9738b414..abb2b5bab 100644 --- a/Package.resolved +++ b/Package.resolved @@ -20,12 +20,12 @@ } }, { - "package": "Facebook", - "repositoryURL": "https://github.com/facebook/facebook-ios-sdk", + "package": "OCMock", + "repositoryURL": "https://github.com/erikdoe/ocmock.git", "state": { "branch": null, - "revision": "7fd8a930a5b2c940a22efafe0e214ed0df671312", - "version": "15.1.0" + "revision": "67bb9602f0a7541f24dc2d6d0d7389ca3e4c2c89", + "version": null } }, { diff --git a/Package.swift b/Package.swift index d80817991..517395cc4 100644 --- a/Package.swift +++ b/Package.swift @@ -5,15 +5,14 @@ import PackageDescription let package = Package( name: "ParseObjC", defaultLocalization: "en", - platforms: [.iOS(.v12), - .macOS(.v10_15), - .tvOS(.v12), - .watchOS(.v2)], + platforms: [ + .iOS(.v12), + .macOS(.v10_15), + .tvOS(.v12), + .watchOS(.v2) + ], products: [ .library(name: "ParseObjC", targets: ["ParseCore"]), - .library(name: "ParseFacebookUtilsiOS", targets: ["ParseFacebookUtilsiOS"]), - .library(name: "ParseFacebookUtilsTvOS", targets: ["ParseFacebookUtilsTvOS"]), - .library(name: "ParseTwitterUtils", targets: ["ParseTwitterUtils"]), .library(name: "ParseUI", targets: ["ParseUI"]), .library(name: "ParseLiveQuery", targets: ["ParseLiveQuery"]) ], @@ -21,7 +20,7 @@ let package = Package( .package(url: "https://github.com/parse-community/Bolts-ObjC.git", from: "1.10.0"), .package(url: "https://github.com/BoltsFramework/Bolts-Swift.git", from: "1.5.0"), .package(url: "https://github.com/daltoniam/Starscream.git", from: "4.0.6"), - .package(url: "https://github.com/facebook/facebook-ios-sdk.git", from: "15.1.0") + .package(name: "OCMock", url: "https://github.com/erikdoe/ocmock.git", .revision("67bb9602f0a7541f24dc2d6d0d7389ca3e4c2c89")) ], targets: [ .target( @@ -31,64 +30,29 @@ let package = Package( exclude: ["Resources/Parse-tvOS.Info.plist", "Resources/Parse-iOS.Info.plist", "Resources/Parse-OSX.Info.plist", "Resources/Parse-watchOS.Info.plist"], resources: [.process("Resources")], publicHeadersPath: "Source", - cSettings: [.headerSearchPath("Internal/**")]), + cSettings: [.headerSearchPath("Internal/**")] + ), .target( - name: "ParseFacebookUtils", + name: "ParseUI", dependencies: [ - "ParseCore", - .product(name: "Bolts", package: "Bolts-ObjC"), - .product(name: "FacebookCore", package: "facebook-ios-sdk", condition: .when(platforms: [.iOS, .tvOS])), - .product(name: "FacebookLogin", package: "facebook-ios-sdk", condition: .when(platforms: [.iOS, .tvOS]))], - path: "ParseFacebookUtils/ParseFacebookUtils", - exclude: ["Resources/Info-tvOS.plist", "Resources/Info-iOS.plist"], - resources: [.process("Resources")], - publicHeadersPath: "Source"), - .target(name: "ParseFacebookUtilsiOS", - dependencies: [ - "ParseFacebookUtils" - ], - path: "ParseFacebookUtilsiOS/ParseFacebookUtilsiOS", - exclude: ["Resources/Info-iOS.plist"], - resources: [.process("Resources")], - publicHeadersPath: "Source", - cSettings: [.headerSearchPath("Internal/**")]), - .target(name: "ParseFacebookUtilsTvOS", - dependencies: [ - "ParseFacebookUtils", - .product(name: "FacebookTV", package: "facebook-ios-sdk", condition: .when(platforms: [.tvOS])) - ], - path: "ParseFacebookUtilsTvOS/ParseFacebookUtilsTvOS", - exclude: ["Resources/Info-tvOS.plist"], - resources: [.process("Resources")], - publicHeadersPath: "Source", - cSettings: [.headerSearchPath("Internal/**")]), - .target(name: "ParseTwitterUtils", - dependencies: [ "ParseCore" - ], - path: "ParseTwitterUtils/ParseTwitterUtils", - exclude: ["Resources/Info-iOS.plist"], - resources: [.process("Resources")], - publicHeadersPath: "Source", - cSettings: [.headerSearchPath("Internal/**")]), - .target(name: "ParseUI", - dependencies: [ - "ParseFacebookUtilsiOS", - "ParseTwitterUtils" - ], - path: "ParseUI/ParseUI", - exclude: ["Resources/Info-iOS.plist"], - resources: [.process("Resources")], - publicHeadersPath: "Source", - cSettings: [.headerSearchPath("Internal/**")]), - .target(name: "ParseLiveQuery", - dependencies: [ + ], + path: "ParseUI/ParseUI", + exclude: ["Resources/Info-iOS.plist"], + resources: [.process("Resources")], + publicHeadersPath: "Source", + cSettings: [.headerSearchPath("Internal/**")] + ), + .target( + name: "ParseLiveQuery", + dependencies: [ .product(name: "BoltsSwift", package: "Bolts-Swift"), "Starscream", "ParseCore" - ], - path: "ParseLiveQuery/ParseLiveQuery", - exclude: ["Resources/Info.plist"], - resources: [.process("Resources")]) + ], + path: "ParseLiveQuery/ParseLiveQuery", + exclude: ["Resources/Info.plist"], + resources: [.process("Resources")] + ) ] ) diff --git a/Parse.xcworkspace/contents.xcworkspacedata b/Parse.xcworkspace/contents.xcworkspacedata index 0344fa5af..b8be39c51 100644 --- a/Parse.xcworkspace/contents.xcworkspacedata +++ b/Parse.xcworkspace/contents.xcworkspacedata @@ -4,31 +4,12 @@ - - - - - - - - - - - - diff --git a/Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved index 9466f0275..abb2b5bab 100644 --- a/Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -20,12 +20,12 @@ } }, { - "package": "Facebook", - "repositoryURL": "https://github.com/facebook/facebook-ios-sdk.git", + "package": "OCMock", + "repositoryURL": "https://github.com/erikdoe/ocmock.git", "state": { "branch": null, - "revision": "7fd8a930a5b2c940a22efafe0e214ed0df671312", - "version": "15.1.0" + "revision": "67bb9602f0a7541f24dc2d6d0d7389ca3e4c2c89", + "version": null } }, { diff --git a/Parse/Configurations/Parse-iOS-Dynamic.xcconfig b/Parse/Configurations/Parse-iOS-Dynamic.xcconfig index 1414a1262..6dc0a5577 100644 --- a/Parse/Configurations/Parse-iOS-Dynamic.xcconfig +++ b/Parse/Configurations/Parse-iOS-Dynamic.xcconfig @@ -13,7 +13,7 @@ PRODUCT_NAME = Parse PRODUCT_BUNDLE_IDENTIFIER = com.parse.ios -IPHONEOS_DEPLOYMENT_TARGET = 9.0 +IPHONEOS_DEPLOYMENT_TARGET = 12.0 INFOPLIST_FILE = $(PROJECT_DIR)/Parse/Resources/Parse-iOS.Info.plist diff --git a/Parse/Configurations/ParseUnitTests-iOS.xcconfig b/Parse/Configurations/ParseUnitTests-iOS.xcconfig index d281ee0c5..a87c8e2e6 100644 --- a/Parse/Configurations/ParseUnitTests-iOS.xcconfig +++ b/Parse/Configurations/ParseUnitTests-iOS.xcconfig @@ -16,7 +16,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.parse.unit.ios SWIFT_VERSION = 5.0 -IPHONEOS_DEPLOYMENT_TARGET = 9.0 +IPHONEOS_DEPLOYMENT_TARGET = 12.0 INFOPLIST_FILE = $(SRCROOT)/Tests/Resources/ParseUnitTests-iOS-Info.plist diff --git a/Parse/Parse.xcodeproj/project.pbxproj b/Parse/Parse.xcodeproj/project.pbxproj index 515d0caa8..b82eb80e6 100644 --- a/Parse/Parse.xcodeproj/project.pbxproj +++ b/Parse/Parse.xcodeproj/project.pbxproj @@ -7,6 +7,15 @@ objects = { /* Begin PBXBuildFile section */ + 39A6B6772AD8EA8000123017 /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39A6B6762AD8EA8000123017 /* ParseObjC */; }; + 39A6B6792AD8EB1D00123017 /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39A6B6782AD8EB1D00123017 /* ParseObjC */; }; + 39E22AB62AD0655300D9AE5C /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = 39E22AB52AD0655300D9AE5C /* OCMock */; }; + 39E22ABC2AD0657F00D9AE5C /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = 39E22ABB2AD0657F00D9AE5C /* OCMock */; }; + 39E24A0D2AD214540014357C /* Bolts in Frameworks */ = {isa = PBXBuildFile; productRef = 39E24A0C2AD214540014357C /* Bolts */; }; + 39E24A0F2AD214720014357C /* Bolts in Frameworks */ = {isa = PBXBuildFile; productRef = 39E24A0E2AD214720014357C /* Bolts */; }; + 39E24A112AD214810014357C /* Bolts in Frameworks */ = {isa = PBXBuildFile; productRef = 39E24A102AD214810014357C /* Bolts */; }; + 39E24A132AD214980014357C /* Bolts in Frameworks */ = {isa = PBXBuildFile; productRef = 39E24A122AD214980014357C /* Bolts */; }; + 39E24A152AD214A40014357C /* Bolts in Frameworks */ = {isa = PBXBuildFile; productRef = 39E24A142AD214A40014357C /* Bolts */; }; 4030936B1C81F0B200CF09F8 /* PFQueryConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 403093691C81F0B200CF09F8 /* PFQueryConstants.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4030936C1C81F0B200CF09F8 /* PFQueryConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 403093691C81F0B200CF09F8 /* PFQueryConstants.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4030936D1C81F0B200CF09F8 /* PFQueryConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 403093691C81F0B200CF09F8 /* PFQueryConstants.h */; settings = {ATTRIBUTES = (Private, ); }; }; @@ -2697,7 +2706,6 @@ B14117071E5D078E00F70D7A /* PFFileUploadResult.m in Sources */ = {isa = PBXBuildFile; fileRef = B14116FB1E5D078E00F70D7A /* PFFileUploadResult.m */; }; B14117081E5D078E00F70D7A /* PFFileUploadResult.m in Sources */ = {isa = PBXBuildFile; fileRef = B14116FB1E5D078E00F70D7A /* PFFileUploadResult.m */; }; B14117091E5D078E00F70D7A /* PFFileUploadResult.m in Sources */ = {isa = PBXBuildFile; fileRef = B14116FB1E5D078E00F70D7A /* PFFileUploadResult.m */; }; - BC150D7325A89F9C0092B00E /* Bolts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A13518820281768000F5FD5 /* Bolts.framework */; }; F50C66331B33A708001941A6 /* PFPushUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = F50C66311B33A708001941A6 /* PFPushUtilities.h */; settings = {ATTRIBUTES = (Private, ); }; }; F50C66341B33A708001941A6 /* PFPushUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = F50C66321B33A708001941A6 /* PFPushUtilities.m */; }; F50C667C1B34B231001941A6 /* PFPushUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = F50C66321B33A708001941A6 /* PFPushUtilities.m */; }; @@ -2822,125 +2830,6 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 4A13518320281768000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81ED94291BE147CF00795F05; - remoteInfo = "Bolts-iOS"; - }; - 4A13518520281768000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 1D5D7DD31BE3CE8200FD67C7; - remoteInfo = "Bolts-iOS-Dynamic"; - }; - 4A13518720281768000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81ED946E1BE14B5200795F05; - remoteInfo = "Bolts-macOS"; - }; - 4A13518920281768000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = F5AFCA021BA752750076E927; - remoteInfo = "Bolts-tvOS"; - }; - 4A13518B20281768000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81E94D6A1C2B8BF200A6291E; - remoteInfo = "Bolts-tvOS-Dynamic"; - }; - 4A13518D20281768000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 8178F99C1BB0F87700AD289D; - remoteInfo = "Bolts-watchOS"; - }; - 4A13518F20281768000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 819573F11C2B8ECB00BFCA39; - remoteInfo = "Bolts-watchOS-Dynamic"; - }; - 4A13519120281768000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 8E8C8EE917F23D1D00E3F1C7; - remoteInfo = "BoltsTests-iOS"; - }; - 4A13519320281768000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 8E8C8F1917F241DA00E3F1C7; - remoteInfo = "BoltsTests-macOS"; - }; - 4A13519520281768000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = F5AFCA131BA752770076E927; - remoteInfo = "BoltsTests-tvOS"; - }; - 4A13519720281768000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 1EC3016018CDAA8400D06D07; - remoteInfo = BoltsTestUI; - }; - 4A1351F420281933000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 8178F9841BB0F87700AD289D; - remoteInfo = "Bolts-watchOS"; - }; - 4A1351F62028193F000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = F5AFC9EA1BA752750076E927; - remoteInfo = "Bolts-tvOS"; - }; - 4AA8ABFE20CEFC9A009306DD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 819573D91C2B8ECB00BFCA39; - remoteInfo = "Bolts-watchOS-Dynamic"; - }; - 4AA8AC0720CEFCA2009306DD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 1D5D7DA61BE3CE8200FD67C7; - remoteInfo = "Bolts-iOS-Dynamic"; - }; - 4AA8AC0920CEFCAD009306DD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 81E94D521C2B8BF200A6291E; - remoteInfo = "Bolts-tvOS-Dynamic"; - }; - 4ACBE7EA2151FCBF008DFAAF /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 8EDDA62817E17DDC00655F8A; - remoteInfo = "Bolts-macOS"; - }; 4AE33A2C1F5451B20088DCA0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 09D33641139C54930098E916 /* Project object */; @@ -2948,90 +2837,6 @@ remoteGlobalIDString = 4AE33A0A1F5451AD0088DCA0; remoteInfo = "ParseUnitTests-iOS-host"; }; - 811167461B8402DA003CB026 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 09D33641139C54930098E916 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 97010FAB1630B18F00AB761E; - remoteInfo = "Parse-OSX"; - }; - 8111674B1B8402DF003CB026 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 09D33641139C54930098E916 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 81C3821B19CCA89E0066284A; - remoteInfo = "Parse-iOS"; - }; - BC105FC424C5D0C900295EF7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BC105FBA24C5D0C900295EF7 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 030EF0A814632FD000B04273; - remoteInfo = OCMock; - }; - BC105FC624C5D0C900295EF7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BC105FBA24C5D0C900295EF7 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 03565A3118F0566E003AE91E; - remoteInfo = OCMockTests; - }; - BC105FC824C5D0C900295EF7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BC105FBA24C5D0C900295EF7 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 030EF0DC14632FF700B04273; - remoteInfo = OCMockLib; - }; - BC105FCA24C5D0C900295EF7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BC105FBA24C5D0C900295EF7 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D31108AD1828DB8700737925; - remoteInfo = OCMockLibTests; - }; - BC105FCC24C5D0C900295EF7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BC105FBA24C5D0C900295EF7 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = F0B950F11B0080BE00942C38; - remoteInfo = "OCMock iOS"; - }; - BC105FCE24C5D0C900295EF7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BC105FBA24C5D0C900295EF7 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 817EB1621BD765130047E85A; - remoteInfo = "OCMock tvOS"; - }; - BC105FD024C5D0C900295EF7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BC105FBA24C5D0C900295EF7 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 8DE97CA022B43EE60098C63F; - remoteInfo = "OCMock watchOS"; - }; - BC105FD224C5D0D600295EF7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BC105FBA24C5D0C900295EF7 /* OCMock.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 030EF0A714632FD000B04273; - remoteInfo = OCMock; - }; - BC105FD424C5D0E100295EF7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BC105FBA24C5D0C900295EF7 /* OCMock.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = F0B950F01B0080BE00942C38; - remoteInfo = "OCMock iOS"; - }; - BCAFF88A25A88C4F00B95DFC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 81ED94111BE147CF00795F05; - remoteInfo = "Bolts-iOS"; - }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -3065,7 +2870,6 @@ 09EEA1351435143500E3A3FA /* ParseInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParseInternal.h; sourceTree = ""; }; 403093691C81F0B200CF09F8 /* PFQueryConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFQueryConstants.h; sourceTree = ""; }; 4030936A1C81F0B200CF09F8 /* PFQueryConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFQueryConstants.m; sourceTree = ""; }; - 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Bolts.xcodeproj; path = "../Carthage/Checkouts/Bolts-ObjC/Bolts.xcodeproj"; sourceTree = ""; }; 4ABF398B1F54592100BBA75A /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; 4AE33A0B1F5451AD0088DCA0 /* ParseUnitTests-iOS-host.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ParseUnitTests-iOS-host.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 4AE33A0D1F5451AD0088DCA0 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -3581,7 +3385,6 @@ 97E18AE51623835600B17A67 /* PFLocationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFLocationManager.m; sourceTree = ""; }; A6E295801E961727009917BF /* ParseManagerPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseManagerPrivate.h; sourceTree = ""; }; B14116FB1E5D078E00F70D7A /* PFFileUploadResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFFileUploadResult.m; sourceTree = ""; }; - BC105FBA24C5D0C900295EF7 /* OCMock.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCMock.xcodeproj; path = ../Carthage/Checkouts/OCMock/Source/OCMock.xcodeproj; sourceTree = ""; }; F50C66311B33A708001941A6 /* PFPushUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFPushUtilities.h; sourceTree = ""; }; F50C66321B33A708001941A6 /* PFPushUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFPushUtilities.m; sourceTree = ""; }; F50E486C1B83ED270055094D /* PFFileStagingController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFFileStagingController.h; sourceTree = ""; }; @@ -3642,6 +3445,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 39E24A152AD214A40014357C /* Bolts in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3649,6 +3453,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 39E24A112AD214810014357C /* Bolts in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3657,7 +3462,9 @@ buildActionMask = 2147483647; files = ( 7CE6ABE0292074CC0054D9D2 /* SystemConfiguration.framework in Frameworks */, + 39A6B6792AD8EB1D00123017 /* ParseObjC in Frameworks */, 7CE6ABDE292074C70054D9D2 /* AudioToolbox.framework in Frameworks */, + 39E22AB62AD0655300D9AE5C /* OCMock in Frameworks */, 7CE6ABDC292074C10054D9D2 /* libsqlite3.tbd in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -3666,6 +3473,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 39A6B6772AD8EA8000123017 /* ParseObjC in Frameworks */, + 39E22ABC2AD0657F00D9AE5C /* OCMock in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3673,6 +3482,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 39E24A0D2AD214540014357C /* Bolts in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3680,6 +3490,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 39E24A132AD214980014357C /* Bolts in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3703,10 +3514,10 @@ files = ( 7CE6ABEC292078180054D9D2 /* AppKit.framework in Frameworks */, 7CE6ABEA292077360054D9D2 /* CoreLocation.framework in Frameworks */, + 39E24A0F2AD214720014357C /* Bolts in Frameworks */, 7CE6ABE9292077310054D9D2 /* Security.framework in Frameworks */, 7CE6ABE82920772D0054D9D2 /* SystemConfiguration.framework in Frameworks */, 7CE6ABE7292077240054D9D2 /* libsqlite3.tbd in Frameworks */, - BC150D7325A89F9C0092B00E /* Bolts.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3871,8 +3682,6 @@ 7CE6ABDF292074CC0054D9D2 /* SystemConfiguration.framework */, 7CE6ABDD292074C70054D9D2 /* AudioToolbox.framework */, 7CE6ABD2292074C10054D9D2 /* libsqlite3.tbd */, - BC105FBA24C5D0C900295EF7 /* OCMock.xcodeproj */, - 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */, ); name = Frameworks; sourceTree = ""; @@ -3886,24 +3695,6 @@ name = Views; sourceTree = ""; }; - 4A13517620281768000F5FD5 /* Products */ = { - isa = PBXGroup; - children = ( - 4A13518420281768000F5FD5 /* Bolts.framework */, - 4A13518620281768000F5FD5 /* Bolts.framework */, - 4A13518820281768000F5FD5 /* Bolts.framework */, - 4A13518A20281768000F5FD5 /* Bolts.framework */, - 4A13518C20281768000F5FD5 /* Bolts.framework */, - 4A13518E20281768000F5FD5 /* Bolts.framework */, - 4A13519020281768000F5FD5 /* Bolts.framework */, - 4A13519220281768000F5FD5 /* BoltsTests-iOS.xctest */, - 4A13519420281768000F5FD5 /* BoltsTests-OSX.xctest */, - 4A13519620281768000F5FD5 /* BoltsTests-tvOS.xctest */, - 4A13519820281768000F5FD5 /* BoltsTestUI.app */, - ); - name = Products; - sourceTree = ""; - }; 4AE33A0C1F5451AD0088DCA0 /* ParseUnitTests-iOS-host */ = { isa = PBXGroup; children = ( @@ -5148,20 +4939,6 @@ path = CurrentUserController; sourceTree = ""; }; - BC105FBB24C5D0C900295EF7 /* Products */ = { - isa = PBXGroup; - children = ( - BC105FC524C5D0C900295EF7 /* OCMock.framework */, - BC105FC724C5D0C900295EF7 /* OCMockTests.xctest */, - BC105FC924C5D0C900295EF7 /* libOCMock.a */, - BC105FCB24C5D0C900295EF7 /* OCMockLibTests.xctest */, - BC105FCD24C5D0C900295EF7 /* OCMock.framework */, - BC105FCF24C5D0C900295EF7 /* OCMock.framework */, - BC105FD124C5D0C900295EF7 /* OCMock.framework */, - ); - name = Products; - sourceTree = ""; - }; F50C66301B33A6CE001941A6 /* Utilites */ = { isa = PBXGroup; children = ( @@ -6862,9 +6639,11 @@ buildRules = ( ); dependencies = ( - 4A1351F520281933000F5FD5 /* PBXTargetDependency */, ); name = "Parse-watchOS"; + packageProductDependencies = ( + 39E24A142AD214A40014357C /* Bolts */, + ); productName = "Parse-iOS"; productReference = 810156691BB3832700D7C7BD /* Parse.framework */; productType = "com.apple.product-type.framework"; @@ -6882,9 +6661,11 @@ buildRules = ( ); dependencies = ( - 4A1351F72028193F000F5FD5 /* PBXTargetDependency */, ); name = "Parse-tvOS"; + packageProductDependencies = ( + 39E24A102AD214810014357C /* Bolts */, + ); productName = "Parse-iOS"; productReference = 815F24151BD04D150054659F /* Parse.framework */; productType = "com.apple.product-type.framework"; @@ -6901,11 +6682,13 @@ buildRules = ( ); dependencies = ( - BC105FD524C5D0E100295EF7 /* PBXTargetDependency */, - 8111674C1B8402DF003CB026 /* PBXTargetDependency */, 4AE33A2D1F5451B20088DCA0 /* PBXTargetDependency */, ); name = "ParseUnitTests-iOS"; + packageProductDependencies = ( + 39E22AB52AD0655300D9AE5C /* OCMock */, + 39A6B6782AD8EB1D00123017 /* ParseObjC */, + ); productName = ParseTests; productReference = 816F449B1A8E8933009CDB32 /* ParseUnitTests-iOS.xctest */; productType = "com.apple.product-type.bundle.unit-test"; @@ -6922,10 +6705,12 @@ buildRules = ( ); dependencies = ( - BC105FD324C5D0D600295EF7 /* PBXTargetDependency */, - 811167471B8402DA003CB026 /* PBXTargetDependency */, ); name = "ParseUnitTests-macOS"; + packageProductDependencies = ( + 39E22ABB2AD0657F00D9AE5C /* OCMock */, + 39A6B6762AD8EA8000123017 /* ParseObjC */, + ); productName = ParseTests; productReference = 81C09F861AF97A490043B49C /* ParseUnitTests-macOS.xctest */; productType = "com.apple.product-type.bundle.unit-test"; @@ -6943,9 +6728,11 @@ buildRules = ( ); dependencies = ( - BCAFF88B25A88C4F00B95DFC /* PBXTargetDependency */, ); name = "Parse-iOS"; + packageProductDependencies = ( + 39E24A0C2AD214540014357C /* Bolts */, + ); productName = "Parse-iOS"; productReference = 81C3821C19CCA89E0066284A /* Parse.framework */; productType = "com.apple.product-type.framework"; @@ -6963,9 +6750,11 @@ buildRules = ( ); dependencies = ( - 4AA8AC0820CEFCA2009306DD /* PBXTargetDependency */, ); name = "Parse-iOS-Dynamic"; + packageProductDependencies = ( + 39E24A122AD214980014357C /* Bolts */, + ); productName = "Parse-iOS"; productReference = 81C5845D1C3B0A98000063C6 /* Parse.framework */; productType = "com.apple.product-type.framework"; @@ -6983,7 +6772,6 @@ buildRules = ( ); dependencies = ( - 4AA8AC0A20CEFCAD009306DD /* PBXTargetDependency */, ); name = "Parse-tvOS-Dynamic"; productName = "Parse-iOS"; @@ -7003,7 +6791,6 @@ buildRules = ( ); dependencies = ( - 4AA8ABFF20CEFC9A009306DD /* PBXTargetDependency */, ); name = "Parse-watchOS-Dynamic"; productName = "Parse-iOS"; @@ -7023,9 +6810,11 @@ buildRules = ( ); dependencies = ( - 4ACBE7EB2151FCBF008DFAAF /* PBXTargetDependency */, ); name = "Parse-macOS"; + packageProductDependencies = ( + 39E24A0E2AD214720014357C /* Bolts */, + ); productName = ParseMac; productReference = 97010FAC1630B18F00AB761E /* Parse.framework */; productType = "com.apple.product-type.framework"; @@ -7041,7 +6830,7 @@ ORGANIZATIONNAME = "Parse Inc."; TargetAttributes = { 4AE33A0A1F5451AD0088DCA0 = { - CreatedOnToolsVersion = 9.0; + CreatedOnToolsVersion = 12.0; ProvisioningStyle = Automatic; }; 810155051BB3832700D7C7BD = { @@ -7069,18 +6858,12 @@ Base, ); mainGroup = 09D3363F139C54930098E916; + packageReferences = ( + 39E22AB42AD0655300D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */, + 39E24A0B2AD214540014357C /* XCRemoteSwiftPackageReference "Bolts-ObjC" */, + ); productRefGroup = 09D3364B139C54940098E916 /* Products */; projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 4A13517620281768000F5FD5 /* Products */; - ProjectRef = 4A1351082027FCFB000F5FD5 /* Bolts.xcodeproj */; - }, - { - ProductGroup = BC105FBB24C5D0C900295EF7 /* Products */; - ProjectRef = BC105FBA24C5D0C900295EF7 /* OCMock.xcodeproj */; - }, - ); projectRoot = ""; targets = ( 81C3821B19CCA89E0066284A /* Parse-iOS */, @@ -7097,135 +6880,6 @@ }; /* End PBXProject section */ -/* Begin PBXReferenceProxy section */ - 4A13518420281768000F5FD5 /* Bolts.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Bolts.framework; - remoteRef = 4A13518320281768000F5FD5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A13518620281768000F5FD5 /* Bolts.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Bolts.framework; - remoteRef = 4A13518520281768000F5FD5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A13518820281768000F5FD5 /* Bolts.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Bolts.framework; - remoteRef = 4A13518720281768000F5FD5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A13518A20281768000F5FD5 /* Bolts.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Bolts.framework; - remoteRef = 4A13518920281768000F5FD5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A13518C20281768000F5FD5 /* Bolts.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Bolts.framework; - remoteRef = 4A13518B20281768000F5FD5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A13518E20281768000F5FD5 /* Bolts.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Bolts.framework; - remoteRef = 4A13518D20281768000F5FD5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A13519020281768000F5FD5 /* Bolts.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Bolts.framework; - remoteRef = 4A13518F20281768000F5FD5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A13519220281768000F5FD5 /* BoltsTests-iOS.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "BoltsTests-iOS.xctest"; - remoteRef = 4A13519120281768000F5FD5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A13519420281768000F5FD5 /* BoltsTests-OSX.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "BoltsTests-OSX.xctest"; - remoteRef = 4A13519320281768000F5FD5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A13519620281768000F5FD5 /* BoltsTests-tvOS.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "BoltsTests-tvOS.xctest"; - remoteRef = 4A13519520281768000F5FD5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A13519820281768000F5FD5 /* BoltsTestUI.app */ = { - isa = PBXReferenceProxy; - fileType = wrapper.application; - path = BoltsTestUI.app; - remoteRef = 4A13519720281768000F5FD5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - BC105FC524C5D0C900295EF7 /* OCMock.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = OCMock.framework; - remoteRef = BC105FC424C5D0C900295EF7 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - BC105FC724C5D0C900295EF7 /* OCMockTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = OCMockTests.xctest; - remoteRef = BC105FC624C5D0C900295EF7 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - BC105FC924C5D0C900295EF7 /* libOCMock.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libOCMock.a; - remoteRef = BC105FC824C5D0C900295EF7 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - BC105FCB24C5D0C900295EF7 /* OCMockLibTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = OCMockLibTests.xctest; - remoteRef = BC105FCA24C5D0C900295EF7 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - BC105FCD24C5D0C900295EF7 /* OCMock.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = OCMock.framework; - remoteRef = BC105FCC24C5D0C900295EF7 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - BC105FCF24C5D0C900295EF7 /* OCMock.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = OCMock.framework; - remoteRef = BC105FCE24C5D0C900295EF7 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - BC105FD124C5D0C900295EF7 /* OCMock.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = OCMock.framework; - remoteRef = BC105FD024C5D0C900295EF7 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - /* Begin PBXResourcesBuildPhase section */ 4AE33A091F5451AD0088DCA0 /* Resources */ = { isa = PBXResourcesBuildPhase; @@ -8778,69 +8432,12 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 4A1351F520281933000F5FD5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Bolts-watchOS"; - targetProxy = 4A1351F420281933000F5FD5 /* PBXContainerItemProxy */; - }; - 4A1351F72028193F000F5FD5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Bolts-tvOS"; - targetProxy = 4A1351F62028193F000F5FD5 /* PBXContainerItemProxy */; - }; - 4AA8ABFF20CEFC9A009306DD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Bolts-watchOS-Dynamic"; - targetProxy = 4AA8ABFE20CEFC9A009306DD /* PBXContainerItemProxy */; - }; - 4AA8AC0820CEFCA2009306DD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Bolts-iOS-Dynamic"; - targetProxy = 4AA8AC0720CEFCA2009306DD /* PBXContainerItemProxy */; - }; - 4AA8AC0A20CEFCAD009306DD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Bolts-tvOS-Dynamic"; - targetProxy = 4AA8AC0920CEFCAD009306DD /* PBXContainerItemProxy */; - }; - 4ACBE7EB2151FCBF008DFAAF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Bolts-macOS"; - targetProxy = 4ACBE7EA2151FCBF008DFAAF /* PBXContainerItemProxy */; - }; 4AE33A2D1F5451B20088DCA0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; platformFilter = ios; target = 4AE33A0A1F5451AD0088DCA0 /* ParseUnitTests-iOS-host */; targetProxy = 4AE33A2C1F5451B20088DCA0 /* PBXContainerItemProxy */; }; - 811167471B8402DA003CB026 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 97010FAB1630B18F00AB761E /* Parse-macOS */; - targetProxy = 811167461B8402DA003CB026 /* PBXContainerItemProxy */; - }; - 8111674C1B8402DF003CB026 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - platformFilter = ios; - target = 81C3821B19CCA89E0066284A /* Parse-iOS */; - targetProxy = 8111674B1B8402DF003CB026 /* PBXContainerItemProxy */; - }; - BC105FD324C5D0D600295EF7 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = OCMock; - targetProxy = BC105FD224C5D0D600295EF7 /* PBXContainerItemProxy */; - }; - BC105FD524C5D0E100295EF7 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "OCMock iOS"; - platformFilter = ios; - targetProxy = BC105FD424C5D0E100295EF7 /* PBXContainerItemProxy */; - }; - BCAFF88B25A88C4F00B95DFC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Bolts-iOS"; - targetProxy = BCAFF88A25A88C4F00B95DFC /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -8867,7 +8464,7 @@ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MACOSX_DEPLOYMENT_TARGET = 10.15; }; name = Debug; @@ -8884,7 +8481,7 @@ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MACOSX_DEPLOYMENT_TARGET = 10.15; SWIFT_COMPILATION_MODE = wholemodule; }; @@ -8939,7 +8536,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "ParseUnitTests-iOS-host/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -8996,7 +8593,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "ParseUnitTests-iOS-host/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -9030,7 +8627,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 815F24171BD04D310054659F /* Parse-tvOS.xcconfig */; buildSettings = { - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 12.0; }; name = Debug; }; @@ -9038,7 +8635,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 815F24171BD04D310054659F /* Parse-tvOS.xcconfig */; buildSettings = { - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 12.0; }; name = Release; }; @@ -9090,7 +8687,7 @@ buildSettings = { CLANG_ENABLE_MODULES = YES; DEFINES_MODULE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -9109,7 +8706,7 @@ buildSettings = { CLANG_ENABLE_MODULES = YES; DEFINES_MODULE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -9127,7 +8724,7 @@ buildSettings = { CLANG_MODULES_AUTOLINK = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; SUPPORTS_MACCATALYST = NO; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -9139,7 +8736,7 @@ buildSettings = { CLANG_MODULES_AUTOLINK = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; SUPPORTS_MACCATALYST = NO; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -9151,7 +8748,7 @@ buildSettings = { CLANG_MODULES_AUTOLINK = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 12.0; }; name = Debug; }; @@ -9161,7 +8758,7 @@ buildSettings = { CLANG_MODULES_AUTOLINK = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 12.0; }; name = Release; }; @@ -9304,6 +8901,71 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 39E22AB42AD0655300D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/erikdoe/ocmock"; + requirement = { + kind = revision; + revision = 67bb9602f0a7541f24dc2d6d0d7389ca3e4c2c89; + }; + }; + 39E24A0B2AD214540014357C /* XCRemoteSwiftPackageReference "Bolts-ObjC" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/parse-community/Bolts-ObjC.git"; + requirement = { + kind = exactVersion; + version = 1.10.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 39A6B6762AD8EA8000123017 /* ParseObjC */ = { + isa = XCSwiftPackageProductDependency; + productName = ParseObjC; + }; + 39A6B6782AD8EB1D00123017 /* ParseObjC */ = { + isa = XCSwiftPackageProductDependency; + productName = ParseObjC; + }; + 39E22AB52AD0655300D9AE5C /* OCMock */ = { + isa = XCSwiftPackageProductDependency; + package = 39E22AB42AD0655300D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */; + productName = OCMock; + }; + 39E22ABB2AD0657F00D9AE5C /* OCMock */ = { + isa = XCSwiftPackageProductDependency; + package = 39E22AB42AD0655300D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */; + productName = OCMock; + }; + 39E24A0C2AD214540014357C /* Bolts */ = { + isa = XCSwiftPackageProductDependency; + package = 39E24A0B2AD214540014357C /* XCRemoteSwiftPackageReference "Bolts-ObjC" */; + productName = Bolts; + }; + 39E24A0E2AD214720014357C /* Bolts */ = { + isa = XCSwiftPackageProductDependency; + package = 39E24A0B2AD214540014357C /* XCRemoteSwiftPackageReference "Bolts-ObjC" */; + productName = Bolts; + }; + 39E24A102AD214810014357C /* Bolts */ = { + isa = XCSwiftPackageProductDependency; + package = 39E24A0B2AD214540014357C /* XCRemoteSwiftPackageReference "Bolts-ObjC" */; + productName = Bolts; + }; + 39E24A122AD214980014357C /* Bolts */ = { + isa = XCSwiftPackageProductDependency; + package = 39E24A0B2AD214540014357C /* XCRemoteSwiftPackageReference "Bolts-ObjC" */; + productName = Bolts; + }; + 39E24A142AD214A40014357C /* Bolts */ = { + isa = XCSwiftPackageProductDependency; + package = 39E24A0B2AD214540014357C /* XCRemoteSwiftPackageReference "Bolts-ObjC" */; + productName = Bolts; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 09D33641139C54930098E916 /* Project object */; } diff --git a/Parse/Parse/Internal/Object/PFObjectPrivate.h b/Parse/Parse/Internal/Object/PFObjectPrivate.h index 70958a667..00cef79d8 100644 --- a/Parse/Parse/Internal/Object/PFObjectPrivate.h +++ b/Parse/Parse/Internal/Object/PFObjectPrivate.h @@ -202,8 +202,6 @@ - (void)setHasBeenFetched:(BOOL)fetched; - (void)_setDeleted:(BOOL)deleted; -- (BOOL)isDataAvailableForKey:(NSString *)key; - - (BOOL)_hasChanges; - (BOOL)_hasOutstandingOperations; - (PFOperationSet *)unsavedChanges; diff --git a/Parse/Parse/Resources/Parse-OSX.Info.plist b/Parse/Parse/Resources/Parse-OSX.Info.plist index ae6885665..4b77e2b42 100644 --- a/Parse/Parse/Resources/Parse-OSX.Info.plist +++ b/Parse/Parse/Resources/Parse-OSX.Info.plist @@ -13,10 +13,10 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleVersion - 2.7.3 + 3.0.0 diff --git a/Parse/Parse/Resources/Parse-iOS.Info.plist b/Parse/Parse/Resources/Parse-iOS.Info.plist index 0420d38b0..9909836c4 100644 --- a/Parse/Parse/Resources/Parse-iOS.Info.plist +++ b/Parse/Parse/Resources/Parse-iOS.Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -21,8 +21,8 @@ iPhoneOS CFBundleVersion - 2.7.3 + 3.0.0 MinimumOSVersion - 9.0 + 12.0 diff --git a/Parse/Parse/Resources/Parse-tvOS.Info.plist b/Parse/Parse/Resources/Parse-tvOS.Info.plist index 79423e800..216858aa9 100644 --- a/Parse/Parse/Resources/Parse-tvOS.Info.plist +++ b/Parse/Parse/Resources/Parse-tvOS.Info.plist @@ -15,12 +15,12 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleVersion - 2.7.3 + 3.0.0 NSPrincipalClass - + diff --git a/Parse/Parse/Resources/Parse-watchOS.Info.plist b/Parse/Parse/Resources/Parse-watchOS.Info.plist index 79423e800..216858aa9 100644 --- a/Parse/Parse/Resources/Parse-watchOS.Info.plist +++ b/Parse/Parse/Resources/Parse-watchOS.Info.plist @@ -15,12 +15,12 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleVersion - 2.7.3 + 3.0.0 NSPrincipalClass - + diff --git a/Parse/Parse/Source/PFAnalytics.h b/Parse/Parse/Source/PFAnalytics.h index 44ce0065d..e80368691 100644 --- a/Parse/Parse/Source/PFAnalytics.h +++ b/Parse/Parse/Source/PFAnalytics.h @@ -9,11 +9,7 @@ #import -#if __has_include() -#import -#else -#import "BFTask.h" -#endif +@import Bolts; #import "PFConstants.h" diff --git a/Parse/Parse/Source/PFAnonymousUtils.h b/Parse/Parse/Source/PFAnonymousUtils.h index 13c73a107..95ad47d45 100644 --- a/Parse/Parse/Source/PFAnonymousUtils.h +++ b/Parse/Parse/Source/PFAnonymousUtils.h @@ -32,10 +32,10 @@ NS_ASSUME_NONNULL_BEGIN Data associated with the anonymous user is retained. - logIn switches users without converting the anonymous user. Data associated with the anonymous user will be lost. - - Service logIn (e.g. Facebook, Twitter) will attempt to convert + - Authentication service logIn will attempt to convert the anonymous user into a standard user by linking it to the service. If a user already exists that is linked to the service, it will instead switch to the existing user. - - Service linking (e.g. Facebook, Twitter) will convert the anonymous user + - Authentication service linking will convert the anonymous user into a standard user by linking it to the service. */ @interface PFAnonymousUtils : NSObject diff --git a/Parse/Parse/Source/PFConstants.h b/Parse/Parse/Source/PFConstants.h index e541317f3..9172bac9c 100644 --- a/Parse/Parse/Source/PFConstants.h +++ b/Parse/Parse/Source/PFConstants.h @@ -14,7 +14,7 @@ #pragma mark - SDK Version ///-------------------------------------- -#define PARSE_VERSION @"2.7.3" +#define PARSE_VERSION @"3.0.0" ///-------------------------------------- #pragma mark - Platform @@ -320,10 +320,6 @@ typedef NS_ENUM(NSInteger, PFErrorCode) { Users can only be created through sign up. */ kPFErrorUserCanOnlyBeCreatedThroughSignUp = 207, - /** - An existing Facebook account already linked to another user. - */ - kPFErrorFacebookAccountAlreadyLinked = 208, /** An existing account already linked to another user. */ @@ -333,18 +329,10 @@ typedef NS_ENUM(NSInteger, PFErrorCode) { */ kPFErrorInvalidSessionToken = 209, kPFErrorUserIdMismatch = 209, - /** - Facebook id missing from request. - */ - kPFErrorFacebookIdMissing = 250, /** Linked id missing from request. */ kPFErrorLinkedIdMissing = 250, - /** - Invalid Facebook session. - */ - kPFErrorFacebookInvalidSession = 251, /** Invalid linked session. */ diff --git a/Parse/Parse/Source/PFObject.h b/Parse/Parse/Source/PFObject.h index cb4a14372..be1738c7d 100644 --- a/Parse/Parse/Source/PFObject.h +++ b/Parse/Parse/Source/PFObject.h @@ -399,6 +399,13 @@ NS_REQUIRES_PROPERTY_DEFINITIONS */ @property (nonatomic, assign, readonly, getter=isDataAvailable) BOOL dataAvailable; +/** + Checks whether the `PFObject` has data for given key + + @return `YES` if data is available for given key + */ +- (BOOL)isDataAvailableForKey:(NSString *)key; + #if TARGET_OS_IOS /** diff --git a/Parse/Parse/Source/PFUser.h b/Parse/Parse/Source/PFUser.h index 86390f31c..4338ec19c 100644 --- a/Parse/Parse/Source/PFUser.h +++ b/Parse/Parse/Source/PFUser.h @@ -31,9 +31,6 @@ typedef void(^PFUserLogoutResultBlock)(NSError *_Nullable error); The `PFUser` class is a local representation of a user persisted to the Parse Data. This class is a subclass of a `PFObject`, and retains the same functionality of a `PFObject`, but also extends it with various user specific methods, like authentication, signing up, and validation uniqueness. - - Many APIs responsible for linking a `PFUser` with Facebook or Twitter have been deprecated in favor of dedicated - utilities for each social network. See `PFFacebookUtils`, `PFTwitterUtils` and `PFAnonymousUtils` for more information. */ @interface PFUser : PFObject @@ -65,8 +62,6 @@ typedef void(^PFUserLogoutResultBlock)(NSError *_Nullable error); /** Whether the `PFUser` was just created from a request. - - This is only set after a Facebook or Twitter login. */ @property (nonatomic, assign, readonly) BOOL isNew; diff --git a/Parse/Parse/Source/PFUser.m b/Parse/Parse/Source/PFUser.m index 9de923bea..8e0787a33 100644 --- a/Parse/Parse/Source/PFUser.m +++ b/Parse/Parse/Source/PFUser.m @@ -223,7 +223,7 @@ - (nullable PFRESTCommand *)_currentSignUpCommandForChanges:(PFOperationSet *)ch #pragma mark - Service Login ///-------------------------------------- -// Constructs the command for user_signup_or_login. This is used for Facebook, Twitter, and other linking services. +// Constructs the command for user_signup_or_login. This is used for authentication services. - (PFRESTCommand *)_currentServiceLoginCommandForChanges:(PFOperationSet *)changes error:(NSError **)error { @synchronized([self lock]) { NSDictionary *parameters = [self _convertToDictionaryForSaving:changes @@ -342,15 +342,13 @@ - (PFObject *)mergeFromObject:(PFUser *)other { /* Merges custom fields from JSON associated with a PFUser: { - "session_token": string, - "is_new": boolean, - "auth_data": { - "facebook": { - "id": string, - "access_token": string, - "expiration_date": string (represents date) - } - } + "session_token": string, + "is_new": boolean, + "auth_data": { + "": { + ... + } + } } */ - (void)_mergeFromServerWithResult:(NSDictionary *)result decoder:(PFDecoder *)decoder completeData:(BOOL)completeData { diff --git a/Parse/Tests/Other/OCMock/OCMock+Parse.m b/Parse/Tests/Other/OCMock/OCMock+Parse.m index 88026c0d2..a5ba432a3 100644 --- a/Parse/Tests/Other/OCMock/OCMock+Parse.m +++ b/Parse/Tests/Other/OCMock/OCMock+Parse.m @@ -9,7 +9,7 @@ #import "OCMock+Parse.h" -@import Bolts.BFTask; +@import Bolts; #import "PFCommandResult.h" #import "PFCommandRunning.h" diff --git a/Parse/Tests/Other/Swift/SwiftSubclass.swift b/Parse/Tests/Other/Swift/SwiftSubclass.swift index ce93195c6..7563283cc 100644 --- a/Parse/Tests/Other/Swift/SwiftSubclass.swift +++ b/Parse/Tests/Other/Swift/SwiftSubclass.swift @@ -9,7 +9,7 @@ import Foundation -import Parse +import ParseCore @objc public class SwiftSubclass: PFObject, PFSubclassing { diff --git a/Parse/Tests/Other/TestCases/TestCase/PFTestCase.m b/Parse/Tests/Other/TestCases/TestCase/PFTestCase.m index b775f992d..42babae40 100644 --- a/Parse/Tests/Other/TestCases/TestCase/PFTestCase.m +++ b/Parse/Tests/Other/TestCases/TestCase/PFTestCase.m @@ -9,7 +9,7 @@ #import "PFTestCase.h" -@import Bolts.BFTask; +@import Bolts; #import "PFTestSwizzlingUtilities.h" diff --git a/Parse/Tests/Resources/ParseUnitTests-OSX-Info.plist b/Parse/Tests/Resources/ParseUnitTests-OSX-Info.plist index 8e40b3180..48a7667f6 100644 --- a/Parse/Tests/Resources/ParseUnitTests-OSX-Info.plist +++ b/Parse/Tests/Resources/ParseUnitTests-OSX-Info.plist @@ -33,8 +33,6 @@ CFBundleVersion 1.0 - FacebookAppID - fake_id LSApplicationCategoryType LSRequiresIPhoneOS diff --git a/Parse/Tests/Resources/ParseUnitTests-iOS-Info.plist b/Parse/Tests/Resources/ParseUnitTests-iOS-Info.plist index 8e40b3180..48a7667f6 100644 --- a/Parse/Tests/Resources/ParseUnitTests-iOS-Info.plist +++ b/Parse/Tests/Resources/ParseUnitTests-iOS-Info.plist @@ -33,8 +33,6 @@ CFBundleVersion 1.0 - FacebookAppID - fake_id LSApplicationCategoryType LSRequiresIPhoneOS diff --git a/Parse/Tests/Unit/AnalyticsUnitTests.m b/Parse/Tests/Unit/AnalyticsUnitTests.m index ca04bdaba..66f0db362 100644 --- a/Parse/Tests/Unit/AnalyticsUnitTests.m +++ b/Parse/Tests/Unit/AnalyticsUnitTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFTask; +@import Bolts; #import "PFAnalyticsController.h" #import "PFUnitTestCase.h" diff --git a/Parse/Tests/Unit/AnonymousAuthenticationProviderTests.m b/Parse/Tests/Unit/AnonymousAuthenticationProviderTests.m index b53ba885a..5775dfc86 100644 --- a/Parse/Tests/Unit/AnonymousAuthenticationProviderTests.m +++ b/Parse/Tests/Unit/AnonymousAuthenticationProviderTests.m @@ -7,7 +7,7 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -@import Bolts.BFTask; +@import Bolts; #import "PFAnonymousAuthenticationProvider.h" #import "PFTestCase.h" diff --git a/Parse/Tests/Unit/CloudCodeControllerTests.m b/Parse/Tests/Unit/CloudCodeControllerTests.m index e484eb758..517991a32 100644 --- a/Parse/Tests/Unit/CloudCodeControllerTests.m +++ b/Parse/Tests/Unit/CloudCodeControllerTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFTask; +@import Bolts; #import "OCMock+Parse.h" #import "PFCloudCodeController.h" diff --git a/Parse/Tests/Unit/ConfigControllerTests.m b/Parse/Tests/Unit/ConfigControllerTests.m index cdfaa401b..8cad73b44 100644 --- a/Parse/Tests/Unit/ConfigControllerTests.m +++ b/Parse/Tests/Unit/ConfigControllerTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFTask; +@import Bolts; #import "OCMock+Parse.h" #import "PFCommandResult.h" diff --git a/Parse/Tests/Unit/ConfigUnitTests.m b/Parse/Tests/Unit/ConfigUnitTests.m index 5e90aea1b..2bf960db3 100644 --- a/Parse/Tests/Unit/ConfigUnitTests.m +++ b/Parse/Tests/Unit/ConfigUnitTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFTask; +@import Bolts; #import "PFConfigController.h" #import "PFConfig_Private.h" diff --git a/Parse/Tests/Unit/CurrentConfigControllerTests.m b/Parse/Tests/Unit/CurrentConfigControllerTests.m index 7caad1411..79780f3e0 100644 --- a/Parse/Tests/Unit/CurrentConfigControllerTests.m +++ b/Parse/Tests/Unit/CurrentConfigControllerTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFTask; +@import Bolts; #import "BFTask+Private.h" #import "PFCommandResult.h" diff --git a/Parse/Tests/Unit/DefaultACLControllerTests.m b/Parse/Tests/Unit/DefaultACLControllerTests.m index 17521fa34..2503dfea2 100644 --- a/Parse/Tests/Unit/DefaultACLControllerTests.m +++ b/Parse/Tests/Unit/DefaultACLControllerTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFTask; +@import Bolts; #import "PFACLPrivate.h" #import "PFCoreManager.h" diff --git a/Parse/Tests/Unit/ExtensionDataSharingTests.m b/Parse/Tests/Unit/ExtensionDataSharingTests.m index 6d4a0e74c..f9b937861 100644 --- a/Parse/Tests/Unit/ExtensionDataSharingTests.m +++ b/Parse/Tests/Unit/ExtensionDataSharingTests.m @@ -7,7 +7,7 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -@import Bolts.BFTask; +@import Bolts; #import "PFExtensionDataSharingTestHelper.h" #import "PFFileManager.h" diff --git a/Parse/Tests/Unit/FileControllerTests.m b/Parse/Tests/Unit/FileControllerTests.m index f5500670c..93c030a2d 100644 --- a/Parse/Tests/Unit/FileControllerTests.m +++ b/Parse/Tests/Unit/FileControllerTests.m @@ -9,9 +9,7 @@ #import -@import Bolts.BFCancellationTokenSource; -@import Bolts.BFTask; -@import Bolts.BFTaskCompletionSource; +@import Bolts; #import "PFCommandResult.h" #import "PFCommandRunning.h" diff --git a/Parse/Tests/Unit/FileUnitTests.m b/Parse/Tests/Unit/FileUnitTests.m index e44d4310a..43eb25215 100644 --- a/Parse/Tests/Unit/FileUnitTests.m +++ b/Parse/Tests/Unit/FileUnitTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFTask; +@import Bolts; #import "PFCoreManager.h" #import "PFFileController.h" diff --git a/Parse/Tests/Unit/ObjectFilePersistenceControllerTests.m b/Parse/Tests/Unit/ObjectFilePersistenceControllerTests.m index ac57ec53c..53c9f67e3 100644 --- a/Parse/Tests/Unit/ObjectFilePersistenceControllerTests.m +++ b/Parse/Tests/Unit/ObjectFilePersistenceControllerTests.m @@ -7,7 +7,7 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -@import Bolts.BFTask; +@import Bolts; #import "BFTask+Private.h" #import "PFObject.h" diff --git a/Parse/Tests/Unit/ObjectOfflineTests.m b/Parse/Tests/Unit/ObjectOfflineTests.m index 7e58e45cf..d560903c7 100644 --- a/Parse/Tests/Unit/ObjectOfflineTests.m +++ b/Parse/Tests/Unit/ObjectOfflineTests.m @@ -7,7 +7,7 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -@import Bolts.BFTask; +@import Bolts; #import "PFObject.h" #import "PFOfflineStore.h" diff --git a/Parse/Tests/Unit/OfflineQueryControllerTests.m b/Parse/Tests/Unit/OfflineQueryControllerTests.m index 4996e2070..5d3900d7d 100644 --- a/Parse/Tests/Unit/OfflineQueryControllerTests.m +++ b/Parse/Tests/Unit/OfflineQueryControllerTests.m @@ -9,8 +9,7 @@ #import -@import Bolts.BFCancellationTokenSource; -@import Bolts.BFTask; +@import Bolts; #import "OCMock+Parse.h" #import "PFCommandResult.h" diff --git a/Parse/Tests/Unit/PurchaseControllerTests.m b/Parse/Tests/Unit/PurchaseControllerTests.m index 1236b24ea..d204b24fe 100644 --- a/Parse/Tests/Unit/PurchaseControllerTests.m +++ b/Parse/Tests/Unit/PurchaseControllerTests.m @@ -11,8 +11,7 @@ #import -@import Bolts.BFExecutor; -@import Bolts.BFTask; +@import Bolts; #import "PFCommandResult.h" #import "PFCommandRunning.h" diff --git a/Parse/Tests/Unit/PurchaseUnitTests.m b/Parse/Tests/Unit/PurchaseUnitTests.m index 0287b4506..fd5960114 100644 --- a/Parse/Tests/Unit/PurchaseUnitTests.m +++ b/Parse/Tests/Unit/PurchaseUnitTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFTask; +@import Bolts; #import "PFCommandRunning.h" #import "PFFileManager.h" diff --git a/Parse/Tests/Unit/PushChannelsControllerTests.m b/Parse/Tests/Unit/PushChannelsControllerTests.m index 4ee116712..6a1c38cf8 100644 --- a/Parse/Tests/Unit/PushChannelsControllerTests.m +++ b/Parse/Tests/Unit/PushChannelsControllerTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFTask; +@import Bolts; #import "PFCurrentInstallationController.h" #import "PFInstallation.h" diff --git a/Parse/Tests/Unit/PushControllerTests.m b/Parse/Tests/Unit/PushControllerTests.m index f7afa7586..84d7aaebd 100644 --- a/Parse/Tests/Unit/PushControllerTests.m +++ b/Parse/Tests/Unit/PushControllerTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFTask; +@import Bolts; #import "PFCommandResult.h" #import "PFCommandRunning.h" diff --git a/Parse/Tests/Unit/PushUnitTests.m b/Parse/Tests/Unit/PushUnitTests.m index 5569ffd34..8a16b34a3 100644 --- a/Parse/Tests/Unit/PushUnitTests.m +++ b/Parse/Tests/Unit/PushUnitTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFTask; +@import Bolts; #import "PFCoreManager.h" #import "PFCurrentInstallationController.h" diff --git a/Parse/Tests/Unit/QueryCachedControllerTests.m b/Parse/Tests/Unit/QueryCachedControllerTests.m index 7dcc6d89b..452db085c 100644 --- a/Parse/Tests/Unit/QueryCachedControllerTests.m +++ b/Parse/Tests/Unit/QueryCachedControllerTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFTask; +@import Bolts; #import "PFCachedQueryController.h" #import "PFCommandResult.h" diff --git a/Parse/Tests/Unit/QueryControllerUnitTests.m b/Parse/Tests/Unit/QueryControllerUnitTests.m index 6dc70aafc..9058bd9eb 100644 --- a/Parse/Tests/Unit/QueryControllerUnitTests.m +++ b/Parse/Tests/Unit/QueryControllerUnitTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFCancellationTokenSource; +@import Bolts; #import "BFTask+Private.h" #import "PFCommandResult.h" diff --git a/Parse/Tests/Unit/QueryUnitTests.m b/Parse/Tests/Unit/QueryUnitTests.m index 0fe42af81..d45540e34 100644 --- a/Parse/Tests/Unit/QueryUnitTests.m +++ b/Parse/Tests/Unit/QueryUnitTests.m @@ -9,7 +9,7 @@ #import -@import Bolts.BFTask; +@import Bolts; #import "PFCoreManager.h" #import "PFMacros.h" diff --git a/Parse/Tests/Unit/RoleUnitTests.m b/Parse/Tests/Unit/RoleUnitTests.m index 94bd2aa34..d6c1b3e6b 100644 --- a/Parse/Tests/Unit/RoleUnitTests.m +++ b/Parse/Tests/Unit/RoleUnitTests.m @@ -7,7 +7,7 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -@import Bolts.BFTask; +@import Bolts; #import "PFMockURLProtocol.h" #import "PFRelation.h" diff --git a/Parse/Tests/Unit/SQLiteDatabaseTest.m b/Parse/Tests/Unit/SQLiteDatabaseTest.m index 813258d52..6c02c5b26 100644 --- a/Parse/Tests/Unit/SQLiteDatabaseTest.m +++ b/Parse/Tests/Unit/SQLiteDatabaseTest.m @@ -7,7 +7,7 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -@import Bolts.BFTask; +@import Bolts; #import "BFTask+Private.h" #import "PFFileManager.h" diff --git a/Parse/Tests/Unit/URLSessionCommandRunnerTests.m b/Parse/Tests/Unit/URLSessionCommandRunnerTests.m index 01eae6f6d..11372992b 100644 --- a/Parse/Tests/Unit/URLSessionCommandRunnerTests.m +++ b/Parse/Tests/Unit/URLSessionCommandRunnerTests.m @@ -9,8 +9,7 @@ #import -@import Bolts.BFCancellationTokenSource; -@import Bolts.BFTask; +@import Bolts; #import "PFCommandResult.h" #import "PFCommandRunningConstants.h" diff --git a/Parse/Tests/Unit/URLSessionDataTaskDelegateTests.m b/Parse/Tests/Unit/URLSessionDataTaskDelegateTests.m index 44c5e9cde..95dfdaeda 100644 --- a/Parse/Tests/Unit/URLSessionDataTaskDelegateTests.m +++ b/Parse/Tests/Unit/URLSessionDataTaskDelegateTests.m @@ -9,8 +9,7 @@ #import -@import Bolts.BFCancellationTokenSource; -@import Bolts.BFTask; +@import Bolts; #import "PFCommandResult.h" #import "PFConstants.h" diff --git a/Parse/Tests/Unit/URLSessionTests.m b/Parse/Tests/Unit/URLSessionTests.m index 778bd351a..9148affde 100644 --- a/Parse/Tests/Unit/URLSessionTests.m +++ b/Parse/Tests/Unit/URLSessionTests.m @@ -9,8 +9,7 @@ #import -@import Bolts.BFCancellationTokenSource; -@import Bolts.BFTask; +@import Bolts; #import "PFCommandResult.h" #import "PFMacros.h" diff --git a/Parse/Tests/Unit/URLSessionUploadTaskDelegateTests.m b/Parse/Tests/Unit/URLSessionUploadTaskDelegateTests.m index ad649abcd..a2e3b1cfd 100644 --- a/Parse/Tests/Unit/URLSessionUploadTaskDelegateTests.m +++ b/Parse/Tests/Unit/URLSessionUploadTaskDelegateTests.m @@ -9,8 +9,7 @@ #import -@import Bolts.BFCancellationTokenSource; -@import Bolts.BFTask; +@import Bolts; #import "PFCommandResult.h" #import "PFTestCase.h" diff --git a/Parse/Tests/Unit/UserControllerTests.m b/Parse/Tests/Unit/UserControllerTests.m index c9b6801d7..7b76b051e 100644 --- a/Parse/Tests/Unit/UserControllerTests.m +++ b/Parse/Tests/Unit/UserControllerTests.m @@ -7,7 +7,7 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -@import Bolts.BFTask; +@import Bolts; #import "OCMock+Parse.h" #import "PFCommandResult.h" diff --git a/ParseFacebookUtils/CHANGELOG.md b/ParseFacebookUtils/CHANGELOG.md deleted file mode 100644 index c932cc491..000000000 --- a/ParseFacebookUtils/CHANGELOG.md +++ /dev/null @@ -1,51 +0,0 @@ -# Change Log -All notable changes to this project will be documented in this file. - ---- - -## [ParseFacebookUtils-V4 1.11.1](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/releases/tag/v4-1.11.1) (02/20/2016) - -#### Updated - -- `ParseFacebookUtilsV4` CocoaPod now uses the latest version of Facebook SDK. - [#50](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/pull/50), - [#48](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/pull/48) - by [@nlutsenko](https://github.com/nlutsenko) - -#### Fixed - -- Fixed static analyzer warnings that appeared in Xcode 7.3 beta. - [#51](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/pull/51) - by [@nlutsenko](https://github.com/nlutsenko) - -## [ParseFacebookUtils-V4 1.11.0](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/releases/tag/v4-1.11.0) (01/07/2016) - -#### New - -- ParseFacebookUtils now requires Xcode 7.0+. - [#38](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/pull/38) - by [@nlutsenko](https://github.com/nlutsenko) - -## [ParseFacebookUtils-V4 1.10.0](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/releases/tag/v4-1.10.0) (12/14/2015) - -#### New -- ParseFacebookUtils now supports tvOS. #23 - -#### Improved -- Updated, cleaned up and improved documentation. #22 - -## [ParseFacebookUtils-V4 1.9.1](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/releases/tag/v4-1.9.1) (11/17/2015) - -#### New -- ParseFacebookUtils now supports Xcode 7.1. #7 -- ParseFacebookUtils now depends on FBSDK 4.8+. - -#### Improved -- Removed unused imports. #10 - -## [ParseFacebookUtils-V4 1.9.0](https://github.com/ParsePlatform/ParseFacebookUtils-iOS/releases/tag/v4-1.9.0) (10/08/2015) - -Hello, open source! - -#### Fixed -- Fixed initialization of Facebook Utils blocking the main thread. diff --git a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-iOS-Dynamic.xcconfig b/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-iOS-Dynamic.xcconfig deleted file mode 100644 index cb9b605be..000000000 --- a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-iOS-Dynamic.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/DynamicFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsV4 -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutils-ios - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtils/Resources/Info-iOS.plist diff --git a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-iOS.xcconfig b/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-iOS.xcconfig deleted file mode 100644 index dff4409e9..000000000 --- a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-iOS.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/StaticFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsV4 -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutils-ios - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtils/Resources/Info-iOS.plist diff --git a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig b/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig deleted file mode 100644 index 380769f02..000000000 --- a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/tvOS.xcconfig" -#include "Shared/Product/DynamicFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsV4 -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutils-tvos - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtils/Resources/Info-tvOS.plist diff --git a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-tvOS.xcconfig b/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-tvOS.xcconfig deleted file mode 100644 index 3dcb2e9e7..000000000 --- a/ParseFacebookUtils/Configurations/ParseFacebookUtilsV4-tvOS.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/tvOS.xcconfig" -#include "Shared/Product/StaticFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsV4 -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutils-tvos - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtils/Resources/Info-tvOS.plist diff --git a/ParseFacebookUtils/Configurations/Shared b/ParseFacebookUtils/Configurations/Shared deleted file mode 120000 index 657caabf0..000000000 --- a/ParseFacebookUtils/Configurations/Shared +++ /dev/null @@ -1 +0,0 @@ -../../Vendor/xctoolchain/Configurations \ No newline at end of file diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.pbxproj b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.pbxproj deleted file mode 100644 index 32a89a12c..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1075 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 52; - objects = { - -/* Begin PBXBuildFile section */ - 7C5F7D27292101490035B219 /* PFFacebookUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1E292101370035B219 /* PFFacebookUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D28292101490035B219 /* ParseFacebookUtilsV4.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1B292101370035B219 /* ParseFacebookUtilsV4.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D29292101490035B219 /* PFFacebookAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1F292101370035B219 /* PFFacebookAuthenticationProvider.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D2B292101490035B219 /* PFFacebookUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1E292101370035B219 /* PFFacebookUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D2C292101490035B219 /* ParseFacebookUtilsV4.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1B292101370035B219 /* ParseFacebookUtilsV4.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D2D292101490035B219 /* PFFacebookAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1F292101370035B219 /* PFFacebookAuthenticationProvider.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D2F2921014A0035B219 /* PFFacebookUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1E292101370035B219 /* PFFacebookUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D302921014A0035B219 /* ParseFacebookUtilsV4.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1B292101370035B219 /* ParseFacebookUtilsV4.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D312921014A0035B219 /* PFFacebookAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1F292101370035B219 /* PFFacebookAuthenticationProvider.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D332921014A0035B219 /* PFFacebookUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1E292101370035B219 /* PFFacebookUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D342921014A0035B219 /* ParseFacebookUtilsV4.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1B292101370035B219 /* ParseFacebookUtilsV4.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D352921014A0035B219 /* PFFacebookAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7D1F292101370035B219 /* PFFacebookAuthenticationProvider.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7D372921015C0035B219 /* PFFacebookAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1C292101370035B219 /* PFFacebookAuthenticationProvider.m */; }; - 7C5F7D392921015C0035B219 /* PFFacebookUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1A292101370035B219 /* PFFacebookUtils.m */; }; - 7C5F7D3A2921015D0035B219 /* PFFacebookAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1C292101370035B219 /* PFFacebookAuthenticationProvider.m */; }; - 7C5F7D3C2921015D0035B219 /* PFFacebookUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1A292101370035B219 /* PFFacebookUtils.m */; }; - 7C5F7D3D2921015D0035B219 /* PFFacebookAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1C292101370035B219 /* PFFacebookAuthenticationProvider.m */; }; - 7C5F7D3F2921015D0035B219 /* PFFacebookUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1A292101370035B219 /* PFFacebookUtils.m */; }; - 7C5F7D402921015E0035B219 /* PFFacebookAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1C292101370035B219 /* PFFacebookAuthenticationProvider.m */; }; - 7C5F7D422921015E0035B219 /* PFFacebookUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7D1A292101370035B219 /* PFFacebookUtils.m */; }; - 7C5F7DF4292105800035B219 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7DF3292105800035B219 /* libc++.tbd */; }; - 7C5F7DF6292105880035B219 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7DF5292105880035B219 /* Accelerate.framework */; }; - 7C77D01C2929115F00C4D90E /* FBAEMKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240329290C9B00E9364E /* FBAEMKit.xcframework */; }; - 7C77D01D2929115F00C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240129290C9A00E9364E /* FBSDKCoreKit_Basics.xcframework */; }; - 7C77D01E2929115F00C4D90E /* FBSDKCoreKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240029290C9A00E9364E /* FBSDKCoreKit.xcframework */; }; - 7C77D01F2929115F00C4D90E /* FBSDKTVOSKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D01B2929114E00C4D90E /* FBSDKTVOSKit.xcframework */; }; - 7C77D0222929118500C4D90E /* FBAEMKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240329290C9B00E9364E /* FBAEMKit.xcframework */; }; - 7C77D0232929118500C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240129290C9A00E9364E /* FBSDKCoreKit_Basics.xcframework */; }; - 7C77D0242929118500C4D90E /* FBSDKCoreKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240029290C9A00E9364E /* FBSDKCoreKit.xcframework */; }; - 7C77D0252929118500C4D90E /* FBSDKLoginKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240229290C9B00E9364E /* FBSDKLoginKit.xcframework */; }; - 7C77D0282929119500C4D90E /* FBAEMKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240329290C9B00E9364E /* FBAEMKit.xcframework */; }; - 7C77D0292929119500C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240129290C9A00E9364E /* FBSDKCoreKit_Basics.xcframework */; }; - 7C77D02A2929119500C4D90E /* FBSDKCoreKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240029290C9A00E9364E /* FBSDKCoreKit.xcframework */; }; - 7C77D02B2929119500C4D90E /* FBSDKTVOSKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D01B2929114E00C4D90E /* FBSDKTVOSKit.xcframework */; }; - 7C78240429290CA600E9364E /* FBAEMKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240329290C9B00E9364E /* FBAEMKit.xcframework */; }; - 7C78240529290CA600E9364E /* FBSDKCoreKit_Basics.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240129290C9A00E9364E /* FBSDKCoreKit_Basics.xcframework */; }; - 7C78240629290CA600E9364E /* FBSDKCoreKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240029290C9A00E9364E /* FBSDKCoreKit.xcframework */; }; - 7C78240729290CA600E9364E /* FBSDKLoginKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240229290C9B00E9364E /* FBSDKLoginKit.xcframework */; }; - 844D0B9F2959AE120026E74D /* FBAEMKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240329290C9B00E9364E /* FBAEMKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 844D0BA02959AE120026E74D /* FBSDKCoreKit_Basics.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240129290C9A00E9364E /* FBSDKCoreKit_Basics.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 844D0BA12959AE120026E74D /* FBSDKCoreKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240029290C9A00E9364E /* FBSDKCoreKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 844D0BA22959AE130026E74D /* FBSDKLoginKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240229290C9B00E9364E /* FBSDKLoginKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 844D0BA32959AE1B0026E74D /* FBAEMKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240329290C9B00E9364E /* FBAEMKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 844D0BA42959AE1B0026E74D /* FBSDKCoreKit_Basics.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240129290C9A00E9364E /* FBSDKCoreKit_Basics.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 844D0BA52959AE1B0026E74D /* FBSDKCoreKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240029290C9A00E9364E /* FBSDKCoreKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 844D0BA62959AE1B0026E74D /* FBSDKLoginKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7C78240229290C9B00E9364E /* FBSDKLoginKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 844D0BA72959AE1B0026E74D /* FBSDKTVOSKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D01B2929114E00C4D90E /* FBSDKTVOSKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 7C77CFB429290F4100C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C3821C19CCA89E0066284A; - remoteInfo = "Parse-iOS"; - }; - 7C77CFB629290F4100C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C5845D1C3B0A98000063C6; - remoteInfo = "Parse-iOS-Dynamic"; - }; - 7C77CFB829290F4100C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 816F449B1A8E8933009CDB32; - remoteInfo = "ParseUnitTests-iOS"; - }; - 7C77CFBA29290F4100C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 97010FAC1630B18F00AB761E; - remoteInfo = "Parse-macOS"; - }; - 7C77CFBC29290F4100C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C09F861AF97A490043B49C; - remoteInfo = "ParseUnitTests-macOS"; - }; - 7C77CFBE29290F4100C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 815F24151BD04D150054659F; - remoteInfo = "Parse-tvOS"; - }; - 7C77CFC029290F4100C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C585BF1C3B0AA1000063C6; - remoteInfo = "Parse-tvOS-Dynamic"; - }; - 7C77CFC229290F4100C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 810156691BB3832700D7C7BD; - remoteInfo = "Parse-watchOS"; - }; - 7C77CFC429290F4100C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C5870F1C3B0AA9000063C6; - remoteInfo = "Parse-watchOS-Dynamic"; - }; - 7C77CFC629290F4100C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4AE33A0B1F5451AD0088DCA0; - remoteInfo = "ParseUnitTests-iOS-host"; - }; - 7C77CFC829290F4500C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 81C3821B19CCA89E0066284A; - remoteInfo = "Parse-iOS"; - }; - 7C77D0192929110300C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 815F22AF1BD04D150054659F; - remoteInfo = "Parse-tvOS"; - }; - 7C77D0202929117E00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 81C582E11C3B0A98000063C6; - remoteInfo = "Parse-iOS-Dynamic"; - }; - 7C77D0262929118E00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 81C5845F1C3B0AA1000063C6; - remoteInfo = "Parse-tvOS-Dynamic"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - BCCC20E1271F1BAB003C9D03 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 844D0B9F2959AE120026E74D /* FBAEMKit.xcframework in Embed Frameworks */, - 844D0BA02959AE120026E74D /* FBSDKCoreKit_Basics.xcframework in Embed Frameworks */, - 844D0BA12959AE120026E74D /* FBSDKCoreKit.xcframework in Embed Frameworks */, - 844D0BA22959AE130026E74D /* FBSDKLoginKit.xcframework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; - BCCC20E4271F1BB3003C9D03 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 844D0BA32959AE1B0026E74D /* FBAEMKit.xcframework in Embed Frameworks */, - 844D0BA42959AE1B0026E74D /* FBSDKCoreKit_Basics.xcframework in Embed Frameworks */, - 844D0BA52959AE1B0026E74D /* FBSDKCoreKit.xcframework in Embed Frameworks */, - 844D0BA62959AE1B0026E74D /* FBSDKLoginKit.xcframework in Embed Frameworks */, - 844D0BA72959AE1B0026E74D /* FBSDKTVOSKit.xcframework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 4AAEAA75200C020E00AA7479 /* ParseFacebookUtilsV4.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsV4.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4AAEAA90200C022300AA7479 /* ParseFacebookUtilsV4.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsV4.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4AAEAA92200C025100AA7479 /* ParseFacebookUtilsV4-iOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtilsV4-iOS-Dynamic.xcconfig"; sourceTree = ""; }; - 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig"; sourceTree = ""; }; - 7C5F7D1A292101370035B219 /* PFFacebookUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookUtils.m; sourceTree = ""; }; - 7C5F7D1B292101370035B219 /* ParseFacebookUtilsV4.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseFacebookUtilsV4.h; sourceTree = ""; }; - 7C5F7D1C292101370035B219 /* PFFacebookAuthenticationProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookAuthenticationProvider.m; sourceTree = ""; }; - 7C5F7D1E292101370035B219 /* PFFacebookUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookUtils.h; sourceTree = ""; }; - 7C5F7D1F292101370035B219 /* PFFacebookAuthenticationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookAuthenticationProvider.h; sourceTree = ""; }; - 7C5F7D22292101370035B219 /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; - 7C5F7D23292101370035B219 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; - 7C5F7D24292101370035B219 /* Info-tvOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-tvOS.plist"; sourceTree = ""; }; - 7C5F7DF3292105800035B219 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/usr/lib/libc++.tbd"; sourceTree = DEVELOPER_DIR; }; - 7C5F7DF5292105880035B219 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; - 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Parse.xcodeproj; path = ../Parse/Parse.xcodeproj; sourceTree = ""; }; - 7C77D01B2929114E00C4D90E /* FBSDKTVOSKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKTVOSKit.xcframework; path = ../Carthage/Build/FBSDKTVOSKit.xcframework; sourceTree = ""; }; - 7C78240029290C9A00E9364E /* FBSDKCoreKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKCoreKit.xcframework; path = ../Carthage/Build/FBSDKCoreKit.xcframework; sourceTree = ""; }; - 7C78240129290C9A00E9364E /* FBSDKCoreKit_Basics.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKCoreKit_Basics.xcframework; path = ../Carthage/Build/FBSDKCoreKit_Basics.xcframework; sourceTree = ""; }; - 7C78240229290C9B00E9364E /* FBSDKLoginKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKLoginKit.xcframework; path = ../Carthage/Build/FBSDKLoginKit.xcframework; sourceTree = ""; }; - 7C78240329290C9B00E9364E /* FBAEMKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBAEMKit.xcframework; path = ../Carthage/Build/FBAEMKit.xcframework; sourceTree = ""; }; - 8121EA9F1D39862400AC0B02 /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; - 8121EAA11D39862400AC0B02 /* iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = iOS.xcconfig; sourceTree = ""; }; - 8121EAA21D39862400AC0B02 /* macOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = macOS.xcconfig; sourceTree = ""; }; - 8121EAA31D39862400AC0B02 /* tvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = tvOS.xcconfig; sourceTree = ""; }; - 8121EAA41D39862400AC0B02 /* watchOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = watchOS.xcconfig; sourceTree = ""; }; - 8121EAA61D39862400AC0B02 /* Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Application.xcconfig; sourceTree = ""; }; - 8121EAA71D39862400AC0B02 /* DynamicFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DynamicFramework.xcconfig; sourceTree = ""; }; - 8121EAA81D39862400AC0B02 /* LogicTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = LogicTests.xcconfig; sourceTree = ""; }; - 8121EAA91D39862400AC0B02 /* StaticFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = StaticFramework.xcconfig; sourceTree = ""; }; - 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 8121EAAC1D39862400AC0B02 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8121EAAD1D39862400AC0B02 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsV4-tvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtilsV4-tvOS.xcconfig"; sourceTree = ""; }; - 81FE7F8B1C17790400E6BD34 /* ParseFacebookUtilsV4.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsV4.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D2AAC07E0554694100DB518D /* ParseFacebookUtilsV4.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsV4.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F52CD64A1B5838560051AB86 /* ParseFacebookUtilsV4-iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtilsV4-iOS.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 4AAEAA6B200C020E00AA7479 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D0222929118500C4D90E /* FBAEMKit.xcframework in Frameworks */, - 7C77D0232929118500C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */, - 7C77D0242929118500C4D90E /* FBSDKCoreKit.xcframework in Frameworks */, - 7C77D0252929118500C4D90E /* FBSDKLoginKit.xcframework in Frameworks */, - 7C5F7DF6292105880035B219 /* Accelerate.framework in Frameworks */, - 7C5F7DF4292105800035B219 /* libc++.tbd in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4AAEAA86200C022300AA7479 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D0282929119500C4D90E /* FBAEMKit.xcframework in Frameworks */, - 7C77D0292929119500C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */, - 7C77D02A2929119500C4D90E /* FBSDKCoreKit.xcframework in Frameworks */, - 7C77D02B2929119500C4D90E /* FBSDKTVOSKit.xcframework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F811C17790400E6BD34 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D01C2929115F00C4D90E /* FBAEMKit.xcframework in Frameworks */, - 7C77D01D2929115F00C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */, - 7C77D01E2929115F00C4D90E /* FBSDKCoreKit.xcframework in Frameworks */, - 7C77D01F2929115F00C4D90E /* FBSDKTVOSKit.xcframework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C78240429290CA600E9364E /* FBAEMKit.xcframework in Frameworks */, - 7C78240529290CA600E9364E /* FBSDKCoreKit_Basics.xcframework in Frameworks */, - 7C78240629290CA600E9364E /* FBSDKCoreKit.xcframework in Frameworks */, - 7C78240729290CA600E9364E /* FBSDKLoginKit.xcframework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - D2AAC07E0554694100DB518D /* ParseFacebookUtilsV4.framework */, - 81FE7F8B1C17790400E6BD34 /* ParseFacebookUtilsV4.framework */, - 4AAEAA75200C020E00AA7479 /* ParseFacebookUtilsV4.framework */, - 4AAEAA90200C022300AA7479 /* ParseFacebookUtilsV4.framework */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* Breakpad */ = { - isa = PBXGroup; - children = ( - F52CD63A1B58383C0051AB86 /* Configurations */, - 813DFC7E1AB2510300F25A08 /* ParseFacebookUtils */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - ); - indentWidth = 4; - name = Breakpad; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7C5F7DF5292105880035B219 /* Accelerate.framework */, - 7C5F7DF3292105800035B219 /* libc++.tbd */, - 7C78240329290C9B00E9364E /* FBAEMKit.xcframework */, - 7C78240129290C9A00E9364E /* FBSDKCoreKit_Basics.xcframework */, - 7C78240029290C9A00E9364E /* FBSDKCoreKit.xcframework */, - 7C78240229290C9B00E9364E /* FBSDKLoginKit.xcframework */, - 7C77D01B2929114E00C4D90E /* FBSDKTVOSKit.xcframework */, - 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */, - ); - name = Frameworks; - sourceTree = ""; - }; - 7C5F7D19292101370035B219 /* Source */ = { - isa = PBXGroup; - children = ( - 7C5F7D1B292101370035B219 /* ParseFacebookUtilsV4.h */, - 7C5F7D1E292101370035B219 /* PFFacebookUtils.h */, - 7C5F7D1A292101370035B219 /* PFFacebookUtils.m */, - 7C5F7D1C292101370035B219 /* PFFacebookAuthenticationProvider.m */, - 7C5F7D1F292101370035B219 /* PFFacebookAuthenticationProvider.h */, - ); - path = Source; - sourceTree = ""; - }; - 7C5F7D21292101370035B219 /* Resources */ = { - isa = PBXGroup; - children = ( - 7C5F7D22292101370035B219 /* Info-iOS.plist */, - 7C5F7D23292101370035B219 /* Localizable.strings */, - 7C5F7D24292101370035B219 /* Info-tvOS.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 7C5F7D25292101370035B219 /* exclude */ = { - isa = PBXGroup; - children = ( - ); - path = exclude; - sourceTree = ""; - }; - 7C77CFA629290F4000C4D90E /* Products */ = { - isa = PBXGroup; - children = ( - 7C77CFB529290F4100C4D90E /* Parse.framework */, - 7C77CFB729290F4100C4D90E /* Parse.framework */, - 7C77CFB929290F4100C4D90E /* ParseUnitTests-iOS.xctest */, - 7C77CFBB29290F4100C4D90E /* Parse.framework */, - 7C77CFBD29290F4100C4D90E /* ParseUnitTests-macOS.xctest */, - 7C77CFBF29290F4100C4D90E /* Parse.framework */, - 7C77CFC129290F4100C4D90E /* Parse.framework */, - 7C77CFC329290F4100C4D90E /* Parse.framework */, - 7C77CFC529290F4100C4D90E /* Parse.framework */, - 7C77CFC729290F4100C4D90E /* ParseUnitTests-iOS-host.app */, - ); - name = Products; - sourceTree = ""; - }; - 8121EA9E1D39862400AC0B02 /* Shared */ = { - isa = PBXGroup; - children = ( - 8121EA9F1D39862400AC0B02 /* Common.xcconfig */, - 8121EAA01D39862400AC0B02 /* Platform */, - 8121EAA51D39862400AC0B02 /* Product */, - 8121EAAA1D39862400AC0B02 /* Project */, - 8121EAAD1D39862400AC0B02 /* Warnings.xcconfig */, - ); - path = Shared; - sourceTree = ""; - }; - 8121EAA01D39862400AC0B02 /* Platform */ = { - isa = PBXGroup; - children = ( - 8121EAA11D39862400AC0B02 /* iOS.xcconfig */, - 8121EAA21D39862400AC0B02 /* macOS.xcconfig */, - 8121EAA31D39862400AC0B02 /* tvOS.xcconfig */, - 8121EAA41D39862400AC0B02 /* watchOS.xcconfig */, - ); - path = Platform; - sourceTree = ""; - }; - 8121EAA51D39862400AC0B02 /* Product */ = { - isa = PBXGroup; - children = ( - 8121EAA61D39862400AC0B02 /* Application.xcconfig */, - 8121EAA71D39862400AC0B02 /* DynamicFramework.xcconfig */, - 8121EAA81D39862400AC0B02 /* LogicTests.xcconfig */, - 8121EAA91D39862400AC0B02 /* StaticFramework.xcconfig */, - ); - path = Product; - sourceTree = ""; - }; - 8121EAAA1D39862400AC0B02 /* Project */ = { - isa = PBXGroup; - children = ( - 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */, - 8121EAAC1D39862400AC0B02 /* Release.xcconfig */, - ); - path = Project; - sourceTree = ""; - }; - 813DFC7E1AB2510300F25A08 /* ParseFacebookUtils */ = { - isa = PBXGroup; - children = ( - 7C5F7D25292101370035B219 /* exclude */, - 7C5F7D21292101370035B219 /* Resources */, - 7C5F7D19292101370035B219 /* Source */, - ); - path = ParseFacebookUtils; - sourceTree = ""; - }; - F52CD63A1B58383C0051AB86 /* Configurations */ = { - isa = PBXGroup; - children = ( - F52CD64A1B5838560051AB86 /* ParseFacebookUtilsV4-iOS.xcconfig */, - 4AAEAA92200C025100AA7479 /* ParseFacebookUtilsV4-iOS-Dynamic.xcconfig */, - 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsV4-tvOS.xcconfig */, - 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig */, - 8121EA9E1D39862400AC0B02 /* Shared */, - ); - path = Configurations; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 4AAEAA5E200C020E00AA7479 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D312921014A0035B219 /* PFFacebookAuthenticationProvider.h in Headers */, - 7C5F7D302921014A0035B219 /* ParseFacebookUtilsV4.h in Headers */, - 7C5F7D2F2921014A0035B219 /* PFFacebookUtils.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4AAEAA7A200C022300AA7479 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D352921014A0035B219 /* PFFacebookAuthenticationProvider.h in Headers */, - 7C5F7D342921014A0035B219 /* ParseFacebookUtilsV4.h in Headers */, - 7C5F7D332921014A0035B219 /* PFFacebookUtils.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F761C17790400E6BD34 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D2D292101490035B219 /* PFFacebookAuthenticationProvider.h in Headers */, - 7C5F7D2C292101490035B219 /* ParseFacebookUtilsV4.h in Headers */, - 7C5F7D2B292101490035B219 /* PFFacebookUtils.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07A0554694100DB518D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D29292101490035B219 /* PFFacebookAuthenticationProvider.h in Headers */, - 7C5F7D28292101490035B219 /* ParseFacebookUtilsV4.h in Headers */, - 7C5F7D27292101490035B219 /* PFFacebookUtils.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 4AAEAA5B200C020E00AA7479 /* ParseFacebookUtilsV4-iOS-Dynamic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4AAEAA72200C020E00AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-iOS-Dynamic" */; - buildPhases = ( - 4AAEAA5D200C020E00AA7479 /* Generate Localizable Strings */, - 4AAEAA5E200C020E00AA7479 /* Headers */, - 4AAEAA66200C020E00AA7479 /* Sources */, - 4AAEAA6B200C020E00AA7479 /* Frameworks */, - 4AAEAA70200C020E00AA7479 /* Resources */, - BCCC20E1271F1BAB003C9D03 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 7C77D0212929117E00C4D90E /* PBXTargetDependency */, - ); - name = "ParseFacebookUtilsV4-iOS-Dynamic"; - packageProductDependencies = ( - ); - productName = Breakpad; - productReference = 4AAEAA75200C020E00AA7479 /* ParseFacebookUtilsV4.framework */; - productType = "com.apple.product-type.framework"; - }; - 4AAEAA77200C022300AA7479 /* ParseFacebookUtilsV4-tvOS-Dynamic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4AAEAA8D200C022300AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-tvOS-Dynamic" */; - buildPhases = ( - 4AAEAA79200C022300AA7479 /* Generate Localizable Strings */, - 4AAEAA7A200C022300AA7479 /* Headers */, - 4AAEAA81200C022300AA7479 /* Sources */, - 4AAEAA86200C022300AA7479 /* Frameworks */, - 4AAEAA8B200C022300AA7479 /* Resources */, - BCCC20E4271F1BB3003C9D03 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 7C77D0272929118E00C4D90E /* PBXTargetDependency */, - ); - name = "ParseFacebookUtilsV4-tvOS-Dynamic"; - packageProductDependencies = ( - ); - productName = Breakpad; - productReference = 4AAEAA90200C022300AA7479 /* ParseFacebookUtilsV4.framework */; - productType = "com.apple.product-type.framework"; - }; - 81FE7F731C17790400E6BD34 /* ParseFacebookUtilsV4-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 81FE7F881C17790400E6BD34 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-tvOS" */; - buildPhases = ( - 4A1351A5202817C7000F5FD5 /* Fetch Latest Dependencies */, - 81FE7F751C17790400E6BD34 /* Generate Localizable Strings */, - 81FE7F761C17790400E6BD34 /* Headers */, - 81FE7F7D1C17790400E6BD34 /* Sources */, - 81FE7F811C17790400E6BD34 /* Frameworks */, - 81FE7F861C17790400E6BD34 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 7C77D01A2929110300C4D90E /* PBXTargetDependency */, - ); - name = "ParseFacebookUtilsV4-tvOS"; - productName = Breakpad; - productReference = 81FE7F8B1C17790400E6BD34 /* ParseFacebookUtilsV4.framework */; - productType = "com.apple.product-type.framework"; - }; - D2AAC07D0554694100DB518D /* ParseFacebookUtilsV4-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-iOS" */; - buildPhases = ( - 4A1351B220281814000F5FD5 /* Fetch Latest Dependencies */, - 81B3F2291AC9CA2600A92677 /* Generate Localizable Strings */, - D2AAC07A0554694100DB518D /* Headers */, - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - 8139B1341A7BF6B5002BEF84 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 7C77CFC929290F4500C4D90E /* PBXTargetDependency */, - ); - name = "ParseFacebookUtilsV4-iOS"; - packageProductDependencies = ( - ); - productName = Breakpad; - productReference = D2AAC07E0554694100DB518D /* ParseFacebookUtilsV4.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = PF; - LastUpgradeCheck = 0920; - ORGANIZATIONNAME = "Parse, LLC"; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseFacebookUtils" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 1; - knownRegions = ( - da, - de, - es, - fr, - it, - ja, - nl, - no, - sl, - sv, - tr, - en, - Base, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; - packageReferences = ( - ); - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 7C77CFA629290F4000C4D90E /* Products */; - ProjectRef = 7C77CFA529290F4000C4D90E /* Parse.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - D2AAC07D0554694100DB518D /* ParseFacebookUtilsV4-iOS */, - 81FE7F731C17790400E6BD34 /* ParseFacebookUtilsV4-tvOS */, - 4AAEAA5B200C020E00AA7479 /* ParseFacebookUtilsV4-iOS-Dynamic */, - 4AAEAA77200C022300AA7479 /* ParseFacebookUtilsV4-tvOS-Dynamic */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 7C77CFB529290F4100C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77CFB429290F4100C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77CFB729290F4100C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77CFB629290F4100C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77CFB929290F4100C4D90E /* ParseUnitTests-iOS.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ParseUnitTests-iOS.xctest"; - remoteRef = 7C77CFB829290F4100C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77CFBB29290F4100C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77CFBA29290F4100C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77CFBD29290F4100C4D90E /* ParseUnitTests-macOS.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ParseUnitTests-macOS.xctest"; - remoteRef = 7C77CFBC29290F4100C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77CFBF29290F4100C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77CFBE29290F4100C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77CFC129290F4100C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77CFC029290F4100C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77CFC329290F4100C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77CFC229290F4100C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77CFC529290F4100C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77CFC429290F4100C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77CFC729290F4100C4D90E /* ParseUnitTests-iOS-host.app */ = { - isa = PBXReferenceProxy; - fileType = wrapper.application; - path = "ParseUnitTests-iOS-host.app"; - remoteRef = 7C77CFC629290F4100C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 4AAEAA70200C020E00AA7479 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4AAEAA8B200C022300AA7479 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8139B1341A7BF6B5002BEF84 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F861C17790400E6BD34 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 4A1351A5202817C7000F5FD5 /* Fetch Latest Dependencies */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Fetch Latest Dependencies"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nif [ ! -d $SRCROOT/../Carthage/Build ]; then\nmkdir $SRCROOT/../Carthage/Build\nfi\n\ncd $SRCROOT/../Carthage/Build\n\nif [ ! -d \"FBSDKCoreKit.xcframework\" ] || [ ! -d \"FBSDKTVOSKit.xcframework\" ]; then\nARCHIVE_NAME=FBSDK.zip\n\nARCHIVE_URL=\"https://github.com/facebook/facebook-ios-sdk/releases/download/v15.1.0/FacebookSDK-Static_XCFramework.zip\"\ncurl -Lk $ARCHIVE_URL -o $ARCHIVE_NAME\n\nunzip $ARCHIVE_NAME -d fbsdk\nrm -rf FBSDKCoreKit.xcframework\nrm -rf FBSDKTVOSKit.xcframework\n\nmv fbsdk/XCFrameworks/FBSDKCoreKit.xcframework .\nmv fbsdk/XCFrameworks/FBSDKTVOSKit.xcframework .\n\nrm $ARCHIVE_NAME\nrm -r fbsdk\nfi\n"; - }; - 4A1351B220281814000F5FD5 /* Fetch Latest Dependencies */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Fetch Latest Dependencies"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nif [ ! -d $SRCROOT/../Carthage/Build ]; then\nmkdir $SRCROOT/../Carthage/Build\nfi\n\ncd $SRCROOT/../Carthage/Build\n\nif [ ! -d \"FBSDKCoreKit.xcframework\" ] || [ ! -d \"FBSDKLoginKit.xcframework\" ] || [ ! -d \"FBSDKCoreKit_Basics.xcframework\" ] || [ ! -d \"FBAEMKit.xcframework\" ]; then\nARCHIVE_NAME=FBSDK.zip\n\nARCHIVE_URL=\"https://github.com/facebook/facebook-ios-sdk/releases/download/v15.1.0/FacebookSDK-Static_XCFramework.zip\"\ncurl -Lk $ARCHIVE_URL -o $ARCHIVE_NAME\n\nunzip $ARCHIVE_NAME -d fbsdk\nrm -rf FBSDKCoreKit.xcframework\nrm -rf FBSDKLoginKit.xcframework\nrm -rf FBSDKCoreKit_Basics.xcframework\nrm -rf FBAEMKit.xcframework\n\nmv fbsdk/XCFrameworks/FBSDKCoreKit.xcframework .\nmv fbsdk/XCFrameworks/FBSDKLoginKit.xcframework .\nmv fbsdk/XCFrameworks/FBSDKCoreKit_Basics.xcframework .\nmv fbsdk/XCFrameworks/FBAEMKit.xcframework .\n\nrm $ARCHIVE_NAME\nrm -r fbsdk\nfi\n"; - }; - 4AAEAA5D200C020E00AA7479 /* Generate Localizable Strings */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Generate Localizable Strings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Generate localizable strings\nfind $PROJECT_DIR -name '*.m' -print0 | xargs -0 genstrings -q -o $PROJECT_DIR/ParseFacebookUtils/Resources\necho \"Finished converting images\"\n"; - }; - 4AAEAA79200C022300AA7479 /* Generate Localizable Strings */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Generate Localizable Strings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Generate localizable strings\nfind $PROJECT_DIR -name '*.m' -print0 | xargs -0 genstrings -q -o $PROJECT_DIR/ParseFacebookUtils/Resources\necho \"Finished converting images\"\n"; - }; - 81B3F2291AC9CA2600A92677 /* Generate Localizable Strings */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Generate Localizable Strings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Generate localizable strings\nfind $PROJECT_DIR -name '*.m' -print0 | xargs -0 genstrings -q -o $PROJECT_DIR/ParseFacebookUtils/Resources\necho \"Finished converting images\"\n"; - }; - 81FE7F751C17790400E6BD34 /* Generate Localizable Strings */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Generate Localizable Strings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Generate localizable strings\nfind $PROJECT_DIR -name '*.m' -print0 | xargs -0 genstrings -q -o $PROJECT_DIR/ParseFacebookUtils/Resources\necho \"Finished converting images\"\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 4AAEAA66200C020E00AA7479 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D3C2921015D0035B219 /* PFFacebookUtils.m in Sources */, - 7C5F7D3A2921015D0035B219 /* PFFacebookAuthenticationProvider.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4AAEAA81200C022300AA7479 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D392921015C0035B219 /* PFFacebookUtils.m in Sources */, - 7C5F7D372921015C0035B219 /* PFFacebookAuthenticationProvider.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F7D1C17790400E6BD34 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D3F2921015D0035B219 /* PFFacebookUtils.m in Sources */, - 7C5F7D3D2921015D0035B219 /* PFFacebookAuthenticationProvider.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7D422921015E0035B219 /* PFFacebookUtils.m in Sources */, - 7C5F7D402921015E0035B219 /* PFFacebookAuthenticationProvider.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 7C77CFC929290F4500C4D90E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Parse-iOS"; - targetProxy = 7C77CFC829290F4500C4D90E /* PBXContainerItemProxy */; - }; - 7C77D01A2929110300C4D90E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Parse-tvOS"; - targetProxy = 7C77D0192929110300C4D90E /* PBXContainerItemProxy */; - }; - 7C77D0212929117E00C4D90E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Parse-iOS-Dynamic"; - targetProxy = 7C77D0202929117E00C4D90E /* PBXContainerItemProxy */; - }; - 7C77D0272929118E00C4D90E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Parse-tvOS-Dynamic"; - targetProxy = 7C77D0262929118E00C4D90E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F52CD64A1B5838560051AB86 /* ParseFacebookUtilsV4-iOS.xcconfig */; - buildSettings = { - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F52CD64A1B5838560051AB86 /* ParseFacebookUtilsV4-iOS.xcconfig */; - buildSettings = { - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - ONLY_ACTIVE_ARCH = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8121EAAC1D39862400AC0B02 /* Release.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = NO; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Release; - }; - 4AAEAA73200C020E00AA7479 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4AAEAA92200C025100AA7479 /* ParseFacebookUtilsV4-iOS-Dynamic.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_MODULES_AUTOLINK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - SUPPORTS_MACCATALYST = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 4AAEAA74200C020E00AA7479 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4AAEAA92200C025100AA7479 /* ParseFacebookUtilsV4-iOS-Dynamic.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_MODULES_AUTOLINK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - ONLY_ACTIVE_ARCH = YES; - SUPPORTS_MACCATALYST = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 4AAEAA8E200C022300AA7479 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_MODULES_AUTOLINK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 4AAEAA8F200C022300AA7479 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsV4-tvOS-Dynamic.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_MODULES_AUTOLINK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - ONLY_ACTIVE_ARCH = YES; - SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Release; - }; - 81FE7F891C17790400E6BD34 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsV4-tvOS.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 81FE7F8A1C17790400E6BD34 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsV4-tvOS.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - EXCLUDED_ARCHS = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - ONLY_ACTIVE_ARCH = YES; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 1DEB922008733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseFacebookUtils" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4AAEAA72200C020E00AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-iOS-Dynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4AAEAA73200C020E00AA7479 /* Debug */, - 4AAEAA74200C020E00AA7479 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4AAEAA8D200C022300AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-tvOS-Dynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4AAEAA8E200C022300AA7479 /* Debug */, - 4AAEAA8F200C022300AA7479 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 81FE7F881C17790400E6BD34 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsV4-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 81FE7F891C17790400E6BD34 /* Debug */, - 81FE7F8A1C17790400E6BD34 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 04cd5dae9..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-iOS-Dynamic.xcscheme b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-iOS-Dynamic.xcscheme deleted file mode 100644 index 17963fd11..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-iOS-Dynamic.xcscheme +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-iOS.xcscheme b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-iOS.xcscheme deleted file mode 100644 index 8f2f22dc5..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-iOS.xcscheme +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-tvOS-Dynamic.xcscheme b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-tvOS-Dynamic.xcscheme deleted file mode 100644 index 0c1653843..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-tvOS-Dynamic.xcscheme +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-tvOS.xcscheme b/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-tvOS.xcscheme deleted file mode 100644 index 98ebf013e..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsV4-tvOS.xcscheme +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtils/ParseFacebookUtils/Resources/Info-iOS.plist b/ParseFacebookUtils/ParseFacebookUtils/Resources/Info-iOS.plist deleted file mode 100644 index 7cadde13e..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Resources/Info-iOS.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ParseFacebookUtilsV4 - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 2.7.3 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - iPhoneOS - - CFBundleVersion - 2.7.3 - MinimumOSVersion - 9.0 - - diff --git a/ParseFacebookUtils/ParseFacebookUtils/Resources/Info-tvOS.plist b/ParseFacebookUtils/ParseFacebookUtils/Resources/Info-tvOS.plist deleted file mode 100644 index 002ac579a..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Resources/Info-tvOS.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ParseFacebookUtilsV4 - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 2.7.3 - CFBundleSignature - ???? - CFBundleVersion - 2.7.3 - - diff --git a/ParseFacebookUtils/ParseFacebookUtils/Resources/Localizable.strings b/ParseFacebookUtils/ParseFacebookUtils/Resources/Localizable.strings deleted file mode 100644 index e69de29bb..000000000 diff --git a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookAuthenticationProvider.h b/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookAuthenticationProvider.h deleted file mode 100644 index fdfb9c086..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookAuthenticationProvider.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import -#import - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -#if __has_include() -#import -#import -#else -#import "PFConstants.h" -#import "PFUserAuthenticationDelegate.h" -#endif - - -NS_ASSUME_NONNULL_BEGIN - -extern NSString *const PFFacebookUserAuthenticationType; - -@interface PFFacebookAuthenticationProvider : NSObject - -///-------------------------------------- -/// @name Init -///-------------------------------------- - -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -- (instancetype)initWithApplication:(UIApplication *)application - launchOptions:(nullable NSDictionary *)launchOptions NS_DESIGNATED_INITIALIZER; -+ (instancetype)providerWithApplication:(UIApplication *)application - launchOptions:(nullable NSDictionary *)launchOptions;; - -///-------------------------------------- -/// @name Authenticate -///-------------------------------------- - -- (BFTask*> *)authenticateAsyncWithReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions; -- (BFTask*> *)authenticateAsyncWithReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions - fromViewComtroller:(UIViewController *)viewController; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookAuthenticationProvider.m b/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookAuthenticationProvider.m deleted file mode 100644 index de5dc51ef..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookAuthenticationProvider.m +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookAuthenticationProvider.h" - -#import - -#import "PFFacebookUtils.h" - -NSString *const PFFacebookUserAuthenticationType = @"facebook"; - -@implementation PFFacebookAuthenticationProvider - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -- (instancetype)initWithApplication:(UIApplication *)application - launchOptions:(nullable NSDictionary *)launchOptions { - self = [super init]; - if (!self) return self; - - [[FBSDKApplicationDelegate sharedInstance] application:[UIApplication sharedApplication] - didFinishLaunchingWithOptions:launchOptions]; - - return self; -} - -+ (instancetype)providerWithApplication:(UIApplication *)application - launchOptions:(nullable NSDictionary *)launchOptions { - return [[self alloc] initWithApplication:application launchOptions:launchOptions]; -} - -///-------------------------------------- -#pragma mark - Authenticate -///-------------------------------------- - -- (BFTask*> *)authenticateAsyncWithReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions { - return [self authenticateAsyncWithReadPermissions:readPermissions - publishPermissions:publishPermissions - fromViewComtroller:[PFFacebookUtils applicationTopViewController]]; -} - -- (BFTask*> *)authenticateAsyncWithReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions - fromViewComtroller:(UIViewController *)viewController { - return [BFTask taskWithError:[NSError pffb_invalidFacebookSessionError]]; -} - -///-------------------------------------- -#pragma mark - PFUserAuthenticationDelegate -///-------------------------------------- - -- (BOOL)restoreAuthenticationWithAuthData:(nullable NSDictionary *)authData { - FBSDKAccessToken *token = [PFFacebookUtils facebookAccessTokenFromUserAuthenticationData:authData]; - if (!token) { - return !authData; // Only deauthenticate if authData was nil, otherwise - return failure (`NO`). - } - - FBSDKAccessToken *currentToken = [FBSDKAccessToken currentAccessToken]; - // Do not reset the current token if we have the same token already set. - if (![currentToken.userID isEqualToString:token.userID] || - ![currentToken.tokenString isEqualToString:token.tokenString]) { - [FBSDKAccessToken setCurrentAccessToken:token]; - } - - return YES; -} - -@end diff --git a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookUtils.h b/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookUtils.h deleted file mode 100644 index cada4567b..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookUtils.h +++ /dev/null @@ -1,294 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -#if __has_include() -#import -#import -#else -#import "PFConstants.h" -#import "PFUser.h" -#endif - -#import -#import "PFFacebookAuthenticationProvider.h" - -NS_ASSUME_NONNULL_BEGIN - -static PFFacebookAuthenticationProvider *authenticationProvider_; - -/** - The `PFFacebookUtils` class provides utility functions for using Facebook authentication with `PFUser`s. - - @warning This class supports official Facebook iOS SDK v4.0+ and is available only on iOS. - */ -@interface PFFacebookUtils : NSObject - -+ (UIViewController *)applicationTopViewController; - -///-------------------------------------- -/// @name User Authentication Data -///-------------------------------------- - -+ (NSDictionary *)userAuthenticationDataWithFacebookUserId:(NSString *)userId - accessToken:(NSString *)accessToken - expirationDate:(NSDate *)expirationDate; -+ (nullable NSDictionary *)userAuthenticationDataFromAccessToken:(FBSDKAccessToken *)token; - -+ (nullable FBSDKAccessToken *)facebookAccessTokenFromUserAuthenticationData:(nullable NSDictionary *)authData; - - -///-------------------------------------- -#pragma mark - Authentication Provider -///-------------------------------------- - -+ (void)_assertFacebookInitialized; - -+ (PFFacebookAuthenticationProvider *)_authenticationProvider; - -+ (void)_setAuthenticationProvider:(PFFacebookAuthenticationProvider *)provider; -///-------------------------------------- -/// @name Logging In -///-------------------------------------- - -/** - *Asynchronously* logs in a user using Facebook with read permissions. - - This method delegates to the Facebook SDK to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param permissions Array of read permissions to use. - - @return The task that has will a have `result` set to `PFUser` if operation succeeds. - */ -+ (BFTask *)logInInBackgroundWithReadPermissions:(nullable NSArray *)permissions; - -/** - *Asynchronously* logs in a user using Facebook with read permissions. - - This method delegates to the Facebook SDK to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param permissions Array of read permissions to use. - @param block The block to execute when the log in completes. - It should have the following signature: `^(PFUser *user, NSError *error)`. - */ -+ (void)logInInBackgroundWithReadPermissions:(nullable NSArray *)permissions - block:(nullable PFUserResultBlock)block; - -/** - *Asynchronously* logs in a user using Facebook with publish permissions. - - This method delegates to the Facebook SDK to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param permissions Array of publish permissions to use. - - @return The task that has will a have `result` set to `PFUser` if operation succeeds. - */ -+ (BFTask *)logInInBackgroundWithPublishPermissions:(nullable NSArray *)permissions; - -/** - *Asynchronously* logs in a user using Facebook with publish permissions. - - This method delegates to the Facebook SDK to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param permissions Array of publish permissions to use. - @param block The block to execute when the log in completes. - It should have the following signature: `^(PFUser *user, NSError *error)`. - */ -+ (void)logInInBackgroundWithPublishPermissions:(nullable NSArray *)permissions - block:(nullable PFUserResultBlock)block; - -/** - *Asynchronously* logs in a user using given Facebook Acess Token. - - This method delegates to the Facebook SDK to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param accessToken An instance of `FBSDKAccessToken` to use when logging in. - - @return The task that has will a have `result` set to `PFUser` if operation succeeds. - */ -+ (BFTask *)logInInBackgroundWithAccessToken:(FBSDKAccessToken *)accessToken; - -/** - *Asynchronously* logs in a user using given Facebook Acess Token. - - This method delegates to the Facebook SDK to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param accessToken An instance of `FBSDKAccessToken` to use when logging in. - @param block The block to execute when the log in completes. - It should have the following signature: `^(PFUser *user, NSError *error)`. - */ -+ (void)logInInBackgroundWithAccessToken:(FBSDKAccessToken *)accessToken - block:(nullable PFUserResultBlock)block; - -///-------------------------------------- -/// @name Linking Users -///-------------------------------------- - -/** - *Asynchronously* links Facebook with read permissions to an existing `PFUser`. - - This method delegates to the Facebook SDK to authenticate - the user, and then automatically links the account to the `PFUser`. - It will also save any unsaved changes that were made to the `user`. - - @param user User to link to Facebook. - @param permissions Array of read permissions to use when logging in with Facebook. - - @return The task that will have a `result` set to `@YES` if operation succeeds. - */ -+ (BFTask *)linkUserInBackground:(PFUser *)user - withReadPermissions:(nullable NSArray *)permissions; - -/** - *Asynchronously* links Facebook with read permissions to an existing `PFUser`. - - This method delegates to the Facebook SDK to authenticate - the user, and then automatically links the account to the `PFUser`. - It will also save any unsaved changes that were made to the `user`. - - @param user User to link to Facebook. - @param permissions Array of read permissions to use. - @param block The block to execute when the linking completes. - It should have the following signature: `^(BOOL succeeded, NSError *error)`. - */ -+ (void)linkUserInBackground:(PFUser *)user - withReadPermissions:(nullable NSArray *)permissions - block:(nullable PFBooleanResultBlock)block; - -/** - *Asynchronously* links Facebook with publish permissions to an existing `PFUser`. - - This method delegates to the Facebook SDK to authenticate - the user, and then automatically links the account to the `PFUser`. - It will also save any unsaved changes that were made to the `user`. - - @param user User to link to Facebook. - @param permissions Array of publish permissions to use. - - @return The task that will have a `result` set to `@YES` if operation succeeds. - */ -+ (BFTask *)linkUserInBackground:(PFUser *)user - withPublishPermissions:(NSArray *)permissions; - -/** - *Asynchronously* links Facebook with publish permissions to an existing `PFUser`. - - This method delegates to the Facebook SDK to authenticate - the user, and then automatically links the account to the `PFUser`. - It will also save any unsaved changes that were made to the `user`. - - @param user User to link to Facebook. - @param permissions Array of publish permissions to use. - @param block The block to execute when the linking completes. - It should have the following signature: `^(BOOL succeeded, NSError *error)`. - */ -+ (void)linkUserInBackground:(PFUser *)user - withPublishPermissions:(NSArray *)permissions - block:(nullable PFBooleanResultBlock)block; - -/** - *Asynchronously* links Facebook Access Token to an existing `PFUser`. - - This method delegates to the Facebook SDK to authenticate - the user, and then automatically links the account to the `PFUser`. - It will also save any unsaved changes that were made to the `user`. - - @param user User to link to Facebook. - @param accessToken An instance of `FBSDKAccessToken` to use. - - @return The task that will have a `result` set to `@YES` if operation succeeds. - */ -+ (BFTask *)linkUserInBackground:(PFUser *)user withAccessToken:(FBSDKAccessToken *)accessToken; - -/** - *Asynchronously* links Facebook Access Token to an existing `PFUser`. - - This method delegates to the Facebook SDK to authenticate - the user, and then automatically links the account to the `PFUser`. - It will also save any unsaved changes that were made to the `user`. - - @param user User to link to Facebook. - @param accessToken An instance of `FBSDKAccessToken` to use. - @param block The block to execute when the linking completes. - It should have the following signature: `^(BOOL succeeded, NSError *error)`. - */ -+ (void)linkUserInBackground:(PFUser *)user - withAccessToken:(FBSDKAccessToken *)accessToken - block:(nullable PFBooleanResultBlock)block; - -///-------------------------------------- -/// @name Unlinking Users -///-------------------------------------- - -/** - Unlinks the `PFUser` from a Facebook account *asynchronously*. - - @param user User to unlink from Facebook. - @return The task, that encapsulates the work being done. - */ -+ (BFTask *)unlinkUserInBackground:(PFUser *)user; - -/** - Unlinks the `PFUser` from a Facebook account *asynchronously*. - - @param user User to unlink from Facebook. - @param block The block to execute. - It should have the following argument signature: `^(BOOL succeeded, NSError *error)`. - */ -+ (void)unlinkUserInBackground:(PFUser *)user block:(nullable PFBooleanResultBlock)block; - -///-------------------------------------- -/// @name Getting Linked State -///-------------------------------------- - -/** - Whether the user has their account linked to Facebook. - - @param user User to check for a facebook link. The user must be logged in on this device. - - @return `YES` if the user has their account linked to Facebook, otherwise `NO`. - */ -+ (BOOL)isLinkedWithUser:(PFUser *)user; - -@end - -@interface BFTask (ParseFacebookUtils) - -- (instancetype)pffb_continueWithMainThreadUserBlock:(PFUserResultBlock)block; -- (instancetype)pffb_continueWithMainThreadBooleanBlock:(PFBooleanResultBlock)block; -- (instancetype)pffb_continueWithMainThreadBlock:(BFContinuationBlock)block; - -@end - -@interface NSError (ParseFacebookUtils) - -+ (instancetype)pffb_invalidFacebookSessionError; - -@end - -@interface NSDateFormatter (ParseFacebookUtils) - -+ (instancetype)pffb_preciseDateFormatter; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookUtils.m b/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookUtils.m deleted file mode 100644 index d2e9dc22e..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Source/PFFacebookUtils.m +++ /dev/null @@ -1,265 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookUtils.h" - -#if __has_include() -#import -#else -#import "BFExecutor.h" -#endif - -#if __has_include() -#import -#else -#import "Parse.h" -#endif - -#import - -#import "PFFacebookAuthenticationProvider.h" - -@implementation PFFacebookUtils - -+ (UIViewController *)applicationTopViewController { - UIViewController *viewController = [UIApplication sharedApplication].keyWindow.rootViewController; - while (viewController.presentedViewController) { - viewController = viewController.presentedViewController; - } - return viewController; -} - -///-------------------------------------- -#pragma mark - User Authentication Data -///-------------------------------------- - -+ (NSDictionary *)userAuthenticationDataWithFacebookUserId:(NSString *)userId - accessToken:(NSString *)accessToken - expirationDate:(NSDate *)expirationDate { - return @{ @"id" : userId, - @"access_token" : accessToken, - @"expiration_date" : [[NSDateFormatter pffb_preciseDateFormatter] stringFromDate:expirationDate] }; -} - -+ (nullable NSDictionary *)userAuthenticationDataFromAccessToken:(FBSDKAccessToken *)token { - if (!token.userID || !token.tokenString || !token.expirationDate) { - return nil; - } - - return [self userAuthenticationDataWithFacebookUserId:token.userID - accessToken:token.tokenString - expirationDate:token.expirationDate]; -} - -+ (nullable FBSDKAccessToken *)facebookAccessTokenFromUserAuthenticationData:(nullable NSDictionary *)authData { - NSString *accessToken = authData[@"access_token"]; - NSString *expirationDateString = authData[@"expiration_date"]; - if (!accessToken || !expirationDateString) { - return nil; - } - -NSDate *expirationDate = [[NSDateFormatter pffb_preciseDateFormatter] dateFromString:expirationDateString]; - FBSDKAccessToken *token = [[FBSDKAccessToken alloc] initWithTokenString: accessToken permissions:@[] declinedPermissions:@[] expiredPermissions:@[] appID: FBSDKSettings.sharedSettings.appID userID: authData[@"id"] expirationDate: expirationDate refreshDate: nil dataAccessExpirationDate: nil]; - return token; -} - -///-------------------------------------- -#pragma mark - Authentication Provider -///-------------------------------------- - -+ (void)_assertFacebookInitialized { - if (!authenticationProvider_) { - [NSException raise:NSInternalInconsistencyException format:@"You must initialize PFFacebookUtils with a call to +initializeFacebookWithApplicationLaunchOptions"]; - } -} - -+ (PFFacebookAuthenticationProvider *)_authenticationProvider { - return authenticationProvider_; -} - -+ (void)_setAuthenticationProvider:(PFFacebookAuthenticationProvider *)provider { - authenticationProvider_ = provider; -} - -///-------------------------------------- -#pragma mark - Logging In -///-------------------------------------- - -+ (BFTask *)logInInBackgroundWithReadPermissions:(nullable NSArray *)permissions { - return [self _logInAsyncWithReadPermissions:permissions publishPermissions:nil]; -} - -+ (void)logInInBackgroundWithReadPermissions:(nullable NSArray *)permissions - block:(nullable PFUserResultBlock)block { - [[self logInInBackgroundWithReadPermissions:permissions] pffb_continueWithMainThreadUserBlock:block]; -} - -+ (BFTask *)logInInBackgroundWithPublishPermissions:(nullable NSArray *)permissions { - return [self _logInAsyncWithReadPermissions:nil publishPermissions:permissions]; -} - -+ (void)logInInBackgroundWithPublishPermissions:(nullable NSArray *)permissions - block:(nullable PFUserResultBlock)block { - [[self logInInBackgroundWithPublishPermissions:permissions] pffb_continueWithMainThreadUserBlock:block]; -} - -+ (BFTask *)_logInAsyncWithReadPermissions:(NSArray *)readPermissions - publishPermissions:(NSArray *)publishPermissions { - [self _assertFacebookInitialized]; - - PFFacebookAuthenticationProvider *provider = [self _authenticationProvider]; - return [[provider authenticateAsyncWithReadPermissions:readPermissions - publishPermissions:publishPermissions] continueWithSuccessBlock:^id(BFTask *task) { - return [PFUser logInWithAuthTypeInBackground:PFFacebookUserAuthenticationType authData:task.result]; - }]; -} - -+ (BFTask *)logInInBackgroundWithAccessToken:(FBSDKAccessToken *)accessToken { - [self _assertFacebookInitialized]; - - NSDictionary *authData = [PFFacebookUtils userAuthenticationDataFromAccessToken:accessToken]; - if (!authData) { - return [BFTask taskWithError:[NSError pffb_invalidFacebookSessionError]]; - } - return [[PFUser logInWithAuthTypeInBackground:PFFacebookUserAuthenticationType - authData:authData] continueWithSuccessBlock:^id(BFTask *task) { - [FBSDKAccessToken setCurrentAccessToken:accessToken]; - return task; // Return the same result. - }]; -} - -+ (void)logInInBackgroundWithAccessToken:(FBSDKAccessToken *)accessToken - block:(nullable PFUserResultBlock)block { - [[self logInInBackgroundWithAccessToken:accessToken] pffb_continueWithMainThreadUserBlock:block]; -} - -///-------------------------------------- -#pragma mark - Linking Users -///-------------------------------------- - -+ (BFTask *)linkUserInBackground:(PFUser *)user - withReadPermissions:(nullable NSArray *)permissions { - return [self _linkUserAsync:user withReadPermissions:permissions publishPermissions:nil]; -} - -+ (void)linkUserInBackground:(PFUser *)user - withReadPermissions:(nullable NSArray *)permissions - block:(nullable PFBooleanResultBlock)block { - [[self linkUserInBackground:user withReadPermissions:permissions] pffb_continueWithMainThreadBooleanBlock:block]; -} - -+ (BFTask *)linkUserInBackground:(PFUser *)user - withPublishPermissions:(NSArray *)permissions { - return [self _linkUserAsync:user withReadPermissions:nil publishPermissions:permissions]; -} - -+ (void)linkUserInBackground:(PFUser *)user - withPublishPermissions:(NSArray *)permissions - block:(nullable PFBooleanResultBlock)block { - [[self linkUserInBackground:user withPublishPermissions:permissions] pffb_continueWithMainThreadBooleanBlock:block]; -} - -+ (BFTask *)linkUserInBackground:(PFUser *)user withAccessToken:(FBSDKAccessToken *)accessToken { - [self _assertFacebookInitialized]; - - NSDictionary *authData = [PFFacebookUtils userAuthenticationDataFromAccessToken:accessToken]; - if (!authData) { - return [BFTask taskWithError:[NSError pffb_invalidFacebookSessionError]]; - } - return [user linkWithAuthTypeInBackground:PFFacebookUserAuthenticationType authData:authData]; -} - -+ (void)linkUserInBackground:(PFUser *)user - withAccessToken:(FBSDKAccessToken *)accessToken - block:(nullable PFBooleanResultBlock)block { - [[self linkUserInBackground:user withAccessToken:accessToken] pffb_continueWithMainThreadBooleanBlock:block]; -} - -+ (BFTask *)_linkUserAsync:(PFUser *)user - withReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions { - [self _assertFacebookInitialized]; - - PFFacebookAuthenticationProvider *authenticationProvider = [self _authenticationProvider]; - return [[authenticationProvider authenticateAsyncWithReadPermissions:readPermissions - publishPermissions:publishPermissions] continueWithSuccessBlock:^id(BFTask *task) { - return [user linkWithAuthTypeInBackground:PFFacebookUserAuthenticationType authData:task.result]; - }]; -} - -///-------------------------------------- -#pragma mark - Unlinking -///-------------------------------------- - -+ (BFTask *)unlinkUserInBackground:(PFUser *)user { - [self _assertFacebookInitialized]; - return [user unlinkWithAuthTypeInBackground:PFFacebookUserAuthenticationType]; -} - -+ (void)unlinkUserInBackground:(PFUser *)user block:(nullable PFBooleanResultBlock)block { - [[self unlinkUserInBackground:user] pffb_continueWithMainThreadBooleanBlock:block]; -} - -///-------------------------------------- -#pragma mark - Getting Linked State -///-------------------------------------- - -+ (BOOL)isLinkedWithUser:(PFUser *)user { - return [user isLinkedWithAuthType:PFFacebookUserAuthenticationType]; -} - -@end - -@implementation BFTask (ParseFacebookUtils) - -- (instancetype)pffb_continueWithMainThreadUserBlock:(PFUserResultBlock)block { - return [self pffb_continueWithMainThreadBlock:^id(BFTask *task) { - if (block) { - block(task.result, task.error); - } - return nil; - }]; -} - -- (instancetype)pffb_continueWithMainThreadBooleanBlock:(PFBooleanResultBlock)block { - return [self pffb_continueWithMainThreadBlock:^id(BFTask *task) { - if (block) { - block([task.result boolValue], task.error); - } - return nil; - }]; -} - -- (instancetype)pffb_continueWithMainThreadBlock:(BFContinuationBlock)block { - return [self continueWithExecutor:[BFExecutor mainThreadExecutor] withBlock:block]; -} - -@end - -@implementation NSError (ParseFacebookUtils) - -+ (instancetype)pffb_invalidFacebookSessionError { - return [NSError errorWithDomain:PFParseErrorDomain - code:kPFErrorFacebookInvalidSession - userInfo:@{ NSLocalizedDescriptionKey : @"Supplied access token is missing required data." }]; -} - -@end - -@implementation NSDateFormatter (ParseFacebookUtils) - -+ (instancetype)pffb_preciseDateFormatter { - NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; - formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; - formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; - formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; - return formatter; -} - -@end diff --git a/ParseFacebookUtils/ParseFacebookUtils/Source/ParseFacebookUtilsV4.h b/ParseFacebookUtils/ParseFacebookUtils/Source/ParseFacebookUtilsV4.h deleted file mode 100644 index e23d38cd7..000000000 --- a/ParseFacebookUtils/ParseFacebookUtils/Source/ParseFacebookUtilsV4.h +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookUtils.h" -#import "PFFacebookAuthenticationProvider.h" diff --git a/ParseFacebookUtilsTvOs/Configurations/ParseFacebookUtilsTvOS-Dynamic.xcconfig b/ParseFacebookUtilsTvOs/Configurations/ParseFacebookUtilsTvOS-Dynamic.xcconfig deleted file mode 100644 index f5c6c1334..000000000 --- a/ParseFacebookUtilsTvOs/Configurations/ParseFacebookUtilsTvOS-Dynamic.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/tvOS.xcconfig" -#include "Shared/Product/DynamicFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsTvOS -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilstvos - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtilsTvOS/Resources/Info-tvOS.plist diff --git a/ParseFacebookUtilsTvOs/Configurations/ParseFacebookUtilsTvOS.xcconfig b/ParseFacebookUtilsTvOs/Configurations/ParseFacebookUtilsTvOS.xcconfig deleted file mode 100644 index 0ca6f91f0..000000000 --- a/ParseFacebookUtilsTvOs/Configurations/ParseFacebookUtilsTvOS.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/tvOS.xcconfig" -#include "Shared/Product/StaticFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsTvOS -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilstvos - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtilsTvOS/Resources/Info-tvOS.plist diff --git a/ParseFacebookUtilsTvOs/Configurations/Shared b/ParseFacebookUtilsTvOs/Configurations/Shared deleted file mode 120000 index 657caabf0..000000000 --- a/ParseFacebookUtilsTvOs/Configurations/Shared +++ /dev/null @@ -1 +0,0 @@ -../../Vendor/xctoolchain/Configurations \ No newline at end of file diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.pbxproj b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.pbxproj deleted file mode 100644 index 40ab4e115..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.pbxproj +++ /dev/null @@ -1,799 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 52; - objects = { - -/* Begin PBXBuildFile section */ - 7C5F7FB129212AAD0035B219 /* PFFacebookDeviceAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7FAF29212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.h */; }; - 7C5F7FB229212AAD0035B219 /* PFFacebookDeviceAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7FB029212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.m */; }; - 7C5F7FB329212AAD0035B219 /* PFFacebookUtilsDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7FAA29212A9F0035B219 /* PFFacebookUtilsDevice.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7FB429212AAD0035B219 /* PFFacebookUtilsDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7FAC29212A9F0035B219 /* PFFacebookUtilsDevice.m */; }; - 7C5F7FB529212AAD0035B219 /* ParseFacebookUtilsTvOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7FAB29212A9F0035B219 /* ParseFacebookUtilsTvOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7FB629212AAE0035B219 /* PFFacebookDeviceAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7FAF29212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.h */; }; - 7C5F7FB729212AAE0035B219 /* PFFacebookDeviceAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7FB029212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.m */; }; - 7C5F7FB829212AAE0035B219 /* PFFacebookUtilsDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7FAA29212A9F0035B219 /* PFFacebookUtilsDevice.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7FB929212AAE0035B219 /* PFFacebookUtilsDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7FAC29212A9F0035B219 /* PFFacebookUtilsDevice.m */; }; - 7C5F7FBA29212AAE0035B219 /* ParseFacebookUtilsTvOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C5F7FAB29212A9F0035B219 /* ParseFacebookUtilsTvOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D05E2929161D00C4D90E /* FBAEMKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D05B2929160800C4D90E /* FBAEMKit.xcframework */; }; - 7C77D05F2929161D00C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D0582929160800C4D90E /* FBSDKCoreKit_Basics.xcframework */; }; - 7C77D0602929161D00C4D90E /* FBSDKCoreKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D05C2929160800C4D90E /* FBSDKCoreKit.xcframework */; }; - 7C77D0612929161D00C4D90E /* FBSDKTVOSKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D05D2929160800C4D90E /* FBSDKTVOSKit.xcframework */; }; - 7C77D0622929164A00C4D90E /* FBAEMKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D05B2929160800C4D90E /* FBAEMKit.xcframework */; }; - 7C77D0632929164A00C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D0582929160800C4D90E /* FBSDKCoreKit_Basics.xcframework */; }; - 7C77D0642929164A00C4D90E /* FBSDKCoreKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D05C2929160800C4D90E /* FBSDKCoreKit.xcframework */; }; - 7C77D0652929164A00C4D90E /* FBSDKTVOSKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D05D2929160800C4D90E /* FBSDKTVOSKit.xcframework */; }; - 7C77D067292916A000C4D90E /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D066292916A000C4D90E /* File.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 7C5F7FD429212AF20035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7FBB29212AF10035B219 /* ParseFacebookUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D2AAC07E0554694100DB518D; - remoteInfo = "ParseFacebookUtilsV4-iOS"; - }; - 7C5F7FD629212AF20035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7FBB29212AF10035B219 /* ParseFacebookUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81FE7F8B1C17790400E6BD34; - remoteInfo = "ParseFacebookUtilsV4-tvOS"; - }; - 7C5F7FD829212AF20035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7FBB29212AF10035B219 /* ParseFacebookUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4AAEAA75200C020E00AA7479; - remoteInfo = "ParseFacebookUtilsV4-iOS-Dynamic"; - }; - 7C5F7FDA29212AF20035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7FBB29212AF10035B219 /* ParseFacebookUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4AAEAA90200C022300AA7479; - remoteInfo = "ParseFacebookUtilsV4-tvOS-Dynamic"; - }; - 7C5F7FDC29212AF70035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7FBB29212AF10035B219 /* ParseFacebookUtils.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 81FE7F731C17790400E6BD34; - remoteInfo = "ParseFacebookUtilsV4-tvOS"; - }; - 7C5F7FFE292130FC0035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7FBB29212AF10035B219 /* ParseFacebookUtils.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 4AAEAA77200C022300AA7479; - remoteInfo = "ParseFacebookUtilsV4-tvOS-Dynamic"; - }; - 84199A032947592D000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999F42947592D000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C3821C19CCA89E0066284A; - remoteInfo = "Parse-iOS"; - }; - 84199A052947592D000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999F42947592D000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C5845D1C3B0A98000063C6; - remoteInfo = "Parse-iOS-Dynamic"; - }; - 84199A072947592D000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999F42947592D000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 816F449B1A8E8933009CDB32; - remoteInfo = "ParseUnitTests-iOS"; - }; - 84199A092947592D000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999F42947592D000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 97010FAC1630B18F00AB761E; - remoteInfo = "Parse-macOS"; - }; - 84199A0B2947592D000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999F42947592D000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C09F861AF97A490043B49C; - remoteInfo = "ParseUnitTests-macOS"; - }; - 84199A0D2947592D000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999F42947592D000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 815F24151BD04D150054659F; - remoteInfo = "Parse-tvOS"; - }; - 84199A0F2947592D000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999F42947592D000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C585BF1C3B0AA1000063C6; - remoteInfo = "Parse-tvOS-Dynamic"; - }; - 84199A112947592D000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999F42947592D000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 810156691BB3832700D7C7BD; - remoteInfo = "Parse-watchOS"; - }; - 84199A132947592D000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999F42947592D000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C5870F1C3B0AA9000063C6; - remoteInfo = "Parse-watchOS-Dynamic"; - }; - 84199A152947592D000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999F42947592D000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4AE33A0B1F5451AD0088DCA0; - remoteInfo = "ParseUnitTests-iOS-host"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - BCCC20E4271F1BB3003C9D03 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 4AAEAA90200C022300AA7479 /* ParseFacebookUtilsTvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsTvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsTvOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtilsTvOS-Dynamic.xcconfig"; sourceTree = ""; }; - 7C5F7FA729212A9F0035B219 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; - 7C5F7FA829212A9F0035B219 /* Info-tvOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-tvOS.plist"; sourceTree = ""; }; - 7C5F7FAA29212A9F0035B219 /* PFFacebookUtilsDevice.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookUtilsDevice.h; sourceTree = ""; }; - 7C5F7FAB29212A9F0035B219 /* ParseFacebookUtilsTvOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseFacebookUtilsTvOS.h; sourceTree = ""; }; - 7C5F7FAC29212A9F0035B219 /* PFFacebookUtilsDevice.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookUtilsDevice.m; sourceTree = ""; }; - 7C5F7FAF29212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookDeviceAuthenticationProvider.h; sourceTree = ""; }; - 7C5F7FB029212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookDeviceAuthenticationProvider.m; sourceTree = ""; }; - 7C5F7FBB29212AF10035B219 /* ParseFacebookUtils.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ParseFacebookUtils.xcodeproj; path = ../ParseFacebookUtils/ParseFacebookUtils.xcodeproj; sourceTree = ""; }; - 7C77D0582929160800C4D90E /* FBSDKCoreKit_Basics.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKCoreKit_Basics.xcframework; path = ../Carthage/Build/FBSDKCoreKit_Basics.xcframework; sourceTree = ""; }; - 7C77D05B2929160800C4D90E /* FBAEMKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBAEMKit.xcframework; path = ../Carthage/Build/FBAEMKit.xcframework; sourceTree = ""; }; - 7C77D05C2929160800C4D90E /* FBSDKCoreKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKCoreKit.xcframework; path = ../Carthage/Build/FBSDKCoreKit.xcframework; sourceTree = ""; }; - 7C77D05D2929160800C4D90E /* FBSDKTVOSKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKTVOSKit.xcframework; path = ../Carthage/Build/FBSDKTVOSKit.xcframework; sourceTree = ""; }; - 7C77D066292916A000C4D90E /* File.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = File.swift; sourceTree = ""; }; - 8121EA9F1D39862400AC0B02 /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; - 8121EAA11D39862400AC0B02 /* iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = iOS.xcconfig; sourceTree = ""; }; - 8121EAA21D39862400AC0B02 /* macOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = macOS.xcconfig; sourceTree = ""; }; - 8121EAA31D39862400AC0B02 /* tvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = tvOS.xcconfig; sourceTree = ""; }; - 8121EAA41D39862400AC0B02 /* watchOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = watchOS.xcconfig; sourceTree = ""; }; - 8121EAA61D39862400AC0B02 /* Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Application.xcconfig; sourceTree = ""; }; - 8121EAA71D39862400AC0B02 /* DynamicFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DynamicFramework.xcconfig; sourceTree = ""; }; - 8121EAA81D39862400AC0B02 /* LogicTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = LogicTests.xcconfig; sourceTree = ""; }; - 8121EAA91D39862400AC0B02 /* StaticFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = StaticFramework.xcconfig; sourceTree = ""; }; - 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 8121EAAC1D39862400AC0B02 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8121EAAD1D39862400AC0B02 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsTvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ParseFacebookUtilsTvOS.xcconfig; sourceTree = ""; }; - 81FE7F8B1C17790400E6BD34 /* ParseFacebookUtilsTvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsTvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 841999B829475714000D241B /* Parse.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Parse.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 841999F42947592D000D241B /* Parse.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Parse.xcodeproj; path = "/Users/admin/Documents/Projects/Parse-SDK-iOS-OSX/Parse/Parse.xcodeproj"; sourceTree = ""; }; - 84B4D990294756A500A065D4 /* Parse.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Parse.framework; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 4AAEAA86200C022300AA7479 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D0622929164A00C4D90E /* FBAEMKit.xcframework in Frameworks */, - 7C77D0632929164A00C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */, - 7C77D0642929164A00C4D90E /* FBSDKCoreKit.xcframework in Frameworks */, - 7C77D0652929164A00C4D90E /* FBSDKTVOSKit.xcframework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F811C17790400E6BD34 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D05E2929161D00C4D90E /* FBAEMKit.xcframework in Frameworks */, - 7C77D05F2929161D00C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */, - 7C77D0602929161D00C4D90E /* FBSDKCoreKit.xcframework in Frameworks */, - 7C77D0612929161D00C4D90E /* FBSDKTVOSKit.xcframework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - 81FE7F8B1C17790400E6BD34 /* ParseFacebookUtilsTvOS.framework */, - 4AAEAA90200C022300AA7479 /* ParseFacebookUtilsTvOS.framework */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* Breakpad */ = { - isa = PBXGroup; - children = ( - F52CD63A1B58383C0051AB86 /* Configurations */, - 7C5F7FA529212A9F0035B219 /* ParseFacebookUtilsTvOS */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - 841999F42947592D000D241B /* Parse.xcodeproj */, - ); - indentWidth = 4; - name = Breakpad; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 841999B829475714000D241B /* Parse.framework */, - 84B4D990294756A500A065D4 /* Parse.framework */, - 7C77D05B2929160800C4D90E /* FBAEMKit.xcframework */, - 7C77D0582929160800C4D90E /* FBSDKCoreKit_Basics.xcframework */, - 7C77D05C2929160800C4D90E /* FBSDKCoreKit.xcframework */, - 7C77D05D2929160800C4D90E /* FBSDKTVOSKit.xcframework */, - 7C5F7FBB29212AF10035B219 /* ParseFacebookUtils.xcodeproj */, - ); - name = Frameworks; - sourceTree = ""; - }; - 7C5F7FA529212A9F0035B219 /* ParseFacebookUtilsTvOS */ = { - isa = PBXGroup; - children = ( - 7C77D068292916A500C4D90E /* exclude */, - 7C5F7FA629212A9F0035B219 /* Resources */, - 7C5F7FA929212A9F0035B219 /* Source */, - 7C5F7FAD29212A9F0035B219 /* Internal */, - ); - path = ParseFacebookUtilsTvOS; - sourceTree = ""; - }; - 7C5F7FA629212A9F0035B219 /* Resources */ = { - isa = PBXGroup; - children = ( - 7C5F7FA729212A9F0035B219 /* Localizable.strings */, - 7C5F7FA829212A9F0035B219 /* Info-tvOS.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 7C5F7FA929212A9F0035B219 /* Source */ = { - isa = PBXGroup; - children = ( - 7C5F7FAA29212A9F0035B219 /* PFFacebookUtilsDevice.h */, - 7C5F7FAB29212A9F0035B219 /* ParseFacebookUtilsTvOS.h */, - 7C5F7FAC29212A9F0035B219 /* PFFacebookUtilsDevice.m */, - ); - path = Source; - sourceTree = ""; - }; - 7C5F7FAD29212A9F0035B219 /* Internal */ = { - isa = PBXGroup; - children = ( - 7C5F7FAE29212A9F0035B219 /* AuthenticationProvider */, - ); - path = Internal; - sourceTree = ""; - }; - 7C5F7FAE29212A9F0035B219 /* AuthenticationProvider */ = { - isa = PBXGroup; - children = ( - 7C5F7FAF29212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.h */, - 7C5F7FB029212A9F0035B219 /* PFFacebookDeviceAuthenticationProvider.m */, - ); - path = AuthenticationProvider; - sourceTree = ""; - }; - 7C5F7FBC29212AF10035B219 /* Products */ = { - isa = PBXGroup; - children = ( - 7C5F7FD529212AF20035B219 /* ParseFacebookUtilsV4.framework */, - 7C5F7FD729212AF20035B219 /* ParseFacebookUtilsV4.framework */, - 7C5F7FD929212AF20035B219 /* ParseFacebookUtilsV4.framework */, - 7C5F7FDB29212AF20035B219 /* ParseFacebookUtilsV4.framework */, - ); - name = Products; - sourceTree = ""; - }; - 7C77D068292916A500C4D90E /* exclude */ = { - isa = PBXGroup; - children = ( - 7C77D066292916A000C4D90E /* File.swift */, - ); - path = exclude; - sourceTree = ""; - }; - 8121EA9E1D39862400AC0B02 /* Shared */ = { - isa = PBXGroup; - children = ( - 8121EA9F1D39862400AC0B02 /* Common.xcconfig */, - 8121EAA01D39862400AC0B02 /* Platform */, - 8121EAA51D39862400AC0B02 /* Product */, - 8121EAAA1D39862400AC0B02 /* Project */, - 8121EAAD1D39862400AC0B02 /* Warnings.xcconfig */, - ); - path = Shared; - sourceTree = ""; - }; - 8121EAA01D39862400AC0B02 /* Platform */ = { - isa = PBXGroup; - children = ( - 8121EAA11D39862400AC0B02 /* iOS.xcconfig */, - 8121EAA21D39862400AC0B02 /* macOS.xcconfig */, - 8121EAA31D39862400AC0B02 /* tvOS.xcconfig */, - 8121EAA41D39862400AC0B02 /* watchOS.xcconfig */, - ); - path = Platform; - sourceTree = ""; - }; - 8121EAA51D39862400AC0B02 /* Product */ = { - isa = PBXGroup; - children = ( - 8121EAA61D39862400AC0B02 /* Application.xcconfig */, - 8121EAA71D39862400AC0B02 /* DynamicFramework.xcconfig */, - 8121EAA81D39862400AC0B02 /* LogicTests.xcconfig */, - 8121EAA91D39862400AC0B02 /* StaticFramework.xcconfig */, - ); - path = Product; - sourceTree = ""; - }; - 8121EAAA1D39862400AC0B02 /* Project */ = { - isa = PBXGroup; - children = ( - 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */, - 8121EAAC1D39862400AC0B02 /* Release.xcconfig */, - ); - path = Project; - sourceTree = ""; - }; - 841999F52947592D000D241B /* Products */ = { - isa = PBXGroup; - children = ( - 84199A042947592D000D241B /* Parse.framework */, - 84199A062947592D000D241B /* Parse.framework */, - 84199A082947592D000D241B /* ParseUnitTests-iOS.xctest */, - 84199A0A2947592D000D241B /* Parse.framework */, - 84199A0C2947592D000D241B /* ParseUnitTests-macOS.xctest */, - 84199A0E2947592D000D241B /* Parse.framework */, - 84199A102947592D000D241B /* Parse.framework */, - 84199A122947592D000D241B /* Parse.framework */, - 84199A142947592D000D241B /* Parse.framework */, - 84199A162947592D000D241B /* ParseUnitTests-iOS-host.app */, - ); - name = Products; - sourceTree = ""; - }; - F52CD63A1B58383C0051AB86 /* Configurations */ = { - isa = PBXGroup; - children = ( - 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsTvOS.xcconfig */, - 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsTvOS-Dynamic.xcconfig */, - 8121EA9E1D39862400AC0B02 /* Shared */, - ); - path = Configurations; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 4AAEAA7A200C022300AA7479 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7FB829212AAE0035B219 /* PFFacebookUtilsDevice.h in Headers */, - 7C5F7FB629212AAE0035B219 /* PFFacebookDeviceAuthenticationProvider.h in Headers */, - 7C5F7FBA29212AAE0035B219 /* ParseFacebookUtilsTvOS.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F761C17790400E6BD34 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7FB329212AAD0035B219 /* PFFacebookUtilsDevice.h in Headers */, - 7C5F7FB129212AAD0035B219 /* PFFacebookDeviceAuthenticationProvider.h in Headers */, - 7C5F7FB529212AAD0035B219 /* ParseFacebookUtilsTvOS.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 4AAEAA77200C022300AA7479 /* ParseFacebookUtilsTvOS-Dynamic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4AAEAA8D200C022300AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsTvOS-Dynamic" */; - buildPhases = ( - 4AAEAA7A200C022300AA7479 /* Headers */, - 4AAEAA81200C022300AA7479 /* Sources */, - 4AAEAA86200C022300AA7479 /* Frameworks */, - 4AAEAA8B200C022300AA7479 /* Resources */, - BCCC20E4271F1BB3003C9D03 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 7C5F7FFF292130FC0035B219 /* PBXTargetDependency */, - ); - name = "ParseFacebookUtilsTvOS-Dynamic"; - packageProductDependencies = ( - ); - productName = Breakpad; - productReference = 4AAEAA90200C022300AA7479 /* ParseFacebookUtilsTvOS.framework */; - productType = "com.apple.product-type.framework"; - }; - 81FE7F731C17790400E6BD34 /* ParseFacebookUtilsTvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 81FE7F881C17790400E6BD34 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsTvOS" */; - buildPhases = ( - 81FE7F761C17790400E6BD34 /* Headers */, - 81FE7F7D1C17790400E6BD34 /* Sources */, - 81FE7F811C17790400E6BD34 /* Frameworks */, - 81FE7F861C17790400E6BD34 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 7C5F7FDD29212AF70035B219 /* PBXTargetDependency */, - ); - name = ParseFacebookUtilsTvOS; - productName = Breakpad; - productReference = 81FE7F8B1C17790400E6BD34 /* ParseFacebookUtilsTvOS.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = PF; - LastUpgradeCheck = 0920; - ORGANIZATIONNAME = "Parse, LLC"; - TargetAttributes = { - 4AAEAA77200C022300AA7479 = { - LastSwiftMigration = 1410; - }; - }; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseFacebookUtilsTvOS" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 1; - knownRegions = ( - da, - de, - es, - fr, - it, - ja, - nl, - no, - sl, - sv, - tr, - en, - Base, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; - packageReferences = ( - ); - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 841999F52947592D000D241B /* Products */; - ProjectRef = 841999F42947592D000D241B /* Parse.xcodeproj */; - }, - { - ProductGroup = 7C5F7FBC29212AF10035B219 /* Products */; - ProjectRef = 7C5F7FBB29212AF10035B219 /* ParseFacebookUtils.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 81FE7F731C17790400E6BD34 /* ParseFacebookUtilsTvOS */, - 4AAEAA77200C022300AA7479 /* ParseFacebookUtilsTvOS-Dynamic */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 7C5F7FD529212AF20035B219 /* ParseFacebookUtilsV4.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsV4.framework; - remoteRef = 7C5F7FD429212AF20035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C5F7FD729212AF20035B219 /* ParseFacebookUtilsV4.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsV4.framework; - remoteRef = 7C5F7FD629212AF20035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C5F7FD929212AF20035B219 /* ParseFacebookUtilsV4.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsV4.framework; - remoteRef = 7C5F7FD829212AF20035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C5F7FDB29212AF20035B219 /* ParseFacebookUtilsV4.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsV4.framework; - remoteRef = 7C5F7FDA29212AF20035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84199A042947592D000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 84199A032947592D000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84199A062947592D000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 84199A052947592D000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84199A082947592D000D241B /* ParseUnitTests-iOS.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ParseUnitTests-iOS.xctest"; - remoteRef = 84199A072947592D000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84199A0A2947592D000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 84199A092947592D000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84199A0C2947592D000D241B /* ParseUnitTests-macOS.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ParseUnitTests-macOS.xctest"; - remoteRef = 84199A0B2947592D000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84199A0E2947592D000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 84199A0D2947592D000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84199A102947592D000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 84199A0F2947592D000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84199A122947592D000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 84199A112947592D000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84199A142947592D000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 84199A132947592D000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84199A162947592D000D241B /* ParseUnitTests-iOS-host.app */ = { - isa = PBXReferenceProxy; - fileType = wrapper.application; - path = "ParseUnitTests-iOS-host.app"; - remoteRef = 84199A152947592D000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 4AAEAA8B200C022300AA7479 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F861C17790400E6BD34 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 4AAEAA81200C022300AA7479 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7FB729212AAE0035B219 /* PFFacebookDeviceAuthenticationProvider.m in Sources */, - 7C77D067292916A000C4D90E /* File.swift in Sources */, - 7C5F7FB929212AAE0035B219 /* PFFacebookUtilsDevice.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81FE7F7D1C17790400E6BD34 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7FB229212AAD0035B219 /* PFFacebookDeviceAuthenticationProvider.m in Sources */, - 7C5F7FB429212AAD0035B219 /* PFFacebookUtilsDevice.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 7C5F7FDD29212AF70035B219 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "ParseFacebookUtilsV4-tvOS"; - targetProxy = 7C5F7FDC29212AF70035B219 /* PBXContainerItemProxy */; - }; - 7C5F7FFF292130FC0035B219 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "ParseFacebookUtilsV4-tvOS-Dynamic"; - targetProxy = 7C5F7FFE292130FC0035B219 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8121EAAC1D39862400AC0B02 /* Release.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = NO; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Release; - }; - 4AAEAA8E200C022300AA7479 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsTvOS-Dynamic.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ENABLE_MODULES = YES; - CLANG_MODULES_AUTOLINK = YES; - DEFINES_MODULE = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/Frameworks", - ); - SDKROOT = appletvos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 4AAEAA8F200C022300AA7479 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4AAEAA93200C026300AA7479 /* ParseFacebookUtilsTvOS-Dynamic.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_ENABLE_MODULES = YES; - CLANG_MODULES_AUTOLINK = YES; - DEFINES_MODULE = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/Frameworks", - ); - ONLY_ACTIVE_ARCH = YES; - SDKROOT = appletvos; - SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Release; - }; - 81FE7F891C17790400E6BD34 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsTvOS.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - 81FE7F8A1C17790400E6BD34 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 81FE7F721C1778FC00E6BD34 /* ParseFacebookUtilsTvOS.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseFacebookUtilsTvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4AAEAA8D200C022300AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsTvOS-Dynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4AAEAA8E200C022300AA7479 /* Debug */, - 4AAEAA8F200C022300AA7479 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 81FE7F881C17790400E6BD34 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsTvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 81FE7F891C17790400E6BD34 /* Debug */, - 81FE7F8A1C17790400E6BD34 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 04cd5dae9..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsTvOS-Dynamic.xcscheme b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsTvOS-Dynamic.xcscheme deleted file mode 100644 index ce40e066b..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsTvOS-Dynamic.xcscheme +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsTvOS.xcscheme b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsTvOS.xcscheme deleted file mode 100644 index fa31dd369..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsTvOS.xcscheme +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Internal/AuthenticationProvider/PFFacebookDeviceAuthenticationProvider.h b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Internal/AuthenticationProvider/PFFacebookDeviceAuthenticationProvider.h deleted file mode 100644 index 325a58b97..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Internal/AuthenticationProvider/PFFacebookDeviceAuthenticationProvider.h +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#if __has_include() -#import -#else -#import "PFFacebookAuthenticationProvider.h" -#endif - -@interface PFFacebookDeviceAuthenticationProvider : PFFacebookAuthenticationProvider - -@end diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Internal/AuthenticationProvider/PFFacebookDeviceAuthenticationProvider.m b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Internal/AuthenticationProvider/PFFacebookDeviceAuthenticationProvider.m deleted file mode 100644 index 2ea70aa57..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Internal/AuthenticationProvider/PFFacebookDeviceAuthenticationProvider.m +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookDeviceAuthenticationProvider.h" - -#if __has_include() -#import -#import -#else -#import "BFExecutor.h" -#import "BFTaskCompletionSource.h" -#endif - -#import -#import -#import - -#if __has_include() -#import -#else -#import "PFFacebookUtils.h" -#endif - -@interface PFFacebookDeviceAuthenticationProvider () { - BFTaskCompletionSource *_loginTaskCompletionSource; - FBSDKDeviceLoginViewController *_loginViewController; -} - -@end - -@implementation PFFacebookDeviceAuthenticationProvider - -///-------------------------------------- -#pragma mark - PFFacebookAuthenticationProvider -///-------------------------------------- - -- (BFTask*> *)authenticateAsyncWithReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions - fromViewComtroller:(UIViewController *)viewController { - return [BFTask taskFromExecutor:[BFExecutor mainThreadExecutor] withBlock:^id _Nonnull{ - if (self->_loginTaskCompletionSource) { - return [NSError errorWithDomain:FBSDKErrorDomain - code:FBSDKErrorDialogUnavailable - userInfo:@{ NSLocalizedDescriptionKey : @"Another login attempt is already in progress." }]; - } - self->_loginTaskCompletionSource = [BFTaskCompletionSource taskCompletionSource]; - self-> _loginViewController = [[FBSDKDeviceLoginViewController alloc] init]; - self->_loginViewController.delegate = self; - NSArray *permissions = [readPermissions arrayByAddingObjectsFromArray:publishPermissions]; - self->_loginViewController.permissions = permissions; - - [viewController presentViewController:self->_loginViewController animated:YES completion:nil]; - - return self->_loginTaskCompletionSource.task; - }]; -} - -///-------------------------------------- -#pragma mark - PFUserAuthenticationDelegate -///-------------------------------------- - -- (BOOL)restoreAuthenticationWithAuthData:(nullable NSDictionary *)authData { - if (!authData) { - [FBSDKAccessToken setCurrentAccessToken:nil]; - } - return [super restoreAuthenticationWithAuthData:authData]; -} - -///-------------------------------------- -#pragma mark - FBSDKDeviceLoginViewController -///-------------------------------------- - -- (void)deviceLoginViewControllerDidCancel:(FBSDKDeviceLoginViewController *)viewController { - [_loginTaskCompletionSource trySetCancelled]; - _loginViewController = nil; - _loginTaskCompletionSource = nil; -} - -- (void)deviceLoginViewControllerDidFinish:(FBSDKDeviceLoginViewController *)viewController { - FBSDKAccessToken *accessToken = [FBSDKAccessToken currentAccessToken]; - NSDictionary *result = [PFFacebookUtils userAuthenticationDataFromAccessToken:accessToken]; - [_loginTaskCompletionSource trySetResult:result]; - _loginViewController = nil; - _loginTaskCompletionSource = nil; -} - -- (void)deviceLoginViewController:(FBSDKDeviceLoginViewController *)viewController didFailWithError:(NSError *)error { - [_loginTaskCompletionSource trySetError:error]; - _loginViewController = nil; - _loginTaskCompletionSource = nil; -} - -@end diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Resources/Info-tvOS.plist b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Resources/Info-tvOS.plist deleted file mode 100644 index 62c478826..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Resources/Info-tvOS.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ParseFacebookUtilsTvOS - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.19.4 - CFBundleSignature - ???? - CFBundleVersion - 1.19.4 - - diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Resources/Localizable.strings b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Resources/Localizable.strings deleted file mode 100644 index e69de29bb..000000000 diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/PFFacebookUtilsDevice.h b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/PFFacebookUtilsDevice.h deleted file mode 100644 index e74ad10f0..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/PFFacebookUtilsDevice.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// Header.h -// -// -// Created by Volodymyr Nazarkevych on 29.11.2022. -// - -#if __has_include() -#import -#else -#import "PFFacebookUtils.h" -#endif - -@interface PFFacebookUtilsDevice : PFFacebookUtils - -///-------------------------------------- -/// @name Interacting With Facebook -///-------------------------------------- - -/** - Initializes Parse Facebook Utils. - - You must provide your Facebook application ID as the value for FacebookAppID in your bundle's plist file - as described here: https://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/ - - @warning You must invoke this in order to use the Facebook functionality in Parse. - - @param launchOptions The launchOptions as passed to [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. - */ -+ (void)initializeFacebookWithApplicationLaunchOptions:(nullable NSDictionary *)launchOptions; - -@end diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/PFFacebookUtilsDevice.m b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/PFFacebookUtilsDevice.m deleted file mode 100644 index 93ab23bd8..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/PFFacebookUtilsDevice.m +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookUtilsDevice.h" - -#if __has_include() -#import -#else -#import "BFExecutor.h" -#endif - -#if __has_include() -#import -#else -#import "Parse.h" -#endif - -#if __has_include() -#import -#else -#import "PFFacebookUtils.h" -#endif - -#import -#import "PFFacebookDeviceAuthenticationProvider.h" - -@implementation PFFacebookUtilsDevice - -///-------------------------------------- -#pragma mark - Interacting With Facebook -///-------------------------------------- - -+ (void)initializeFacebookWithApplicationLaunchOptions:(NSDictionary *)launchOptions { - if (![Parse currentConfiguration]) { - // TODO: (nlutsenko) Remove this when Parse SDK throws on every access to Parse._currentManager - [NSException raise:NSInternalInconsistencyException format:@"PFFacebookUtils must be initialized after initializing Parse."]; - } - if (!authenticationProvider_) { - Class providerClass = nil; - - providerClass = [PFFacebookDeviceAuthenticationProvider class]; - - PFFacebookAuthenticationProvider *provider = [providerClass providerWithApplication:[UIApplication sharedApplication] - launchOptions:launchOptions]; - [PFUser registerAuthenticationDelegate:provider forAuthType:PFFacebookUserAuthenticationType]; - - [self _setAuthenticationProvider:provider]; - } -} - -@end diff --git a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/ParseFacebookUtilsTvOS.h b/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/ParseFacebookUtilsTvOS.h deleted file mode 100644 index f2602cc3d..000000000 --- a/ParseFacebookUtilsTvOs/ParseFacebookUtilsTvOS/Source/ParseFacebookUtilsTvOS.h +++ /dev/null @@ -1,9 +0,0 @@ -// -// ParseFacebookUtils-tvOS.h -// ParseFacebookUtils-tvOS -// -// Created by Volodymyr Nazarkevych on 29.11.2022. -// Copyright © 2022 Parse, LLC. All rights reserved. -// - -#import "PFFacebookUtilsDevice.h" diff --git a/ParseFacebookUtilsiOS/Configurations/ParseFacebookTestApplication.xcconfig b/ParseFacebookUtilsiOS/Configurations/ParseFacebookTestApplication.xcconfig deleted file mode 100644 index 20764fd98..000000000 --- a/ParseFacebookUtilsiOS/Configurations/ParseFacebookTestApplication.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/Application.xcconfig" - -PRODUCT_NAME = ParseFacebookTestApplication -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios.unit.app - -INFOPLIST_FILE = $(SRCROOT)/Tests/TestApplication/Resources/Info.plist diff --git a/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtils-UnitTests.xcconfig b/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtils-UnitTests.xcconfig deleted file mode 100644 index bb7da544c..000000000 --- a/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtils-UnitTests.xcconfig +++ /dev/null @@ -1,19 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/LogicTests.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsiOS-UnitTests -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios.unit - -IPHONEOS_DEPLOYMENT_TARGET = 9.0 - -INFOPLIST_FILE = $(SRCROOT)/Tests/Resources/Info.plist -TEST_HOST = $(BUILT_PRODUCTS_DIR)/ParseFacebookTestApplication.app/ParseFacebookTestApplication diff --git a/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtilsiOS-Dynamic.xcconfig b/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtilsiOS-Dynamic.xcconfig deleted file mode 100644 index 95d31bdaf..000000000 --- a/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtilsiOS-Dynamic.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/DynamicFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsiOS -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtilsiOS/Resources/Info-iOS.plist diff --git a/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtilsiOS.xcconfig b/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtilsiOS.xcconfig deleted file mode 100644 index e5c24ea57..000000000 --- a/ParseFacebookUtilsiOS/Configurations/ParseFacebookUtilsiOS.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/StaticFramework.xcconfig" - -PRODUCT_NAME = ParseFacebookUtilsiOS -PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios - -INFOPLIST_FILE = $(SRCROOT)/ParseFacebookUtilsiOS/Resources/Info-iOS.plist diff --git a/ParseFacebookUtilsiOS/Configurations/Shared b/ParseFacebookUtilsiOS/Configurations/Shared deleted file mode 120000 index 657caabf0..000000000 --- a/ParseFacebookUtilsiOS/Configurations/Shared +++ /dev/null @@ -1 +0,0 @@ -../../Vendor/xctoolchain/Configurations \ No newline at end of file diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.pbxproj b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.pbxproj deleted file mode 100644 index 35f7e5e68..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1281 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 7C5F7E2829210C9C0035B219 /* FacebookUtilsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7E1B29210C970035B219 /* FacebookUtilsTests.m */; }; - 7C5F7E2929210C9C0035B219 /* FacebookAuthenticationProviderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7E1C29210C970035B219 /* FacebookAuthenticationProviderTests.m */; }; - 7C5F7E2A29210CA00035B219 /* PFFacebookTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7E2129210C970035B219 /* PFFacebookTestCase.m */; }; - 7C5F7E2B29210CA20035B219 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5F7E2529210C970035B219 /* main.m */; }; - 7C5F7E8129210E760035B219 /* PFFacebookUtilsDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE621291EA75A003359B5 /* PFFacebookUtilsDevice.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7E8229210E760035B219 /* ParseFacebookUtilsiOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE622291EA75A003359B5 /* ParseFacebookUtilsiOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7E8329210E760035B219 /* PFFacebookUtils_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE626291EA75A003359B5 /* PFFacebookUtils_Private.h */; }; - 7C5F7E8429210E760035B219 /* PFFacebookMobileAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE628291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.h */; }; - 7C5F7E8529210E760035B219 /* PFFacebookMobileAuthenticationProvider_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE629291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider_Private.h */; }; - 7C5F7E8629210E890035B219 /* PFFacebookUtilsDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CACE623291EA75A003359B5 /* PFFacebookUtilsDevice.m */; }; - 7C5F7E8729210E890035B219 /* PFFacebookMobileAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CACE627291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.m */; }; - 7C5F7E8F292114340035B219 /* PFFacebookUtilsDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE621291EA75A003359B5 /* PFFacebookUtilsDevice.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7E90292114340035B219 /* ParseFacebookUtilsiOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE622291EA75A003359B5 /* ParseFacebookUtilsiOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5F7E91292114340035B219 /* PFFacebookUtils_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE626291EA75A003359B5 /* PFFacebookUtils_Private.h */; }; - 7C5F7E92292114340035B219 /* PFFacebookMobileAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE628291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.h */; }; - 7C5F7E93292114350035B219 /* PFFacebookMobileAuthenticationProvider_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CACE629291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider_Private.h */; }; - 7C5F7E94292114410035B219 /* PFFacebookUtilsDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CACE623291EA75A003359B5 /* PFFacebookUtilsDevice.m */; }; - 7C5F7E95292114410035B219 /* PFFacebookMobileAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CACE627291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.m */; }; - 7C5F7ED729211E120035B219 /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7EAC292119EA0035B219 /* OCMock.framework */; }; - 7C5F7EDA29211E5E0035B219 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7ED929211E5E0035B219 /* libsqlite3.tbd */; }; - 7C5F7EDC29211E640035B219 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7EDB29211E640035B219 /* libc++.tbd */; }; - 7C5F7EDE29211E6A0035B219 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7EDD29211E6A0035B219 /* SystemConfiguration.framework */; }; - 7C5F7EE029211E6E0035B219 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7EDF29211E6E0035B219 /* AudioToolbox.framework */; }; - 7C5F7EE229211E870035B219 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7EE129211E870035B219 /* Accelerate.framework */; }; - 7C77D047292913DC00C4D90E /* FBAEMKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D045292913CF00C4D90E /* FBAEMKit.xcframework */; }; - 7C77D048292913DC00C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D03C292913CF00C4D90E /* FBSDKCoreKit_Basics.xcframework */; }; - 7C77D049292913DC00C4D90E /* FBSDKCoreKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D044292913CF00C4D90E /* FBSDKCoreKit.xcframework */; }; - 7C77D04A292913DC00C4D90E /* FBSDKLoginKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D046292913CF00C4D90E /* FBSDKLoginKit.xcframework */; }; - 7C77D04C292913EC00C4D90E /* FBAEMKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D045292913CF00C4D90E /* FBAEMKit.xcframework */; }; - 7C77D04D292913EC00C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D03C292913CF00C4D90E /* FBSDKCoreKit_Basics.xcframework */; }; - 7C77D04E292913EC00C4D90E /* FBSDKCoreKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D044292913CF00C4D90E /* FBSDKCoreKit.xcframework */; }; - 7C77D04F292913EC00C4D90E /* FBSDKLoginKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D046292913CF00C4D90E /* FBSDKLoginKit.xcframework */; }; - 7C77D0512929156900C4D90E /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D0502929156900C4D90E /* libc++.tbd */; }; - 7C77D0532929157600C4D90E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D0522929157600C4D90E /* Accelerate.framework */; }; - 7CD81D17292D16DC0074F64D /* ParseFacebookUtilsV4.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C5F7E5D29210E590035B219 /* ParseFacebookUtilsV4.framework */; platformFilter = ios; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 7C5F7E5C29210E590035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7E3929210E580035B219 /* ParseFacebookUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D2AAC07E0554694100DB518D; - remoteInfo = "ParseFacebookUtilsV4-iOS"; - }; - 7C5F7E5E29210E590035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7E3929210E580035B219 /* ParseFacebookUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81FE7F8B1C17790400E6BD34; - remoteInfo = "ParseFacebookUtilsV4-tvOS"; - }; - 7C5F7E6029210E590035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7E3929210E580035B219 /* ParseFacebookUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4AAEAA75200C020E00AA7479; - remoteInfo = "ParseFacebookUtilsV4-iOS-Dynamic"; - }; - 7C5F7E6229210E590035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7E3929210E580035B219 /* ParseFacebookUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4AAEAA90200C022300AA7479; - remoteInfo = "ParseFacebookUtilsV4-tvOS-Dynamic"; - }; - 7C5F7E7F29210E600035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7E3929210E580035B219 /* ParseFacebookUtils.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D; - remoteInfo = "ParseFacebookUtilsV4-iOS"; - }; - 7C5F7E8D292114240035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7E3929210E580035B219 /* ParseFacebookUtils.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 4AAEAA5B200C020E00AA7479; - remoteInfo = "ParseFacebookUtilsV4-iOS-Dynamic"; - }; - 7C5F7EA3292119EA0035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7E99292119EA0035B219 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 030EF0A814632FD000B04273; - remoteInfo = OCMock; - }; - 7C5F7EA5292119EA0035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7E99292119EA0035B219 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 03565A3118F0566E003AE91E; - remoteInfo = OCMockTests; - }; - 7C5F7EA7292119EA0035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7E99292119EA0035B219 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 030EF0DC14632FF700B04273; - remoteInfo = OCMockLib; - }; - 7C5F7EA9292119EA0035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7E99292119EA0035B219 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D31108AD1828DB8700737925; - remoteInfo = OCMockLibTests; - }; - 7C5F7EAB292119EA0035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7E99292119EA0035B219 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = F0B950F11B0080BE00942C38; - remoteInfo = "OCMock iOS"; - }; - 7C5F7EAD292119EA0035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7E99292119EA0035B219 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 817EB1621BD765130047E85A; - remoteInfo = "OCMock tvOS"; - }; - 7C5F7EAF292119EA0035B219 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C5F7E99292119EA0035B219 /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 8DE97CA022B43EE60098C63F; - remoteInfo = "OCMock watchOS"; - }; - 841999DE29475911000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999CF29475911000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C3821C19CCA89E0066284A; - remoteInfo = "Parse-iOS"; - }; - 841999E029475911000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999CF29475911000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C5845D1C3B0A98000063C6; - remoteInfo = "Parse-iOS-Dynamic"; - }; - 841999E229475911000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999CF29475911000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 816F449B1A8E8933009CDB32; - remoteInfo = "ParseUnitTests-iOS"; - }; - 841999E429475911000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999CF29475911000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 97010FAC1630B18F00AB761E; - remoteInfo = "Parse-macOS"; - }; - 841999E629475911000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999CF29475911000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C09F861AF97A490043B49C; - remoteInfo = "ParseUnitTests-macOS"; - }; - 841999E829475911000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999CF29475911000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 815F24151BD04D150054659F; - remoteInfo = "Parse-tvOS"; - }; - 841999EA29475911000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999CF29475911000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C585BF1C3B0AA1000063C6; - remoteInfo = "Parse-tvOS-Dynamic"; - }; - 841999EC29475911000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999CF29475911000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 810156691BB3832700D7C7BD; - remoteInfo = "Parse-watchOS"; - }; - 841999EE29475911000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999CF29475911000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C5870F1C3B0AA9000063C6; - remoteInfo = "Parse-watchOS-Dynamic"; - }; - 841999F029475911000D241B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 841999CF29475911000D241B /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4AE33A0B1F5451AD0088DCA0; - remoteInfo = "ParseUnitTests-iOS-host"; - }; - B9A7EE7323C49272003E606E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = F535C73A1B54B4A800A7D81E; - remoteInfo = ParseFacebookTestApplicationV4; - }; - B9A7EEB623C49C89003E606E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D; - remoteInfo = "ParseFacebookUtilsV4-iOS"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - BCCC20E1271F1BAB003C9D03 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 4AAEAA75200C020E00AA7479 /* ParseFacebookUtilsiOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsiOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7C5F7E1B29210C970035B219 /* FacebookUtilsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FacebookUtilsTests.m; sourceTree = ""; }; - 7C5F7E1C29210C970035B219 /* FacebookAuthenticationProviderTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FacebookAuthenticationProviderTests.m; sourceTree = ""; }; - 7C5F7E1E29210C970035B219 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7C5F7E2129210C970035B219 /* PFFacebookTestCase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookTestCase.m; sourceTree = ""; }; - 7C5F7E2229210C970035B219 /* PFFacebookTestCase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookTestCase.h; sourceTree = ""; }; - 7C5F7E2529210C970035B219 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 7C5F7E2729210C970035B219 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7C5F7E2C29210CF30035B219 /* ParseFacebookTestApplication.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ParseFacebookTestApplication.xcconfig; sourceTree = ""; }; - 7C5F7E2D29210CF30035B219 /* ParseFacebookUtils-UnitTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtils-UnitTests.xcconfig"; sourceTree = ""; }; - 7C5F7E3929210E580035B219 /* ParseFacebookUtils.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ParseFacebookUtils.xcodeproj; path = ../ParseFacebookUtils/ParseFacebookUtils.xcodeproj; sourceTree = ""; }; - 7C5F7E99292119EA0035B219 /* OCMock.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCMock.xcodeproj; path = ../Carthage/Checkouts/OCMock/Source/OCMock.xcodeproj; sourceTree = ""; }; - 7C5F7ED929211E5E0035B219 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; - 7C5F7EDB29211E640035B219 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; - 7C5F7EDD29211E6A0035B219 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - 7C5F7EDF29211E6E0035B219 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 7C5F7EE129211E870035B219 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; - 7C77D03C292913CF00C4D90E /* FBSDKCoreKit_Basics.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKCoreKit_Basics.xcframework; path = ../Carthage/Build/FBSDKCoreKit_Basics.xcframework; sourceTree = ""; }; - 7C77D044292913CF00C4D90E /* FBSDKCoreKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKCoreKit.xcframework; path = ../Carthage/Build/FBSDKCoreKit.xcframework; sourceTree = ""; }; - 7C77D045292913CF00C4D90E /* FBAEMKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBAEMKit.xcframework; path = ../Carthage/Build/FBAEMKit.xcframework; sourceTree = ""; }; - 7C77D046292913CF00C4D90E /* FBSDKLoginKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKLoginKit.xcframework; path = ../Carthage/Build/FBSDKLoginKit.xcframework; sourceTree = ""; }; - 7C77D0502929156900C4D90E /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/usr/lib/libc++.tbd"; sourceTree = DEVELOPER_DIR; }; - 7C77D0522929157600C4D90E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.1.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; - 7CACE61A291EA74D003359B5 /* ParseFacebookUtilsiOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseFacebookUtilsiOS-Dynamic.xcconfig"; sourceTree = ""; }; - 7CACE61B291EA74D003359B5 /* ParseFacebookUtilsiOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ParseFacebookUtilsiOS.xcconfig; sourceTree = ""; }; - 7CACE61E291EA75A003359B5 /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; - 7CACE61F291EA75A003359B5 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; - 7CACE621291EA75A003359B5 /* PFFacebookUtilsDevice.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookUtilsDevice.h; sourceTree = ""; }; - 7CACE622291EA75A003359B5 /* ParseFacebookUtilsiOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseFacebookUtilsiOS.h; sourceTree = ""; }; - 7CACE623291EA75A003359B5 /* PFFacebookUtilsDevice.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookUtilsDevice.m; sourceTree = ""; }; - 7CACE626291EA75A003359B5 /* PFFacebookUtils_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookUtils_Private.h; sourceTree = ""; }; - 7CACE627291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFFacebookMobileAuthenticationProvider.m; sourceTree = ""; }; - 7CACE628291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookMobileAuthenticationProvider.h; sourceTree = ""; }; - 7CACE629291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFFacebookMobileAuthenticationProvider_Private.h; sourceTree = ""; }; - 8121EA9F1D39862400AC0B02 /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; - 8121EAA11D39862400AC0B02 /* iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = iOS.xcconfig; sourceTree = ""; }; - 8121EAA21D39862400AC0B02 /* macOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = macOS.xcconfig; sourceTree = ""; }; - 8121EAA31D39862400AC0B02 /* tvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = tvOS.xcconfig; sourceTree = ""; }; - 8121EAA41D39862400AC0B02 /* watchOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = watchOS.xcconfig; sourceTree = ""; }; - 8121EAA61D39862400AC0B02 /* Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Application.xcconfig; sourceTree = ""; }; - 8121EAA71D39862400AC0B02 /* DynamicFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DynamicFramework.xcconfig; sourceTree = ""; }; - 8121EAA81D39862400AC0B02 /* LogicTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = LogicTests.xcconfig; sourceTree = ""; }; - 8121EAA91D39862400AC0B02 /* StaticFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = StaticFramework.xcconfig; sourceTree = ""; }; - 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 8121EAAC1D39862400AC0B02 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8121EAAD1D39862400AC0B02 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 81CB98C61AB7905D00136FA5 /* ParseFacebookUtilsiOS-UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ParseFacebookUtilsiOS-UnitTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 841999BC29475725000D241B /* Parse.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Parse.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 841999C729475730000D241B /* Parse.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Parse.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 841999CF29475911000D241B /* Parse.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Parse.xcodeproj; path = "/Users/admin/Documents/Projects/Parse-SDK-iOS-OSX/Parse/Parse.xcodeproj"; sourceTree = ""; }; - D2AAC07E0554694100DB518D /* ParseFacebookUtilsiOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseFacebookUtilsiOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F535C73B1B54B4A800A7D81E /* ParseFacebookTestApplication.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseFacebookTestApplication.app; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 4AAEAA6B200C020E00AA7479 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D0532929157600C4D90E /* Accelerate.framework in Frameworks */, - 7C77D0512929156900C4D90E /* libc++.tbd in Frameworks */, - 7C77D04C292913EC00C4D90E /* FBAEMKit.xcframework in Frameworks */, - 7C77D04D292913EC00C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */, - 7C77D04E292913EC00C4D90E /* FBSDKCoreKit.xcframework in Frameworks */, - 7C77D04F292913EC00C4D90E /* FBSDKLoginKit.xcframework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81CB98C31AB7905D00136FA5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7CD81D17292D16DC0074F64D /* ParseFacebookUtilsV4.framework in Frameworks */, - 7C5F7EE229211E870035B219 /* Accelerate.framework in Frameworks */, - 7C5F7EE029211E6E0035B219 /* AudioToolbox.framework in Frameworks */, - 7C5F7EDE29211E6A0035B219 /* SystemConfiguration.framework in Frameworks */, - 7C5F7EDC29211E640035B219 /* libc++.tbd in Frameworks */, - 7C5F7EDA29211E5E0035B219 /* libsqlite3.tbd in Frameworks */, - 7C5F7ED729211E120035B219 /* OCMock.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D047292913DC00C4D90E /* FBAEMKit.xcframework in Frameworks */, - 7C77D048292913DC00C4D90E /* FBSDKCoreKit_Basics.xcframework in Frameworks */, - 7C77D049292913DC00C4D90E /* FBSDKCoreKit.xcframework in Frameworks */, - 7C77D04A292913DC00C4D90E /* FBSDKLoginKit.xcframework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F535C7381B54B4A800A7D81E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - D2AAC07E0554694100DB518D /* ParseFacebookUtilsiOS.framework */, - 81CB98C61AB7905D00136FA5 /* ParseFacebookUtilsiOS-UnitTests.xctest */, - F535C73B1B54B4A800A7D81E /* ParseFacebookTestApplication.app */, - 4AAEAA75200C020E00AA7479 /* ParseFacebookUtilsiOS.framework */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* Breakpad */ = { - isa = PBXGroup; - children = ( - F52CD63A1B58383C0051AB86 /* Configurations */, - 7CACE61C291EA75A003359B5 /* ParseFacebookUtilsiOS */, - 7C5F7E1929210C970035B219 /* Tests */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - 841999CF29475911000D241B /* Parse.xcodeproj */, - ); - indentWidth = 4; - name = Breakpad; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 841999C729475730000D241B /* Parse.framework */, - 841999BC29475725000D241B /* Parse.framework */, - 7C77D0522929157600C4D90E /* Accelerate.framework */, - 7C77D0502929156900C4D90E /* libc++.tbd */, - 7C5F7EE129211E870035B219 /* Accelerate.framework */, - 7C5F7EDF29211E6E0035B219 /* AudioToolbox.framework */, - 7C5F7EDD29211E6A0035B219 /* SystemConfiguration.framework */, - 7C5F7EDB29211E640035B219 /* libc++.tbd */, - 7C5F7ED929211E5E0035B219 /* libsqlite3.tbd */, - 7C77D045292913CF00C4D90E /* FBAEMKit.xcframework */, - 7C77D03C292913CF00C4D90E /* FBSDKCoreKit_Basics.xcframework */, - 7C77D044292913CF00C4D90E /* FBSDKCoreKit.xcframework */, - 7C77D046292913CF00C4D90E /* FBSDKLoginKit.xcframework */, - 7C5F7E99292119EA0035B219 /* OCMock.xcodeproj */, - 7C5F7E3929210E580035B219 /* ParseFacebookUtils.xcodeproj */, - ); - name = Frameworks; - sourceTree = ""; - }; - 7C5F7E1929210C970035B219 /* Tests */ = { - isa = PBXGroup; - children = ( - 7C5F7E1A29210C970035B219 /* Unit */, - 7C5F7E1D29210C970035B219 /* Resources */, - 7C5F7E1F29210C970035B219 /* Other */, - 7C5F7E2329210C970035B219 /* TestApplication */, - ); - path = Tests; - sourceTree = ""; - }; - 7C5F7E1A29210C970035B219 /* Unit */ = { - isa = PBXGroup; - children = ( - 7C5F7E1B29210C970035B219 /* FacebookUtilsTests.m */, - 7C5F7E1C29210C970035B219 /* FacebookAuthenticationProviderTests.m */, - ); - path = Unit; - sourceTree = ""; - }; - 7C5F7E1D29210C970035B219 /* Resources */ = { - isa = PBXGroup; - children = ( - 7C5F7E1E29210C970035B219 /* Info.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 7C5F7E1F29210C970035B219 /* Other */ = { - isa = PBXGroup; - children = ( - 7C5F7E2029210C970035B219 /* TestCase */, - ); - path = Other; - sourceTree = ""; - }; - 7C5F7E2029210C970035B219 /* TestCase */ = { - isa = PBXGroup; - children = ( - 7C5F7E2129210C970035B219 /* PFFacebookTestCase.m */, - 7C5F7E2229210C970035B219 /* PFFacebookTestCase.h */, - ); - path = TestCase; - sourceTree = ""; - }; - 7C5F7E2329210C970035B219 /* TestApplication */ = { - isa = PBXGroup; - children = ( - 7C5F7E2429210C970035B219 /* Classes */, - 7C5F7E2629210C970035B219 /* Resources */, - ); - path = TestApplication; - sourceTree = ""; - }; - 7C5F7E2429210C970035B219 /* Classes */ = { - isa = PBXGroup; - children = ( - 7C5F7E2529210C970035B219 /* main.m */, - ); - path = Classes; - sourceTree = ""; - }; - 7C5F7E2629210C970035B219 /* Resources */ = { - isa = PBXGroup; - children = ( - 7C5F7E2729210C970035B219 /* Info.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 7C5F7E3A29210E580035B219 /* Products */ = { - isa = PBXGroup; - children = ( - 7C5F7E5D29210E590035B219 /* ParseFacebookUtilsV4.framework */, - 7C5F7E5F29210E590035B219 /* ParseFacebookUtilsV4.framework */, - 7C5F7E6129210E590035B219 /* ParseFacebookUtilsV4.framework */, - 7C5F7E6329210E590035B219 /* ParseFacebookUtilsV4.framework */, - ); - name = Products; - sourceTree = ""; - }; - 7C5F7E96292116960035B219 /* exclude */ = { - isa = PBXGroup; - children = ( - ); - path = exclude; - sourceTree = ""; - }; - 7C5F7E9A292119EA0035B219 /* Products */ = { - isa = PBXGroup; - children = ( - 7C5F7EA4292119EA0035B219 /* OCMock.framework */, - 7C5F7EA6292119EA0035B219 /* OCMockTests.xctest */, - 7C5F7EA8292119EA0035B219 /* libOCMock.a */, - 7C5F7EAA292119EA0035B219 /* OCMockLibTests.xctest */, - 7C5F7EAC292119EA0035B219 /* OCMock.framework */, - 7C5F7EAE292119EA0035B219 /* OCMock.framework */, - 7C5F7EB0292119EA0035B219 /* OCMock.framework */, - ); - name = Products; - sourceTree = ""; - }; - 7CACE61C291EA75A003359B5 /* ParseFacebookUtilsiOS */ = { - isa = PBXGroup; - children = ( - 7C5F7E96292116960035B219 /* exclude */, - 7CACE61D291EA75A003359B5 /* Resources */, - 7CACE620291EA75A003359B5 /* Source */, - 7CACE624291EA75A003359B5 /* Internal */, - ); - path = ParseFacebookUtilsiOS; - sourceTree = ""; - }; - 7CACE61D291EA75A003359B5 /* Resources */ = { - isa = PBXGroup; - children = ( - 7CACE61E291EA75A003359B5 /* Info-iOS.plist */, - 7CACE61F291EA75A003359B5 /* Localizable.strings */, - ); - path = Resources; - sourceTree = ""; - }; - 7CACE620291EA75A003359B5 /* Source */ = { - isa = PBXGroup; - children = ( - 7CACE622291EA75A003359B5 /* ParseFacebookUtilsiOS.h */, - 7CACE621291EA75A003359B5 /* PFFacebookUtilsDevice.h */, - 7CACE623291EA75A003359B5 /* PFFacebookUtilsDevice.m */, - ); - path = Source; - sourceTree = ""; - }; - 7CACE624291EA75A003359B5 /* Internal */ = { - isa = PBXGroup; - children = ( - 7CACE625291EA75A003359B5 /* AuthenticationProvider */, - ); - path = Internal; - sourceTree = ""; - }; - 7CACE625291EA75A003359B5 /* AuthenticationProvider */ = { - isa = PBXGroup; - children = ( - 7CACE626291EA75A003359B5 /* PFFacebookUtils_Private.h */, - 7CACE627291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.m */, - 7CACE628291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider.h */, - 7CACE629291EA75A003359B5 /* PFFacebookMobileAuthenticationProvider_Private.h */, - ); - path = AuthenticationProvider; - sourceTree = ""; - }; - 8121EA9E1D39862400AC0B02 /* Shared */ = { - isa = PBXGroup; - children = ( - 8121EA9F1D39862400AC0B02 /* Common.xcconfig */, - 8121EAA01D39862400AC0B02 /* Platform */, - 8121EAA51D39862400AC0B02 /* Product */, - 8121EAAA1D39862400AC0B02 /* Project */, - 8121EAAD1D39862400AC0B02 /* Warnings.xcconfig */, - ); - path = Shared; - sourceTree = ""; - }; - 8121EAA01D39862400AC0B02 /* Platform */ = { - isa = PBXGroup; - children = ( - 8121EAA11D39862400AC0B02 /* iOS.xcconfig */, - 8121EAA21D39862400AC0B02 /* macOS.xcconfig */, - 8121EAA31D39862400AC0B02 /* tvOS.xcconfig */, - 8121EAA41D39862400AC0B02 /* watchOS.xcconfig */, - ); - path = Platform; - sourceTree = ""; - }; - 8121EAA51D39862400AC0B02 /* Product */ = { - isa = PBXGroup; - children = ( - 8121EAA61D39862400AC0B02 /* Application.xcconfig */, - 8121EAA71D39862400AC0B02 /* DynamicFramework.xcconfig */, - 8121EAA81D39862400AC0B02 /* LogicTests.xcconfig */, - 8121EAA91D39862400AC0B02 /* StaticFramework.xcconfig */, - ); - path = Product; - sourceTree = ""; - }; - 8121EAAA1D39862400AC0B02 /* Project */ = { - isa = PBXGroup; - children = ( - 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */, - 8121EAAC1D39862400AC0B02 /* Release.xcconfig */, - ); - path = Project; - sourceTree = ""; - }; - 841999D029475911000D241B /* Products */ = { - isa = PBXGroup; - children = ( - 841999DF29475911000D241B /* Parse.framework */, - 841999E129475911000D241B /* Parse.framework */, - 841999E329475911000D241B /* ParseUnitTests-iOS.xctest */, - 841999E529475911000D241B /* Parse.framework */, - 841999E729475911000D241B /* ParseUnitTests-macOS.xctest */, - 841999E929475911000D241B /* Parse.framework */, - 841999EB29475911000D241B /* Parse.framework */, - 841999ED29475911000D241B /* Parse.framework */, - 841999EF29475911000D241B /* Parse.framework */, - 841999F129475911000D241B /* ParseUnitTests-iOS-host.app */, - ); - name = Products; - sourceTree = ""; - }; - F52CD63A1B58383C0051AB86 /* Configurations */ = { - isa = PBXGroup; - children = ( - 7CACE61A291EA74D003359B5 /* ParseFacebookUtilsiOS-Dynamic.xcconfig */, - 7CACE61B291EA74D003359B5 /* ParseFacebookUtilsiOS.xcconfig */, - 7C5F7E2C29210CF30035B219 /* ParseFacebookTestApplication.xcconfig */, - 7C5F7E2D29210CF30035B219 /* ParseFacebookUtils-UnitTests.xcconfig */, - 8121EA9E1D39862400AC0B02 /* Shared */, - ); - path = Configurations; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 4AAEAA5E200C020E00AA7479 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7E8F292114340035B219 /* PFFacebookUtilsDevice.h in Headers */, - 7C5F7E90292114340035B219 /* ParseFacebookUtilsiOS.h in Headers */, - 7C5F7E91292114340035B219 /* PFFacebookUtils_Private.h in Headers */, - 7C5F7E92292114340035B219 /* PFFacebookMobileAuthenticationProvider.h in Headers */, - 7C5F7E93292114350035B219 /* PFFacebookMobileAuthenticationProvider_Private.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07A0554694100DB518D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7E8129210E760035B219 /* PFFacebookUtilsDevice.h in Headers */, - 7C5F7E8229210E760035B219 /* ParseFacebookUtilsiOS.h in Headers */, - 7C5F7E8329210E760035B219 /* PFFacebookUtils_Private.h in Headers */, - 7C5F7E8429210E760035B219 /* PFFacebookMobileAuthenticationProvider.h in Headers */, - 7C5F7E8529210E760035B219 /* PFFacebookMobileAuthenticationProvider_Private.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 4AAEAA5B200C020E00AA7479 /* ParseFacebookUtilsiOS-Dynamic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4AAEAA72200C020E00AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsiOS-Dynamic" */; - buildPhases = ( - 4AAEAA5E200C020E00AA7479 /* Headers */, - 4AAEAA66200C020E00AA7479 /* Sources */, - 4AAEAA6B200C020E00AA7479 /* Frameworks */, - 4AAEAA70200C020E00AA7479 /* Resources */, - BCCC20E1271F1BAB003C9D03 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 7C5F7E8E292114240035B219 /* PBXTargetDependency */, - ); - name = "ParseFacebookUtilsiOS-Dynamic"; - packageProductDependencies = ( - ); - productName = Breakpad; - productReference = 4AAEAA75200C020E00AA7479 /* ParseFacebookUtilsiOS.framework */; - productType = "com.apple.product-type.framework"; - }; - 81CB98C51AB7905D00136FA5 /* ParseFacebookUtils-UnitTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 81CB98D11AB7905D00136FA5 /* Build configuration list for PBXNativeTarget "ParseFacebookUtils-UnitTests" */; - buildPhases = ( - 81CB98C21AB7905D00136FA5 /* Sources */, - 81CB98C31AB7905D00136FA5 /* Frameworks */, - 81CB98C41AB7905D00136FA5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - B9A7EEB723C49C89003E606E /* PBXTargetDependency */, - B9A7EE7423C49272003E606E /* PBXTargetDependency */, - ); - name = "ParseFacebookUtils-UnitTests"; - productName = "ParseFacebookUtilsV4-Tests"; - productReference = 81CB98C61AB7905D00136FA5 /* ParseFacebookUtilsiOS-UnitTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - D2AAC07D0554694100DB518D /* ParseFacebookUtilsiOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsiOS" */; - buildPhases = ( - D2AAC07A0554694100DB518D /* Headers */, - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - 8139B1341A7BF6B5002BEF84 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 7C5F7E8029210E600035B219 /* PBXTargetDependency */, - ); - name = ParseFacebookUtilsiOS; - packageProductDependencies = ( - ); - productName = Breakpad; - productReference = D2AAC07E0554694100DB518D /* ParseFacebookUtilsiOS.framework */; - productType = "com.apple.product-type.framework"; - }; - F535C73A1B54B4A800A7D81E /* ParseFacebookTestApplication */ = { - isa = PBXNativeTarget; - buildConfigurationList = F535C75B1B54B4A800A7D81E /* Build configuration list for PBXNativeTarget "ParseFacebookTestApplication" */; - buildPhases = ( - F535C7371B54B4A800A7D81E /* Sources */, - F535C7381B54B4A800A7D81E /* Frameworks */, - F535C7391B54B4A800A7D81E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ParseFacebookTestApplication; - productName = ParseFacebookTestApplicationV4; - productReference = F535C73B1B54B4A800A7D81E /* ParseFacebookTestApplication.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = PF; - LastUpgradeCheck = 0920; - ORGANIZATIONNAME = "Parse, LLC"; - TargetAttributes = { - 4AAEAA5B200C020E00AA7479 = { - LastSwiftMigration = 1410; - ProvisioningStyle = Manual; - }; - 81CB98C51AB7905D00136FA5 = { - CreatedOnToolsVersion = 6.2; - ProvisioningStyle = Manual; - TestTargetID = F535C73A1B54B4A800A7D81E; - }; - D2AAC07D0554694100DB518D = { - ProvisioningStyle = Manual; - }; - F535C73A1B54B4A800A7D81E = { - CreatedOnToolsVersion = 6.4; - ProvisioningStyle = Manual; - }; - }; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseFacebookUtilsiOS" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 1; - knownRegions = ( - da, - de, - es, - fr, - it, - ja, - nl, - no, - sl, - sv, - tr, - en, - Base, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; - packageReferences = ( - ); - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 7C5F7E9A292119EA0035B219 /* Products */; - ProjectRef = 7C5F7E99292119EA0035B219 /* OCMock.xcodeproj */; - }, - { - ProductGroup = 841999D029475911000D241B /* Products */; - ProjectRef = 841999CF29475911000D241B /* Parse.xcodeproj */; - }, - { - ProductGroup = 7C5F7E3A29210E580035B219 /* Products */; - ProjectRef = 7C5F7E3929210E580035B219 /* ParseFacebookUtils.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - D2AAC07D0554694100DB518D /* ParseFacebookUtilsiOS */, - 4AAEAA5B200C020E00AA7479 /* ParseFacebookUtilsiOS-Dynamic */, - 81CB98C51AB7905D00136FA5 /* ParseFacebookUtils-UnitTests */, - F535C73A1B54B4A800A7D81E /* ParseFacebookTestApplication */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 7C5F7E5D29210E590035B219 /* ParseFacebookUtilsV4.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsV4.framework; - remoteRef = 7C5F7E5C29210E590035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C5F7E5F29210E590035B219 /* ParseFacebookUtilsV4.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsV4.framework; - remoteRef = 7C5F7E5E29210E590035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C5F7E6129210E590035B219 /* ParseFacebookUtilsV4.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsV4.framework; - remoteRef = 7C5F7E6029210E590035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C5F7E6329210E590035B219 /* ParseFacebookUtilsV4.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsV4.framework; - remoteRef = 7C5F7E6229210E590035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C5F7EA4292119EA0035B219 /* OCMock.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = OCMock.framework; - remoteRef = 7C5F7EA3292119EA0035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C5F7EA6292119EA0035B219 /* OCMockTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = OCMockTests.xctest; - remoteRef = 7C5F7EA5292119EA0035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C5F7EA8292119EA0035B219 /* libOCMock.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libOCMock.a; - remoteRef = 7C5F7EA7292119EA0035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C5F7EAA292119EA0035B219 /* OCMockLibTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = OCMockLibTests.xctest; - remoteRef = 7C5F7EA9292119EA0035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C5F7EAC292119EA0035B219 /* OCMock.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = OCMock.framework; - remoteRef = 7C5F7EAB292119EA0035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C5F7EAE292119EA0035B219 /* OCMock.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = OCMock.framework; - remoteRef = 7C5F7EAD292119EA0035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C5F7EB0292119EA0035B219 /* OCMock.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = OCMock.framework; - remoteRef = 7C5F7EAF292119EA0035B219 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 841999DF29475911000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 841999DE29475911000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 841999E129475911000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 841999E029475911000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 841999E329475911000D241B /* ParseUnitTests-iOS.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ParseUnitTests-iOS.xctest"; - remoteRef = 841999E229475911000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 841999E529475911000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 841999E429475911000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 841999E729475911000D241B /* ParseUnitTests-macOS.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ParseUnitTests-macOS.xctest"; - remoteRef = 841999E629475911000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 841999E929475911000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 841999E829475911000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 841999EB29475911000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 841999EA29475911000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 841999ED29475911000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 841999EC29475911000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 841999EF29475911000D241B /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 841999EE29475911000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 841999F129475911000D241B /* ParseUnitTests-iOS-host.app */ = { - isa = PBXReferenceProxy; - fileType = wrapper.application; - path = "ParseUnitTests-iOS-host.app"; - remoteRef = 841999F029475911000D241B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 4AAEAA70200C020E00AA7479 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8139B1341A7BF6B5002BEF84 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81CB98C41AB7905D00136FA5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F535C7391B54B4A800A7D81E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 4AAEAA66200C020E00AA7479 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7E94292114410035B219 /* PFFacebookUtilsDevice.m in Sources */, - 7C5F7E95292114410035B219 /* PFFacebookMobileAuthenticationProvider.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81CB98C21AB7905D00136FA5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7E2929210C9C0035B219 /* FacebookAuthenticationProviderTests.m in Sources */, - 7C5F7E2A29210CA00035B219 /* PFFacebookTestCase.m in Sources */, - 7C5F7E2829210C9C0035B219 /* FacebookUtilsTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7E8629210E890035B219 /* PFFacebookUtilsDevice.m in Sources */, - 7C5F7E8729210E890035B219 /* PFFacebookMobileAuthenticationProvider.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F535C7371B54B4A800A7D81E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C5F7E2B29210CA20035B219 /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 7C5F7E8029210E600035B219 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "ParseFacebookUtilsV4-iOS"; - targetProxy = 7C5F7E7F29210E600035B219 /* PBXContainerItemProxy */; - }; - 7C5F7E8E292114240035B219 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "ParseFacebookUtilsV4-iOS-Dynamic"; - targetProxy = 7C5F7E8D292114240035B219 /* PBXContainerItemProxy */; - }; - B9A7EE7423C49272003E606E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = F535C73A1B54B4A800A7D81E /* ParseFacebookTestApplication */; - targetProxy = B9A7EE7323C49272003E606E /* PBXContainerItemProxy */; - }; - B9A7EEB723C49C89003E606E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = D2AAC07D0554694100DB518D /* ParseFacebookUtilsiOS */; - targetProxy = B9A7EEB623C49C89003E606E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7CACE61B291EA74D003359B5 /* ParseFacebookUtilsiOS.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/ParseFacebookUtilsiOS/Resources/Info-iOS.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7CACE61B291EA74D003359B5 /* ParseFacebookUtilsiOS.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/ParseFacebookUtilsiOS/Resources/Info-iOS.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8121EAAB1D39862400AC0B02 /* Debug.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8121EAAC1D39862400AC0B02 /* Release.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = NO; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Release; - }; - 4AAEAA73200C020E00AA7479 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7CACE61A291EA74D003359B5 /* ParseFacebookUtilsiOS-Dynamic.xcconfig */; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - CLANG_MODULES_AUTOLINK = YES; - CODE_SIGN_STYLE = Manual; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/ParseFacebookUtilsiOS/Resources/Info-iOS.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SUPPORTS_MACCATALYST = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 4AAEAA74200C020E00AA7479 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7CACE61A291EA74D003359B5 /* ParseFacebookUtilsiOS-Dynamic.xcconfig */; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - CLANG_MODULES_AUTOLINK = YES; - CODE_SIGN_STYLE = Manual; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/ParseFacebookUtilsiOS/Resources/Info-iOS.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SUPPORTS_MACCATALYST = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 81CB98CF1AB7905D00136FA5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7C5F7E2D29210CF30035B219 /* ParseFacebookUtils-UnitTests.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/Tests/Resources/Info.plist"; - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios.unit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; - }; - name = Debug; - }; - 81CB98D01AB7905D00136FA5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7C5F7E2D29210CF30035B219 /* ParseFacebookUtils-UnitTests.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/Tests/Resources/Info.plist"; - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios.unit; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; - }; - name = Release; - }; - F535C75C1B54B4A800A7D81E /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7C5F7E2C29210CF30035B219 /* ParseFacebookTestApplication.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = "$(SRCROOT)/Tests/TestApplication/Resources/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios.unit.app; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - }; - name = Debug; - }; - F535C75D1B54B4A800A7D81E /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7C5F7E2C29210CF30035B219 /* ParseFacebookTestApplication.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = "$(SRCROOT)/Tests/TestApplication/Resources/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.parse.facebookutilsios.unit.app; - PROVISIONING_PROFILE_SPECIFIER = ""; - SDKROOT = iphoneos; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsiOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 1DEB922008733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseFacebookUtilsiOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4AAEAA72200C020E00AA7479 /* Build configuration list for PBXNativeTarget "ParseFacebookUtilsiOS-Dynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4AAEAA73200C020E00AA7479 /* Debug */, - 4AAEAA74200C020E00AA7479 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 81CB98D11AB7905D00136FA5 /* Build configuration list for PBXNativeTarget "ParseFacebookUtils-UnitTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 81CB98CF1AB7905D00136FA5 /* Debug */, - 81CB98D01AB7905D00136FA5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - F535C75B1B54B4A800A7D81E /* Build configuration list for PBXNativeTarget "ParseFacebookTestApplication" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F535C75C1B54B4A800A7D81E /* Debug */, - F535C75D1B54B4A800A7D81E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 04cd5dae9..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsiOS-Dynamic.xcscheme b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsiOS-Dynamic.xcscheme deleted file mode 100644 index 1d7f67478..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsiOS-Dynamic.xcscheme +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsiOS.xcscheme b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsiOS.xcscheme deleted file mode 100644 index b0d6603eb..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj/xcshareddata/xcschemes/ParseFacebookUtilsiOS.xcscheme +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider.h b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider.h deleted file mode 100644 index 3ad69742e..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import - -#if __has_include() -#import -#import -#else -#import "PFConstants.h" -#import "PFUser.h" -#endif - -#if __has_include() -#import -#else -#import "PFFacebookAuthenticationProvider.h" -#endif - -@class BFTask<__covariant BFGenericType>; - -NS_ASSUME_NONNULL_BEGIN - -@interface PFFacebookMobileAuthenticationProvider : PFFacebookAuthenticationProvider - -@property (nonatomic, strong, readonly) FBSDKLoginManager *loginManager; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider.m b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider.m deleted file mode 100644 index c83941654..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider.m +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookMobileAuthenticationProvider.h" -#import "PFFacebookMobileAuthenticationProvider_Private.h" - -#if __has_include() -#import -#import -#else -#import "BFTask.h" -#import "BFTaskCompletionSource.h" -#endif - -#if __has_include() -#import -#else -#import "PFConstants.h" -#endif - -#import -#import - -#if __has_include() -#import -#else -#import "PFFacebookUtils.h" -#endif - -@implementation PFFacebookMobileAuthenticationProvider - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -- (instancetype)initWithApplication:(UIApplication *)application - launchOptions:(nullable NSDictionary *)launchOptions { - self = [super initWithApplication:application launchOptions:launchOptions]; - if (!self) return self; - - _loginManager = [[FBSDKLoginManager alloc] init]; - - return self; -} - -///-------------------------------------- -#pragma mark - Authenticate -///-------------------------------------- - -- (BFTask*> *)authenticateAsyncWithReadPermissions:(nullable NSArray *)readPermissions - publishPermissions:(nullable NSArray *)publishPermissions - fromViewComtroller:(UIViewController *)viewController { - - NSArray *permissions = [readPermissions arrayByAddingObjectsFromArray:publishPermissions]; - - BFTaskCompletionSource *taskCompletionSource = [BFTaskCompletionSource taskCompletionSource]; - FBSDKLoginManagerLoginResultBlock resultHandler = ^(FBSDKLoginManagerLoginResult *result, NSError *error) { - if (result.isCancelled) { - [taskCompletionSource cancel]; - } else if (error) { - taskCompletionSource.error = error; - } else { - taskCompletionSource.result = [PFFacebookUtils userAuthenticationDataFromAccessToken:result.token]; - } - }; - - [self.loginManager logInWithPermissions:permissions fromViewController:viewController handler:resultHandler]; - - return taskCompletionSource.task; -} - -///-------------------------------------- -#pragma mark - PFUserAuthenticationDelegate -///-------------------------------------- - -- (BOOL)restoreAuthenticationWithAuthData:(nullable NSDictionary *)authData { - if (!authData) { - [self.loginManager logOut]; - } - return [super restoreAuthenticationWithAuthData:authData]; -} - -@end diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider_Private.h b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider_Private.h deleted file mode 100644 index 40a16547b..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookMobileAuthenticationProvider_Private.h +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import "PFFacebookMobileAuthenticationProvider.h" - -@class FBSDKAccessToken; - -@interface PFFacebookMobileAuthenticationProvider () - -@property (nonatomic, strong, readwrite) FBSDKLoginManager *loginManager; - -@end diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookUtils_Private.h b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookUtils_Private.h deleted file mode 100644 index 860f20e63..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Internal/AuthenticationProvider/PFFacebookUtils_Private.h +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookUtilsDevice.h" -#import "PFFacebookMobileAuthenticationProvider.h" - -@interface PFFacebookUtilsDevice (Private) - -+ (PFFacebookMobileAuthenticationProvider *)_authenticationProvider; -+ (void)_setAuthenticationProvider:(PFFacebookMobileAuthenticationProvider *)provider; - -@end diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Resources/Info-iOS.plist b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Resources/Info-iOS.plist deleted file mode 100644 index 999351ffc..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Resources/Info-iOS.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ParseFacebookUtilsiOS - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.19.4 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - iPhoneOS - - CFBundleVersion - 1.19.4 - MinimumOSVersion - 9.0 - - diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Resources/Localizable.strings b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Resources/Localizable.strings deleted file mode 100644 index e69de29bb..000000000 diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/PFFacebookUtilsDevice.h b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/PFFacebookUtilsDevice.h deleted file mode 100644 index 815c56e66..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/PFFacebookUtilsDevice.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// Header.h -// -// -// Created by Volodymyr Nazarkevych on 29.11.2022. -// - -#import - -#if __has_include() -#import -#else -#import "PFFacebookUtils.h" -#endif - -#import - -@interface PFFacebookUtilsDevice : PFFacebookUtils - -///-------------------------------------- -/// @name Interacting With Facebook -///-------------------------------------- - -/** - Initializes Parse Facebook Utils. - - You must provide your Facebook application ID as the value for FacebookAppID in your bundle's plist file - as described here: https://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/ - - @warning You must invoke this in order to use the Facebook functionality in Parse. - - @param launchOptions The launchOptions as passed to [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. - */ -+ (void)initializeFacebookWithApplicationLaunchOptions:(nullable NSDictionary *)launchOptions; - -/** - `FBSDKLoginManager` provides methods for configuring login behavior, default audience - and managing Facebook Access Token. - - @warning This method is available only on iOS. - - @return An instance of `FBSDKLoginManager` that is used by `PFFacebookUtils`. - */ -+ ( FBSDKLoginManager * _Nonnull)facebookLoginManager; - -@end diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/PFFacebookUtilsDevice.m b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/PFFacebookUtilsDevice.m deleted file mode 100644 index 320ee371e..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/PFFacebookUtilsDevice.m +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookUtilsDevice.h" -#if __has_include() -#import -#else -#import "BFExecutor.h" -#endif - -#if __has_include() -#import -#else -#import "Parse.h" -#endif - -#import - -#import "PFFacebookMobileAuthenticationProvider.h" - -@implementation PFFacebookUtilsDevice - -///-------------------------------------- -#pragma mark - Interacting With Facebook -///-------------------------------------- - -+ (void)initializeFacebookWithApplicationLaunchOptions:(NSDictionary *)launchOptions { - if (![Parse currentConfiguration]) { - // TODO: (nlutsenko) Remove this when Parse SDK throws on every access to Parse._currentManager - [NSException raise:NSInternalInconsistencyException format:@"PFFacebookUtils must be initialized after initializing Parse."]; - } - if (!authenticationProvider_) { - Class providerClass = nil; - - providerClass = [PFFacebookMobileAuthenticationProvider class]; - - PFFacebookAuthenticationProvider *provider = [providerClass providerWithApplication:[UIApplication sharedApplication] - launchOptions:launchOptions]; - [PFUser registerAuthenticationDelegate:provider forAuthType:PFFacebookUserAuthenticationType]; - - [self _setAuthenticationProvider:provider]; - } -} - -+ (FBSDKLoginManager *)facebookLoginManager { - PFFacebookMobileAuthenticationProvider *provider = (PFFacebookMobileAuthenticationProvider *)[self _authenticationProvider]; - return provider.loginManager; -} - -@end diff --git a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/ParseFacebookUtilsiOS.h b/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/ParseFacebookUtilsiOS.h deleted file mode 100644 index 3b0b2772b..000000000 --- a/ParseFacebookUtilsiOS/ParseFacebookUtilsiOS/Source/ParseFacebookUtilsiOS.h +++ /dev/null @@ -1,9 +0,0 @@ -// -// ParseFacebookUtilsiOS.h -// ParseFacebookUtilsiOS -// -// Created by Volodymyr Nazarkevych on 22.11.2022. -// Copyright © 2022 Parse, LLC. All rights reserved. -// - -#import "PFFacebookUtilsDevice.h" diff --git a/ParseFacebookUtilsiOS/Tests/Other/TestCase/PFFacebookTestCase.h b/ParseFacebookUtilsiOS/Tests/Other/TestCase/PFFacebookTestCase.h deleted file mode 100644 index 7941e897b..000000000 --- a/ParseFacebookUtilsiOS/Tests/Other/TestCase/PFFacebookTestCase.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@import XCTest; - -@interface PFFacebookTestCase : XCTestCase - -///-------------------------------------- -/// @name XCTestCase -///-------------------------------------- - -- (void)setUp NS_REQUIRES_SUPER; -- (void)tearDown NS_REQUIRES_SUPER; - -///-------------------------------------- -/// @name Expectations -///-------------------------------------- - -- (XCTestExpectation *)currentSelectorTestExpectation; -- (void)waitForTestExpectations; - -///-------------------------------------- -/// @name Mocks -///-------------------------------------- - -- (void)registerMockObject:(id)mockObject; - -@end - -#define _PFRegisterMock(mockObject) [self registerMockObject:mockObject] -#define _PFMockShim(method, args...) ({ id mock = method(args); _PFRegisterMock(mock); mock; }) -#define _PFOCMockWarning _Pragma("GCC warning \"Please use PF mocking methods instead of OCMock ones.\"") - -#define _PFStrictClassMock(kls) [OCMockObject mockForClass:kls] -#define _PFClassMock(kls) [OCMockObject niceMockForClass:kls] -#define _PFStrictProtocolMock(proto) [OCMockObject mockForProtocol:proto] -#define _PFProtocolMock(proto) [OCMockObject niceMockForProtocol:proto] -#define _PFPartialMock(obj) [OCMockObject partialMockForObject:obj] - -#define PFStrictClassMock(...) _PFMockShim(_PFStrictClassMock, __VA_ARGS__) -#define PFClassMock(...) _PFMockShim(_PFClassMock, __VA_ARGS__) -#define PFStrictProtocolMock(...) _PFMockShim(_PFStrictProtocolMock, __VA_ARGS__) -#define PFProtocolMock(...) _PFMockShim(_PFProtocolMock, __VA_ARGS__) -#define PFPartialMock(...) _PFMockShim(_PFPartialMock, __VA_ARGS__) - -#undef OCMStrictClassMock -#undef OCMClassMock -#undef OCMStrictProtocolMock -#undef OCMProtocolMock -#undef OCMPartialMock - -#define OCMStrictClassMock _PFOCMockWarning _PFStrictClassMock -#define OCMClassMock _PFOCMockWarning _PFClassMock -#define OCMStrictProtocolMock _PFOCMockWarning _PFStrictProtocolMock -#define OCMProtocolMock _PFOCMockWarning _PFProtocolMock -#define OCMPartialMock _PFOCMockWarning _PFPartialMock - -#define PFAssertIsKindOfClass(a1, a2, description...) \ -XCTAssertTrue([a1 isKindOfClass:[a2 class]], ## description) - -#define PFAssertNotKindOfClass(a1, a2, description...) \ -XCTAssertFalse([a1 isKindOfClass:[a2 class]], ## description) - -#define PFAssertThrowsInconsistencyException(expression, ...) \ -XCTAssertThrowsSpecificNamed(expression, NSException, NSInternalInconsistencyException, __VA_ARGS__) - -#define PFAssertThrowsInvalidArgumentException(expression, ...) \ -XCTAssertThrowsSpecificNamed(expression, NSException, NSInvalidArgumentException, __VA_ARGS__) - -#define PFAssertStringContains(a, b) XCTAssertTrue([(a) rangeOfString:(b)].location != NSNotFound) diff --git a/ParseFacebookUtilsiOS/Tests/Other/TestCase/PFFacebookTestCase.m b/ParseFacebookUtilsiOS/Tests/Other/TestCase/PFFacebookTestCase.m deleted file mode 100644 index a5414a149..000000000 --- a/ParseFacebookUtilsiOS/Tests/Other/TestCase/PFFacebookTestCase.m +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFFacebookTestCase.h" - -@implementation PFFacebookTestCase { - NSMutableArray *_mocks; - dispatch_queue_t _mockQueue; -} - -///-------------------------------------- -#pragma mark - XCTestCase -///-------------------------------------- - -- (void)setUp { - [super setUp]; - - _mocks = [[NSMutableArray alloc] init]; - _mockQueue = dispatch_queue_create("com.parse.tests.mock.queue", DISPATCH_QUEUE_SERIAL); -} - -- (void)tearDown { - dispatch_sync(_mockQueue, ^{ - [_mocks makeObjectsPerformSelector:@selector(stopMocking)]; - }); - - _mocks = nil; - _mockQueue = nil; - - [super tearDown]; -} - -///-------------------------------------- -#pragma mark - Helpers -///-------------------------------------- - -- (XCTestExpectation *)currentSelectorTestExpectation { - NSInvocation *invocation = self.invocation; - NSString *selectorName = invocation ? NSStringFromSelector(invocation.selector) : @"testExpectation"; - return [self expectationWithDescription:selectorName]; -} - -- (void)waitForTestExpectations { - [self waitForExpectationsWithTimeout:10.0 handler:nil]; -} - -///-------------------------------------- -#pragma mark - Mock Registration -///-------------------------------------- - -- (void)registerMockObject:(id)mockObject { - dispatch_sync(_mockQueue, ^{ - [_mocks addObject:mockObject]; - }); -} - -@end diff --git a/ParseFacebookUtilsiOS/Tests/Resources/Info.plist b/ParseFacebookUtilsiOS/Tests/Resources/Info.plist deleted file mode 100644 index ba72822e8..000000000 --- a/ParseFacebookUtilsiOS/Tests/Resources/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/ParseFacebookUtilsiOS/Tests/TestApplication/Classes/main.m b/ParseFacebookUtilsiOS/Tests/TestApplication/Classes/main.m deleted file mode 100644 index 453fc1227..000000000 --- a/ParseFacebookUtilsiOS/Tests/TestApplication/Classes/main.m +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@interface AppDelegate : NSObject - -@end - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; - window.rootViewController = [[UIViewController alloc] init]; - [window makeKeyAndVisible]; - return YES; -} - -@end - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/ParseFacebookUtilsiOS/Tests/TestApplication/Resources/Info.plist b/ParseFacebookUtilsiOS/Tests/TestApplication/Resources/Info.plist deleted file mode 100644 index 6dcc65160..000000000 --- a/ParseFacebookUtilsiOS/Tests/TestApplication/Resources/Info.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIcons - - CFBundleIcons~ipad - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/ParseFacebookUtilsiOS/Tests/Unit/FacebookAuthenticationProviderTests.m b/ParseFacebookUtilsiOS/Tests/Unit/FacebookAuthenticationProviderTests.m deleted file mode 100644 index 5c7dedf96..000000000 --- a/ParseFacebookUtilsiOS/Tests/Unit/FacebookAuthenticationProviderTests.m +++ /dev/null @@ -1,288 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -@import Bolts.BFTask; - -@import FBSDKCoreKit.FBSDKAccessToken; -@import FBSDKLoginKit; - -#import "PFFacebookMobileAuthenticationProvider_Private.h" -#import "PFFacebookTestCase.h" - -@interface FacebookAuthenticationProviderTests : PFFacebookTestCase - -@end - -@implementation FacebookAuthenticationProviderTests - -- (void)testAuthType { - XCTAssertEqualObjects(PFFacebookUserAuthenticationType, @"facebook"); -} - -- (void)testAuthenticateRead { - NSDictionary *expectedAuthData = @{ @"id" : @"fbId", - @"access_token" : @"token", - @"expiration_date" : @"1970-01-01T00:22:17.000Z" }; - - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - - OCMStub([mockedLoginManager logInWithPermissions:@[ @"read" ] - fromViewController:OCMOCK_ANY - handler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained FBSDKLoginManagerLoginResultBlock handler = nil; - [invocation getArgument:&handler atIndex:4]; - - FBSDKAccessToken *token = [[FBSDKAccessToken alloc] initWithTokenString:@"token" - permissions:@[ @"read" ] - declinedPermissions:@[] - expiredPermissions:@[] - appID:@"appId" - userID:@"fbId" - expirationDate:[NSDate dateWithTimeIntervalSince1970:1337] - refreshDate:[NSDate dateWithTimeIntervalSince1970:1337] - dataAccessExpirationDate:nil]; - - FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:token - authenticationToken:nil - isCancelled:NO - grantedPermissions:[NSSet setWithObject:@"read"] - declinedPermissions:[NSSet setWithArray:@[]]]; - - handler(result, nil); - }); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsyncWithReadPermissions:@[ @"read" ] - publishPermissions:nil] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.result, expectedAuthData); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testAuthenticatePublish { - NSDictionary *expectedAuthData = @{ @"id" : @"fbId", - @"access_token" : @"token", - @"expiration_date" : @"1970-01-01T00:22:17.000Z" }; - - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - - OCMStub([mockedLoginManager logInWithPermissions:@[ @"publish" ] - fromViewController:OCMOCK_ANY - handler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained FBSDKLoginManagerLoginResultBlock handler = nil; - [invocation getArgument:&handler atIndex:4]; - - FBSDKAccessToken *token = [[FBSDKAccessToken alloc] initWithTokenString:@"token" - permissions:@[ @"publish" ] - declinedPermissions:@[] - expiredPermissions:@[] - appID:@"appId" - userID:@"fbId" - expirationDate:[NSDate dateWithTimeIntervalSince1970:1337] - refreshDate:[NSDate dateWithTimeIntervalSince1970:1337] - dataAccessExpirationDate:nil]; - - FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:token - authenticationToken:nil - isCancelled:NO - grantedPermissions:[NSSet setWithObject:@"publish"] - declinedPermissions:[NSSet setWithArray:@[]]]; - - handler(result, nil); - }); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsyncWithReadPermissions:@[] - publishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.result, expectedAuthData); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testAuthenticateBoth { - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - OCMStub([mockedLoginManager logInWithPermissions:(@[ @"read", @"publish" ]) - fromViewController:OCMOCK_ANY - handler:OCMOCK_ANY]).andDo((^(NSInvocation *invocation) { - __unsafe_unretained FBSDKLoginManagerLoginResultBlock handler = nil; - [invocation getArgument:&handler atIndex:4]; - - FBSDKAccessToken *token = [[FBSDKAccessToken alloc] initWithTokenString:@"token" - permissions:@[ @"read", @"publish" ] - declinedPermissions:@[] - expiredPermissions:@[] - appID:@"appId" - userID:@"fbId" - expirationDate:[NSDate dateWithTimeIntervalSince1970:1337] - refreshDate:[NSDate dateWithTimeIntervalSince1970:1337] - dataAccessExpirationDate:nil]; - - FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:token - authenticationToken:nil - isCancelled:NO - grantedPermissions:[NSSet setWithArray:@[ @"read", @"publish" ]] - declinedPermissions:[NSSet setWithArray:@[]]]; - - handler(result, nil); - })); - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsyncWithReadPermissions:@[ @"read" ] publishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertNil(task.error); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testAuthenticateCancel { - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - - OCMStub([mockedLoginManager logInWithPermissions:@[ @"publish" ] - fromViewController:OCMOCK_ANY - handler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained FBSDKLoginManagerLoginResultBlock handler = nil; - [invocation getArgument:&handler atIndex:4]; - - FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:nil - authenticationToken:nil - isCancelled:YES - grantedPermissions:[NSSet setWithArray:@[]] - declinedPermissions:[NSSet setWithObject:@"publish"]]; - - handler(result, nil); - }); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsyncWithReadPermissions:@[] publishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertTrue(task.cancelled); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testAuthenticateError { - NSError *expectedError = [NSError errorWithDomain:@"FBSDK" code:1337 userInfo:nil]; - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - - OCMStub([mockedLoginManager logInWithPermissions:@[ @"publish" ] - fromViewController:OCMOCK_ANY - handler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained FBSDKLoginManagerLoginResultBlock handler = nil; - [invocation getArgument:&handler atIndex:4]; - - handler(nil, expectedError); - }); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsyncWithReadPermissions:@[] publishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.error, expectedError); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testAuthenticateInvalidResults { - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wnonnull" - - // Test simulates invalid input with a nil user. User is nonnull in the interface. Disabling that warning here. - - OCMStub([mockedLoginManager logInWithPermissions:@[ @"publish" ] - fromViewController:OCMOCK_ANY - handler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained FBSDKLoginManagerLoginResultBlock handler = nil; - [invocation getArgument:&handler atIndex:4]; - - FBSDKAccessToken *token = [[FBSDKAccessToken alloc] initWithTokenString:@"" - permissions:@[ @"publish" ] - declinedPermissions:@[] - expiredPermissions:@[] - appID:@"appId" - userID:nil - expirationDate:nil - refreshDate:nil - dataAccessExpirationDate:nil]; - - FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:token - authenticationToken:nil - isCancelled:NO - grantedPermissions:[NSSet setWithObject:@"publish"] - declinedPermissions:[NSSet setWithArray:@[]]]; - - handler(result, nil); - }); - -#pragma GCC diagnostic pop - - - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsyncWithReadPermissions:@[] publishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertNil(task.result); - XCTAssertFalse(task.faulted); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testReauthenticate { - NSDictionary *authData = @{ @"id" : @"fbId", - @"access_token" : @"token", - @"expiration_date" : @"1970-01-01T00:22:17.000Z" }; - - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTAssertTrue([provider restoreAuthenticationWithAuthData:authData]); -} - -- (void)testRestoreAuthNil { - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - OCMExpect([mockedLoginManager logOut]); - - PFFacebookMobileAuthenticationProvider *provider = [[PFFacebookMobileAuthenticationProvider alloc] initWithApplication:[UIApplication sharedApplication] launchOptions:nil]; - provider.loginManager = mockedLoginManager; - - XCTAssertTrue([provider restoreAuthenticationWithAuthData:nil]); - - OCMVerifyAll(mockedLoginManager); -} - -@end diff --git a/ParseFacebookUtilsiOS/Tests/Unit/FacebookUtilsTests.m b/ParseFacebookUtilsiOS/Tests/Unit/FacebookUtilsTests.m deleted file mode 100644 index 7d5a76842..000000000 --- a/ParseFacebookUtilsiOS/Tests/Unit/FacebookUtilsTests.m +++ /dev/null @@ -1,277 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -@import Parse; - -#import - -#import "PFFacebookTestCase.h" -#import "PFFacebookUtils_Private.h" - -#if __has_include() -#import -#else -#import "PFFacebookUtils.h" -#endif - -///-------------------------------------- -#pragma mark - FacebookUtilsTests -///-------------------------------------- - -@interface FacebookUtilsTests : PFFacebookTestCase - -@end - -@implementation FacebookUtilsTests - -///-------------------------------------- -#pragma mark - XCTestCase -///-------------------------------------- - -- (void)tearDown { - [PFFacebookUtilsDevice _setAuthenticationProvider:nil]; - - [super tearDown]; -} - -///-------------------------------------- -#pragma mark - Helpers -///-------------------------------------- - -- (NSDictionary *)sampleAuthData { - return @{ @"id" : @"fbId", - @"auth_token" : @"token", - @"expiration_date" : @"1970-01-01T00:22:17.000Z" }; -} - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -- (void)testInitialize { - id userMock = PFStrictClassMock([PFUser class]); - OCMExpect(ClassMethod([userMock registerAuthenticationDelegate:[OCMArg checkWithBlock:^BOOL(id obj) { - return (obj != nil); - }] forAuthType:@"facebook"])); - - XCTAssertThrows([PFFacebookUtilsDevice unlinkUserInBackground:userMock]); - - XCTAssertThrows([PFFacebookUtilsDevice initializeFacebookWithApplicationLaunchOptions:nil]); - - id parseMock = PFStrictClassMock([Parse class]); - id configurationMock = PFStrictClassMock([ParseClientConfiguration class]); - OCMStub(ClassMethod([parseMock currentConfiguration])).andReturn(configurationMock); - - XCTAssertNoThrow([PFFacebookUtilsDevice initializeFacebookWithApplicationLaunchOptions:nil]); - XCTAssertNotNil([PFFacebookUtilsDevice _authenticationProvider]); - XCTAssertNoThrow([PFFacebookUtilsDevice initializeFacebookWithApplicationLaunchOptions:nil]); - - OCMVerifyAll(userMock); -} - -- (void)testLoginManager { - id mockedLoginManager = PFStrictClassMock([FBSDKLoginManager class]); - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - - OCMStub([mockedAuthProvider loginManager]).andReturn(mockedLoginManager); - - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - XCTAssertEqualObjects(mockedLoginManager, [PFFacebookUtilsDevice facebookLoginManager]); -} - -- (void)testLoginReadPermissions { - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - OCMStub([mockedAuthProvider authenticateAsyncWithReadPermissions:@[ @"read" ] publishPermissions:nil]).andReturn([BFTask taskWithResult:@{}]); - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - - id userMock = PFStrictClassMock([PFUser class]); - OCMStub(ClassMethod([userMock logInWithAuthTypeInBackground:@"facebook" authData:[OCMArg isNotNil]])).andReturn([BFTask taskWithResult:userMock]); - - XCTestExpectation *taskExpecatation = [self expectationWithDescription:@"task"]; - [[PFFacebookUtilsDevice logInInBackgroundWithReadPermissions:@[ @"read" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertEqual(task.result, userMock); - [taskExpecatation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpecatation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice logInInBackgroundWithReadPermissions:@[ @"read" ] block:^(PFUser *resultUser, NSError *error) { - XCTAssertEqual(resultUser, userMock); - XCTAssertNil(error); - [blockExpecatation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testLoginWritePermissions { - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - OCMStub([mockedAuthProvider authenticateAsyncWithReadPermissions:nil publishPermissions:@[ @"publish" ]]).andReturn([BFTask taskWithResult:@{}]); - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - - id userMock = PFStrictClassMock([PFUser class]); - OCMStub(ClassMethod([userMock logInWithAuthTypeInBackground:@"facebook" authData:[OCMArg isNotNil]])).andReturn([BFTask taskWithResult:userMock]); - - XCTestExpectation *taskExpecatation = [self expectationWithDescription:@"task"]; - [[PFFacebookUtilsDevice logInInBackgroundWithPublishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertEqual(task.result, userMock); - [taskExpecatation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpecatation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice logInInBackgroundWithPublishPermissions:@[ @"publish" ] block:^(PFUser *resultUser, NSError *error) { - XCTAssertEqual(resultUser, userMock); - XCTAssertNil(error); - [blockExpecatation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testLoginWithAccessToken { - id mockedPrivateUtilities = PFStrictClassMock([PFFacebookUtils class]); - id mockedAccessToken = PFStrictClassMock([FBSDKAccessToken class]); - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - - // NOTE: (richardross) Until we decouple user login with auth data, we can only mock error cases here. - OCMStub(ClassMethod([mockedPrivateUtilities userAuthenticationDataFromAccessToken:mockedAccessToken])).andReturn(nil); - - XCTestExpectation *taskExpectation = [self expectationWithDescription:@"task"]; - [[PFFacebookUtilsDevice logInInBackgroundWithAccessToken:mockedAccessToken] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.error.domain, PFParseErrorDomain); - XCTAssertEqual(task.error.code, kPFErrorFacebookInvalidSession); - [taskExpectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpectation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice logInInBackgroundWithAccessToken:mockedAccessToken block:^(PFUser *user, NSError *error) { - XCTAssertNil(user); - XCTAssertEqualObjects(error.domain, PFParseErrorDomain); - XCTAssertEqual(error.code, kPFErrorFacebookInvalidSession); - [blockExpectation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testLinkWithReadPermissions { - id mockedUser = PFStrictClassMock([PFUser class]); - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - - OCMStub([mockedAuthProvider authenticateAsyncWithReadPermissions:@[ @"read" ] publishPermissions:nil]).andReturn([BFTask taskWithResult:@{}]); - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - - OCMStub([mockedUser linkWithAuthTypeInBackground:@"facebook" authData:[OCMArg isNotNil]]).andReturn([BFTask taskWithResult:@YES]); - - XCTestExpectation *taskExpecatation = [self expectationWithDescription:@"task"]; - [[PFFacebookUtilsDevice linkUserInBackground:mockedUser withReadPermissions:@[ @"read" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.result, @YES); - [taskExpecatation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpectation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice linkUserInBackground:mockedUser withReadPermissions:@[ @"read" ] block:^(BOOL result, NSError *error) { - XCTAssertTrue(result); - [blockExpectation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testLinkWithWritePermissions { - id mockedUser = PFStrictClassMock([PFUser class]); - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - - OCMStub([mockedAuthProvider authenticateAsyncWithReadPermissions:nil publishPermissions:@[ @"publish" ]]).andReturn([BFTask taskWithResult:@{}]); - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - OCMStub([mockedUser linkWithAuthTypeInBackground:@"facebook" authData:[OCMArg isNotNil]]).andReturn([BFTask taskWithResult:@YES]); - - XCTestExpectation *taskExpecation = [self expectationWithDescription:@"task"]; - [[PFFacebookUtilsDevice linkUserInBackground:mockedUser withPublishPermissions:@[ @"publish" ]] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.result, @YES); - [taskExpecation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpectation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice linkUserInBackground:mockedUser withPublishPermissions:@[ @"publish" ] block:^(BOOL result, NSError *error) { - XCTAssertTrue(result); - [blockExpectation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testLinkWithAccessToken { - id mockedPrivateUtilities = PFStrictClassMock([PFFacebookUtils class]); - id mockedAccessToken = PFStrictClassMock([FBSDKAccessToken class]); - id mockedUser = PFStrictClassMock([PFUser class]); - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - - NSDictionary *sampleAuthData = [self sampleAuthData]; - OCMStub(ClassMethod([mockedPrivateUtilities userAuthenticationDataFromAccessToken:mockedAccessToken])).andReturn(sampleAuthData); - - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - [OCMStub([mockedUser linkWithAuthTypeInBackground:@"facebook" authData:sampleAuthData]) andReturn:[BFTask taskWithResult:@YES]]; - - XCTestExpectation *taskExpecatation = [self expectationWithDescription:@"block"]; - [[PFFacebookUtilsDevice linkUserInBackground:mockedUser withAccessToken:mockedAccessToken] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.result, @YES); - [taskExpecatation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpectation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice linkUserInBackground:mockedUser withAccessToken:mockedAccessToken block:^(BOOL result, NSError *error) { - XCTAssertTrue(result); - [blockExpectation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testUnlink { - id mockedLinkedUser = PFStrictClassMock([PFUser class]); - id mockedAuthProvider = PFStrictClassMock([PFFacebookMobileAuthenticationProvider class]); - - [PFFacebookUtilsDevice _setAuthenticationProvider:mockedAuthProvider]; - [OCMStub([mockedLinkedUser unlinkWithAuthTypeInBackground:@"facebook"]) andReturn:[BFTask taskWithResult:@YES]]; - - XCTestExpectation *taskExpecatation = [self expectationWithDescription:@"block"]; - [[PFFacebookUtilsDevice unlinkUserInBackground:mockedLinkedUser] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.result, @YES); - [taskExpecatation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; - - XCTestExpectation *blockExpectation = [self expectationWithDescription:@"block"]; - [PFFacebookUtilsDevice unlinkUserInBackground:mockedLinkedUser block:^(BOOL result, NSError *error) { - XCTAssertTrue(result); - [blockExpectation fulfill]; - }]; - [self waitForTestExpectations]; -} - -- (void)testIsLinked { - id mockedLinkedUser = PFStrictClassMock([PFUser class]); - id mockedUnlinkedUser = PFStrictClassMock([PFUser class]); - - OCMStub([mockedLinkedUser isLinkedWithAuthType:@"facebook"]).andReturn(YES); - OCMStub([mockedUnlinkedUser isLinkedWithAuthType:@"facebook"]).andReturn(NO); - - XCTAssertTrue([PFFacebookUtilsDevice isLinkedWithUser:mockedLinkedUser]); - XCTAssertFalse([PFFacebookUtilsDevice isLinkedWithUser:mockedUnlinkedUser]); -} - -@end diff --git a/ParseLiveQuery/Examples/LiveQueryDemo.xcodeproj/project.pbxproj b/ParseLiveQuery/Examples/LiveQueryDemo.xcodeproj/project.pbxproj index 115b5245d..452c4732b 100644 --- a/ParseLiveQuery/Examples/LiveQueryDemo.xcodeproj/project.pbxproj +++ b/ParseLiveQuery/Examples/LiveQueryDemo.xcodeproj/project.pbxproj @@ -3,10 +3,11 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ + 6B63F16A2BC3560300F89DEE /* ParseLiveQuery in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F1692BC3560300F89DEE /* ParseLiveQuery */; }; F509D5291CA9E53D007B15B0 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = F59F85B61C9BB4B600566A29 /* Message.swift */; }; F509D52A1CA9E53D007B15B0 /* Room.swift in Sources */ = {isa = PBXBuildFile; fileRef = F59F85B71C9BB4B600566A29 /* Room.swift */; }; F509D52B1CA9E53D007B15B0 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = F59F85AF1C9BB48200566A29 /* main.swift */; }; @@ -57,6 +58,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 6B63F16A2BC3560300F89DEE /* ParseLiveQuery in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -128,6 +130,9 @@ dependencies = ( ); name = LiveQueryDemo; + packageProductDependencies = ( + 6B63F1692BC3560300F89DEE /* ParseLiveQuery */, + ); productName = AppKitDemo; productReference = F509D5171CA9E4AE007B15B0 /* LiveQueryDemo.app */; productType = "com.apple.product-type.application"; @@ -235,7 +240,10 @@ CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = "$(SRCROOT)/LiveQueryDemo/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_BUNDLE_IDENTIFIER = com.parse.LiveQueryDemo; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -251,7 +259,10 @@ CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = "$(SRCROOT)/LiveQueryDemo/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_BUNDLE_IDENTIFIER = com.parse.LiveQueryDemo; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -358,7 +369,8 @@ MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; }; name = Release; }; @@ -384,6 +396,13 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCSwiftPackageProductDependency section */ + 6B63F1692BC3560300F89DEE /* ParseLiveQuery */ = { + isa = XCSwiftPackageProductDependency; + productName = ParseLiveQuery; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = F59F85A41C9BB48200566A29 /* Project object */; } diff --git a/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist b/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist index 271216d49..35d77674d 100644 --- a/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleVersion - 2.7.3 + 3.0.0 diff --git a/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist b/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist index 271216d49..35d77674d 100644 --- a/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleVersion - 2.7.3 + 3.0.0 diff --git a/ParseLiveQuery/ParseLiveQuery.xcodeproj/project.pbxproj b/ParseLiveQuery/ParseLiveQuery.xcodeproj/project.pbxproj index c4d956711..2e1717f2a 100644 --- a/ParseLiveQuery/ParseLiveQuery.xcodeproj/project.pbxproj +++ b/ParseLiveQuery/ParseLiveQuery.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -11,16 +11,16 @@ 0632EDD51CA1A6DB00DD3CB8 /* Parse+LiveQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0632EDD31CA1A6DB00DD3CB8 /* Parse+LiveQuery.swift */; }; 094AE9001E25AF3100F408BC /* libicucore.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 094AE8FF1E25AF3100F408BC /* libicucore.tbd */; }; 09D80FE21E26C05200AC7A2D /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 09D80FE11E26C05200AC7A2D /* libsqlite3.tbd */; }; - 393363622ACF772800E582D4 /* BoltsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 393363612ACF772800E582D4 /* BoltsSwift */; }; 393363642ACF773900E582D4 /* BoltsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 393363632ACF773900E582D4 /* BoltsSwift */; }; 393363902ACF889100E582D4 /* Starscream in Frameworks */ = {isa = PBXBuildFile; productRef = 3933638F2ACF889100E582D4 /* Starscream */; }; 393363922ACF889F00E582D4 /* Starscream in Frameworks */ = {isa = PBXBuildFile; productRef = 393363912ACF889F00E582D4 /* Starscream */; }; 39506FFB2A304E6B007F9550 /* Common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39506FFA2A304E6B007F9550 /* Common.swift */; }; 39506FFC2A3056B6007F9550 /* Common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39506FFA2A304E6B007F9550 /* Common.swift */; }; - 39CE834D2ACF707500142920 /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39CE834C2ACF707500142920 /* ParseObjC */; }; 39CE834F2ACF707B00142920 /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39CE834E2ACF707B00142920 /* ParseObjC */; }; 4A819D9D1D937866009C0F61 /* ObjCCompat.swift in Sources */ = {isa = PBXBuildFile; fileRef = F54D58B51C8E33D9009F8D6C /* ObjCCompat.swift */; }; 4A819D9E1D93786A009C0F61 /* ObjCCompat.swift in Sources */ = {isa = PBXBuildFile; fileRef = F54D58B51C8E33D9009F8D6C /* ObjCCompat.swift */; }; + 6B63F1642BC34F3900F89DEE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F1632BC34F3900F89DEE /* ParseObjC */; }; + 6B63F1682BC355C900F89DEE /* BoltsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F1672BC355C900F89DEE /* BoltsSwift */; }; 708836762561F503005B32F0 /* ParseLiveQuery_watchOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 708836742561F503005B32F0 /* ParseLiveQuery_watchOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 708836982561F55B005B32F0 /* ParseLiveQuery_tvOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 708836962561F55B005B32F0 /* ParseLiveQuery_tvOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 95E91676299526B200EFDB34 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 094AE9011E25AF3A00F408BC /* Foundation.framework */; }; @@ -181,11 +181,11 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 39CE834D2ACF707500142920 /* ParseObjC in Frameworks */, 95E916B6299527DC00EFDB34 /* SystemConfiguration.framework in Frameworks */, 95E916B12995279800EFDB34 /* AudioToolbox.framework in Frameworks */, + 6B63F1642BC34F3900F89DEE /* ParseObjC in Frameworks */, + 6B63F1682BC355C900F89DEE /* BoltsSwift in Frameworks */, 393363902ACF889100E582D4 /* Starscream in Frameworks */, - 393363622ACF772800E582D4 /* BoltsSwift in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -432,9 +432,9 @@ ); name = "ParseLiveQuery-iOS"; packageProductDependencies = ( - 39CE834C2ACF707500142920 /* ParseObjC */, - 393363612ACF772800E582D4 /* BoltsSwift */, 3933638F2ACF889100E582D4 /* Starscream */, + 6B63F1632BC34F3900F89DEE /* ParseObjC */, + 6B63F1672BC355C900F89DEE /* BoltsSwift */, ); productName = ParseLiveQuery; productReference = F5A9BFCA1BE0248D00E78326 /* ParseLiveQuery.framework */; @@ -845,7 +845,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MACOSX_DEPLOYMENT_TARGET = 10.15; ONLY_ACTIVE_ARCH = YES; SWIFT_OBJC_BRIDGING_HEADER = ""; @@ -882,7 +882,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MACOSX_DEPLOYMENT_TARGET = 10.15; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OBJC_BRIDGING_HEADER = ""; @@ -1087,11 +1087,6 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 393363612ACF772800E582D4 /* BoltsSwift */ = { - isa = XCSwiftPackageProductDependency; - package = 393363602ACF772800E582D4 /* XCRemoteSwiftPackageReference "Bolts-Swift" */; - productName = BoltsSwift; - }; 393363632ACF773900E582D4 /* BoltsSwift */ = { isa = XCSwiftPackageProductDependency; package = 393363602ACF772800E582D4 /* XCRemoteSwiftPackageReference "Bolts-Swift" */; @@ -1107,14 +1102,19 @@ package = 3933638E2ACF889100E582D4 /* XCRemoteSwiftPackageReference "Starscream" */; productName = Starscream; }; - 39CE834C2ACF707500142920 /* ParseObjC */ = { + 39CE834E2ACF707B00142920 /* ParseObjC */ = { isa = XCSwiftPackageProductDependency; productName = ParseObjC; }; - 39CE834E2ACF707B00142920 /* ParseObjC */ = { + 6B63F1632BC34F3900F89DEE /* ParseObjC */ = { isa = XCSwiftPackageProductDependency; productName = ParseObjC; }; + 6B63F1672BC355C900F89DEE /* BoltsSwift */ = { + isa = XCSwiftPackageProductDependency; + package = 393363602ACF772800E582D4 /* XCRemoteSwiftPackageReference "Bolts-Swift" */; + productName = BoltsSwift; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = F5256FC51BD71F9A0052FB8A /* Project object */; diff --git a/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist b/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist index 02cc6ba9b..028bd9e36 100644 --- a/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleVersion - 2.7.3 + 3.0.0 diff --git a/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist index 3549450eb..106b5ff4b 100644 --- a/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIconFile - + CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleVersion - 2.7.3 + 3.0.0 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSMainNibFile diff --git a/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist b/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist index cbe37f262..2dbe4d3b4 100644 --- a/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist +++ b/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile - + CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleVersion - 2.7.3 + 3.0.0 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSMainNibFile diff --git a/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift b/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift index 69b522685..5ffabbe1b 100644 --- a/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift +++ b/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift @@ -44,13 +44,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } Parse.initialize(with: configuration) - // **************************************************************************** - // If you are using Facebook, uncomment and add your FacebookAppID to your bundle's plist as - // described here: https://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/ - // Uncomment the line inside ParseStartProject-Bridging-Header and the following line here: - // PFFacebookUtils.initializeFacebook() - // **************************************************************************** - PFUser.enableAutomaticUser() let defaultACL = PFACL() @@ -133,15 +126,4 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo) // } // } - - //-------------------------------------- - // MARK: Facebook SDK Integration - //-------------------------------------- - - /////////////////////////////////////////////////////////// - // Uncomment this method if you are using Facebook - /////////////////////////////////////////////////////////// - // func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool { - // return FBAppCall.handleOpenURL(url, sourceApplication:sourceApplication, session:PFFacebookUtils.session()) - // } } diff --git a/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist index b4dd60eff..ecd9c9d33 100644 --- a/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleVersion - 2.7.3 + 3.0.0 LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject.xcodeproj/project.pbxproj b/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject.xcodeproj/project.pbxproj index 552283547..deba0e919 100644 --- a/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject.xcodeproj/project.pbxproj +++ b/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject.xcodeproj/project.pbxproj @@ -290,7 +290,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -325,7 +325,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; }; diff --git a/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m b/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m index f072fa6e7..f3bb506a7 100644 --- a/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m +++ b/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m @@ -12,9 +12,6 @@ // If you want to use any of the UI components, uncomment this line // #import -// If you are using Facebook, uncomment this line -// #import - #import "ParseStarterProjectAppDelegate.h" #import "ParseStarterProjectViewController.h" @@ -43,12 +40,6 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( configuration.localDatastoreEnabled = YES; }]]; - // **************************************************************************** - // If you are using Facebook, uncomment and add your FacebookAppID to your bundle's plist as - // described here: https://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/ - // [PFFacebookUtils initializeFacebook]; - // **************************************************************************** - [PFUser enableAutomaticUser]; PFACL *defaultACL = [PFACL ACL]; @@ -133,16 +124,4 @@ - (void)application:(UIApplication *)application didReceiveRemoteNotification:(N // } //} -#pragma mark Facebook SDK Integration - -/////////////////////////////////////////////////////////// -// Uncomment this method if you are using Facebook -/////////////////////////////////////////////////////////// -//- (BOOL)application:(UIApplication *)application -// openURL:(NSURL *)url -// sourceApplication:(NSString *)sourceApplication -// annotation:(id)annotation { -// return [PFFacebookUtils handleOpenURL:url]; -//} - @end diff --git a/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist b/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist index dc4ae12fa..cbecae0e9 100644 --- a/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist +++ b/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile - + CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion @@ -19,11 +19,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleVersion - 2.7.3 + 3.0.0 LSRequiresIPhoneOS NSMainNibFile diff --git a/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist b/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist index b64ae9cb3..57a9056b7 100644 --- a/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist +++ b/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleVersion - 2.7.3 + 3.0.0 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist index de6ee398b..06b656c40 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleVersion - 2.7.3 + 3.0.0 NSExtension NSExtensionAttributes diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter-Swift.xcodeproj/project.pbxproj b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter-Swift.xcodeproj/project.pbxproj index 74fbbe1db..82c56a1a7 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter-Swift.xcodeproj/project.pbxproj +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter-Swift.xcodeproj/project.pbxproj @@ -533,7 +533,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -581,7 +581,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; @@ -598,7 +598,7 @@ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = Resources/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -616,7 +616,7 @@ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = Resources/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist index a48d9c431..bf71d7c01 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleVersion - 2.7.3 + 3.0.0 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift index ad4fe6816..a3c01de2c 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift @@ -121,15 +121,4 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo) // } // } - - //-------------------------------------- - // MARK: Facebook SDK Integration - //-------------------------------------- - - /////////////////////////////////////////////////////////// - // Uncomment this method if you are using Facebook - /////////////////////////////////////////////////////////// - // func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool { - // return FBAppCall.handleOpenURL(url, sourceApplication:sourceApplication, session:PFFacebookUtils.session()) - // } } diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist index eaec3ce1d..53cdda13e 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleVersion - 2.7.3 + 3.0.0 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/ParseTwitterUtils/CHANGELOG.md b/ParseTwitterUtils/CHANGELOG.md deleted file mode 100644 index d44df0325..000000000 --- a/ParseTwitterUtils/CHANGELOG.md +++ /dev/null @@ -1,55 +0,0 @@ -# Change Log - -## [1.11.0](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/tree/1.11.0) (2016-06-29) -[Full Changelog](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/compare/1.10.0...1.11.0) - -**Implemented enhancements:** - -- Add support for Carthage. [\#33](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/33) ([nlutsenko](https://github.com/nlutsenko)) -- Fix analyzer and build warnings. [\#32](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/32) ([nlutsenko](https://github.com/nlutsenko)) -- Update all dependencies and project to Xcode 7.3. [\#28](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/28) ([nlutsenko](https://github.com/nlutsenko)) -- Add support for using `PF_Twitter` without a linking or logging into a Parse account [\#27](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/27) ([zadr](https://github.com/zadr)) -- Removed `Parse.clientKey` requirement for initializing ParseTwitterUtils. [\#26](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/26) ([aphex3k](https://github.com/aphex3k)) - -**Merged pull requests:** - -- Update CocoaPods and RubyGems dependencies. [\#31](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/31) ([nlutsenko](https://github.com/nlutsenko)) - -## [1.10.0](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/tree/1.10.0) (2016-01-08) -[Full Changelog](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/compare/1.9.1...1.10.0) - -**Implemented enhancements:** - -- Remove all usages of PF\_GENERIC macro. [\#19](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/19) ([nlutsenko](https://github.com/nlutsenko)) -- Add custom packaging into a precompiled binary via Rakefile. [\#16](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/16) ([nlutsenko](https://github.com/nlutsenko)) -- Update all of the public documentation to new style. [\#15](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/15) ([nlutsenko](https://github.com/nlutsenko)) - -**Merged pull requests:** - -- ParseTwitterUtils 1.10.0 [\#21](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/21) ([nlutsenko](https://github.com/nlutsenko)) -- Update project to Xcode 7.2. [\#20](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/20) ([nlutsenko](https://github.com/nlutsenko)) -- Use Xcode 7.2 for Travis-CI. [\#17](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/17) ([nlutsenko](https://github.com/nlutsenko)) -- Update xctoolchain to latest. [\#14](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/14) ([richardjrossiii](https://github.com/richardjrossiii)) - -## [1.9.1](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/tree/1.9.1) (2015-11-18) -[Full Changelog](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/compare/1.9.0...1.9.1) - -**Implemented enhancements:** - -- Fix warnings in PFOAuth1FlowDialog. [\#10](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/10) ([nlutsenko](https://github.com/nlutsenko)) -- Remove all usage of custom nullability macros. [\#8](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/8) ([nlutsenko](https://github.com/nlutsenko)) -- Update everything to use Xcode 7.1. [\#6](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/6) ([nlutsenko](https://github.com/nlutsenko)) -- Added safeguard assertion for initialization of PFTwitterUtils before Parse is initialized. [\#4](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/4) ([nlutsenko](https://github.com/nlutsenko)) -- Include and automate localized strings generation. [\#2](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/2) ([nlutsenko](https://github.com/nlutsenko)) - -**Merged pull requests:** - -- ParseTwitterUtils 1.9.1 [\#13](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/13) ([nlutsenko](https://github.com/nlutsenko)) -- Update Gemfile. [\#9](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/9) ([nlutsenko](https://github.com/nlutsenko)) -- Update xctoolchain to latest. [\#5](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/5) ([nlutsenko](https://github.com/nlutsenko)) -- Use shared things from xctoolchain. [\#3](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/pull/3) ([nlutsenko](https://github.com/nlutsenko)) - -## [1.9.0](https://github.com/ParsePlatform/ParseTwitterUtils-iOS/tree/1.9.0) (2015-10-08) - - -\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file diff --git a/ParseTwitterUtils/Configurations/ParseTwitterTestApplication.xcconfig b/ParseTwitterUtils/Configurations/ParseTwitterTestApplication.xcconfig deleted file mode 100644 index 81ec6d3b5..000000000 --- a/ParseTwitterUtils/Configurations/ParseTwitterTestApplication.xcconfig +++ /dev/null @@ -1,18 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/Application.xcconfig" - -PRODUCT_NAME = ParseTwitterTestApplication -PRODUCT_BUNDLE_IDENTIFIER = com.parse.twitterutils.testapplication - -IPHONEOS_DEPLOYMENT_TARGET = 9.0 - -INFOPLIST_FILE = $(SRCROOT)/Tests/TestApplication/Resources/Info.plist diff --git a/ParseTwitterUtils/Configurations/ParseTwitterUtils-Tests.xcconfig b/ParseTwitterUtils/Configurations/ParseTwitterUtils-Tests.xcconfig deleted file mode 100644 index 42bf4515d..000000000 --- a/ParseTwitterUtils/Configurations/ParseTwitterUtils-Tests.xcconfig +++ /dev/null @@ -1,18 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/LogicTests.xcconfig" - -PRODUCT_NAME = ParseTwitterUtils-Tests -IPHONEOS_DEPLOYMENT_TARGET = 9.0 - -INFOPLIST_FILE = $(PROJECT_DIR)/Tests/Resources/Info.plist - -TEST_HOST = $(BUILT_PRODUCTS_DIR)/ParseTwitterTestApplication.app/ParseTwitterTestApplication diff --git a/ParseTwitterUtils/Configurations/ParseTwitterUtils-iOS-Dynamic.xcconfig b/ParseTwitterUtils/Configurations/ParseTwitterUtils-iOS-Dynamic.xcconfig deleted file mode 100644 index d436dc8d4..000000000 --- a/ParseTwitterUtils/Configurations/ParseTwitterUtils-iOS-Dynamic.xcconfig +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/DynamicFramework.xcconfig" - -PRODUCT_NAME = ParseTwitterUtils -PRODUCT_BUNDLE_IDENTIFIER = com.parse.twitterutils.ios - -IPHONEOS_DEPLOYMENT_TARGET = 9.0 - -INFOPLIST_FILE = $(SRCROOT)/ParseTwitterUtils/Resources/Info-iOS.plist - -// TODO: (nlutsenko) Cleanup source code so we can safely ignore local variable shadow warnings. -GCC_WARN_SHADOW = NO diff --git a/ParseTwitterUtils/Configurations/ParseTwitterUtils-iOS.xcconfig b/ParseTwitterUtils/Configurations/ParseTwitterUtils-iOS.xcconfig deleted file mode 100644 index 1cfe8062c..000000000 --- a/ParseTwitterUtils/Configurations/ParseTwitterUtils-iOS.xcconfig +++ /dev/null @@ -1,20 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/StaticFramework.xcconfig" - -PRODUCT_NAME = ParseTwitterUtils -PRODUCT_BUNDLE_IDENTIFIER = com.parse.twitterutils.ios - -INFOPLIST_FILE = $(SRCROOT)/ParseTwitterUtils/Resources/Info-iOS.plist - -// TODO: (nlutsenko) Cleanup source code so we can safely ignore local variable shadow warnings. -GCC_WARN_SHADOW = NO - diff --git a/ParseTwitterUtils/Configurations/Shared b/ParseTwitterUtils/Configurations/Shared deleted file mode 120000 index 657caabf0..000000000 --- a/ParseTwitterUtils/Configurations/Shared +++ /dev/null @@ -1 +0,0 @@ -../../Vendor/xctoolchain/Configurations \ No newline at end of file diff --git a/ParseTwitterUtils/ParseTwitterTestApplication.entitlements b/ParseTwitterUtils/ParseTwitterTestApplication.entitlements deleted file mode 100644 index ee95ab7e5..000000000 --- a/ParseTwitterUtils/ParseTwitterTestApplication.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.network.client - - - diff --git a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.pbxproj b/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.pbxproj deleted file mode 100644 index 162266eeb..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1115 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 52; - objects = { - -/* Begin PBXBuildFile section */ - 06D00BB51BC790F3005BAA6F /* PFTwitterLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 06D00BB41BC790F3005BAA6F /* PFTwitterLocalization.h */; }; - 7C605D0B292A91D700E4B6D2 /* PFTwitterLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C605D02292A91D700E4B6D2 /* PFTwitterLocalization.m */; }; - 7C605D0C292A91D700E4B6D2 /* PFTwitterLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C605D02292A91D700E4B6D2 /* PFTwitterLocalization.m */; }; - 7C77D07E2929241300C4D90E /* PF_Twitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D079292923FF00C4D90E /* PF_Twitter.m */; }; - 7C77D07F2929241300C4D90E /* PFTwitterUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D07D292923FF00C4D90E /* PFTwitterUtils.m */; }; - 7C77D0802929241D00C4D90E /* PFTwitterUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D07A292923FF00C4D90E /* PFTwitterUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D0812929241D00C4D90E /* PF_Twitter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D07B292923FF00C4D90E /* PF_Twitter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D0822929241D00C4D90E /* ParseTwitterUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D07C292923FF00C4D90E /* ParseTwitterUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D0832929243E00C4D90E /* PFTwitterUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D07A292923FF00C4D90E /* PFTwitterUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D0842929243E00C4D90E /* PF_Twitter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D07B292923FF00C4D90E /* PF_Twitter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D0852929243E00C4D90E /* ParseTwitterUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D07C292923FF00C4D90E /* ParseTwitterUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D0862929244900C4D90E /* PF_Twitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D079292923FF00C4D90E /* PF_Twitter.m */; }; - 7C77D0872929244900C4D90E /* PFTwitterUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D07D292923FF00C4D90E /* PFTwitterUtils.m */; }; - 8135E4951B4B6A0E0092F452 /* PF_Twitter_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 8135E48E1B4B6A0E0092F452 /* PF_Twitter_Private.h */; }; - 8135E4961B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 8135E48F1B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.h */; }; - 8135E4971B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 8135E4901B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.m */; }; - 813E54A41BB5DDEF00C727E8 /* PFTwitterUtils_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 813E54A31BB5DDEF00C727E8 /* PFTwitterUtils_Private.h */; }; - 813E54A91BB5E5FA00C727E8 /* PFTwitterPrivateUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 813E54A61BB5E52000C727E8 /* PFTwitterPrivateUtilities.m */; }; - 813E54AA1BB5E5FF00C727E8 /* PFTwitterPrivateUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 813E54A51BB5E52000C727E8 /* PFTwitterPrivateUtilities.h */; }; - 815F18401B4B730E0066E996 /* PFOAuth1FlowDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 815F183E1B4B730E0066E996 /* PFOAuth1FlowDialog.h */; }; - 815F18411B4B730E0066E996 /* PFOAuth1FlowDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 815F183F1B4B730E0066E996 /* PFOAuth1FlowDialog.m */; }; - 81665C731BBDE27D00AE923F /* OAuth1FlowDialogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 81665C6E1BBDE27D00AE923F /* OAuth1FlowDialogTests.m */; }; - 81665C741BBDE27D00AE923F /* OAuthCoreTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 81665C6F1BBDE27D00AE923F /* OAuthCoreTests.m */; }; - 81665C751BBDE27D00AE923F /* TwitterAuthenticationProviderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 81665C701BBDE27D00AE923F /* TwitterAuthenticationProviderTests.m */; }; - 81665C761BBDE27D00AE923F /* TwitterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 81665C711BBDE27D00AE923F /* TwitterTests.m */; }; - 81665C771BBDE27D00AE923F /* TwitterUtilsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 81665C721BBDE27D00AE923F /* TwitterUtilsTests.m */; }; - 81665C7C1BBDE2EE00AE923F /* PFTwitterTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 81665C7B1BBDE2EE00AE923F /* PFTwitterTestCase.m */; }; - 8166FB921B4F1DC5003841A2 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 8166FB8F1B4F1DC5003841A2 /* main.m */; }; - 816832521D1E1A7900315E21 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8168311C1D1E16DC00315E21 /* Security.framework */; platformFilter = ios; }; - 816832591D1E1A7E00315E21 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8168312A1D1E16F000315E21 /* SystemConfiguration.framework */; platformFilter = ios; }; - 8168325E1D1E1A8600315E21 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 816831231D1E16E700315E21 /* libsqlite3.tbd */; platformFilter = ios; }; - 8168326A1D1E1A8B00315E21 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8168312E1D1E16F700315E21 /* AudioToolbox.framework */; platformFilter = ios; }; - 817A37CB1B4B741A00129AFA /* PF_OAuthCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 817A37C91B4B741A00129AFA /* PF_OAuthCore.h */; }; - 817A37CC1B4B741A00129AFA /* PF_OAuthCore.m in Sources */ = {isa = PBXBuildFile; fileRef = 817A37CA1B4B741A00129AFA /* PF_OAuthCore.m */; }; - 819DAAD61BB5EC79002BDE2B /* PFTwitterAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 819DAAD41BB5EC79002BDE2B /* PFTwitterAlertView.h */; }; - 819DAAD71BB5EC79002BDE2B /* PFTwitterAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 819DAAD51BB5EC79002BDE2B /* PFTwitterAlertView.m */; }; - 81ECACBB1D1E14E000FA7673 /* PFOAuth1FlowDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 815F183E1B4B730E0066E996 /* PFOAuth1FlowDialog.h */; }; - 81ECACBC1D1E14E000FA7673 /* PF_OAuthCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 817A37C91B4B741A00129AFA /* PF_OAuthCore.h */; }; - 81ECACBD1D1E14E000FA7673 /* PFTwitterUtils_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 813E54A31BB5DDEF00C727E8 /* PFTwitterUtils_Private.h */; }; - 81ECACBF1D1E14E000FA7673 /* PFTwitterPrivateUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 813E54A51BB5E52000C727E8 /* PFTwitterPrivateUtilities.h */; }; - 81ECACC11D1E14E000FA7673 /* PFTwitterLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 06D00BB41BC790F3005BAA6F /* PFTwitterLocalization.h */; }; - 81ECACC21D1E14E000FA7673 /* PF_Twitter_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 8135E48E1B4B6A0E0092F452 /* PF_Twitter_Private.h */; }; - 81ECACC31D1E14E000FA7673 /* PFTwitterAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 8135E48F1B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.h */; }; - 81ECACC41D1E14E000FA7673 /* PFTwitterAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 819DAAD41BB5EC79002BDE2B /* PFTwitterAlertView.h */; }; - 81ECACC71D1E14E000FA7673 /* PFTwitterAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 8135E4901B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.m */; }; - 81ECACCA1D1E14E000FA7673 /* PFOAuth1FlowDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 815F183F1B4B730E0066E996 /* PFOAuth1FlowDialog.m */; }; - 81ECACCB1D1E14E000FA7673 /* PFTwitterPrivateUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 813E54A61BB5E52000C727E8 /* PFTwitterPrivateUtilities.m */; }; - 81ECACCC1D1E14E000FA7673 /* PF_OAuthCore.m in Sources */ = {isa = PBXBuildFile; fileRef = 817A37CA1B4B741A00129AFA /* PF_OAuthCore.m */; }; - 81ECACCD1D1E14E000FA7673 /* PFTwitterAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 819DAAD51BB5EC79002BDE2B /* PFTwitterAlertView.m */; }; - B9783173240D14A50049C02B /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9783172240D14A50049C02B /* OCMock.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 4A1350A82027F4B8000F5FD5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 81C3821B19CCA89E0066284A; - remoteInfo = "Parse-iOS"; - }; - 4A51E4072027CC0F0066DE1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C3821C19CCA89E0066284A; - remoteInfo = "Parse-iOS"; - }; - 4A51E4092027CC0F0066DE1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C5845D1C3B0A98000063C6; - remoteInfo = "Parse-iOS-Dynamic"; - }; - 4A51E40B2027CC0F0066DE1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 816F449B1A8E8933009CDB32; - remoteInfo = "ParseUnitTests-iOS"; - }; - 4A51E40D2027CC0F0066DE1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 97010FAC1630B18F00AB761E; - remoteInfo = "Parse-macOS"; - }; - 4A51E40F2027CC0F0066DE1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C09F861AF97A490043B49C; - remoteInfo = "ParseUnitTests-macOS"; - }; - 4A51E4112027CC0F0066DE1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 815F24151BD04D150054659F; - remoteInfo = "Parse-tvOS"; - }; - 4A51E4132027CC0F0066DE1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C585BF1C3B0AA1000063C6; - remoteInfo = "Parse-tvOS-Dynamic"; - }; - 4A51E4152027CC0F0066DE1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 810156691BB3832700D7C7BD; - remoteInfo = "Parse-watchOS"; - }; - 4A51E4172027CC0F0066DE1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C5870F1C3B0AA9000063C6; - remoteInfo = "Parse-watchOS-Dynamic"; - }; - 4A51E4192027CC0F0066DE1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4AE33A0B1F5451AD0088DCA0; - remoteInfo = "ParseUnitTests-iOS-host"; - }; - 4A51E41B2027CC1C0066DE1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 81C582E11C3B0A98000063C6; - remoteInfo = "Parse-iOS-Dynamic"; - }; - 8166FB941B4F1E9A003841A2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8166FB661B4F1D77003841A2; - remoteInfo = ParseTwitterTestApplication; - }; - B9783142240D050B0049C02B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D; - remoteInfo = "ParseTwitterUtils-iOS"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 06D00BB41BC790F3005BAA6F /* PFTwitterLocalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTwitterLocalization.h; sourceTree = ""; }; - 4A0ECBDD200D41B600BA84A3 /* Parse.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Parse.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4A13522820282037000F5FD5 /* Bolts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Bolts.framework; path = ../Carthage/Build/iOS/Bolts.framework; sourceTree = ""; }; - 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Parse.xcodeproj; path = ../Parse/Parse.xcodeproj; sourceTree = ""; }; - 7C605D02292A91D700E4B6D2 /* PFTwitterLocalization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFTwitterLocalization.m; sourceTree = ""; }; - 7C77D076292923FF00C4D90E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/ParseTwitterUtils.strings; sourceTree = ""; }; - 7C77D077292923FF00C4D90E /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; - 7C77D079292923FF00C4D90E /* PF_Twitter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PF_Twitter.m; sourceTree = ""; }; - 7C77D07A292923FF00C4D90E /* PFTwitterUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFTwitterUtils.h; sourceTree = ""; }; - 7C77D07B292923FF00C4D90E /* PF_Twitter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PF_Twitter.h; sourceTree = ""; }; - 7C77D07C292923FF00C4D90E /* ParseTwitterUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseTwitterUtils.h; sourceTree = ""; }; - 7C77D07D292923FF00C4D90E /* PFTwitterUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFTwitterUtils.m; sourceTree = ""; }; - 8135E48E1B4B6A0E0092F452 /* PF_Twitter_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PF_Twitter_Private.h; sourceTree = ""; }; - 8135E48F1B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTwitterAuthenticationProvider.h; sourceTree = ""; }; - 8135E4901B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFTwitterAuthenticationProvider.m; sourceTree = ""; }; - 813E54A31BB5DDEF00C727E8 /* PFTwitterUtils_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTwitterUtils_Private.h; sourceTree = ""; }; - 813E54A51BB5E52000C727E8 /* PFTwitterPrivateUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTwitterPrivateUtilities.h; sourceTree = ""; }; - 813E54A61BB5E52000C727E8 /* PFTwitterPrivateUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFTwitterPrivateUtilities.m; sourceTree = ""; }; - 815462231D37FE6E0069489A /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; - 815462251D37FE6E0069489A /* iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = iOS.xcconfig; sourceTree = ""; }; - 815462261D37FE6E0069489A /* macOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = macOS.xcconfig; sourceTree = ""; }; - 815462271D37FE6E0069489A /* tvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = tvOS.xcconfig; sourceTree = ""; }; - 815462281D37FE6E0069489A /* watchOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = watchOS.xcconfig; sourceTree = ""; }; - 8154622A1D37FE6E0069489A /* Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Application.xcconfig; sourceTree = ""; }; - 8154622B1D37FE6E0069489A /* DynamicFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DynamicFramework.xcconfig; sourceTree = ""; }; - 8154622C1D37FE6E0069489A /* LogicTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = LogicTests.xcconfig; sourceTree = ""; }; - 8154622D1D37FE6E0069489A /* StaticFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = StaticFramework.xcconfig; sourceTree = ""; }; - 8154622F1D37FE6E0069489A /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 815462301D37FE6E0069489A /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 815462311D37FE6E0069489A /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 815F183E1B4B730E0066E996 /* PFOAuth1FlowDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFOAuth1FlowDialog.h; sourceTree = ""; }; - 815F183F1B4B730E0066E996 /* PFOAuth1FlowDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFOAuth1FlowDialog.m; sourceTree = ""; }; - 81665C6E1BBDE27D00AE923F /* OAuth1FlowDialogTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OAuth1FlowDialogTests.m; sourceTree = ""; }; - 81665C6F1BBDE27D00AE923F /* OAuthCoreTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OAuthCoreTests.m; sourceTree = ""; }; - 81665C701BBDE27D00AE923F /* TwitterAuthenticationProviderTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TwitterAuthenticationProviderTests.m; sourceTree = ""; }; - 81665C711BBDE27D00AE923F /* TwitterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TwitterTests.m; sourceTree = ""; }; - 81665C721BBDE27D00AE923F /* TwitterUtilsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TwitterUtilsTests.m; sourceTree = ""; }; - 81665C7A1BBDE2EE00AE923F /* PFTwitterTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTwitterTestCase.h; sourceTree = ""; }; - 81665C7B1BBDE2EE00AE923F /* PFTwitterTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFTwitterTestCase.m; sourceTree = ""; }; - 8166FB671B4F1D77003841A2 /* ParseTwitterTestApplication.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseTwitterTestApplication.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 8166FB8F1B4F1DC5003841A2 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 8166FB911B4F1DC5003841A2 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 816831121D1E16CC00315E21 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 816831151D1E16D000315E21 /* Accounts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accounts.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Accounts.framework; sourceTree = DEVELOPER_DIR; }; - 816831181D1E16D500315E21 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; - 8168311C1D1E16DC00315E21 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; - 8168311F1D1E16E200315E21 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/StoreKit.framework; sourceTree = DEVELOPER_DIR; }; - 816831231D1E16E700315E21 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/usr/lib/libsqlite3.tbd; sourceTree = DEVELOPER_DIR; }; - 816831261D1E16EB00315E21 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/CoreLocation.framework; sourceTree = DEVELOPER_DIR; }; - 8168312A1D1E16F000315E21 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; - 8168312E1D1E16F700315E21 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; }; - 816831321D1E16FE00315E21 /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Social.framework; sourceTree = DEVELOPER_DIR; }; - 817A37C91B4B741A00129AFA /* PF_OAuthCore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PF_OAuthCore.h; sourceTree = ""; }; - 817A37CA1B4B741A00129AFA /* PF_OAuthCore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PF_OAuthCore.m; sourceTree = ""; }; - 81930A391BBDE76E00A5E4BB /* PFTwitterTestMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFTwitterTestMacros.h; sourceTree = ""; }; - 819DAAD41BB5EC79002BDE2B /* PFTwitterAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTwitterAlertView.h; sourceTree = ""; }; - 819DAAD51BB5EC79002BDE2B /* PFTwitterAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFTwitterAlertView.m; sourceTree = ""; }; - 81CB98C61AB7905D00136FA5 /* ParseTwitterUtils-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ParseTwitterUtils-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 81CB98D31AB7906D00136FA5 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ../Resources/Info.plist; sourceTree = ""; }; - 81ECACD71D1E14E000FA7673 /* ParseTwitterUtils.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseTwitterUtils.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 81ECACD91D1E14F300FA7673 /* ParseTwitterUtils-iOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseTwitterUtils-iOS-Dynamic.xcconfig"; sourceTree = ""; }; - 848E11B22959EF2100BA2457 /* FBAEMKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBAEMKit.xcframework; path = "/Users/admin/Documents/Projects/Parse-SDK-iOS-OSX/ParseFacebookUtils/../Carthage/Build/FBAEMKit.xcframework"; sourceTree = ""; }; - 848E11B42959EF2100BA2457 /* FBSDKCoreKit_Basics.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKCoreKit_Basics.xcframework; path = "/Users/admin/Documents/Projects/Parse-SDK-iOS-OSX/ParseFacebookUtils/../Carthage/Build/FBSDKCoreKit_Basics.xcframework"; sourceTree = ""; }; - 848E11B62959EF2100BA2457 /* FBSDKCoreKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKCoreKit.xcframework; path = "/Users/admin/Documents/Projects/Parse-SDK-iOS-OSX/ParseFacebookUtils/../Carthage/Build/FBSDKCoreKit.xcframework"; sourceTree = ""; }; - 848E11B82959EF2100BA2457 /* FBSDKLoginKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FBSDKLoginKit.xcframework; path = "/Users/admin/Documents/Projects/Parse-SDK-iOS-OSX/ParseFacebookUtils/../Carthage/Build/FBSDKLoginKit.xcframework"; sourceTree = ""; }; - B9783172240D14A50049C02B /* OCMock.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = OCMock.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B99F4FFE2444B5B00061A6F5 /* ParseTwitterTestApplication.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ParseTwitterTestApplication.entitlements; sourceTree = ""; }; - B9A7EEC123C49D94003E606E /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - D2AAC07E0554694100DB518D /* ParseTwitterUtils.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseTwitterUtils.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F51535531B57453700C49F56 /* ParseTwitterUtils-iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseTwitterUtils-iOS.xcconfig"; sourceTree = ""; }; - F51535541B57454500C49F56 /* ParseTwitterUtils-Tests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseTwitterUtils-Tests.xcconfig"; sourceTree = ""; }; - F51535551B57455200C49F56 /* ParseTwitterTestApplication.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ParseTwitterTestApplication.xcconfig; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 8166FB641B4F1D77003841A2 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81CB98C31AB7905D00136FA5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - B9783173240D14A50049C02B /* OCMock.framework in Frameworks */, - 8168326A1D1E1A8B00315E21 /* AudioToolbox.framework in Frameworks */, - 8168325E1D1E1A8600315E21 /* libsqlite3.tbd in Frameworks */, - 816832591D1E1A7E00315E21 /* SystemConfiguration.framework in Frameworks */, - 816832521D1E1A7900315E21 /* Security.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81ECACCE1D1E14E000FA7673 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - D2AAC07E0554694100DB518D /* ParseTwitterUtils.framework */, - 81CB98C61AB7905D00136FA5 /* ParseTwitterUtils-Tests.xctest */, - 8166FB671B4F1D77003841A2 /* ParseTwitterTestApplication.app */, - 81ECACD71D1E14E000FA7673 /* ParseTwitterUtils.framework */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* Breakpad */ = { - isa = PBXGroup; - children = ( - B99F4FFE2444B5B00061A6F5 /* ParseTwitterTestApplication.entitlements */, - F51535381B57451200C49F56 /* Configurations */, - 8135E48C1B4B6A0E0092F452 /* ParseTwitterUtils */, - 81CB98D21AB7906D00136FA5 /* Tests */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - 8EF82AB7049F0059A572B973 /* Pods */, - ); - indentWidth = 4; - name = Breakpad; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 848E11B22959EF2100BA2457 /* FBAEMKit.xcframework */, - 848E11B42959EF2100BA2457 /* FBSDKCoreKit_Basics.xcframework */, - 848E11B62959EF2100BA2457 /* FBSDKCoreKit.xcframework */, - 848E11B82959EF2100BA2457 /* FBSDKLoginKit.xcframework */, - B9783172240D14A50049C02B /* OCMock.framework */, - B9A7EEC123C49D94003E606E /* CoreGraphics.framework */, - 4A13522820282037000F5FD5 /* Bolts.framework */, - 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */, - 4A0ECBDD200D41B600BA84A3 /* Parse.framework */, - 813DFC8E1AB2513300F25A08 /* System Frameworks */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4A51E3FB2027CC0F0066DE1A /* Products */ = { - isa = PBXGroup; - children = ( - 4A51E4082027CC0F0066DE1A /* Parse.framework */, - 4A51E40A2027CC0F0066DE1A /* Parse.framework */, - 4A51E40C2027CC0F0066DE1A /* ParseUnitTests-iOS.xctest */, - 4A51E40E2027CC0F0066DE1A /* Parse.framework */, - 4A51E4102027CC0F0066DE1A /* ParseUnitTests-macOS.xctest */, - 4A51E4122027CC0F0066DE1A /* Parse.framework */, - 4A51E4142027CC0F0066DE1A /* Parse.framework */, - 4A51E4162027CC0F0066DE1A /* Parse.framework */, - 4A51E4182027CC0F0066DE1A /* Parse.framework */, - 4A51E41A2027CC0F0066DE1A /* ParseUnitTests-iOS-host.app */, - ); - name = Products; - sourceTree = ""; - }; - 7C77D074292923FF00C4D90E /* Resources */ = { - isa = PBXGroup; - children = ( - 7C77D075292923FF00C4D90E /* ParseTwitterUtils.strings */, - 7C77D077292923FF00C4D90E /* Info-iOS.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 7C77D078292923FF00C4D90E /* Source */ = { - isa = PBXGroup; - children = ( - 7C77D079292923FF00C4D90E /* PF_Twitter.m */, - 7C77D07A292923FF00C4D90E /* PFTwitterUtils.h */, - 7C77D07B292923FF00C4D90E /* PF_Twitter.h */, - 7C77D07C292923FF00C4D90E /* ParseTwitterUtils.h */, - 7C77D07D292923FF00C4D90E /* PFTwitterUtils.m */, - ); - path = Source; - sourceTree = ""; - }; - 8135E48C1B4B6A0E0092F452 /* ParseTwitterUtils */ = { - isa = PBXGroup; - children = ( - 8135E48D1B4B6A0E0092F452 /* Internal */, - 7C77D074292923FF00C4D90E /* Resources */, - 7C77D078292923FF00C4D90E /* Source */, - ); - path = ParseTwitterUtils; - sourceTree = ""; - }; - 8135E48D1B4B6A0E0092F452 /* Internal */ = { - isa = PBXGroup; - children = ( - 815F183D1B4B730E0066E996 /* Dialog */, - 817A37C81B4B741A00129AFA /* OAuthCore */, - 8135E48E1B4B6A0E0092F452 /* PF_Twitter_Private.h */, - 813E54A31BB5DDEF00C727E8 /* PFTwitterUtils_Private.h */, - 8135E48F1B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.h */, - 8135E4901B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.m */, - 813E54A51BB5E52000C727E8 /* PFTwitterPrivateUtilities.h */, - 813E54A61BB5E52000C727E8 /* PFTwitterPrivateUtilities.m */, - 819DAAD41BB5EC79002BDE2B /* PFTwitterAlertView.h */, - 819DAAD51BB5EC79002BDE2B /* PFTwitterAlertView.m */, - 06D00BB41BC790F3005BAA6F /* PFTwitterLocalization.h */, - 7C605D02292A91D700E4B6D2 /* PFTwitterLocalization.m */, - ); - path = Internal; - sourceTree = ""; - }; - 813DFC8E1AB2513300F25A08 /* System Frameworks */ = { - isa = PBXGroup; - children = ( - 816831321D1E16FE00315E21 /* Social.framework */, - 8168312E1D1E16F700315E21 /* AudioToolbox.framework */, - 8168312A1D1E16F000315E21 /* SystemConfiguration.framework */, - 816831261D1E16EB00315E21 /* CoreLocation.framework */, - 816831231D1E16E700315E21 /* libsqlite3.tbd */, - 8168311F1D1E16E200315E21 /* StoreKit.framework */, - 8168311C1D1E16DC00315E21 /* Security.framework */, - 816831181D1E16D500315E21 /* CoreGraphics.framework */, - 816831151D1E16D000315E21 /* Accounts.framework */, - 816831121D1E16CC00315E21 /* UIKit.framework */, - ); - name = "System Frameworks"; - sourceTree = ""; - }; - 815462221D37FE6E0069489A /* Shared */ = { - isa = PBXGroup; - children = ( - 815462231D37FE6E0069489A /* Common.xcconfig */, - 815462241D37FE6E0069489A /* Platform */, - 815462291D37FE6E0069489A /* Product */, - 8154622E1D37FE6E0069489A /* Project */, - 815462311D37FE6E0069489A /* Warnings.xcconfig */, - ); - path = Shared; - sourceTree = ""; - }; - 815462241D37FE6E0069489A /* Platform */ = { - isa = PBXGroup; - children = ( - 815462251D37FE6E0069489A /* iOS.xcconfig */, - 815462261D37FE6E0069489A /* macOS.xcconfig */, - 815462271D37FE6E0069489A /* tvOS.xcconfig */, - 815462281D37FE6E0069489A /* watchOS.xcconfig */, - ); - path = Platform; - sourceTree = ""; - }; - 815462291D37FE6E0069489A /* Product */ = { - isa = PBXGroup; - children = ( - 8154622A1D37FE6E0069489A /* Application.xcconfig */, - 8154622B1D37FE6E0069489A /* DynamicFramework.xcconfig */, - 8154622C1D37FE6E0069489A /* LogicTests.xcconfig */, - 8154622D1D37FE6E0069489A /* StaticFramework.xcconfig */, - ); - path = Product; - sourceTree = ""; - }; - 8154622E1D37FE6E0069489A /* Project */ = { - isa = PBXGroup; - children = ( - 8154622F1D37FE6E0069489A /* Debug.xcconfig */, - 815462301D37FE6E0069489A /* Release.xcconfig */, - ); - path = Project; - sourceTree = ""; - }; - 815F183D1B4B730E0066E996 /* Dialog */ = { - isa = PBXGroup; - children = ( - 815F183E1B4B730E0066E996 /* PFOAuth1FlowDialog.h */, - 815F183F1B4B730E0066E996 /* PFOAuth1FlowDialog.m */, - ); - path = Dialog; - sourceTree = ""; - }; - 81665C6D1BBDE27D00AE923F /* Unit */ = { - isa = PBXGroup; - children = ( - 81665C6E1BBDE27D00AE923F /* OAuth1FlowDialogTests.m */, - 81665C6F1BBDE27D00AE923F /* OAuthCoreTests.m */, - 81665C701BBDE27D00AE923F /* TwitterAuthenticationProviderTests.m */, - 81665C711BBDE27D00AE923F /* TwitterTests.m */, - 81665C721BBDE27D00AE923F /* TwitterUtilsTests.m */, - ); - path = Unit; - sourceTree = ""; - }; - 81665C781BBDE2C000AE923F /* Other */ = { - isa = PBXGroup; - children = ( - 81665C791BBDE2EE00AE923F /* TestCase */, - 81930A391BBDE76E00A5E4BB /* PFTwitterTestMacros.h */, - ); - path = Other; - sourceTree = ""; - }; - 81665C791BBDE2EE00AE923F /* TestCase */ = { - isa = PBXGroup; - children = ( - 81665C7A1BBDE2EE00AE923F /* PFTwitterTestCase.h */, - 81665C7B1BBDE2EE00AE923F /* PFTwitterTestCase.m */, - ); - path = TestCase; - sourceTree = ""; - }; - 8166FB8D1B4F1DC5003841A2 /* TestApplication */ = { - isa = PBXGroup; - children = ( - 8166FB8E1B4F1DC5003841A2 /* Classes */, - 8166FB901B4F1DC5003841A2 /* Resources */, - ); - path = TestApplication; - sourceTree = ""; - }; - 8166FB8E1B4F1DC5003841A2 /* Classes */ = { - isa = PBXGroup; - children = ( - 8166FB8F1B4F1DC5003841A2 /* main.m */, - ); - path = Classes; - sourceTree = ""; - }; - 8166FB901B4F1DC5003841A2 /* Resources */ = { - isa = PBXGroup; - children = ( - 8166FB911B4F1DC5003841A2 /* Info.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 817A37C81B4B741A00129AFA /* OAuthCore */ = { - isa = PBXGroup; - children = ( - 817A37C91B4B741A00129AFA /* PF_OAuthCore.h */, - 817A37CA1B4B741A00129AFA /* PF_OAuthCore.m */, - ); - path = OAuthCore; - sourceTree = ""; - }; - 81CB98D21AB7906D00136FA5 /* Tests */ = { - isa = PBXGroup; - children = ( - 81665C6D1BBDE27D00AE923F /* Unit */, - 81665C781BBDE2C000AE923F /* Other */, - 81CB98D71AB7907500136FA5 /* Resources */, - 8166FB8D1B4F1DC5003841A2 /* TestApplication */, - ); - path = Tests; - sourceTree = ""; - }; - 81CB98D71AB7907500136FA5 /* Resources */ = { - isa = PBXGroup; - children = ( - 81CB98D31AB7906D00136FA5 /* Info.plist */, - ); - name = Resources; - sourceTree = ""; - }; - 8EF82AB7049F0059A572B973 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - F51535381B57451200C49F56 /* Configurations */ = { - isa = PBXGroup; - children = ( - F51535531B57453700C49F56 /* ParseTwitterUtils-iOS.xcconfig */, - 81ECACD91D1E14F300FA7673 /* ParseTwitterUtils-iOS-Dynamic.xcconfig */, - F51535541B57454500C49F56 /* ParseTwitterUtils-Tests.xcconfig */, - F51535551B57455200C49F56 /* ParseTwitterTestApplication.xcconfig */, - 815462221D37FE6E0069489A /* Shared */, - ); - path = Configurations; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 81ECACBA1D1E14E000FA7673 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D0832929243E00C4D90E /* PFTwitterUtils.h in Headers */, - 7C77D0842929243E00C4D90E /* PF_Twitter.h in Headers */, - 7C77D0852929243E00C4D90E /* ParseTwitterUtils.h in Headers */, - 81ECACBB1D1E14E000FA7673 /* PFOAuth1FlowDialog.h in Headers */, - 81ECACBC1D1E14E000FA7673 /* PF_OAuthCore.h in Headers */, - 81ECACBD1D1E14E000FA7673 /* PFTwitterUtils_Private.h in Headers */, - 81ECACBF1D1E14E000FA7673 /* PFTwitterPrivateUtilities.h in Headers */, - 81ECACC11D1E14E000FA7673 /* PFTwitterLocalization.h in Headers */, - 81ECACC21D1E14E000FA7673 /* PF_Twitter_Private.h in Headers */, - 81ECACC31D1E14E000FA7673 /* PFTwitterAuthenticationProvider.h in Headers */, - 81ECACC41D1E14E000FA7673 /* PFTwitterAlertView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07A0554694100DB518D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D0802929241D00C4D90E /* PFTwitterUtils.h in Headers */, - 7C77D0812929241D00C4D90E /* PF_Twitter.h in Headers */, - 7C77D0822929241D00C4D90E /* ParseTwitterUtils.h in Headers */, - 815F18401B4B730E0066E996 /* PFOAuth1FlowDialog.h in Headers */, - 817A37CB1B4B741A00129AFA /* PF_OAuthCore.h in Headers */, - 813E54A41BB5DDEF00C727E8 /* PFTwitterUtils_Private.h in Headers */, - 813E54AA1BB5E5FF00C727E8 /* PFTwitterPrivateUtilities.h in Headers */, - 06D00BB51BC790F3005BAA6F /* PFTwitterLocalization.h in Headers */, - 8135E4951B4B6A0E0092F452 /* PF_Twitter_Private.h in Headers */, - 8135E4961B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.h in Headers */, - 819DAAD61BB5EC79002BDE2B /* PFTwitterAlertView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 8166FB661B4F1D77003841A2 /* ParseTwitterTestApplication */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8166FB8B1B4F1D77003841A2 /* Build configuration list for PBXNativeTarget "ParseTwitterTestApplication" */; - buildPhases = ( - 8166FB631B4F1D77003841A2 /* Sources */, - 8166FB641B4F1D77003841A2 /* Frameworks */, - 8166FB651B4F1D77003841A2 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ParseTwitterTestApplication; - productName = ParseTwitterTestApplication; - productReference = 8166FB671B4F1D77003841A2 /* ParseTwitterTestApplication.app */; - productType = "com.apple.product-type.application"; - }; - 81CB98C51AB7905D00136FA5 /* ParseTwitterUtils-Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 81CB98D11AB7905D00136FA5 /* Build configuration list for PBXNativeTarget "ParseTwitterUtils-Tests" */; - buildPhases = ( - 81CB98C21AB7905D00136FA5 /* Sources */, - 81CB98C31AB7905D00136FA5 /* Frameworks */, - 81CB98C41AB7905D00136FA5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - B9783143240D050B0049C02B /* PBXTargetDependency */, - 8166FB951B4F1E9A003841A2 /* PBXTargetDependency */, - ); - name = "ParseTwitterUtils-Tests"; - productName = "ParseFacebookUtilsV4-Tests"; - productReference = 81CB98C61AB7905D00136FA5 /* ParseTwitterUtils-Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 81ECACB71D1E14E000FA7673 /* ParseTwitterUtils-iOS-Dynamic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 81ECACD41D1E14E000FA7673 /* Build configuration list for PBXNativeTarget "ParseTwitterUtils-iOS-Dynamic" */; - buildPhases = ( - 81ECACB91D1E14E000FA7673 /* Generate Localizable Strings */, - 81ECACBA1D1E14E000FA7673 /* Headers */, - 81ECACC61D1E14E000FA7673 /* Sources */, - 81ECACCE1D1E14E000FA7673 /* Frameworks */, - 81ECACD11D1E14E000FA7673 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 4A51E41C2027CC1C0066DE1A /* PBXTargetDependency */, - ); - name = "ParseTwitterUtils-iOS-Dynamic"; - productName = Breakpad; - productReference = 81ECACD71D1E14E000FA7673 /* ParseTwitterUtils.framework */; - productType = "com.apple.product-type.framework"; - }; - D2AAC07D0554694100DB518D /* ParseTwitterUtils-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseTwitterUtils-iOS" */; - buildPhases = ( - 81B3F2291AC9CA2600A92677 /* Generate Localizable Strings */, - D2AAC07A0554694100DB518D /* Headers */, - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - 8139B1341A7BF6B5002BEF84 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 4A1350A92027F4B8000F5FD5 /* PBXTargetDependency */, - ); - name = "ParseTwitterUtils-iOS"; - productName = Breakpad; - productReference = D2AAC07E0554694100DB518D /* ParseTwitterUtils.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = PF; - LastUpgradeCheck = 1020; - ORGANIZATIONNAME = "Parse, LLC"; - TargetAttributes = { - 8166FB661B4F1D77003841A2 = { - CreatedOnToolsVersion = 6.4; - }; - 81CB98C51AB7905D00136FA5 = { - CreatedOnToolsVersion = 6.2; - TestTargetID = 8166FB661B4F1D77003841A2; - }; - }; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseTwitterUtils" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 1; - knownRegions = ( - en, - Base, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 4A51E3FB2027CC0F0066DE1A /* Products */; - ProjectRef = 4A51E3FA2027CC0F0066DE1A /* Parse.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - D2AAC07D0554694100DB518D /* ParseTwitterUtils-iOS */, - 81ECACB71D1E14E000FA7673 /* ParseTwitterUtils-iOS-Dynamic */, - 81CB98C51AB7905D00136FA5 /* ParseTwitterUtils-Tests */, - 8166FB661B4F1D77003841A2 /* ParseTwitterTestApplication */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 4A51E4082027CC0F0066DE1A /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 4A51E4072027CC0F0066DE1A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A51E40A2027CC0F0066DE1A /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 4A51E4092027CC0F0066DE1A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A51E40C2027CC0F0066DE1A /* ParseUnitTests-iOS.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ParseUnitTests-iOS.xctest"; - remoteRef = 4A51E40B2027CC0F0066DE1A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A51E40E2027CC0F0066DE1A /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 4A51E40D2027CC0F0066DE1A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A51E4102027CC0F0066DE1A /* ParseUnitTests-macOS.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ParseUnitTests-macOS.xctest"; - remoteRef = 4A51E40F2027CC0F0066DE1A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A51E4122027CC0F0066DE1A /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 4A51E4112027CC0F0066DE1A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A51E4142027CC0F0066DE1A /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 4A51E4132027CC0F0066DE1A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A51E4162027CC0F0066DE1A /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 4A51E4152027CC0F0066DE1A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A51E4182027CC0F0066DE1A /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 4A51E4172027CC0F0066DE1A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4A51E41A2027CC0F0066DE1A /* ParseUnitTests-iOS-host.app */ = { - isa = PBXReferenceProxy; - fileType = wrapper.application; - path = "ParseUnitTests-iOS-host.app"; - remoteRef = 4A51E4192027CC0F0066DE1A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 8139B1341A7BF6B5002BEF84 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8166FB651B4F1D77003841A2 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81CB98C41AB7905D00136FA5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81ECACD11D1E14E000FA7673 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 81B3F2291AC9CA2600A92677 /* Generate Localizable Strings */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Generate Localizable Strings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Generate localizable strings\nLOCALIZATION_FOLDER=$PROJECT_DIR/ParseTwitterUtils/Resources/en.lproj\nLOCALIZATION_MACRO=PFTWLocalizedString\n\nfind $PROJECT_DIR/ParseTwitterUtils -name '*.m' -print0 | xargs -0 xcrun extractLocStrings -s $LOCALIZATION_MACRO -q -o $LOCALIZATION_FOLDER\n\nmv $LOCALIZATION_FOLDER/Localizable.strings $LOCALIZATION_FOLDER/ParseTwitterUtils.strings\n"; - showEnvVarsInLog = 0; - }; - 81ECACB91D1E14E000FA7673 /* Generate Localizable Strings */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Generate Localizable Strings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Generate localizable strings\nLOCALIZATION_FOLDER=$PROJECT_DIR/ParseTwitterUtils/Resources/en.lproj\nLOCALIZATION_MACRO=PFTWLocalizedString\n\nfind $PROJECT_DIR/ParseTwitterUtils -name '*.m' -print0 | xargs -0 xcrun extractLocStrings -s $LOCALIZATION_MACRO -q -o $LOCALIZATION_FOLDER\n\nmv $LOCALIZATION_FOLDER/Localizable.strings $LOCALIZATION_FOLDER/ParseTwitterUtils.strings\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 8166FB631B4F1D77003841A2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8166FB921B4F1DC5003841A2 /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81CB98C21AB7905D00136FA5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81665C751BBDE27D00AE923F /* TwitterAuthenticationProviderTests.m in Sources */, - 81665C741BBDE27D00AE923F /* OAuthCoreTests.m in Sources */, - 81665C731BBDE27D00AE923F /* OAuth1FlowDialogTests.m in Sources */, - 81665C771BBDE27D00AE923F /* TwitterUtilsTests.m in Sources */, - 81665C761BBDE27D00AE923F /* TwitterTests.m in Sources */, - 81665C7C1BBDE2EE00AE923F /* PFTwitterTestCase.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81ECACC61D1E14E000FA7673 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D0862929244900C4D90E /* PF_Twitter.m in Sources */, - 7C77D0872929244900C4D90E /* PFTwitterUtils.m in Sources */, - 81ECACC71D1E14E000FA7673 /* PFTwitterAuthenticationProvider.m in Sources */, - 81ECACCA1D1E14E000FA7673 /* PFOAuth1FlowDialog.m in Sources */, - 7C605D0C292A91D700E4B6D2 /* PFTwitterLocalization.m in Sources */, - 81ECACCB1D1E14E000FA7673 /* PFTwitterPrivateUtilities.m in Sources */, - 81ECACCC1D1E14E000FA7673 /* PF_OAuthCore.m in Sources */, - 81ECACCD1D1E14E000FA7673 /* PFTwitterAlertView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D07E2929241300C4D90E /* PF_Twitter.m in Sources */, - 7C77D07F2929241300C4D90E /* PFTwitterUtils.m in Sources */, - 8135E4971B4B6A0E0092F452 /* PFTwitterAuthenticationProvider.m in Sources */, - 815F18411B4B730E0066E996 /* PFOAuth1FlowDialog.m in Sources */, - 7C605D0B292A91D700E4B6D2 /* PFTwitterLocalization.m in Sources */, - 813E54A91BB5E5FA00C727E8 /* PFTwitterPrivateUtilities.m in Sources */, - 817A37CC1B4B741A00129AFA /* PF_OAuthCore.m in Sources */, - 819DAAD71BB5EC79002BDE2B /* PFTwitterAlertView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 4A1350A92027F4B8000F5FD5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Parse-iOS"; - targetProxy = 4A1350A82027F4B8000F5FD5 /* PBXContainerItemProxy */; - }; - 4A51E41C2027CC1C0066DE1A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Parse-iOS-Dynamic"; - targetProxy = 4A51E41B2027CC1C0066DE1A /* PBXContainerItemProxy */; - }; - 8166FB951B4F1E9A003841A2 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - platformFilter = ios; - target = 8166FB661B4F1D77003841A2 /* ParseTwitterTestApplication */; - targetProxy = 8166FB941B4F1E9A003841A2 /* PBXContainerItemProxy */; - }; - B9783143240D050B0049C02B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - platformFilter = ios; - target = D2AAC07D0554694100DB518D /* ParseTwitterUtils-iOS */; - targetProxy = B9783142240D050B0049C02B /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 7C77D075292923FF00C4D90E /* ParseTwitterUtils.strings */ = { - isa = PBXVariantGroup; - children = ( - 7C77D076292923FF00C4D90E /* en */, - ); - name = ParseTwitterUtils.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F51535531B57453700C49F56 /* ParseTwitterUtils-iOS.xcconfig */; - buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F51535531B57453700C49F56 /* ParseTwitterUtils-iOS.xcconfig */; - buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - ONLY_ACTIVE_ARCH = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8154622F1D37FE6E0069489A /* Debug.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - ENABLE_TESTABILITY = YES; - ONLY_ACTIVE_ARCH = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 815462301D37FE6E0069489A /* Release.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = NO; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - PARSE_DIR = "$(PROJECT_DIR)/.."; - }; - name = Release; - }; - 8166FB871B4F1D77003841A2 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F51535551B57455200C49F56 /* ParseTwitterTestApplication.xcconfig */; - buildSettings = { - CODE_SIGN_ENTITLEMENTS = ParseTwitterTestApplication.entitlements; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 8166FB881B4F1D77003841A2 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F51535551B57455200C49F56 /* ParseTwitterTestApplication.xcconfig */; - buildSettings = { - CODE_SIGN_ENTITLEMENTS = ParseTwitterTestApplication.entitlements; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 81CB98CF1AB7905D00136FA5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F51535541B57454500C49F56 /* ParseTwitterUtils-Tests.xcconfig */; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - }; - name = Debug; - }; - 81CB98D01AB7905D00136FA5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F51535541B57454500C49F56 /* ParseTwitterUtils-Tests.xcconfig */; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - }; - name = Release; - }; - 81ECACD51D1E14E000FA7673 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 81ECACD91D1E14F300FA7673 /* ParseTwitterUtils-iOS-Dynamic.xcconfig */; - buildSettings = { - CLANG_MODULES_AUTOLINK = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 81ECACD61D1E14E000FA7673 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 81ECACD91D1E14F300FA7673 /* ParseTwitterUtils-iOS-Dynamic.xcconfig */; - buildSettings = { - CLANG_MODULES_AUTOLINK = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - ONLY_ACTIVE_ARCH = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseTwitterUtils-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 1DEB922008733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseTwitterUtils" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8166FB8B1B4F1D77003841A2 /* Build configuration list for PBXNativeTarget "ParseTwitterTestApplication" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8166FB871B4F1D77003841A2 /* Debug */, - 8166FB881B4F1D77003841A2 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 81CB98D11AB7905D00136FA5 /* Build configuration list for PBXNativeTarget "ParseTwitterUtils-Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 81CB98CF1AB7905D00136FA5 /* Debug */, - 81CB98D01AB7905D00136FA5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 81ECACD41D1E14E000FA7673 /* Build configuration list for PBXNativeTarget "ParseTwitterUtils-iOS-Dynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 81ECACD51D1E14E000FA7673 /* Debug */, - 81ECACD61D1E14E000FA7673 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index f1755b4ab..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/xcshareddata/xcschemes/ParseTwitterUtils-iOS-Dynamic.xcscheme b/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/xcshareddata/xcschemes/ParseTwitterUtils-iOS-Dynamic.xcscheme deleted file mode 100644 index 0ae7f5812..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/xcshareddata/xcschemes/ParseTwitterUtils-iOS-Dynamic.xcscheme +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/xcshareddata/xcschemes/ParseTwitterUtils-iOS.xcscheme b/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/xcshareddata/xcschemes/ParseTwitterUtils-iOS.xcscheme deleted file mode 100644 index 9e870b03e..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils.xcodeproj/xcshareddata/xcschemes/ParseTwitterUtils-iOS.xcscheme +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.h deleted file mode 100644 index c468bbafb..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.h +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import -#import -#import -@class PFOAuth1FlowDialog; - -@protocol PFOAuth1FlowDialogDataSource - -/** - Asks if a link touched by a user should be opened in an external browser. - - If a user touches a link, the default behavior is to open the link in the Safari browser, - which will cause your app to quit. You may want to prevent this from happening, open the link - in your own internal browser, or perhaps warn the user that they are about to leave your app. - If so, implement this method on your delegate and return NO. If you warn the user, you - should hold onto the URL and once you have received their acknowledgement open the URL yourself - using [[UIApplication sharedApplication] openURL:]. - */ -- (BOOL)dialog:(PFOAuth1FlowDialog *)dialog shouldOpenURLInExternalBrowser:(NSURL *)url; - -@end - -typedef void (^PFOAuth1FlowDialogCompletion)(BOOL succeeded, NSURL *url, NSError *error); - -/** - To allow for greater mockability, this protocol exposes all of the methods implemented by PFOAuth1FlowDialog. - */ -@protocol PFOAuth1FlowDialogInterface - -@property (nonatomic, weak) id dataSource; -@property (nonatomic, strong) PFOAuth1FlowDialogCompletion completion; - -@property (nonatomic, copy) NSDictionary *queryParameters; -@property (nonatomic, copy) NSString *redirectURLPrefix; - -/** - The title that is shown in the header atop the view. - */ -@property (nonatomic, copy) NSString *title; - -+ (instancetype)dialogWithURL:(NSURL *)url queryParameters:(NSDictionary *)queryParameters; - -/** - The view will be added to the top of the current key window. - */ -- (void)showAnimated:(BOOL)animated; - -/** - Hides the view. - This method does not call the completion block. - */ -- (void)dismissAnimated:(BOOL)animated; - -/** - Displays a URL in the dialog. - */ -- (void)loadURL:(NSURL *)url queryParameters:(NSDictionary *)parameters; - -@end - -@interface PFOAuth1FlowDialog : UIView { -@public - // Ensures that UI elements behind the dialog are disabled. - UIView *_modalBackgroundView; - - NSURL *_baseURL; - NSURL *_loadingURL; - - UILabel *_titleLabel; - UIButton *_closeButton; - WKWebView *_webView; - UIActivityIndicatorView *_activityIndicator; - - UIInterfaceOrientation _orientation; - BOOL _showingKeyboard; -} - -- (instancetype)initWithURL:(NSURL *)url queryParameters:(NSDictionary *)parameters; - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.m b/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.m deleted file mode 100644 index 73ac12e36..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/Dialog/PFOAuth1FlowDialog.m +++ /dev/null @@ -1,631 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFOAuth1FlowDialog.h" -#import - -#if __has_include() -#import -#else -#import "PFNetworkActivityIndicatorManager.h" -#endif - -@implementation PFOAuth1FlowDialog - -@synthesize dataSource = _dataSource; -@synthesize completion = _completion; - -@synthesize queryParameters = _queryParameters; -@synthesize redirectURLPrefix = _redirectURLPrefix; - -static NSString *const PFOAuth1FlowDialogDefaultTitle = @"Connect to Service"; - -static const CGFloat PFOAuth1FlowDialogBorderGreyColorComponents[4] = {0.3f, 0.3f, 0.3f, 0.8f}; -static const CGFloat PFOAuth1FlowDialogBorderBlackColorComponents[4] = {0.3f, 0.3f, 0.3f, 1.0f}; - -static const NSTimeInterval PFOAuth1FlowDialogAnimationDuration = 0.3; - -static const UIEdgeInsets PFOAuth1FlowDialogContentInsets = { - .top = 10.0f, - .left = 10.0f, - .bottom = 10.0f, - .right = 10.0f, -}; - -static const UIEdgeInsets PFOAuth1FlowDialogTitleInsets = {.top = 4.0f, .left = 8.0f, .bottom = 4.0f, .right = 8.0f}; - -static const CGFloat PFOAuth1FlowDialogScreenInset = 10.0f; - -static BOOL PFOAuth1FlowDialogScreenHasAutomaticRotation() { - static BOOL automaticRotation; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - automaticRotation = [[UIScreen mainScreen] respondsToSelector:NSSelectorFromString(@"coordinateSpace")]; - }); - return automaticRotation; -} - -static BOOL PFOAuth1FlowDialogIsDevicePad() { - static BOOL isPad; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - isPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); - }); - return isPad; -} - -static CGFloat PFTFloatRound(CGFloat value, NSRoundingMode mode) { - switch (mode) { - case NSRoundPlain: - case NSRoundBankers: -#if CGFLOAT_IS_DOUBLE - value = round(value); -#else - value = roundf(value); -#endif - case NSRoundDown: -#if CGFLOAT_IS_DOUBLE - value = floor(value); -#else - value = floorf(value); -#endif - case NSRoundUp: -#if CGFLOAT_IS_DOUBLE - value = ceil(value); -#else - value = ceilf(value); -#endif - default: break; - } - return value; -} - -#pragma mark - -#pragma mark Class - -+ (void)_fillRect:(CGRect)rect withColorComponents:(const CGFloat *)colorComponents radius:(CGFloat)radius { - CGContextRef context = UIGraphicsGetCurrentContext(); - - if (colorComponents) { - CGContextSaveGState(context); - CGContextSetFillColor(context, colorComponents); - if (radius != 0.0f) { - UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius]; - CGContextAddPath(context, [bezierPath CGPath]); - CGContextFillPath(context); - } else { - CGContextFillRect(context, rect); - } - CGContextRestoreGState(context); - } -} - -+ (void)_strokeRect:(CGRect)rect withColorComponents:(const CGFloat *)strokeColor { - CGContextRef context = UIGraphicsGetCurrentContext(); - - CGContextSaveGState(context); - { - CGContextSetStrokeColor(context, strokeColor); - CGContextSetLineWidth(context, 1.0f); - CGContextStrokeRect(context, rect); - } - CGContextRestoreGState(context); -} - -+ (NSURL *)_urlFromBaseURL:(NSURL *)baseURL queryParameters:(NSDictionary *)params { - if ([params count] > 0) { - NSMutableArray *parameterPairs = [NSMutableArray array]; - [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - CFStringRef escapedString = CFURLCreateStringByAddingPercentEscapes( - NULL, /* allocator */ - (CFStringRef)obj, - NULL, /* charactersToLeaveUnescaped */ - (CFStringRef)@"!*'();:@&=+$,/?%#[]", - kCFStringEncodingUTF8); - [parameterPairs addObject:[NSString stringWithFormat:@"%@=%@", key, CFBridgingRelease(escapedString)]]; - }]; - - NSString *query = [parameterPairs componentsJoinedByString:@"&"]; - NSString *url = [NSString stringWithFormat:@"%@?%@", [baseURL absoluteString], query]; - - return [NSURL URLWithString:url]; - } - - return baseURL; -} - -+ (UIImage *)_closeButtonImage { - CGRect imageRect = CGRectZero; - imageRect.size = CGSizeMake(30.0f, 30.0f); - - UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, 0.0f); - CGContextRef context = UIGraphicsGetCurrentContext(); - - CGRect outerRingRect = CGRectInset(imageRect, 2.0f, 2.0f); - - [[UIColor whiteColor] set]; - CGContextFillEllipseInRect(context, outerRingRect); - - CGRect innerRingRect = CGRectInset(outerRingRect, 2.0f, 2.0f); - - [[UIColor blackColor] set]; - CGContextFillEllipseInRect(context, innerRingRect); - - CGRect crossRect = CGRectInset(innerRingRect, 6.0f, 6.0f); - - CGContextBeginPath(context); - - [[UIColor whiteColor] setStroke]; - CGContextSetLineWidth(context, 3.0f); - - CGContextMoveToPoint(context, CGRectGetMinX(crossRect), CGRectGetMinY(crossRect)); - CGContextAddLineToPoint(context, CGRectGetMaxX(crossRect), CGRectGetMaxY(crossRect)); - - CGContextMoveToPoint(context, CGRectGetMaxX(crossRect), CGRectGetMinY(crossRect)); - CGContextAddLineToPoint(context, CGRectGetMinX(crossRect), CGRectGetMaxY(crossRect)); - - CGContextStrokePath(context); - - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return image; -} - -#pragma mark - -#pragma mark Init - -- (instancetype)init { - self = [super initWithFrame:CGRectZero]; - if (self) { - self.backgroundColor = [UIColor clearColor]; - self.autoresizesSubviews = YES; - self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - self.contentMode = UIViewContentModeRedraw; - - _orientation = UIInterfaceOrientationPortrait; - - _closeButton = [UIButton buttonWithType:UIButtonTypeCustom]; - _closeButton.showsTouchWhenHighlighted = YES; - _closeButton.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin); - [_closeButton setImage:[[self class] _closeButtonImage] forState:UIControlStateNormal]; - [_closeButton addTarget:self - action:@selector(_cancelButtonAction) - forControlEvents:UIControlEventTouchUpInside]; - [self addSubview:_closeButton]; - - CGFloat titleLabelFontSize = (PFOAuth1FlowDialogIsDevicePad() ? 18.0f : 14.0f); - _titleLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; - _titleLabel.backgroundColor = [UIColor clearColor]; - _titleLabel.text = PFOAuth1FlowDialogDefaultTitle; - _titleLabel.textColor = [UIColor whiteColor]; - _titleLabel.font = [UIFont boldSystemFontOfSize:titleLabelFontSize]; - [self addSubview:_titleLabel]; - - _webView = [[WKWebView alloc] initWithFrame:CGRectZero]; - _webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - _webView.navigationDelegate = self; - [self addSubview:_webView]; - - _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: - UIActivityIndicatorViewStyleWhiteLarge]; - _activityIndicator.color = [UIColor grayColor]; - _activityIndicator.autoresizingMask = (UIViewAutoresizingFlexibleTopMargin | - UIViewAutoresizingFlexibleBottomMargin | - UIViewAutoresizingFlexibleLeftMargin | - UIViewAutoresizingFlexibleRightMargin); - [self addSubview:_activityIndicator]; - - _modalBackgroundView = [[UIView alloc] init]; - } - return self; -} - -- (instancetype)initWithURL:(NSURL *)url queryParameters:(NSDictionary *)parameters { - self = [self init]; - if (self) { - _baseURL = url; - _queryParameters = [parameters mutableCopy]; - } - return self; -} - -+ (instancetype)dialogWithURL:(NSURL *)url queryParameters:(NSDictionary *)queryParameters { - return [[self alloc] initWithURL:url queryParameters:queryParameters]; -} - -#pragma mark - -#pragma mark Dealloc - -- (void)dealloc { - _webView.navigationDelegate = nil; - - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - -#pragma mark UIView - -- (void)drawRect:(CGRect)rect { - [super drawRect:rect]; - - [[self class] _fillRect:self.bounds withColorComponents:PFOAuth1FlowDialogBorderGreyColorComponents radius:10.0f]; - [[self class] _strokeRect:_webView.frame withColorComponents:PFOAuth1FlowDialogBorderBlackColorComponents]; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - - const CGRect bounds = self.bounds; - const CGRect contentRect = UIEdgeInsetsInsetRect(bounds, PFOAuth1FlowDialogContentInsets); - - CGRect titleLabelBoundingRect = UIEdgeInsetsInsetRect(contentRect, PFOAuth1FlowDialogTitleInsets); - CGSize titleLabelSize = [_titleLabel sizeThatFits:titleLabelBoundingRect.size]; - titleLabelBoundingRect.size.width = (CGRectGetMaxX(contentRect) - - PFOAuth1FlowDialogTitleInsets.right - - titleLabelSize.height); - titleLabelSize = [_titleLabel sizeThatFits:titleLabelBoundingRect.size]; - - CGRect titleLabelFrame = titleLabelBoundingRect; - titleLabelFrame.size.height = titleLabelSize.height; - titleLabelFrame.size.width = CGRectGetWidth(titleLabelBoundingRect); - _titleLabel.frame = titleLabelFrame; - - CGRect closeButtonFrame = contentRect; - closeButtonFrame.size.height = (CGRectGetHeight(titleLabelFrame) + - PFOAuth1FlowDialogTitleInsets.top + - PFOAuth1FlowDialogTitleInsets.bottom); - closeButtonFrame.size.width = CGRectGetHeight(closeButtonFrame); - closeButtonFrame.origin.x = CGRectGetMaxX(contentRect) - CGRectGetWidth(closeButtonFrame); - _closeButton.frame = closeButtonFrame; - - CGRect webViewFrame = contentRect; - if (!_showingKeyboard || PFOAuth1FlowDialogIsDevicePad() || UIInterfaceOrientationIsPortrait(_orientation)) { - webViewFrame.origin.y = CGRectGetMaxY(titleLabelFrame) + PFOAuth1FlowDialogTitleInsets.bottom; - webViewFrame.size.height = CGRectGetMaxY(contentRect) - CGRectGetMinY(webViewFrame); - } - _webView.frame = webViewFrame; - - [_activityIndicator sizeToFit]; - _activityIndicator.center = _webView.center; -} - -#pragma mark - -#pragma mark Accessors - -- (NSString *)title { - return _titleLabel.text; -} - -- (void)setTitle:(NSString *)title { - _titleLabel.text = title; - - [self setNeedsLayout]; -} - -#pragma mark - -#pragma mark Present / Dismiss - -- (void)showAnimated:(BOOL)animated { - [self load]; - [self _sizeToFitOrientation]; - - [_activityIndicator startAnimating]; - - UIWindow *window = [UIApplication sharedApplication].keyWindow; - _modalBackgroundView.frame = window.bounds; - [_modalBackgroundView addSubview:self]; - [window addSubview:_modalBackgroundView]; - - CGAffineTransform transform = [self _transformForOrientation:_orientation]; - if (animated) { - self.transform = CGAffineTransformScale(transform, 0.001f, 0.001f); - - NSTimeInterval animationStepDuration = PFOAuth1FlowDialogAnimationDuration / 2.0f; - - [UIView animateWithDuration:animationStepDuration - animations:^{ - self.transform = CGAffineTransformScale(transform, 1.1f, 1.1f); - } - completion:^(BOOL finished) { - [UIView animateWithDuration:animationStepDuration - animations:^{ - self.transform = CGAffineTransformScale(transform, 0.9f, 0.9f); - } - completion:^(BOOL finished) { - [UIView animateWithDuration:animationStepDuration - animations:^{ - self.transform = transform; - }]; - }]; - - }]; - } else { - self.transform = transform; - } - - [self _addObservers]; -} - -- (void)dismissAnimated:(BOOL)animated { - _loadingURL = nil; - - __weak typeof(self) wself = self; - dispatch_block_t completionBlock = ^{ - __strong typeof(wself) sself = wself; - [sself _removeObservers]; - [sself removeFromSuperview]; - [sself->_modalBackgroundView removeFromSuperview]; - }; - - if (animated) { - [UIView animateWithDuration:PFOAuth1FlowDialogAnimationDuration - animations:^{ - typeof(wself) sself = wself; - sself.alpha = 0.0f; - } - completion:^(BOOL finished) { - completionBlock(); - }]; - } else { - completionBlock(); - } -} - -- (void)_dismissWithSuccess:(BOOL)success url:(NSURL *)url error:(NSError *)error { - if (!self.completion) { - return; - } - - PFOAuth1FlowDialogCompletion completion = self.completion; - self.completion = nil; - - dispatch_async(dispatch_get_main_queue(), ^{ - completion(success, url, error); - }); - - [self dismissAnimated:YES]; -} - -- (void)_cancelButtonAction { - [self _dismissWithSuccess:NO url:nil error:nil]; -} - -#pragma mark - -#pragma mark Public - -- (void)load { - [self loadURL:_baseURL queryParameters:self.queryParameters]; -} - -- (void)loadURL:(NSURL *)url queryParameters:(NSDictionary *)parameters { - _loadingURL = [[self class] _urlFromBaseURL:url queryParameters:parameters]; - - NSURLRequest *request = [NSURLRequest requestWithURL:_loadingURL]; - [_webView loadRequest:request]; -} - -#pragma mark - -#pragma mark WKWebViewNavigationDelegate - -- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { - NSURL *url = navigationAction.request.URL; - BOOL hasPrefix = [url.absoluteString hasPrefix:self.redirectURLPrefix]; - if (hasPrefix) { - NSURLComponents* components = [[NSURLComponents alloc] initWithString:url.absoluteString]; - NSArray * items = components.queryItems; - if (items) { - for (NSURLQueryItem * queryItem in items) { - if ([queryItem.name isEqualToString:@"denied"]) { - [self _dismissWithSuccess:NO url:url error:nil]; - break; - } else if ([queryItem.name isEqualToString:@"oauth_verifier"] || [queryItem.name isEqualToString:@"oauth_token" ]) { - [self _dismissWithSuccess:YES url:url error:nil]; - break;; - } - } - } else { - [self _dismissWithSuccess:NO url:url error:nil]; - } - decisionHandler(WKNavigationActionPolicyCancel); - return; - } else if (navigationAction.navigationType == UIWebViewNavigationTypeLinkClicked && [self.dataSource dialog:self shouldOpenURLInExternalBrowser:url]) { - [[UIApplication sharedApplication] openURL:url]; - } else { - decisionHandler(WKNavigationActionPolicyAllow); - } -} - - - -- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { - [[PFNetworkActivityIndicatorManager sharedManager] incrementActivityCount]; -} - -- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { - [[PFNetworkActivityIndicatorManager sharedManager] decrementActivityCount]; - - [_activityIndicator stopAnimating]; - [_webView evaluateJavaScript:@"document.title" completionHandler:^(id _Nullable string, NSError * _Nullable error) { - self.title = (NSString *) string; - - }]; - -} - -- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error { - [[PFNetworkActivityIndicatorManager sharedManager] decrementActivityCount]; - - // 102 == WebKitErrorFrameLoadInterruptedByPolicyChange - if (!([error.domain isEqualToString:@"WebKitErrorDomain"] && error.code == 102)) { - [self _dismissWithSuccess:NO url:nil error:error]; - } -} - -#pragma mark - -#pragma mark Observers - -- (void)_addObservers { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_deviceOrientationDidChange:) - name:UIDeviceOrientationDidChangeNotification - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_keyboardWillShow:) - name:UIKeyboardWillShowNotification - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_keyboardWillHide:) - name:UIKeyboardWillHideNotification - object:nil]; -} - -- (void)_removeObservers { - [[NSNotificationCenter defaultCenter] removeObserver:self - name:UIDeviceOrientationDidChangeNotification - object:nil]; - [[NSNotificationCenter defaultCenter] removeObserver:self - name:UIKeyboardWillShowNotification - object:nil]; - [[NSNotificationCenter defaultCenter] removeObserver:self - name:UIKeyboardWillHideNotification - object:nil]; -} - -#pragma mark - -#pragma mark UIDeviceOrientationDidChangeNotification - -- (void)_deviceOrientationDidChange:(NSNotification *)notification { - UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; - if ([self _shouldRotateToOrientation:orientation]) { - NSTimeInterval duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration; - [UIView animateWithDuration:duration - animations:^{ - [self _sizeToFitOrientation]; - }]; - } -} - -- (BOOL)_shouldRotateToOrientation:(UIInterfaceOrientation)orientation { - if (orientation == _orientation) { - return NO; - } - - return (orientation == UIDeviceOrientationLandscapeLeft || - orientation == UIDeviceOrientationLandscapeRight || - orientation == UIDeviceOrientationPortrait || - orientation == UIDeviceOrientationPortraitUpsideDown); -} - -- (CGAffineTransform)_transformForOrientation:(UIInterfaceOrientation)orientation { - // No manual rotation required on iOS 8 - // There is coordinateSpace method, since iOS 8 - if (PFOAuth1FlowDialogScreenHasAutomaticRotation()) { - return CGAffineTransformIdentity; - } - - switch (orientation) { - case UIInterfaceOrientationLandscapeLeft: - return CGAffineTransformMakeRotation((CGFloat)(-M_PI / 2.0f)); - break; - case UIInterfaceOrientationLandscapeRight: - return CGAffineTransformMakeRotation((CGFloat)(M_PI / 2.0f)); - break; - case UIInterfaceOrientationPortraitUpsideDown: - return CGAffineTransformMakeRotation((CGFloat)-M_PI); - break; - case UIInterfaceOrientationPortrait: - case UIInterfaceOrientationUnknown: - default: - break; - } - - return CGAffineTransformIdentity; -} - -- (void)_sizeToFitOrientation { - _orientation = [UIApplication sharedApplication].statusBarOrientation; - CGAffineTransform transform = [self _transformForOrientation:_orientation]; - - CGRect bounds = [UIScreen mainScreen].applicationFrame; - CGRect transformedBounds = CGRectApplyAffineTransform(bounds, transform); - transformedBounds.origin = CGPointZero; - - CGPoint center = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)); - - CGFloat scale = (PFOAuth1FlowDialogIsDevicePad() ? 0.6f : 1.0f); - - CGFloat width = PFTFloatRound((scale * CGRectGetWidth(transformedBounds)) - PFOAuth1FlowDialogScreenInset * 2.0f, NSRoundDown); - CGFloat height = PFTFloatRound((scale * CGRectGetHeight(transformedBounds)) - PFOAuth1FlowDialogScreenInset * 2.0f, NSRoundDown); - - self.transform = transform; - self.center = center; - self.bounds = CGRectMake(0.0f, 0.0f, width, height); - - [self setNeedsLayout]; -} - -#pragma mark - -#pragma mark UIKeyboardNotifications - -- (void)_keyboardWillShow:(NSNotification *)notification { - _showingKeyboard = YES; - - if (PFOAuth1FlowDialogIsDevicePad()) { - // On the iPad the screen is large enough that we don't need to - // resize the dialog to accomodate the keyboard popping up - return; - } - - UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; - if (UIInterfaceOrientationIsLandscape(orientation)) { - NSDictionary *userInfo = [notification userInfo]; - NSTimeInterval animationDuration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - UIViewAnimationCurve animationCurve = [[notification userInfo][UIKeyboardAnimationCurveUserInfoKey] intValue]; - - [UIView animateWithDuration:animationDuration - delay:0.0 - options:animationCurve << 16 | UIViewAnimationOptionBeginFromCurrentState - animations:^{ - [self setNeedsLayout]; - [self layoutIfNeeded]; - - [self setNeedsDisplay]; - } - completion:nil]; - } -} - -- (void)_keyboardWillHide:(NSNotification *)notification { - _showingKeyboard = NO; - - if (PFOAuth1FlowDialogIsDevicePad()) { - return; - } - UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; - if (UIInterfaceOrientationIsLandscape(orientation)) { - NSDictionary *userInfo = [notification userInfo]; - NSTimeInterval animationDuration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - UIViewAnimationCurve animationCurve = [[notification userInfo][UIKeyboardAnimationCurveUserInfoKey] intValue]; - - [UIView animateWithDuration:animationDuration - delay:0.0 - options:animationCurve << 16 | UIViewAnimationOptionBeginFromCurrentState - animations:^{ - [self setNeedsLayout]; - [self layoutIfNeeded]; - - [self setNeedsDisplay]; - } - completion:nil]; - } -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/OAuthCore/PF_OAuthCore.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/OAuthCore/PF_OAuthCore.h deleted file mode 100644 index a44f469cb..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/OAuthCore/PF_OAuthCore.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface PFOAuthConfiguration : NSObject - -@property (nonatomic, strong) NSURL *url; -@property (nonatomic, copy) NSString *method; -@property (nullable, nonatomic, strong) NSData *body; - -@property (nonatomic, copy) NSString *consumerKey; -@property (nonatomic, copy) NSString *consumerSecret; - -@property (nullable, nonatomic, copy) NSString *token; -@property (nullable, nonatomic, copy) NSString *tokenSecret; - -@property (nullable, nonatomic, copy) NSDictionary *additionalParameters; - -@property (nonatomic, copy) NSString *nonce; -@property (nonatomic, strong) NSDate *timestampDate; - -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -+ (instancetype)configurationForURL:(NSURL *)url - method:(NSString *)method - body:(nullable NSData *)body - additionalParameters:(nullable NSDictionary *)additionalParams - consumerKey:(NSString *)consumerKey - consumerSecret:(NSString *)consumerSecret - token:(nullable NSString *)token - tokenSecret:(nullable NSString *)tokenSecret; - -@end - -@interface PFOAuth : NSObject - -+ (NSString *)authorizationHeaderFromConfiguration:(PFOAuthConfiguration *)configuration; - -@end - -@interface NSURL (PF_OAuthAdditions) - -+ (NSDictionary *)PF_ab_parseURLQueryString:(NSString *)query; - -@end - -@interface NSString (PF_OAuthAdditions) - -- (NSString *)PF_ab_RFC3986EncodedString; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/OAuthCore/PF_OAuthCore.m b/ParseTwitterUtils/ParseTwitterUtils/Internal/OAuthCore/PF_OAuthCore.m deleted file mode 100644 index 987ebcc52..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/OAuthCore/PF_OAuthCore.m +++ /dev/null @@ -1,192 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PF_OAuthCore.h" - -#import - -static NSData *PF_HMAC_SHA1(NSString *data, NSString *key) { - unsigned char buf[CC_SHA1_DIGEST_LENGTH]; - CCHmac(kCCHmacAlgSHA1, [key UTF8String], [key length], [data UTF8String], [data length], buf); - return [NSData dataWithBytes:buf length:CC_SHA1_DIGEST_LENGTH]; -} - -@implementation PFOAuthConfiguration - -- (instancetype)init { - self = [super init]; - if (!self) return nil; - - _nonce = [[NSUUID UUID] UUIDString]; - _timestampDate = [NSDate date]; - - return self; -} - -+ (instancetype)configurationForURL:(NSURL *)url - method:(NSString *)method - body:(nullable NSData *)body - additionalParameters:(nullable NSDictionary *)additionalParams - consumerKey:(NSString *)consumerKey - consumerSecret:(NSString *)consumerSecret - token:(nullable NSString *)token - tokenSecret:(nullable NSString *)tokenSecret { - PFOAuthConfiguration *configuration = [[self alloc] init]; - configuration.url = url; - configuration.method = method; - configuration.body = body; - configuration.additionalParameters = additionalParams; - configuration.consumerKey = consumerKey; - configuration.consumerSecret = consumerSecret; - configuration.token = token; - configuration.tokenSecret = tokenSecret; - return configuration; -} - -@end - -@implementation PFOAuth - -+ (NSString *)authorizationHeaderFromConfiguration:(PFOAuthConfiguration *)configuration { - NSString *authTimeStamp = [NSString stringWithFormat:@"%llu", - (unsigned long long)floor([configuration.timestampDate timeIntervalSince1970])]; - NSString *authSignatureMethod = @"HMAC-SHA1"; - NSString *authVersion = @"1.0"; - NSURL *url = configuration.url; - - // Don't use -mutableCopy here, as that will return nil if `additionalParams` is nil. - NSMutableDictionary *oAuthAuthorizationParameters = [NSMutableDictionary dictionaryWithDictionary:configuration.additionalParameters]; - - oAuthAuthorizationParameters[@"oauth_nonce"] = configuration.nonce; - oAuthAuthorizationParameters[@"oauth_timestamp"] = authTimeStamp; - oAuthAuthorizationParameters[@"oauth_signature_method"] = authSignatureMethod; - oAuthAuthorizationParameters[@"oauth_version"] = authVersion; - oAuthAuthorizationParameters[@"oauth_consumer_key"] = configuration.consumerKey; - - if (configuration.token) { - oAuthAuthorizationParameters[@"oauth_token"] = configuration.token; - } - - // get query and body parameters - NSDictionary *additionalQueryParameters = [NSURL PF_ab_parseURLQueryString:[url query]]; - NSDictionary *additionalBodyParameters = nil; - if (configuration.body) { - NSString *string = [[NSString alloc] initWithData:configuration.body encoding:NSUTF8StringEncoding]; - additionalBodyParameters = [NSURL PF_ab_parseURLQueryString:string]; - } - - // combine all parameters - NSMutableDictionary *parameters = [oAuthAuthorizationParameters mutableCopy]; - [parameters addEntriesFromDictionary:additionalQueryParameters]; - if (additionalBodyParameters) { - [parameters addEntriesFromDictionary:additionalBodyParameters]; - } - - NSArray *sortedKeys = [[parameters allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { - return [obj1 compare:obj2] ?: [parameters[obj1] compare:parameters[obj2]]; - }]; - - NSMutableArray *parameterArray = [NSMutableArray array]; - for (NSString *key in sortedKeys) { - [parameterArray addObject:[NSString stringWithFormat:@"%@=%@", key, [parameters[key] PF_ab_RFC3986EncodedString]]]; - } - - NSString *normalizedParameterString = [parameterArray componentsJoinedByString:@"&"]; - NSString *normalizedURLString = [NSString stringWithFormat:@"%@://%@%@", [url scheme], [url host], [url path]]; - - NSString *signatureBaseString = [NSString stringWithFormat:@"%@&%@&%@", - [configuration.method PF_ab_RFC3986EncodedString], - [normalizedURLString PF_ab_RFC3986EncodedString], - [normalizedParameterString PF_ab_RFC3986EncodedString]]; - - NSString *key = [NSString stringWithFormat:@"%@&%@", - [configuration.consumerSecret PF_ab_RFC3986EncodedString], - (configuration.tokenSecret ? [configuration.tokenSecret PF_ab_RFC3986EncodedString] : @"")]; - - NSData *signature = PF_HMAC_SHA1(signatureBaseString, key); - NSString *base64Signature = [signature base64EncodedStringWithOptions:0]; - - oAuthAuthorizationParameters[@"oauth_signature"] = base64Signature; - - NSMutableArray *authorizationHeaderItems = [NSMutableArray array]; - [oAuthAuthorizationParameters enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { - [authorizationHeaderItems addObject:[NSString stringWithFormat:@"%@=\"%@\"", - [key PF_ab_RFC3986EncodedString], - [value PF_ab_RFC3986EncodedString]]]; - }]; - - NSString *authorizationHeaderString = [authorizationHeaderItems componentsJoinedByString:@", "]; - authorizationHeaderString = [NSString stringWithFormat:@"OAuth %@", authorizationHeaderString]; - - return authorizationHeaderString; -} - -@end - -@implementation NSURL (OAuthAdditions) - -+ (NSDictionary *)PF_ab_parseURLQueryString:(NSString *)query { - // Use NSURLComponents if available. - if ([NSURLComponents class] != nil && [NSURLComponents instancesRespondToSelector:@selector(queryItems)]) { - NSURLComponents *components = [[NSURLComponents alloc] init]; - [components setQuery:query]; - - NSArray *queryItems = components.queryItems; - - NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:components.queryItems.count]; - for (NSURLQueryItem *item in queryItems) { - dictionary[item.name] = [item.value stringByRemovingPercentEncoding]; - } - return dictionary; - } - - NSMutableDictionary *dict = [NSMutableDictionary dictionary]; - NSArray *pairs = [query componentsSeparatedByString:@"&"]; - for (NSString *pair in pairs) { - NSArray *keyValue = [pair componentsSeparatedByString:@"="]; - if ([keyValue count] == 2) { - NSString *key = [keyValue objectAtIndex:0]; - NSString *value = [keyValue objectAtIndex:1]; - value = [value stringByRemovingPercentEncoding]; - if (key && value) - [dict setObject:value forKey:key]; - } - } - return [NSDictionary dictionaryWithDictionary:dict]; -} - -@end - -@implementation NSString (OAuthAdditions) - -- (NSString *)PF_ab_RFC3986EncodedString // UTF-8 encodes prior to URL encoding -{ - NSMutableString *result = [NSMutableString string]; - const char *p = [self UTF8String]; - unsigned char c; - - for (; (c = *p); p++) { - switch (c) { - case '0' ... '9': - case 'A' ... 'Z': - case 'a' ... 'z': - case '.': - case '-': - case '~': - case '_': - [result appendFormat:@"%c", c]; - break; - default: - [result appendFormat:@"%%%02X", c]; - } - } - return result; -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAlertView.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAlertView.h deleted file mode 100644 index 3b8c81562..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAlertView.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -typedef void (^PFTwitterAlertViewCompletion)(NSUInteger selectedOtherButtonIndex); - -@interface PFTwitterAlertView : NSObject - -+ (void)showAlertWithTitle:(NSString *)title - message:(NSString *)message - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(NSArray *)otherButtonTitles - completion:(PFTwitterAlertViewCompletion)completion NS_EXTENSION_UNAVAILABLE_IOS(""); - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAlertView.m b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAlertView.m deleted file mode 100644 index e42371b08..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAlertView.m +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterAlertView.h" - -@interface PFTwitterAlertView () - -@property (nonatomic, copy) PFTwitterAlertViewCompletion completion; - -@end - -@implementation PFTwitterAlertView - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -+ (void)showAlertWithTitle:(NSString *)title - message:(NSString *)message - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(NSArray *)otherButtonTitles - completion:(PFTwitterAlertViewCompletion)completion { - if ([UIAlertController class] != nil) { - __block UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title - message:message - preferredStyle:UIAlertControllerStyleAlert]; - - void (^alertActionHandler)(UIAlertAction *) = [^(UIAlertAction *action) { - if (completion) { - // This block intentionally retains alertController, and releases it afterwards. - if (action.style == UIAlertActionStyleCancel) { - completion(NSNotFound); - } else { - NSUInteger index = [alertController.actions indexOfObject:action]; - completion(index - 1); - } - } - alertController = nil; - } copy]; - - [alertController addAction:[UIAlertAction actionWithTitle:cancelButtonTitle - style:UIAlertActionStyleCancel - handler:alertActionHandler]]; - - for (NSString *buttonTitle in otherButtonTitles) { - [alertController addAction:[UIAlertAction actionWithTitle:buttonTitle - style:UIAlertActionStyleDefault - handler:alertActionHandler]]; - } - - UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow; - UIViewController *viewController = keyWindow.rootViewController; - while (viewController.presentedViewController) { - viewController = viewController.presentedViewController; - } - - [viewController presentViewController:alertController animated:YES completion:nil]; - } else { -#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 - __block PFTwitterAlertView *pfAlertView = [[self alloc] init]; - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title - message:message - delegate:nil - cancelButtonTitle:cancelButtonTitle - otherButtonTitles:nil]; - - for (NSString *buttonTitle in otherButtonTitles) { - [alertView addButtonWithTitle:buttonTitle]; - } - - pfAlertView.completion = ^(NSUInteger index) { - if (completion) { - completion(index); - } - - pfAlertView = nil; - }; - - alertView.delegate = pfAlertView; - [alertView show]; -#endif - } -} - -#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 - -///-------------------------------------- -#pragma mark - UIAlertViewDelegate -///-------------------------------------- - -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { - if (self.completion) { - if (buttonIndex == alertView.cancelButtonIndex) { - self.completion(NSNotFound); - } else { - self.completion(buttonIndex - 1); - } - } -} - -#endif - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAuthenticationProvider.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAuthenticationProvider.h deleted file mode 100644 index 2d6b19c48..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAuthenticationProvider.h +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#if __has_include() -#import -#else -#import "PFUserAuthenticationDelegate.h" -#endif - -@class BFTask<__covariant BFGenericType>; -@class PF_Twitter; - -NS_ASSUME_NONNULL_BEGIN - -extern NSString *const PFTwitterUserAuthenticationType; - -@interface PFTwitterAuthenticationProvider : NSObject - -@property (nonatomic, strong, readonly) PF_Twitter *twitter; - -- (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithTwitter:(PF_Twitter *)twitter NS_DESIGNATED_INITIALIZER; -+ (instancetype)providerWithTwitter:(PF_Twitter *)twitter; - -- (BFTask *)authenticateAsync; - -- (NSDictionary *)authDataWithTwitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - secret:(NSString *)authTokenSecret; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAuthenticationProvider.m b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAuthenticationProvider.m deleted file mode 100644 index d8cd8bba0..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterAuthenticationProvider.m +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterAuthenticationProvider.h" - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -#if __has_include() -#import -#else -#import "PFConstants.h" -#endif - -#import "PFTwitterPrivateUtilities.h" -#import "PF_Twitter.h" - -NSString *const PFTwitterUserAuthenticationType = @"twitter"; - -static NSString *const _PFTwitterAuthDataIdKey = @"id"; -static NSString *const _PFTwitterAuthDataScreenNameKey = @"screen_name"; -static NSString *const _PFTwitterAuthDataAuthTokenKey = @"auth_token"; -static NSString *const _PFTwitterAuthDataAuthTokenSecretKey = @"auth_token_secret"; -static NSString *const _PFTwitterAuthDataConsumerKeyKey = @"consumer_key"; -static NSString *const _PFTwitterAuthDataConsumerSecretKey = @"consumer_secret"; - -@implementation PFTwitterAuthenticationProvider - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -- (instancetype)init { - PFTWConsistencyAssert(NO, @"%@ is not a designated initializer for instances of %@.", - NSStringFromSelector(_cmd), NSStringFromClass([self class])); - return nil; -} - -- (instancetype)initWithTwitter:(PF_Twitter *)twitter { - self = [super init]; - if (!self) return nil; - - _twitter = twitter; - - return self; -} - -+ (instancetype)providerWithTwitter:(PF_Twitter *)twitter { - return [[self alloc] initWithTwitter:twitter]; -} - -///-------------------------------------- -#pragma mark - Auth Data -///-------------------------------------- - -- (NSDictionary *)authDataWithTwitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - secret:(NSString *)authTokenSecret { - NSDictionary *authData = @{_PFTwitterAuthDataIdKey : twitterId, - _PFTwitterAuthDataScreenNameKey : screenName, - _PFTwitterAuthDataAuthTokenKey : authToken, - _PFTwitterAuthDataAuthTokenSecretKey : authTokenSecret, - _PFTwitterAuthDataConsumerKeyKey : self.twitter.consumerKey, - _PFTwitterAuthDataConsumerSecretKey : self.twitter.consumerSecret}; - return authData; -} - -///-------------------------------------- -#pragma mark - Authentication -///-------------------------------------- - -- (BFTask *)authenticateAsync { - return [[self.twitter authorizeInBackground] continueWithSuccessBlock:^id(BFTask *task) { - NSDictionary *authData = [self authDataWithTwitterId:self.twitter.userId - screenName:self.twitter.screenName - authToken:self.twitter.authToken - secret:self.twitter.authTokenSecret]; - return [BFTask taskWithResult:authData]; - }]; -} - -///-------------------------------------- -#pragma mark - PFUserAuthenticationDelegate -///-------------------------------------- - -- (BOOL)restoreAuthenticationWithAuthData:(NSDictionary *)authData { - // If authData is nil, this is an unlink operation, which should succeed. - if (!authData) { - self.twitter.userId = nil; - self.twitter.authToken = nil; - self.twitter.authTokenSecret = nil; - self.twitter.screenName = nil; - return YES; - } - - // Check that the authData contains the required fields, and if so, synchronize. - NSString *userId = authData[_PFTwitterAuthDataIdKey]; - NSString *screenName = authData[_PFTwitterAuthDataScreenNameKey]; - NSString *authToken = authData[_PFTwitterAuthDataAuthTokenKey]; - NSString *authTokenSecret = authData[_PFTwitterAuthDataAuthTokenSecretKey]; - if (userId && screenName && authToken && authTokenSecret) { - self.twitter.userId = userId; - self.twitter.screenName = screenName; - self.twitter.authToken = authToken; - self.twitter.authTokenSecret = authTokenSecret; - return YES; - } - return NO; -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterLocalization.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterLocalization.h deleted file mode 100644 index 0d1aadd03..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterLocalization.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#ifndef PFTwitterLocalization_h -#define PFTwitterLocalization_h - -#import - -#define PFTWLocalizedString(key, comment) \ -[PFTwitterLocalization localizedStringForKey:key] - -#endif - -/** - Used by the above macro to fetch a localized string - */ -@interface PFTwitterLocalization : NSObject - -+ (NSString *)localizedStringForKey:key; - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterLocalization.m b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterLocalization.m deleted file mode 100644 index bb5c51519..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterLocalization.m +++ /dev/null @@ -1,38 +0,0 @@ -// -// PFTwitterLocalization.m -// -// -// Created by Volodymyr Nazarkevych on 29.11.2022. -// - -#import "PFTwitterLocalization.h" - -@implementation PFTwitterLocalization - -+ (NSString *)localizedStringForKey:key { - return [[self resourcesBundle] localizedStringForKey:key value:nil table:@"ParseTwitterUtils"]; -} - -+ (NSBundle *)resourcesBundle { - static NSBundle *bundle; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSBundle *classBundle = [NSBundle bundleForClass:[self class]]; - NSURL *bundleURL = [classBundle URLForResource:@"ParseTwitterUtils" withExtension:@"bundle"]; - - if (bundleURL) { - bundle = [NSBundle bundleWithURL:bundleURL]; - } else { - bundleURL = [classBundle URLForResource:@"ParseObjC_ParseTwitterUtils" withExtension:@"bundle"]; - if (bundleURL) { - bundle = [NSBundle bundleWithURL:bundleURL]; - } - else { - bundle = [NSBundle mainBundle]; - } - } - }); - return bundle; -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterPrivateUtilities.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterPrivateUtilities.h deleted file mode 100644 index e22fc2d75..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterPrivateUtilities.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -#if __has_include() -#import -#else -#import "PFConstants.h" -#endif - -@interface PFTwitterPrivateUtilities : NSObject - -+ (void)safePerformSelector:(SEL)selector onTarget:(id)target withObject:(id)object object:(id)anotherObject; - -@end - -@interface BFTask (ParseTwitterUtils) - -- (id)pftw_waitForResult:(NSError **)error; - -//TODO: (nlutsenko) Look into killing this and replacing with generic continueWithBlock: -- (instancetype)pftw_continueAsyncWithBlock:(BFContinuationBlock)block; - -- (instancetype)pftw_continueWithMainThreadUserBlock:(PFUserResultBlock)block; -- (instancetype)pftw_continueWithMainThreadBooleanBlock:(PFBooleanResultBlock)block; -- (instancetype)pftw_continueWithMainThreadBlock:(BFContinuationBlock)block; - -@end - -/** - Raises an `NSInternalInconsistencyException` if the `condition` does not pass. - Use `description` to supply the way to fix the exception. - */ -#define PFTWConsistencyAssert(condition, description, ...) \ -do { \ - if (!(condition)) { \ - [NSException raise:NSInternalInconsistencyException \ - format:description, ##__VA_ARGS__]; \ - } \ -} while(0) diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterPrivateUtilities.m b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterPrivateUtilities.m deleted file mode 100644 index ec8857a74..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterPrivateUtilities.m +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterPrivateUtilities.h" - -#if __has_include() -#import -#else -#import "BFExecutor.h" -#endif - -@implementation PFTwitterPrivateUtilities - -+ (void)safePerformSelector:(SEL)selector - onTarget:(id)target - withObject:(id)object - object:(id)anotherObject { - if (target == nil || selector == nil || ![target respondsToSelector:selector]) { - return; - } - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - [target performSelector:selector withObject:object withObject:anotherObject]; -#pragma clang diagnostic pop -} - -@end - -@implementation BFTask (ParseTwitterUtils) - -- (id)pftw_waitForResult:(NSError **)error { - [self waitUntilFinished]; - - if (self.cancelled) { - return nil; - } else if (self.error && error) { - *error = self.error; - } - return self.result; -} - -- (instancetype)pftw_continueAsyncWithBlock:(BFContinuationBlock)block { - BFExecutor *executor = [BFExecutor executorWithDispatchQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)]; - return [self continueWithExecutor:executor withBlock:block]; -} - -- (instancetype)pftw_continueWithMainThreadUserBlock:(PFUserResultBlock)block { - return [self pftw_continueWithMainThreadBlock:^id(BFTask *task) { - if (block) { - block(task.result, task.error); - } - return nil; - }]; -} - -- (instancetype)pftw_continueWithMainThreadBooleanBlock:(PFBooleanResultBlock)block { - return [self pftw_continueWithMainThreadBlock:^id(BFTask *task) { - if (block) { - block([task.result boolValue], task.error); - } - return nil; - }]; -} - -- (instancetype)pftw_continueWithMainThreadBlock:(BFContinuationBlock)block { - return [self continueWithExecutor:[BFExecutor mainThreadExecutor] withBlock:block]; -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterUtils_Private.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterUtils_Private.h deleted file mode 100644 index aa88c8804..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PFTwitterUtils_Private.h +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterUtils.h" - -@class PFTwitterAuthenticationProvider; - -@interface PFTwitterUtils () - -+ (PFTwitterAuthenticationProvider *)_authenticationProvider; -+ (void)_setAuthenticationProvider:(PFTwitterAuthenticationProvider *)provider; - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Internal/PF_Twitter_Private.h b/ParseTwitterUtils/ParseTwitterUtils/Internal/PF_Twitter_Private.h deleted file mode 100644 index 2136290e8..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Internal/PF_Twitter_Private.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import "PF_Twitter.h" - -@class ACAccount; -@class ACAccountStore; -@protocol PFOAuth1FlowDialogInterface; - -NS_ASSUME_NONNULL_BEGIN - -@interface PF_Twitter () - -@property (nonatomic, strong, readonly) ACAccountStore *accountStore; -@property (nonatomic, strong, readonly) NSURLSession *urlSession; -@property (nonatomic, strong, readonly) Class oauthDialogClass; - -- (instancetype)initWithAccountStore:(ACAccountStore *)accountStore - urlSession:(NSURLSession *)urlSession - dialogClass:(Class)dialogClass; - -/** - Obtain access to the local twitter account. - Returns the twitter account if access is obtained. Otherwise, returns null. - */ -- (BFTask *)_getLocalTwitterAccountAsync; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseTwitterUtils/ParseTwitterUtils/Resources/Info-iOS.plist b/ParseTwitterUtils/ParseTwitterUtils/Resources/Info-iOS.plist deleted file mode 100644 index 35e0dbe08..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Resources/Info-iOS.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ParseTwitterUtils - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 2.7.3 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - iPhoneOS - - CFBundleVersion - 2.7.3 - MinimumOSVersion - 9.0 - - diff --git a/ParseTwitterUtils/ParseTwitterUtils/Resources/en.lproj/ParseTwitterUtils.strings b/ParseTwitterUtils/ParseTwitterUtils/Resources/en.lproj/ParseTwitterUtils.strings deleted file mode 100644 index 2ebc81b9e..000000000 Binary files a/ParseTwitterUtils/ParseTwitterUtils/Resources/en.lproj/ParseTwitterUtils.strings and /dev/null differ diff --git a/ParseTwitterUtils/ParseTwitterUtils/Source/PFTwitterUtils.h b/ParseTwitterUtils/ParseTwitterUtils/Source/PFTwitterUtils.h deleted file mode 100644 index 963ac9321..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Source/PFTwitterUtils.h +++ /dev/null @@ -1,325 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#if __has_include() -#import -#import -#else -#import "PFConstants.h" -#import "PFUser.h" -#endif - -NS_ASSUME_NONNULL_BEGIN - -@class BFTask<__covariant BFGenericType>; -@class PF_Twitter; - -/** - The `PFTwitterUtils` class provides utility functions for working with Twitter in a Parse application. - - This class is currently for iOS only. - */ -@interface PFTwitterUtils : NSObject - -///-------------------------------------- -/// @name Interacting With Twitter -///-------------------------------------- - -/** - Gets the instance of the `PF_Twitter` object that Parse uses. - - @return An instance of `PF_Twitter` object. - */ -+ (nullable PF_Twitter *)twitter; - -/** - Initializes the Twitter singleton. - - @warning You must invoke this in order to use the Twitter functionality in Parse. - - @param consumerKey Your Twitter application's consumer key. - @param consumerSecret Your Twitter application's consumer secret. - */ -+ (void)initializeWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret; - -/** - Whether the user has their account linked to Twitter. - - @param user User to check for a Twitter link. The user must be logged in on this device. - - @return `YES` if the user has their account linked to Twitter, otherwise `NO`. - */ -+ (BOOL)isLinkedWithUser:(nullable PFUser *)user; - -///-------------------------------------- -/// @name Logging In & Creating Twitter-Linked Users -///-------------------------------------- - -/** - *Asynchronously* logs in a user using Twitter. - - This method delegates to Twitter to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @return The task, that encapsulates the work being done. - */ -+ (BFTask *)logInInBackground; - -/** - *Asynchronously* logs in a user using Twitter. - - This method delegates to Twitter to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) `PFUser`. - - @param block The block to execute. - It should have the following argument signature: `^(PFUser *user, NSError *error)`. - */ -+ (void)logInWithBlock:(nullable PFUserResultBlock)block; - -/* - *Asynchronously* Logs in a user using Twitter. - - This method delegates to Twitter to authenticate the user, - and then automatically logs in (or creates, in the case where it is a new user) a `PFUser`. - - @param target Target object for the selector - @param selector The selector that will be called when the asynchrounous request is complete. - It should have the following signature: `(void)callbackWithUser:(PFUser *)user error:(NSError **)error`. - */ -+ (void)logInWithTarget:(nullable id)target selector:(nullable SEL)selector; - -/** - *Asynchronously* logs in a user using Twitter. - - Allows you to handle user login to Twitter, then provide authentication - data to log in (or create, in the case where it is a new user) the `PFUser`. - - @param twitterId The id of the Twitter user being linked. - @param screenName The screen name of the Twitter user being linked. - @param authToken The auth token for the user's session. - @param authTokenSecret The auth token secret for the user's session. - - @return The task, that encapsulates the work being done. - */ -+ (BFTask *)logInWithTwitterIdInBackground:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret; - -/** - Logs in a user using Twitter. - - Allows you to handle user login to Twitter, then provide authentication data - to log in (or create, in the case where it is a new user) the `PFUser`. - - @param twitterId The id of the Twitter user being linked - @param screenName The screen name of the Twitter user being linked - @param authToken The auth token for the user's session - @param authTokenSecret The auth token secret for the user's session - @param block The block to execute. - It should have the following argument signature: `^(PFUser *user, NSError *error)`. - */ -+ (void)logInWithTwitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - block:(nullable PFUserResultBlock)block; - -/* - Logs in a user using Twitter. - - Allows you to handle user login to Twitter, then provide authentication data - to log in (or create, in the case where it is a new user) the `PFUser`. - - @param twitterId The id of the Twitter user being linked. - @param screenName The screen name of the Twitter user being linked. - @param authToken The auth token for the user's session. - @param authTokenSecret The auth token secret for the user's session. - @param target Target object for the selector. - @param selector The selector that will be called when the asynchronous request is complete. - It should have the following signature: `(void)callbackWithUser:(PFUser *)user error:(NSError *)error`. - */ -+ (void)logInWithTwitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - target:(nullable id)target - selector:(nullable SEL)selector; - -///-------------------------------------- -/// @name Linking Users with Twitter -///-------------------------------------- - -/** - *Asynchronously* links Twitter to an existing PFUser. - - This method delegates to Twitter to authenticate the user, - and then automatically links the account to the `PFUser`. - - @param user User to link to Twitter. - - @deprecated Please use `[PFTwitterUtils linkUserInBackground:]` instead. - */ -+ (void)linkUser:(PFUser *)user PARSE_DEPRECATED("Please use +linkUserInBackground: instead."); - -/** - *Asynchronously* links Twitter to an existing `PFUser`. - - This method delegates to Twitter to authenticate the user, - and then automatically links the account to the `PFUser`. - - @param user User to link to Twitter. - - @return The task, that encapsulates the work being done. - */ -+ (BFTask *)linkUserInBackground:(PFUser *)user; - -/** - *Asynchronously* links Twitter to an existing `PFUser`. - - This method delegates to Twitter to authenticate the user, - and then automatically links the account to the `PFUser`. - - @param user User to link to Twitter. - @param block The block to execute. - It should have the following argument signature: `^(BOOL success, NSError *error)`. - */ -+ (void)linkUser:(PFUser *)user block:(nullable PFBooleanResultBlock)block; - -/* - *Asynchronously* links Twitter to an existing `PFUser`. - - This method delegates to Twitter to authenticate the user, - and then automatically links the account to the `PFUser`. - - @param user User to link to Twitter. - @param target Target object for the selector - @param selector The selector that will be called when the asynchrounous request is complete. - It should have the following signature: `(void)callbackWithResult:(NSNumber *)result error:(NSError *)error`. - */ -+ (void)linkUser:(PFUser *)user target:(nullable id)target selector:(nullable SEL)selector; - -/** - *Asynchronously* links Twitter to an existing PFUser asynchronously. - - Allows you to handle user login to Twitter, - then provide authentication data to link the account to the `PFUser`. - - @param user User to link to Twitter. - @param twitterId The id of the Twitter user being linked. - @param screenName The screen name of the Twitter user being linked. - @param authToken The auth token for the user's session. - @param authTokenSecret The auth token secret for the user's session. - @return The task, that encapsulates the work being done. - */ -+ (BFTask *)linkUserInBackground:(PFUser *)user - twitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret; - -/** - *Asynchronously* links Twitter to an existing `PFUser`. - - @discussionAllows you to handle user login to Twitter, - then provide authentication data to link the account to the `PFUser`. - - @param user User to link to Twitter. - @param twitterId The id of the Twitter user being linked. - @param screenName The screen name of the Twitter user being linked. - @param authToken The auth token for the user's session. - @param authTokenSecret The auth token secret for the user's session. - @param block The block to execute. - It should have the following argument signature: `^(BOOL success, NSError *error)`. - */ -+ (void)linkUser:(PFUser *)user - twitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - block:(nullable PFBooleanResultBlock)block; - -/* - Links Twitter to an existing `PFUser`. - - This method allows you to handle user login to Twitter, - then provide authentication data to link the account to the `PFUser`. - - @param user User to link to Twitter. - @param twitterId The id of the Twitter user being linked. - @param screenName The screen name of the Twitter user being linked. - @param authToken The auth token for the user's session. - @param authTokenSecret The auth token secret for the user's session. - @param target Target object for the selector. - @param selector The selector that will be called when the asynchronous request is complete. - It should have the following signature: `(void)callbackWithResult:(NSNumber *)result error:(NSError *)error`. - */ -+ (void)linkUser:(PFUser *)user - twitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - target:(nullable id)target - selector:(nullable SEL)selector; - -///-------------------------------------- -/// @name Unlinking Users from Twitter -///-------------------------------------- - -/** - *Synchronously* unlinks the `PFUser` from a Twitter account. - - @param user User to unlink from Twitter. - - @return Returns true if the unlink was successful. - */ -+ (BOOL)unlinkUser:(PFUser *)user; - -/** - *Synchronously* unlinks the PFUser from a Twitter account. - - @param user User to unlink from Twitter. - @param error Error object to set on error. - - @return Returns `YES` if the unlink was successful, otherwise `NO`. - */ -+ (BOOL)unlinkUser:(PFUser *)user error:(NSError **)error; - -/** - Makes an *asynchronous* request to unlink a user from a Twitter account. - - @param user User to unlink from Twitter. - - @return The task, that encapsulates the work being done. - */ -+ (BFTask *)unlinkUserInBackground:(PFUser *)user; - -/** - Makes an *asynchronous* request to unlink a user from a Twitter account. - - @param user User to unlink from Twitter. - @param block The block to execute. - It should have the following argument signature: `^(BOOL succeeded, NSError *error)`. - */ -+ (void)unlinkUserInBackground:(PFUser *)user block:(nullable PFBooleanResultBlock)block; - -/* - Makes an *asynchronous* request to unlink a user from a Twitter account. - - @param user User to unlink from Twitter - @param target Target object for the selector - @param selector The selector that will be called when the asynchrounous request is complete. - */ -+ (void)unlinkUserInBackground:(PFUser *)user target:(nullable id)target selector:(nullable SEL)selector; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseTwitterUtils/ParseTwitterUtils/Source/PFTwitterUtils.m b/ParseTwitterUtils/ParseTwitterUtils/Source/PFTwitterUtils.m deleted file mode 100644 index 9235a444a..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Source/PFTwitterUtils.m +++ /dev/null @@ -1,239 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterUtils.h" - -#if __has_include() -#import -#import -#else -#import "BFExecutor.h" -#import "BFTaskCompletionSource.h" -#endif - -#if __has_include() -#import -#else -#import "Parse.h" -#endif - -#import "PFTwitterAuthenticationProvider.h" -#import "PFTwitterPrivateUtilities.h" -#import "PF_Twitter.h" - -@implementation PFTwitterUtils - -///-------------------------------------- -#pragma mark - Authentication Provider -///-------------------------------------- - -static PFTwitterAuthenticationProvider *authenticationProvider_; - -+ (PFTwitterAuthenticationProvider *)_authenticationProvider { - return authenticationProvider_; -} - -+ (void)_setAuthenticationProvider:(PFTwitterAuthenticationProvider *)provider { - authenticationProvider_ = provider; -} - -///-------------------------------------- -#pragma mark - Initialize -///-------------------------------------- - -+ (void)_assertTwitterInitialized { - PFTWConsistencyAssert([self _authenticationProvider], - @"You must call PFTwitterUtils initializeWithConsumerKey:consumerSecret: to use PFTwitterUtils."); -} - -+ (void)_assertParseInitialized { - PFTWConsistencyAssert([Parse applicationId], - @"PFTwitterUtils should be initialized after setting up Parse."); -} - -+ (void)initializeWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret { - [self _assertParseInitialized]; - if (![self _authenticationProvider]) { - PF_Twitter *twitter = [[PF_Twitter alloc] init]; - twitter.consumerKey = consumerKey; - twitter.consumerSecret = consumerSecret; - - PFTwitterAuthenticationProvider *provider = [[PFTwitterAuthenticationProvider alloc] initWithTwitter:twitter]; - [PFUser registerAuthenticationDelegate:provider forAuthType:PFTwitterUserAuthenticationType]; - - [self _setAuthenticationProvider:provider]; - } -} - -+ (PF_Twitter *)twitter { - return [self _authenticationProvider].twitter; -} - -+ (BOOL)isLinkedWithUser:(PFUser *)user { - return [user isLinkedWithAuthType:PFTwitterUserAuthenticationType]; -} - -+ (BOOL)unlinkUser:(PFUser *)user { - return [self unlinkUser:user error:nil]; -} - -+ (BOOL)unlinkUser:(PFUser *)user error:(NSError **)error { - return [[[self unlinkUserInBackground:user] pftw_waitForResult:error] boolValue]; -} - -+ (BFTask *)unlinkUserInBackground:(PFUser *)user { - [self _assertTwitterInitialized]; - return [user unlinkWithAuthTypeInBackground:PFTwitterUserAuthenticationType]; -} - -+ (void)unlinkUserInBackground:(PFUser *)user block:(PFBooleanResultBlock)block { - [[self unlinkUserInBackground:user] pftw_continueWithMainThreadBooleanBlock:block]; -} - -+ (void)unlinkUserInBackground:(PFUser *)user target:(id)target selector:(SEL)selector { - [PFTwitterUtils unlinkUserInBackground:user block:^(BOOL succeeded, NSError *error) { - [PFTwitterPrivateUtilities safePerformSelector:selector onTarget:target withObject:@(succeeded) object:error]; - }]; -} - -+ (void)linkUser:(PFUser *)user { - // This is misnamed `*InBackground` method. Left as is for backward compatability. - [self linkUserInBackground:user]; -} - -+ (BFTask *)linkUserInBackground:(PFUser *)user { - [self _assertTwitterInitialized]; - - PFTwitterAuthenticationProvider *provider = [self _authenticationProvider]; - return [[provider authenticateAsync] continueWithSuccessBlock:^id(BFTask *task) { - return [user linkWithAuthTypeInBackground:PFTwitterUserAuthenticationType authData:task.result]; - }]; -} - -+ (void)linkUser:(PFUser *)user block:(PFBooleanResultBlock)block { - [[self linkUserInBackground:user] pftw_continueWithMainThreadBooleanBlock:block]; -} - -+ (void)linkUser:(PFUser *)user target:(id)target selector:(SEL)selector { - [PFTwitterUtils linkUser:user block:^(BOOL succeeded, NSError *error) { - [PFTwitterPrivateUtilities safePerformSelector:selector onTarget:target withObject:@(succeeded) object:error]; - }]; -} - -+ (BFTask *)linkUserInBackground:(PFUser *)user - twitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret { - [self _assertTwitterInitialized]; - - PFTwitterAuthenticationProvider *provider = [self _authenticationProvider]; - NSDictionary *authData = [provider authDataWithTwitterId:twitterId - screenName:screenName - authToken:authToken - secret:authTokenSecret]; - return [user linkWithAuthTypeInBackground:PFTwitterUserAuthenticationType authData:authData]; -} - -+ (void)linkUser:(PFUser *)user - twitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - block:(PFBooleanResultBlock)block { - [[self linkUserInBackground:user - twitterId:twitterId - screenName:screenName - authToken:authToken - authTokenSecret:authTokenSecret] pftw_continueWithMainThreadBooleanBlock:block]; -} - -+ (void)linkUser:(PFUser *)user - twitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - target:(id)target - selector:(SEL)selector { - [PFTwitterUtils linkUser:user - twitterId:twitterId - screenName:screenName - authToken:authToken - authTokenSecret:authTokenSecret - block:^(BOOL succeeded, NSError *error) { - [PFTwitterPrivateUtilities safePerformSelector:selector - onTarget:target - withObject:@(succeeded) - object:error]; - }]; -} - -+ (BFTask *)logInInBackground { - [self _assertTwitterInitialized]; - - PFTwitterAuthenticationProvider *provider = [self _authenticationProvider]; - return [[provider authenticateAsync] continueWithSuccessBlock:^id(BFTask *task) { - return [PFUser logInWithAuthTypeInBackground:PFTwitterUserAuthenticationType authData:task.result]; - }]; -} - -+ (void)logInWithBlock:(PFUserResultBlock)block { - [[self logInInBackground] pftw_continueWithMainThreadUserBlock:block]; -} - -+ (void)logInWithTarget:(id)target selector:(SEL)selector { - [self logInWithBlock:^(PFUser *user, NSError *error) { - [PFTwitterPrivateUtilities safePerformSelector:selector onTarget:target withObject:user object:error]; - }]; -} - -+ (BFTask *)logInWithTwitterIdInBackground:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret { - [self _assertTwitterInitialized]; - - PFTwitterAuthenticationProvider *provider = [self _authenticationProvider]; - NSDictionary *authData = [provider authDataWithTwitterId:twitterId - screenName:screenName - authToken:authToken - secret:authTokenSecret]; - return [PFUser logInWithAuthTypeInBackground:PFTwitterUserAuthenticationType authData:authData]; -} - -+ (void)logInWithTwitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - block:(PFUserResultBlock)block { - [[self logInWithTwitterIdInBackground:twitterId - screenName:screenName - authToken:authToken - authTokenSecret:authTokenSecret] pftw_continueWithMainThreadUserBlock:block]; -} - -+ (void)logInWithTwitterId:(NSString *)twitterId - screenName:(NSString *)screenName - authToken:(NSString *)authToken - authTokenSecret:(NSString *)authTokenSecret - target:(id)target - selector:(SEL)selector { - [self logInWithTwitterId:twitterId - screenName:screenName - authToken:authToken - authTokenSecret:authTokenSecret - block:^(PFUser *user, NSError *error) { - [PFTwitterPrivateUtilities safePerformSelector:selector - onTarget:target - withObject:user - object:error]; - }]; -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Source/PF_Twitter.h b/ParseTwitterUtils/ParseTwitterUtils/Source/PF_Twitter.h deleted file mode 100644 index 051b0feb3..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Source/PF_Twitter.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#if __has_include() -#import -#else -#import "PFConstants.h" -#endif - -NS_ASSUME_NONNULL_BEGIN - -@class BFTask<__covariant BFGenericType>; - -/** - The `PF_Twitter` class is a simple interface for interacting with the Twitter REST API, - automating sign-in and OAuth signing of requests against the API. - */ -@interface PF_Twitter : NSObject - -/** - Initializes an instance of `PF_Twitter` configured to access device Twitter accounts with Accounts.framework, - and remote access to Twitter accounts - and, if no accounts are found locally - through a built-in webview. - - After setting `consumerKey` and `consumerSecret`, authorization to Twitter accounts can be requested with -`authorizeInBackground`, and then revoked with its opposite, `deauthorizeInBackground`. - */ -- (instancetype)init; - -/** - Consumer key of the application that is used to authorize with Twitter. - */ -@property (nullable, nonatomic, copy) NSString *consumerKey; - -/** - Consumer secret of the application that is used to authorize with Twitter. - */ -@property (nullable, nonatomic, copy) NSString *consumerSecret; - -/** - Auth token for the current user. - */ -@property (nullable, nonatomic, copy) NSString *authToken; - -/** - Auth token secret for the current user. - */ -@property (nullable, nonatomic, copy) NSString *authTokenSecret; - -/** - Twitter user id of the currently signed in user. - */ -@property (nullable, nonatomic, copy) NSString *userId; - -/** - Twitter screen name of the currently signed in user. - */ -@property (nullable, nonatomic, copy) NSString *screenName; - -/** - Displays an auth dialog and populates the authToken, authTokenSecret, userId, and screenName properties - if the Twitter user grants permission to the application. - - @return The task, that encapsulates the work being done. - */ -- (BFTask *)authorizeInBackground; - -/** - Invalidates an OAuth token for the current user, if the Twitter user has granted permission to the - current application. - - @return The task, that encapsulates the work being done. - */ -- (BFTask *)deauthorizeInBackground; - -/** - Displays an auth dialog and populates the authToken, authTokenSecret, userId, and screenName properties - if the Twitter user grants permission to the application. - - @param success Invoked upon successful authorization. - @param failure Invoked upon an error occurring in the authorization process. - @param cancel Invoked when the user cancels authorization. - */ -- (void)authorizeWithSuccess:(nullable void (^)(void))success - failure:(nullable void (^)(NSError *__nullable error))failure - cancel:(nullable void (^)(void))cancel; - -/** - Adds a 3-legged OAuth signature to an `NSMutableURLRequest` based - upon the properties set for the Twitter object. - - Use this function to sign requests being made to the Twitter API. - - @param request Request to sign. - */ -- (void)signRequest:(nullable NSMutableURLRequest *)request; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseTwitterUtils/ParseTwitterUtils/Source/PF_Twitter.m b/ParseTwitterUtils/ParseTwitterUtils/Source/PF_Twitter.m deleted file mode 100644 index 92450f3b0..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Source/PF_Twitter.m +++ /dev/null @@ -1,507 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PF_Twitter.h" -#import "PF_Twitter_Private.h" - -#import -#import -#import - -#if __has_include() -#import -#import -#else -#import "BFExecutor.h" -#import "BFTaskCompletionSource.h" -#endif - -#if __has_include() -#import -#else -#import "PFConstants.h" -#endif - -#import "PFOAuth1FlowDialog.h" -#import "PFTwitterAlertView.h" -#import "PFTwitterPrivateUtilities.h" -#import "PF_OAuthCore.h" -#import "PFTwitterLocalization.h" - -@implementation PF_Twitter - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -- (instancetype)init { - return [self initWithAccountStore:[[ACAccountStore alloc] init] - urlSession:[NSURLSession sharedSession] - dialogClass:[PFOAuth1FlowDialog class]]; -} - -- (instancetype)initWithAccountStore:(ACAccountStore *)accountStore - urlSession:(NSURLSession *)urlSession - dialogClass:(Class)dialogClass { - self = [super init]; - if (!self) return nil; - - _accountStore = accountStore; - _urlSession = urlSession; - _oauthDialogClass = dialogClass; - - PFTWConsistencyAssert(_oauthDialogClass == nil || - [(id)_oauthDialogClass conformsToProtocol:@protocol(PFOAuth1FlowDialogInterface)], - @"OAuth Dialog class must conform to the Dialog Interface protocol!"); - - return self; -} - -///-------------------------------------- -#pragma mark - Authorize -///-------------------------------------- - -- (BFTask *)authorizeInBackground { - if (self.consumerKey.length == 0 || self.consumerSecret.length == 0) { - //TODO: (nlutsenko) This doesn't look right, maybe we should add additional error code? - return [BFTask taskWithError:[NSError errorWithDomain:PFParseErrorDomain code:1 userInfo:nil]]; - } - - return [[self _performReverseAuthAsync] pftw_continueAsyncWithBlock:^id(BFTask *task) { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - dispatch_async(dispatch_get_main_queue(), ^{ - // if reverse auth was successful then return - if (task.cancelled) { - [source cancel]; - return; - } else if (!task.error && !task.result) { - source.result = nil; - return; - } - - // fallback to the webview auth - [[self _performWebViewAuthAsync] pftw_continueAsyncWithBlock:^id(BFTask *task) { - NSError *error = task.error; - if (task.cancelled) { - [source cancel]; - } else if (!error) { - [source setResult:task.result]; - } else { - [source setError:error]; - } - return nil; - }]; - }); - return source.task; - }]; -} -- (BFTask *)deauthorizeInBackground { - if (self.consumerKey.length == 0 || self.consumerSecret.length == 0) { - //TODO: (nlutsenko) This doesn't look right, maybe we should add additional error code? - return [BFTask taskWithError:[NSError errorWithDomain:PFParseErrorDomain code:1 userInfo:nil]]; - } - - return [[self _performDeauthAsync] pftw_continueAsyncWithBlock:^id(BFTask *task) { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - if (task.cancelled) { - [source cancel]; - } else if (!task.error && !task.result) { - source.result = nil; - } else if (task.error) { - [source trySetError:task.error]; - } else if (task.result) { - [self setLoginResultValues:nil]; - - [source trySetResult:task.result]; - } - return source.task; - }]; -} - -- (void)authorizeWithSuccess:(void (^)(void))success - failure:(void (^)(NSError *error))failure - cancel:(void (^)(void))cancel { - [[self authorizeInBackground] continueWithExecutor:[BFExecutor mainThreadExecutor] - withBlock:^id(BFTask *task) { - if (task.error) { - failure(task.error); - } else if (task.cancelled) { - cancel(); - } else { - success(); - } - return nil; - }]; -} - -// Displays the web view dialog -- (BFTask *)_showWebViewDialogAsync:(NSString *)requestToken requestSecret:(NSString *)requestSecret { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - - static NSString *twitterAuthURLString = @"https://api.twitter.com/oauth/authenticate"; - - PFOAuth1FlowDialog *dialog = [_oauthDialogClass dialogWithURL:[NSURL URLWithString:twitterAuthURLString] - queryParameters:@{ @"oauth_token" : requestToken }]; - dialog.redirectURLPrefix = @"http://twitter-oauth.callback"; - dialog.completion = ^(BOOL succeeded, NSURL *url, NSError *error) { - // In case of error - if (error) { - source.error = error; - return; - } - // In case the dialog was cancelled - if (!succeeded) { - [source cancel]; - return; - } - - // Handle URL received. - NSDictionary *authQueryParams = [NSURL PF_ab_parseURLQueryString:[url query]]; - NSString *verifier = [authQueryParams objectForKey:@"oauth_verifier"]; - NSString *token = [authQueryParams objectForKey:@"oauth_token"]; - - [[self _getAccessTokenForWebAuthAsync:verifier requestSecret:requestSecret token:token] - pftw_continueAsyncWithBlock:^id (BFTask *task) { - NSError *error = task.error; - if (!error) { - NSDictionary *accessResult = (NSDictionary*) task.result; - [self setLoginResultValues:accessResult]; - source.result = nil; - } else { - source.error = error; - } - return nil; - }]; - }; - [dialog showAnimated:YES]; - - return source.task; -} - -/** - Get the request token for the authentication. This is the first step in auth. - if isReverseAuth is YES then get the request token for reverse auth mode. Otherwise, get the request token for web auth mode. - */ -- (BFTask *)_getRequestTokenAsync:(BOOL)isReverseAuth { - NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/oauth/request_token"]; - NSMutableDictionary *params = nil; - NSData *body = nil; - - if (isReverseAuth) { - body = [[NSString stringWithFormat:@"x_auth_mode=%@", @"reverse_auth"] dataUsingEncoding:NSUTF8StringEncoding]; - } else { - params = [NSMutableDictionary dictionary]; - [params setObject:@"http://twitter-oauth.callback" forKey:@"oauth_callback"]; - } - - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:url - method:@"POST" - body:body - additionalParameters:params - consumerKey:_consumerKey - consumerSecret:_consumerSecret - token:nil - tokenSecret:nil]; - NSString *header = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; - [request setHTTPMethod:@"POST"]; - [request addValue:header forHTTPHeaderField:@"Authorization"]; - [request setHTTPBody:body]; - - BFTaskCompletionSource *taskCompletionSource = [BFTaskCompletionSource taskCompletionSource]; - [[self.urlSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { - if (error) { - [taskCompletionSource trySetError:error]; - } else { - [taskCompletionSource trySetResult:data]; - } - }] resume]; - return taskCompletionSource.task; -} - -// Get the access token for web authentication -- (BFTask *)_getAccessTokenForWebAuthAsync:(NSString *)verifier - requestSecret:(NSString *)requestSecret - token:(NSString *)token { - NSURL *accessTokenURL = [NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"]; - NSData *body = [[NSString stringWithFormat:@"oauth_verifier=%@", verifier] dataUsingEncoding:NSUTF8StringEncoding]; - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:accessTokenURL - method:@"POST" - body:body - additionalParameters:nil - consumerKey:_consumerKey - consumerSecret:_consumerSecret - token:token - tokenSecret:requestSecret]; - NSString *accessTokenHeader = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - NSMutableURLRequest *accessRequest = [NSMutableURLRequest requestWithURL:accessTokenURL]; - [accessRequest setHTTPMethod:@"POST"]; - [accessRequest addValue:accessTokenHeader forHTTPHeaderField:@"Authorization"]; - [accessRequest setHTTPBody:body]; - - BFTaskCompletionSource *taskCompletionSource = [BFTaskCompletionSource taskCompletionSource]; - [[self.urlSession dataTaskWithRequest:accessRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { - if (error) { - [taskCompletionSource trySetError:error]; - } else { - NSString *accessResponseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *accessResponseValues = [NSURL PF_ab_parseURLQueryString:accessResponseString]; - [taskCompletionSource trySetResult:accessResponseValues]; - } - }] resume]; - return taskCompletionSource.task; -} - -/** - Get the access token for reverse authentication. - If the Task is successful then, Task result is dictionary containing logged in user's Auth token, Screenname and other attributes. - */ -- (BFTask *)_getAccessTokenForReverseAuthAsync:(NSString *)signedReverseAuthSignature - localTwitterAccount:(ACAccount *)localTwitterAccount { - - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - if (!signedReverseAuthSignature || - [signedReverseAuthSignature length] == 0 || - !localTwitterAccount) { - - source.error = [NSError errorWithDomain:PFParseErrorDomain code:1 userInfo:nil]; - return source.task; - } - - NSDictionary *params = @{ @"x_reverse_auth_parameters" : signedReverseAuthSignature, - @"x_reverse_auth_target" : _consumerKey }; - - NSURL *accessTokenUrl = [NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"]; - SLRequest *accessRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter - requestMethod:SLRequestMethodPOST - URL:accessTokenUrl - parameters:params]; - - [accessRequest setAccount:localTwitterAccount]; - [accessRequest performRequestWithHandler:^(NSData *data, NSHTTPURLResponse *urlResponse, NSError *error) { - if (error) { - [source setError:error]; - } else { - NSString *accessResponseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *accessResponseValues = [NSURL PF_ab_parseURLQueryString:accessResponseString]; - [source setResult:accessResponseValues]; - } - }]; - - return source.task; -} - -// Set the result parameters from the data returned om succesful login -- (void)setLoginResultValues:(NSDictionary *)resultData { - self.authToken = [resultData objectForKey:@"oauth_token"]; - self.authTokenSecret = [resultData objectForKey:@"oauth_token_secret"]; - self.userId = [resultData objectForKey:@"user_id"]; - self.screenName = [resultData objectForKey:@"screen_name"]; -} - -// Performs the Reverse auth for the the twitter account setup on the device. -- (BFTask *)_performReverseAuthAsync { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - - // get permission to access the account if its setup and available. - [[self _getLocalTwitterAccountAsync] pftw_continueAsyncWithBlock:^id(BFTask *task) { - - if (task.error) { - source.error = task.error; - return source.task; - } - - if (task.cancelled) { - [source cancel]; - return source.task; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - ACAccount *localTwitterAccount = (ACAccount*) task.result; - - if(!localTwitterAccount) { - source.error = [NSError errorWithDomain:PFParseErrorDomain code:2 userInfo:nil]; - return; - } - - // continue with reverse auth since its permitted - [[self _getRequestTokenAsync:YES] pftw_continueAsyncWithBlock:^id(BFTask *task) { - if (task.error) { - source.error = task.error; - return source.task; - } - dispatch_async(dispatch_get_main_queue(), ^{ - NSString *requestTokenResponse = [[NSString alloc] initWithData:task.result encoding:NSUTF8StringEncoding]; - - [[self _getAccessTokenForReverseAuthAsync:requestTokenResponse - localTwitterAccount:localTwitterAccount] pftw_continueAsyncWithBlock:^id(BFTask *task) { - NSError *error = task.error; - if (!error) { - NSDictionary *accessResult = (NSDictionary*) task.result; - [self setLoginResultValues:accessResult]; - source.result = nil; - } else { - source.error = task.error; - } - return nil; - }]; - }); - return nil; - }]; - - }); - return nil; - }]; - - return source.task; -} - -- (BFTask *)_performWebViewAuthAsync { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - - [[self _getRequestTokenAsync:NO] pftw_continueAsyncWithBlock:^id(BFTask *task) { - if (task.error || task.isCancelled) { - if (task.error) { - [source setError:task.error]; - } else { - [source cancel]; - } - return task; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - NSString *requestTokenResponse = [[NSString alloc] initWithData:task.result encoding:NSUTF8StringEncoding]; - - NSDictionary *requestTokenParsed = [NSURL PF_ab_parseURLQueryString:requestTokenResponse]; - NSString *requestToken = requestTokenParsed[@"oauth_token"]; - NSString *requestSecret = requestTokenParsed[@"oauth_token_secret"]; - - // If one of these is missing, then we failed to get a token. - if (!requestToken || !requestSecret) { - NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Failed to request authorization token from Twitter." }; - NSError *error = [NSError errorWithDomain:PFParseErrorDomain code:2 userInfo:userInfo]; - [source setError:error]; - return; - } - - // show the webview dialog for auth token - [[self _showWebViewDialogAsync:requestToken - requestSecret:requestSecret] pftw_continueAsyncWithBlock:^id(BFTask *task) { - NSError *error = task.error; - if (task.isCancelled) { - [source cancel]; - } else if (!error) { - [source setResult:task.result]; - } else { - [source setError:error]; - } - return nil; - }]; - }); - return nil; - }]; - - return source.task; -} - -- (BFTask *)_getLocalTwitterAccountAsync { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - - // If no twitter accounts present in the system, then no need to ask for permission to the user - if (![SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) { - [source setResult:nil]; - return source.task; - } - - ACAccountType *twitterType = [_accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; - [_accountStore requestAccessToAccountsWithType:twitterType options:nil completion:^(BOOL granted, NSError *error) { - if (error) { - [source setError:error]; - return; - } - - if (!granted) { - [source setResult:nil]; - return; - } - - NSArray *accounts = [self->_accountStore accountsWithAccountType:twitterType]; - - // No accounts - provide an empty result - if ([accounts count] == 0) { - [source setResult:nil]; - return; - } - - // Finish if there is only 1 account - if ([accounts count] == 1) { - [source setResult:accounts[0]]; - return; - } - - NSArray *usernames = [accounts valueForKey:@"accountDescription"]; - - // Call async on the main thread, as the completion isn't executed on the main thread - dispatch_async(dispatch_get_main_queue(), ^{ - [PFTwitterAlertView showAlertWithTitle:PFTWLocalizedString(@"Select a Twitter Account", @"Select a Twitter Account") - message:nil - cancelButtonTitle:PFTWLocalizedString(@"Cancel", @"Cancel") - otherButtonTitles:usernames - completion:^(NSUInteger buttonIndex) { - if (buttonIndex == NSNotFound) { - [source cancel]; - } else { - ACAccount *account = accounts[buttonIndex]; - [source setResult:account]; - } - }]; - }); - }]; - - return source.task; -} - -- (BFTask *)_performDeauthAsync { - NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; - request.URL = [NSURL URLWithString:@"https://api.twitter.com/oauth2/invalidate_token"]; - request.HTTPMethod = @"POST"; - - [self signRequest:request]; - - BFTaskCompletionSource *taskCompletionSource = [BFTaskCompletionSource taskCompletionSource]; - - [[self.urlSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { - if (error) { - [taskCompletionSource trySetError:error]; - } else { - [taskCompletionSource trySetResult:data]; - } - }] resume]; - - return taskCompletionSource.task; -} - -///-------------------------------------- -#pragma mark - Sign Request -///-------------------------------------- - -- (void)signRequest:(NSMutableURLRequest *)request { - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:request.URL - method:request.HTTPMethod ?: @"GET" - body:request.HTTPBody - additionalParameters:nil - consumerKey:_consumerKey - consumerSecret:_consumerSecret - token:_authToken - tokenSecret:_authTokenSecret]; - NSString *header = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - [request addValue:header forHTTPHeaderField:@"Authorization"]; -} - -@end diff --git a/ParseTwitterUtils/ParseTwitterUtils/Source/ParseTwitterUtils.h b/ParseTwitterUtils/ParseTwitterUtils/Source/ParseTwitterUtils.h deleted file mode 100644 index a14686667..000000000 --- a/ParseTwitterUtils/ParseTwitterUtils/Source/ParseTwitterUtils.h +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterUtils.h" -#import "PF_Twitter.h" diff --git a/ParseTwitterUtils/Tests/Other/PFTwitterTestMacros.h b/ParseTwitterUtils/Tests/Other/PFTwitterTestMacros.h deleted file mode 100644 index 5c1461e7c..000000000 --- a/ParseTwitterUtils/Tests/Other/PFTwitterTestMacros.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#ifndef PFTwitterTestMacros_h -#define PFTwitterTestMacros_h - -/** - To prevent retain cycles by OCMock, this macro allows us to capture a weak reference to return from a stubbed method. - */ -#define andReturnWeak(variable) _andDo( \ - ({ \ - __weak typeof(variable) variable ## _weak = (variable); \ - ^(NSInvocation *invocation) { \ - __autoreleasing typeof(variable) variable ## _block = variable ## _weak; \ - [invocation setReturnValue:&(variable ## _block)]; \ - }; \ - }) \ -) - -#endif /* PFTwitterTestMacros_h */ diff --git a/ParseTwitterUtils/Tests/Other/TestCase/PFTwitterTestCase.h b/ParseTwitterUtils/Tests/Other/TestCase/PFTwitterTestCase.h deleted file mode 100644 index 05411f71d..000000000 --- a/ParseTwitterUtils/Tests/Other/TestCase/PFTwitterTestCase.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@import XCTest; - -@interface PFTwitterTestCase : XCTestCase - -///-------------------------------------- -/// @name XCTestCase -///-------------------------------------- - -- (void)setUp NS_REQUIRES_SUPER; -- (void)tearDown NS_REQUIRES_SUPER; - -///-------------------------------------- -/// @name Expectations -///-------------------------------------- - -- (XCTestExpectation *)currentSelectorTestExpectation; -- (void)waitForTestExpectations; - -///-------------------------------------- -/// @name Mocks -///-------------------------------------- - -- (void)registerMockObject:(id)mockObject; - -@end - -#define _PFRegisterMock(mockObject) [self registerMockObject:mockObject] -#define _PFMockShim(method, args...) ({ id mock = method(args); _PFRegisterMock(mock); mock; }) -#define _PFOCMockWarning _Pragma("GCC warning \"Please use PF mocking methods instead of OCMock ones.\"") - -#define _PFStrictClassMock(kls) [OCMockObject mockForClass:kls] -#define _PFClassMock(kls) [OCMockObject niceMockForClass:kls] -#define _PFStrictProtocolMock(proto) [OCMockObject mockForProtocol:proto] -#define _PFProtocolMock(proto) [OCMockObject niceMockForProtocol:proto] -#define _PFPartialMock(obj) [OCMockObject partialMockForObject:obj] - -#define PFStrictClassMock(...) _PFMockShim(_PFStrictClassMock, __VA_ARGS__) -#define PFClassMock(...) _PFMockShim(_PFClassMock, __VA_ARGS__) -#define PFStrictProtocolMock(...) _PFMockShim(_PFStrictProtocolMock, __VA_ARGS__) -#define PFProtocolMock(...) _PFMockShim(_PFProtocolMock, __VA_ARGS__) -#define PFPartialMock(...) _PFMockShim(_PFPartialMock, __VA_ARGS__) - -#undef OCMStrictClassMock -#undef OCMClassMock -#undef OCMStrictProtocolMock -#undef OCMProtocolMock -#undef OCMPartialMock - -#define OCMStrictClassMock _PFOCMockWarning _PFStrictClassMock -#define OCMClassMock _PFOCMockWarning _PFClassMock -#define OCMStrictProtocolMock _PFOCMockWarning _PFStrictProtocolMock -#define OCMProtocolMock _PFOCMockWarning _PFProtocolMock -#define OCMPartialMock _PFOCMockWarning _PFPartialMock - -#define PFAssertIsKindOfClass(a1, a2, description...) \ -XCTAssertTrue([a1 isKindOfClass:[a2 class]], ## description) - -#define PFAssertNotKindOfClass(a1, a2, description...) \ -XCTAssertFalse([a1 isKindOfClass:[a2 class]], ## description) - -#define PFAssertThrowsInconsistencyException(expression, ...) \ -XCTAssertThrowsSpecificNamed(expression, NSException, NSInternalInconsistencyException, __VA_ARGS__) - -#define PFAssertThrowsInvalidArgumentException(expression, ...) \ -XCTAssertThrowsSpecificNamed(expression, NSException, NSInvalidArgumentException, __VA_ARGS__) - -#define PFAssertStringContains(a, b) XCTAssertTrue([(a) rangeOfString:(b)].location != NSNotFound) diff --git a/ParseTwitterUtils/Tests/Other/TestCase/PFTwitterTestCase.m b/ParseTwitterUtils/Tests/Other/TestCase/PFTwitterTestCase.m deleted file mode 100644 index 174a48226..000000000 --- a/ParseTwitterUtils/Tests/Other/TestCase/PFTwitterTestCase.m +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterTestCase.h" - -@implementation PFTwitterTestCase { - NSMutableArray *_mocks; - dispatch_queue_t _mockQueue; -} - -///-------------------------------------- -#pragma mark - XCTestCase -///-------------------------------------- - -- (void)setUp { - [super setUp]; - - _mocks = [[NSMutableArray alloc] init]; - _mockQueue = dispatch_queue_create("com.parse.tests.mock.queue", DISPATCH_QUEUE_SERIAL); -} - -- (void)tearDown { - dispatch_sync(_mockQueue, ^{ - [self->_mocks makeObjectsPerformSelector:@selector(stopMocking)]; - }); - - _mocks = nil; - _mockQueue = nil; - - [super tearDown]; -} - -///-------------------------------------- -#pragma mark - Helpers -///-------------------------------------- - -- (XCTestExpectation *)currentSelectorTestExpectation { - NSInvocation *invocation = self.invocation; - NSString *selectorName = invocation ? NSStringFromSelector(invocation.selector) : @"testExpectation"; - return [self expectationWithDescription:selectorName]; -} - -- (void)waitForTestExpectations { - [self waitForExpectationsWithTimeout:10.0 handler:nil]; -} - -///-------------------------------------- -#pragma mark - Mock Registration -///-------------------------------------- - -- (void)registerMockObject:(id)mockObject { - dispatch_sync(_mockQueue, ^{ - [self->_mocks addObject:mockObject]; - }); -} - -@end diff --git a/ParseTwitterUtils/Tests/Resources/Info.plist b/ParseTwitterUtils/Tests/Resources/Info.plist deleted file mode 100644 index ba72822e8..000000000 --- a/ParseTwitterUtils/Tests/Resources/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/ParseTwitterUtils/Tests/TestApplication/Classes/main.m b/ParseTwitterUtils/Tests/TestApplication/Classes/main.m deleted file mode 100644 index 453fc1227..000000000 --- a/ParseTwitterUtils/Tests/TestApplication/Classes/main.m +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@interface AppDelegate : NSObject - -@end - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; - window.rootViewController = [[UIViewController alloc] init]; - [window makeKeyAndVisible]; - return YES; -} - -@end - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/ParseTwitterUtils/Tests/TestApplication/Resources/Info.plist b/ParseTwitterUtils/Tests/TestApplication/Resources/Info.plist deleted file mode 100644 index 6dcc65160..000000000 --- a/ParseTwitterUtils/Tests/TestApplication/Resources/Info.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIcons - - CFBundleIcons~ipad - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/ParseTwitterUtils/Tests/Unit/OAuth1FlowDialogTests.m b/ParseTwitterUtils/Tests/Unit/OAuth1FlowDialogTests.m deleted file mode 100644 index 68d57dbf5..000000000 --- a/ParseTwitterUtils/Tests/Unit/OAuth1FlowDialogTests.m +++ /dev/null @@ -1,194 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFOAuth1FlowDialog.h" -#import "PFTwitterTestCase.h" -#import - -@interface UIActivityIndicatorView (Private) - -- (void)_generateImages; - -@end - -@interface FakeWKNavigationAction : WKNavigationAction -// Redefined WKNavigationAction properties as readwrite. -@property(nullable, nonatomic, copy) WKFrameInfo* sourceFrame; -@property(nullable, nonatomic, copy) WKFrameInfo* targetFrame; -@property(nonatomic) WKNavigationType navigationType; -@property(nullable, nonatomic, copy) NSURLRequest* request; - -@end - -@implementation FakeWKNavigationAction -@synthesize sourceFrame, targetFrame, navigationType, request; - -+ (Class)class { - return [super class]; -} - -+ (Class)_nilClass { - return nil; -} - -@end - -@interface OAuth1FlowDialogTests : PFTwitterTestCase -@end - -@implementation OAuth1FlowDialogTests - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -- (void)testConstructors { - NSURL *exampleURL = [NSURL URLWithString:@"http://foo.bar"]; - NSDictionary *parameters = @{ @"a" : @"b" }; - - PFOAuth1FlowDialog *flowDialog = [[PFOAuth1FlowDialog alloc] initWithURL:exampleURL - queryParameters:parameters]; - XCTAssertNotNil(flowDialog); - XCTAssertEqualObjects(flowDialog.queryParameters, parameters); - XCTAssertEqualObjects(flowDialog->_baseURL, exampleURL); - - flowDialog = [PFOAuth1FlowDialog dialogWithURL:exampleURL queryParameters:parameters]; - XCTAssertNotNil(flowDialog); - XCTAssertEqualObjects(flowDialog.queryParameters, parameters); - XCTAssertEqualObjects(flowDialog->_baseURL, exampleURL); -} - -- (void)testTitle { - PFOAuth1FlowDialog *flowDialog = [[PFOAuth1FlowDialog alloc] initWithURL:nil queryParameters:nil]; - XCTAssertEqualObjects(flowDialog.title, @"Connect to Service"); - flowDialog.title = @"Bleh"; - XCTAssertEqualObjects(flowDialog.title, @"Bleh"); -} - -- (void)testShow { - PFOAuth1FlowDialog *flowDialog = [[PFOAuth1FlowDialog alloc] initWithURL:nil queryParameters:nil]; - - [flowDialog showAnimated:NO]; - [flowDialog layoutSubviews]; - [flowDialog dismissAnimated:NO]; -} - -- (void)testKeyboard { - PFOAuth1FlowDialog *flowDialog = [[PFOAuth1FlowDialog alloc] initWithURL:nil queryParameters:nil]; - [flowDialog showAnimated:NO]; - - NSDictionary *notificationuserInfo = @{ UIKeyboardAnimationDurationUserInfoKey : @0, - UIKeyboardAnimationCurveUserInfoKey : @(UIViewAnimationCurveLinear) }; - [[NSNotificationCenter defaultCenter] postNotificationName:UIKeyboardWillShowNotification - object:nil - userInfo:notificationuserInfo]; - - [[NSNotificationCenter defaultCenter] postNotificationName:UIKeyboardWillHideNotification - object:nil - userInfo:notificationuserInfo]; - - [flowDialog dismissAnimated:NO]; -} - -/** This test is broken by iOS 13. The UIDevice -setOrientation:animated is no longer available and there doesn't seem to be a new equivalent. Leaving this here so we know it was once a thing. - - If we find the need to test this again, a different approach such as a UI test should be used.*/ -- (void)skip_testRotation { - [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]; -// [[UIDevice currentDevice] setOrientation:UIDeviceOrientationPortrait animated:NO]; - - PFOAuth1FlowDialog *flowDialog = [[PFOAuth1FlowDialog alloc] initWithURL:nil queryParameters:nil]; - - [flowDialog showAnimated:NO]; - CGRect oldBounds = flowDialog.bounds; - - [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft]; -// [[UIDevice currentDevice] setOrientation:UIDeviceOrientationLandscapeLeft animated:NO]; - [[NSNotificationCenter defaultCenter] postNotificationName:UIDeviceOrientationDidChangeNotification object:nil]; - - CGRect newBounds = flowDialog.bounds; - XCTAssertFalse(CGRectEqualToRect(oldBounds, newBounds)); - - [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]; -// [[UIDevice currentDevice] setOrientation:UIDeviceOrientationPortrait animated:NO]; - [[NSNotificationCenter defaultCenter] postNotificationName:UIDeviceOrientationDidChangeNotification object:nil]; - - newBounds = flowDialog.bounds; - XCTAssertTrue(CGRectEqualToRect(oldBounds, newBounds)); - - [flowDialog dismissAnimated:NO]; -} - -- (void)testWebViewDelegate { - NSURL *sampleURL = [NSURL URLWithString:@"http://foo.bar"]; - NSURL *successURL = [NSURL URLWithString:@"foo://success/?oauth_verifier=abcd&oauth_token=authtoken123"]; - NSURL *rejectedURL = [NSURL URLWithString:@"foo://success/?denied=authtoken123"]; - - //XCTestExpectation *flowExpectation = [[XCTestExpectation alloc] initWithDescription: @"Waiting for redirect"]; - XCTestExpectation *flowExpectation = [self currentSelectorTestExpectation]; - - PFOAuth1FlowDialog *flowDialog = [[PFOAuth1FlowDialog alloc] initWithURL:sampleURL queryParameters:nil]; - flowDialog.redirectURLPrefix = @"foo://"; - flowDialog.completion = ^(BOOL succeeded, NSURL *url, NSError *error) { - XCTAssertTrue(succeeded, @"Flow Dialogue Failed"); - XCTAssertNil(error, @"error"); - XCTAssertEqualObjects(url, successURL, @"url's arent equal"); - [flowExpectation fulfill]; - }; - - [flowDialog showAnimated:NO]; - - id webView = PFClassMock([WKWebView class]); - - NSURLRequest *request = [NSURLRequest requestWithURL:sampleURL]; - XCTestExpectation *policyExpectation = [[XCTestExpectation alloc] initWithDescription:@"Waiting for allowed policy decision"]; - - FakeWKNavigationAction *navigationAction = [[FakeWKNavigationAction alloc] init]; - navigationAction.navigationType = WKNavigationTypeOther; - navigationAction.request = request; - - [flowDialog webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:^(WKNavigationActionPolicy policy) { - XCTAssertTrue(policy == WKNavigationActionPolicyAllow, @"policy not allowed"); - [policyExpectation fulfill]; - }]; - - XCTestExpectation *canceledExpectation = [[XCTestExpectation alloc] initWithDescription:@"Waiting for canceled policy decision"]; - - WKNavigation* navigation = (WKNavigation *)([[NSObject alloc] init]); - [flowDialog webView:webView didStartProvisionalNavigation:navigation]; - [flowDialog webView:webView didFinishNavigation:navigation]; - - FakeWKNavigationAction *successAction = [[FakeWKNavigationAction alloc] init]; - successAction.navigationType = WKNavigationTypeOther; - successAction.request = [NSURLRequest requestWithURL:successURL]; - - [flowDialog webView:webView decidePolicyForNavigationAction:successAction decisionHandler:^(WKNavigationActionPolicy policy) { - XCTAssertTrue(policy == WKNavigationActionPolicyCancel); - [canceledExpectation fulfill]; - }]; - - XCTestExpectation *canceledOnDeniedExpectation = [[XCTestExpectation alloc] initWithDescription:@"Waiting for canceled policy decision"]; - - WKNavigation* rejectNavigation = (WKNavigation *)([[NSObject alloc] init]); - [flowDialog webView:webView didStartProvisionalNavigation:rejectNavigation]; - [flowDialog webView:webView didFinishNavigation:rejectNavigation]; - - FakeWKNavigationAction *rejectAction = [[FakeWKNavigationAction alloc] init]; - rejectAction.navigationType = WKNavigationTypeOther; - rejectAction.request = [NSURLRequest requestWithURL:rejectedURL]; - - [flowDialog webView:webView decidePolicyForNavigationAction:rejectAction decisionHandler:^(WKNavigationActionPolicy policy) { - XCTAssertTrue(policy == WKNavigationActionPolicyCancel); - [canceledOnDeniedExpectation fulfill]; - }]; - - [self waitForExpectations:@[policyExpectation, flowExpectation, canceledExpectation, canceledOnDeniedExpectation] timeout:20]; -} - -@end diff --git a/ParseTwitterUtils/Tests/Unit/OAuthCoreTests.m b/ParseTwitterUtils/Tests/Unit/OAuthCoreTests.m deleted file mode 100644 index c4e20cb64..000000000 --- a/ParseTwitterUtils/Tests/Unit/OAuthCoreTests.m +++ /dev/null @@ -1,168 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -@import ObjectiveC.runtime; - -#import "PFTwitterTestCase.h" -#import "PF_OAuthCore.h" - -@implementation NSURLComponents (OAuthCoreTests) - -+ (Class)class { - return [super class]; -} - -+ (Class)_nilClass { - return nil; -} - -@end - -@interface OAuthCoreTests : PFTwitterTestCase - -@property (nonatomic, strong) NSDate *authDate; -@property (nonatomic, copy) NSString *authNonce; - -@end - -@implementation OAuthCoreTests - -///-------------------------------------- -#pragma mark - Helpers -///-------------------------------------- - -- (NSURL *)sampleURL { - return [NSURL URLWithString:@"https://localhost/foo/bar"]; -} - -- (NSData *)sampleData { - return [@"sampe=@!value" dataUsingEncoding:NSUTF8StringEncoding]; -} - -- (void)assertAuthHeader:(NSString *)authHeader matchesExpectedSignature:(NSString *)signature { - XCTAssertTrue([authHeader hasPrefix:@"OAuth "]); - - PFAssertStringContains(authHeader, - ([NSString stringWithFormat:@"oauth_timestamp=\"%llu\"", - (unsigned long long)[_authDate timeIntervalSince1970]])); - - PFAssertStringContains(authHeader, ([NSString stringWithFormat:@"oauth_nonce=\"%@\"", _authNonce])); - PFAssertStringContains(authHeader, @"oauth_version=\"1.0\""); - PFAssertStringContains(authHeader, @"oauth_consumer_key=\"consumer_key\""); - PFAssertStringContains(authHeader, @"oauth_signature_method=\"HMAC-SHA1\""); - PFAssertStringContains(authHeader, ([NSString stringWithFormat:@"oauth_signature=\"%@\"", signature])); -} - -///-------------------------------------- -#pragma mark - XCTestCase -///-------------------------------------- - -- (void)setUp { - [super setUp]; - - _authDate = [NSDate dateWithTimeIntervalSinceReferenceDate:0.0]; - _authNonce = @"UUID-STRING"; -} - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -- (void)testBasic { - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:[self sampleURL] - method:@"POST" - body:[self sampleData] - additionalParameters:nil - consumerKey:@"consumer_key" - consumerSecret:@"consumer_secret" - token:nil - tokenSecret:nil]; - configuration.nonce = self.authNonce; - configuration.timestampDate = self.authDate; - NSString *authHeader = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - - [self assertAuthHeader:authHeader matchesExpectedSignature:@"3Nvy4O1Ok3qkeKcjvtv4wtyjc%2FY%3D"]; -} - -- (void)testNoBody { - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:[self sampleURL] - method:@"POST" - body:nil - additionalParameters:nil - consumerKey:@"consumer_key" - consumerSecret:@"consumer_secret" - token:nil - tokenSecret:nil]; - configuration.nonce = self.authNonce; - configuration.timestampDate = self.authDate; - NSString *authHeader = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - - [self assertAuthHeader:authHeader matchesExpectedSignature:@"rXtmqPIUmMbl4e1%2Bz4JgJUuVIz0%3D"]; -} - -- (void)testWithToken { - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:[self sampleURL] - method:@"POST" - body:nil - additionalParameters:nil - consumerKey:@"consumer_key" - consumerSecret:@"consumer_secret" - token:@"token" - tokenSecret:nil]; - configuration.nonce = self.authNonce; - configuration.timestampDate = self.authDate; - NSString *authHeader = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - - XCTAssertTrue([authHeader rangeOfString:@"oauth_token=\"token\""].location != NSNotFound); - [self assertAuthHeader:authHeader matchesExpectedSignature:@"iRsvN%2FUCXyzhf3o9tIL0DAX%2F4HY%3D"]; -} - -- (void)testNoNSURLComponents { - // Disable NSURLComponents for a single test. - Method originalMethod = class_getClassMethod([NSURLComponents class], @selector(class)); - Method replacementMethod = class_getClassMethod([NSURLComponents class], @selector(_nilClass)); - method_exchangeImplementations(originalMethod, replacementMethod); - - @try { - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:[self sampleURL] - method:@"POST" - body:[self sampleData] - additionalParameters:nil - consumerKey:@"consumer_key" - consumerSecret:@"consumer_secret" - token:nil - tokenSecret:nil]; - configuration.nonce = self.authNonce; - configuration.timestampDate = self.authDate; - NSString *authHeader = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - - [self assertAuthHeader:authHeader matchesExpectedSignature:@"3Nvy4O1Ok3qkeKcjvtv4wtyjc%2FY%3D"]; - } @finally { - method_exchangeImplementations(originalMethod, replacementMethod); - } -} - -- (void)testWithQuery { - NSURL *url = [NSURL URLWithString:[[[self sampleURL] absoluteString] stringByAppendingString:@"?key=value"]]; - - PFOAuthConfiguration *configuration = [PFOAuthConfiguration configurationForURL:url - method:@"GET" - body:nil - additionalParameters:nil - consumerKey:@"consumer_key" - consumerSecret:@"consumer_secret" - token:nil - tokenSecret:nil]; - configuration.nonce = self.authNonce; - configuration.timestampDate = self.authDate; - NSString *authHeader = [PFOAuth authorizationHeaderFromConfiguration:configuration]; - [self assertAuthHeader:authHeader matchesExpectedSignature:@"LecftA2NX%2FvSD4KakdTFjPZlmc0%3D"]; -} - -@end diff --git a/ParseTwitterUtils/Tests/Unit/TwitterAuthenticationProviderTests.m b/ParseTwitterUtils/Tests/Unit/TwitterAuthenticationProviderTests.m deleted file mode 100644 index 6660317b1..000000000 --- a/ParseTwitterUtils/Tests/Unit/TwitterAuthenticationProviderTests.m +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -@import Bolts.BFTask; - -#import "PFTwitterAuthenticationProvider.h" -#import "PFTwitterTestCase.h" -#import "PF_Twitter.h" - -@interface TwitterAuthenticationProviderTests : PFTwitterTestCase - -@end - -@implementation TwitterAuthenticationProviderTests - -///-------------------------------------- -#pragma mark - Helpers -///-------------------------------------- - -- (PF_Twitter *)mockedTwitter { - PF_Twitter *twitter = PFStrictClassMock([PF_Twitter class]); - - OCMStub(twitter.consumerKey).andReturn(@"yarr"); - OCMStub(twitter.consumerSecret).andReturn(@"yolo"); - - return twitter; -} - -- (void)assertValidAuthenticationData:(NSDictionary *)authData forTwitter:(PF_Twitter *)twitter { - XCTAssertEqualObjects(authData[@"id"], @"a"); - XCTAssertEqualObjects(authData[@"screen_name"], @"b"); - XCTAssertEqualObjects(authData[@"auth_token"], @"c"); - XCTAssertEqualObjects(authData[@"auth_token_secret"], @"d"); - XCTAssertEqualObjects(authData[@"consumer_key"], twitter.consumerKey); - XCTAssertEqualObjects(authData[@"consumer_secret"], twitter.consumerSecret); -} - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -- (void)testConstructors { - PF_Twitter *twitter = [self mockedTwitter]; - PFTwitterAuthenticationProvider *provider = [[PFTwitterAuthenticationProvider alloc] initWithTwitter:twitter]; - XCTAssertNotNil(provider); - XCTAssertEqual(provider.twitter, twitter); - - provider = [PFTwitterAuthenticationProvider providerWithTwitter:twitter]; - XCTAssertNotNil(provider); - XCTAssertEqual(provider.twitter, twitter); - - PFAssertThrowsInconsistencyException([PFTwitterAuthenticationProvider new]); -} - -- (void)testAuthData { - PF_Twitter *twitter = [self mockedTwitter]; - PFTwitterAuthenticationProvider *provider = [[PFTwitterAuthenticationProvider alloc] initWithTwitter:twitter]; - - NSDictionary *authData = [provider authDataWithTwitterId:@"a" - screenName:@"b" - authToken:@"c" - secret:@"d"]; - [self assertValidAuthenticationData:authData forTwitter:twitter]; -} - -- (void)testAuthType { - XCTAssertEqualObjects(PFTwitterUserAuthenticationType, @"twitter"); -} - -- (void)testAuthenticateAsync { - PF_Twitter *twitter = [self mockedTwitter]; - - OCMStub(twitter.userId).andReturn(@"a"); - OCMStub(twitter.screenName).andReturn(@"b"); - OCMStub(twitter.authToken).andReturn(@"c"); - OCMStub(twitter.authTokenSecret).andReturn(@"d"); - - BFTask *task = [BFTask taskWithResult:nil]; - OCMStub([twitter authorizeInBackground]).andReturn(task); - - PFTwitterAuthenticationProvider *provider = [PFTwitterAuthenticationProvider providerWithTwitter:twitter]; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[provider authenticateAsync] continueWithBlock:^id(BFTask *t) { - NSDictionary *authData = t.result; - XCTAssertNotNil(authData); - [self assertValidAuthenticationData:authData forTwitter:twitter]; - - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testRestoreAuthentication { - PF_Twitter *twitter = [self mockedTwitter]; - OCMExpect(twitter.userId = @"a"); - OCMExpect(twitter.screenName = @"b"); - OCMExpect(twitter.authToken = @"c"); - OCMExpect(twitter.authTokenSecret = @"d"); - - PFTwitterAuthenticationProvider *provider = [PFTwitterAuthenticationProvider providerWithTwitter:twitter]; - - NSDictionary *authData = @{ @"id" : @"a", - @"screen_name" : @"b", - @"auth_token" : @"c", - @"auth_token_secret" : @"d" }; - XCTAssertTrue([provider restoreAuthenticationWithAuthData:authData]); - - OCMVerifyAll((id)twitter); -} - -- (void)testRestoreAuthenticationBadData { - PF_Twitter *twitter = [self mockedTwitter]; - PFTwitterAuthenticationProvider *provider = [PFTwitterAuthenticationProvider providerWithTwitter:twitter]; - - NSDictionary *authData = @{ @"bad" : @"data" }; - XCTAssertFalse([provider restoreAuthenticationWithAuthData:authData]); -} - -- (void)testRestoreAuthenticationWithNoData { - PF_Twitter *twitter = [self mockedTwitter]; - OCMExpect(twitter.userId = nil); - OCMExpect(twitter.authToken = nil); - OCMExpect(twitter.authTokenSecret = nil); - OCMExpect(twitter.screenName = nil); - - PFTwitterAuthenticationProvider *provider = [PFTwitterAuthenticationProvider providerWithTwitter:twitter]; - XCTAssertTrue([provider restoreAuthenticationWithAuthData:nil]); - - OCMVerifyAll((id)twitter); -} - -@end diff --git a/ParseTwitterUtils/Tests/Unit/TwitterTests.m b/ParseTwitterUtils/Tests/Unit/TwitterTests.m deleted file mode 100644 index 8e81b81c7..000000000 --- a/ParseTwitterUtils/Tests/Unit/TwitterTests.m +++ /dev/null @@ -1,684 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -@import Accounts; -@import Bolts.BFTask; -@import Parse.PFConstants; -@import Social; - -#import "PFOAuth1FlowDialog.h" -#import "PFTwitterAlertView.h" -#import "PFTwitterTestCase.h" -#import "PFTwitterTestMacros.h" -#import "PF_Twitter_Private.h" - -typedef void (^NSURLSessionDataTaskCompletionHandler)(NSData *data, NSURLResponse *response, NSError *error); - -@interface TwitterTests : PFTwitterTestCase -@end - -@implementation TwitterTests - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -- (void)testConstructors { - PF_Twitter *twitter = [[PF_Twitter alloc] init]; - XCTAssertNotNil(twitter); - XCTAssertNotNil(twitter.accountStore); - - ACAccountStore *store = PFStrictClassMock([ACAccountStore class]); - NSURLSession *session = PFStrictClassMock([NSURLSession class]); - id dialogClass = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - twitter = [[PF_Twitter alloc] initWithAccountStore:store urlSession:session dialogClass:dialogClass]; - XCTAssertNotNil(twitter); - XCTAssertEqual(twitter.accountStore, store); - XCTAssertEqual(twitter.urlSession, session); - XCTAssertEqual(twitter.oauthDialogClass, dialogClass); -} - -- (void)testProperties { - PF_Twitter *twitter = [[PF_Twitter alloc] init]; - - XCTAssertNil(twitter.consumerKey); - XCTAssertNil(twitter.consumerKey); - XCTAssertNil(twitter.consumerSecret); - XCTAssertNil(twitter.authToken); - XCTAssertNil(twitter.authTokenSecret); - XCTAssertNil(twitter.userId); - XCTAssertNil(twitter.screenName); - - twitter.consumerKey = @"a"; - XCTAssertEqualObjects(twitter.consumerKey, @"a"); - twitter.consumerSecret = @"b"; - XCTAssertEqualObjects(twitter.consumerSecret, @"b"); - twitter.authToken = @"c"; - XCTAssertEqualObjects(twitter.authToken, @"c"); - twitter.authTokenSecret = @"d"; - XCTAssertEqualObjects(twitter.authTokenSecret, @"d"); - twitter.userId = @"e"; - XCTAssertEqualObjects(twitter.userId, @"e"); - twitter.screenName = @"f"; - XCTAssertEqualObjects(twitter.screenName, @"f"); -} - -- (void)testAuthorizeWithoutRequiredKeys { - id store = PFStrictClassMock([ACAccountStore class]); - NSURLSession *session = PFStrictClassMock([NSURLSession class]); - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:store urlSession:session dialogClass:mockedDialog]; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - NSError *error = task.error; - XCTAssertNotNil(error); - XCTAssertEqualObjects(error.domain, PFParseErrorDomain); - //TODO: (nlutsenko) Add code verification when we have proper code reported. - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testSignRequest { - id store = PFStrictClassMock([ACAccountStore class]); - NSURLSession *session = PFStrictClassMock([NSURLSession class]); - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:store urlSession:session dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; - [twitter signRequest:request]; - - XCTAssertNotNil([request valueForHTTPHeaderField:@"Authorization"]); -} - -- (void)testAuthorizeWithCallbackBlocks { - id store = PFStrictClassMock([ACAccountStore class]); - NSURLSession *session = PFStrictClassMock([NSURLSession class]); - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:store urlSession:session dialogClass:mockedDialog]; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [twitter authorizeWithSuccess:^{ - XCTFail(@"Did not expect success!"); - } failure:^(NSError *error) { - [expectation fulfill]; - } cancel:^{ - XCTFail(@"Did not expect cancellation!"); - }]; - - [self waitForTestExpectations]; -} - -- (void)testAuthorizeWithLocalAccountErrorAndNetworkError { - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - id mockedOperationQueue = PFStrictClassMock([NSOperationQueue class]); - id mockedComposeViewController = PFStrictClassMock([SLComposeViewController class]); - - NSError *expectedError = [NSError errorWithDomain:PFParseErrorDomain code:1337 userInfo:nil]; - - OCMStub(ClassMethod([mockedComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])).andReturn(YES); - OCMStub([mockedStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]).andReturn(nil); - - OCMStub([mockedStore requestAccessToAccountsWithType:nil - options:nil - completion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained ACAccountStoreRequestAccessCompletionHandler handler = nil; - [invocation getArgument:&handler atIndex:4]; - - handler(NO, expectedError); - }); - - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - completionHandler(nil, nil, expectedError); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedURLSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.error, expectedError); - - [expectation fulfill]; - - return nil; - }]; - - [self waitForTestExpectations]; - OCMVerifyAll(mockedOperationQueue); -} - -- (void)testAuthorizeWithoutLocalAccountAndNetworkError { - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - id mockedOperationQueue = PFStrictClassMock([NSOperationQueue class]); - - NSError *expectedError = [NSError errorWithDomain:PFParseErrorDomain code:1337 userInfo:nil]; - - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - completionHandler(nil, nil, expectedError); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedURLSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.error, expectedError); - XCTAssertNil(task.result); - - [expectation fulfill]; - - return nil; - }]; - - [self waitForTestExpectations]; - OCMVerifyAll(mockedOperationQueue); -} - -- (void)testAuthorizeWithLocalAccountAndNetworkError { - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - id mockedComposeViewController = PFStrictClassMock([SLComposeViewController class]); - - OCMStub(ClassMethod([mockedComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])).andReturn(YES); - OCMStub([mockedStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]).andReturn(nil); - - OCMStub([mockedStore requestAccessToAccountsWithType:nil - options:nil - completion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained ACAccountStoreRequestAccessCompletionHandler handler = nil; - [invocation getArgument:&handler atIndex:4]; - - handler(YES, nil); - }); - - id mockedAccount = PFStrictClassMock([ACAccount class]); - - NSArray *twitterAccounts = @[ mockedAccount ]; - OCMStub([mockedStore accountsWithAccountType:nil]).andReturn(twitterAccounts); - - NSError *expectedError = [NSError errorWithDomain:PFParseErrorDomain code:1337 userInfo:nil]; - - __block NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [OCMStub([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg checkWithBlock:^BOOL(id obj) { - completionHandler = obj; - return (obj != nil); - }]]).andDo(^(NSInvocation *invocation) { - completionHandler(nil, nil, expectedError); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedURLSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertEqualObjects(task.error, expectedError); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testAuthorizeWithSingleLocalAccountAndNetworkSuccess { - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - id mockedComposeViewController = PFStrictClassMock([SLComposeViewController class]); - id mockedSLRequest = PFStrictClassMock([SLRequest class]); - - OCMStub(ClassMethod([mockedComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])).andReturn(YES); - OCMStub([mockedStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]).andReturn(nil); - - OCMStub([mockedStore requestAccessToAccountsWithType:nil - options:nil - completion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained ACAccountStoreRequestAccessCompletionHandler handler = nil; - [invocation getArgument:&handler atIndex:4]; - - handler(YES, nil); - }); - - id mockedAccount = PFStrictClassMock([ACAccount class]); - OCMStub([mockedAccount accountType]).andReturn(nil); - - NSArray *twitterAccounts = @[ mockedAccount ]; - OCMStub([mockedStore accountsWithAccountType:nil]).andReturn(twitterAccounts); - - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - NSString *successString = @"oauth_token=request_token&oauth_token_secret=request_secret"; - completionHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - __weak typeof(mockedSLRequest) weakSLRequest = mockedSLRequest; - OCMStub(ClassMethod([[mockedSLRequest ignoringNonObjectArgs] requestForServiceType:SLServiceTypeTwitter - requestMethod:0 - URL:OCMOCK_ANY - parameters:OCMOCK_ANY])) - .andDo(^(NSInvocation *invocation) { - __strong typeof(mockedSLRequest) slRequest = weakSLRequest; - [invocation setReturnValue:&slRequest]; - }); - - OCMStub([mockedSLRequest setAccount:OCMOCK_ANY]); - OCMStub([mockedSLRequest performRequestWithHandler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained SLRequestHandler requestHandler = nil; - [invocation getArgument:&requestHandler atIndex:2]; - - NSString *successString = @"oauth_token=access_token&oauth_token_secret=access_secret&user_id=test_user&" - @"screen_name=test_name"; - requestHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }); - - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedURLSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertNil(task.error); - XCTAssertNil(task.result); - - XCTAssertEqualObjects(@"access_token", twitter.authToken); - XCTAssertEqualObjects(@"access_secret", twitter.authTokenSecret); - XCTAssertEqualObjects(@"test_user", twitter.userId); - XCTAssertEqualObjects(@"test_name", twitter.screenName); - - [expectation fulfill]; - - return nil; - }]; - - [self waitForTestExpectations]; -} - -- (void)testAuthorizeWithMultipleLocalAccountsAndNetworkSuccess { - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedSession = PFStrictClassMock([NSURLSession class]); - id mockedComposeViewController = PFStrictClassMock([SLComposeViewController class]); - id mockedSLRequest = PFStrictClassMock([SLRequest class]); - id mockedAlertView = PFStrictClassMock([PFTwitterAlertView class]); - - OCMStub(ClassMethod([mockedComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])).andReturn(YES); - OCMStub([mockedStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]).andReturn(nil); - - OCMStub([mockedStore requestAccessToAccountsWithType:nil - options:nil - completion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained ACAccountStoreRequestAccessCompletionHandler handler = nil; - [invocation getArgument:&handler atIndex:4]; - - handler(YES, nil); - }); - - id mockedAccount = PFStrictClassMock([ACAccount class]); - OCMStub([mockedAccount accountType]).andReturn(nil); - OCMStub([mockedAccount valueForKey:@"accountDescription"]).andReturn(@"An Account"); - - NSArray *twitterAccounts = @[ mockedAccount, mockedAccount ]; - OCMStub([mockedStore accountsWithAccountType:nil]).andReturn(twitterAccounts); - - [OCMExpect([mockedSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - - NSString *successString = @"oauth_token=request_token&oauth_token_secret=request_secret"; - completionHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - __weak typeof(mockedSLRequest) weakSLRequest = mockedSLRequest; - OCMStub(ClassMethod([[mockedSLRequest ignoringNonObjectArgs] requestForServiceType:SLServiceTypeTwitter - requestMethod:0 - URL:OCMOCK_ANY - parameters:OCMOCK_ANY])) - .andDo(^(NSInvocation *invocation) { - __strong typeof(mockedSLRequest) slRequest = weakSLRequest; - [invocation setReturnValue:&slRequest]; - }); - - OCMStub([mockedSLRequest setAccount:OCMOCK_ANY]); - OCMStub([mockedSLRequest performRequestWithHandler:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained SLRequestHandler requestHandler = nil; - [invocation getArgument:&requestHandler atIndex:2]; - - NSString *successString = @"oauth_token=access_token&oauth_token_secret=access_secret&user_id=test_user&" - @"screen_name=test_name"; - requestHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }); - - OCMStub(ClassMethod([mockedAlertView showAlertWithTitle:OCMOCK_ANY - message:nil - cancelButtonTitle:@"Cancel" - otherButtonTitles:[OCMArg checkWithBlock:^BOOL(id obj) { - return [obj count] == 2; - }] - completion:OCMOCK_ANY])).andDo(^(NSInvocation *invocation) { - __unsafe_unretained PFTwitterAlertViewCompletion completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:6]; - - completionHandler(0); - }); - - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertNil(task.error); - XCTAssertNil(task.result); - - XCTAssertEqualObjects(@"access_token", twitter.authToken); - XCTAssertEqualObjects(@"access_secret", twitter.authTokenSecret); - XCTAssertEqualObjects(@"test_user", twitter.userId); - XCTAssertEqualObjects(@"test_name", twitter.screenName); - - [expectation fulfill]; - - return nil; - }]; - - [self waitForTestExpectations]; -} - -- (void)testAuthorizeWithZeroLocalAccountsAndNetworkSuccess { - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - id mockedComposeViewController = PFStrictClassMock([SLComposeViewController class]); - id mockedSLRequest = PFStrictClassMock([SLRequest class]); - - OCMStub(ClassMethod([mockedComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])).andReturn(YES); - OCMStub([mockedStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]).andReturn(nil); - - OCMStub([mockedStore requestAccessToAccountsWithType:nil - options:nil - completion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained ACAccountStoreRequestAccessCompletionHandler handler = nil; - [invocation getArgument:&handler atIndex:4]; - - handler(YES, nil); - }); - - id mockedAccount = PFStrictClassMock([ACAccount class]); - OCMStub([mockedAccount accountType]).andReturn(nil); - - NSArray *twitterAccounts = @[]; - OCMStub([mockedStore accountsWithAccountType:nil]).andReturn(twitterAccounts); - - __weak typeof(mockedSLRequest) weakSLRequest = mockedSLRequest; - OCMStub(ClassMethod([[mockedSLRequest ignoringNonObjectArgs] requestForServiceType:SLServiceTypeTwitter - requestMethod:0 - URL:OCMOCK_ANY - parameters:OCMOCK_ANY])) - .andDo(^(NSInvocation *invocation) { - __strong typeof(mockedSLRequest) slRequest = weakSLRequest; - [invocation setReturnValue:&slRequest]; - }); - - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - - NSString *successString = @"oauth_token=request_token&oauth_token_secret=request_secret"; - completionHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"access_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - - NSString *successString = @"oauth_token=access_token&oauth_token_secret=access_secret&user_id=test_user&" - @"screen_name=test_name"; - completionHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - OCMExpect([mockedDialog dialogWithURL:OCMOCK_ANY queryParameters:OCMOCK_ANY]).andReturnWeak(mockedDialog); - OCMExpect([mockedDialog setRedirectURLPrefix:@"http://twitter-oauth.callback"]); - - __block PFOAuth1FlowDialogCompletion completionHandler = nil; - OCMExpect([mockedDialog setCompletion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained PFOAuth1FlowDialogCompletion newHandler = nil; - [invocation getArgument:&newHandler atIndex:2]; - - completionHandler = [newHandler copy]; - }); - - OCMExpect([[mockedDialog ignoringNonObjectArgs] showAnimated:NO]).andDo(^(NSInvocation *invocation) { - completionHandler( - YES, - [NSURL URLWithString:@"http://twitter-oauth.callback/?oauth_token=sucess_token&oauth_token_secret=success_secret"], - nil - ); - }); - - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedURLSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertNil(task.error); - XCTAssertNil(task.result); - - XCTAssertEqualObjects(@"access_token", twitter.authToken); - XCTAssertEqualObjects(@"access_secret", twitter.authTokenSecret); - XCTAssertEqualObjects(@"test_user", twitter.userId); - XCTAssertEqualObjects(@"test_name", twitter.screenName); - - [expectation fulfill]; - - return nil; - }]; - - [self waitForTestExpectations]; - - OCMVerifyAll(mockedDialog); - OCMVerifyAll(mockedURLSession); -} - -- (void)testAuthorizeWithoutLocalAccountAndNetworkSuccess { - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"request_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - - NSString *successString = @"oauth_token=request_token&oauth_token_secret=request_secret"; - completionHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - [OCMExpect([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"access_token"]; - }] completionHandler:[OCMArg isNotNil]]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [invocation getArgument:&completionHandler atIndex:3]; - - - NSString *successString = @"oauth_token=access_token&oauth_token_secret=access_secret&user_id=test_user&" - @"screen_name=test_name"; - completionHandler([successString dataUsingEncoding:NSUTF8StringEncoding], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - OCMExpect([mockedDialog dialogWithURL:OCMOCK_ANY queryParameters:OCMOCK_ANY]).andReturnWeak(mockedDialog); - OCMExpect([mockedDialog setRedirectURLPrefix:@"http://twitter-oauth.callback"]); - - __block PFOAuth1FlowDialogCompletion completionHandler = nil; - OCMExpect([mockedDialog setCompletion:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) { - __unsafe_unretained PFOAuth1FlowDialogCompletion newHandler = nil; - [invocation getArgument:&newHandler atIndex:2]; - - completionHandler = [newHandler copy]; - }); - - OCMExpect([[mockedDialog ignoringNonObjectArgs] showAnimated:NO]).andDo(^(NSInvocation *invocation) { - completionHandler( - YES, - [NSURL URLWithString:@"http://twitter-oauth.callback/?oauth_token=sucess_token&oauth_token_secret=success_secret"], - nil - ); - }); - - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore - urlSession:mockedURLSession - dialogClass:mockedDialog]; - - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - XCTAssertNil(task.error); - XCTAssertNil(task.result); - - XCTAssertEqualObjects(@"access_token", twitter.authToken); - XCTAssertEqualObjects(@"access_secret", twitter.authTokenSecret); - XCTAssertEqualObjects(@"test_user", twitter.userId); - XCTAssertEqualObjects(@"test_name", twitter.screenName); - - [expectation fulfill]; - - return nil; - }]; - - [self waitForTestExpectations]; - - OCMVerifyAll(mockedDialog); - OCMVerifyAll(mockedURLSession); -} - -- (void)testDeauthorizeLoggedOutAccount { - id store = PFStrictClassMock([ACAccountStore class]); - NSURLSession *session = PFStrictClassMock([NSURLSession class]); - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:store urlSession:session dialogClass:mockedDialog]; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter authorizeInBackground] continueWithBlock:^id(BFTask *task) { - NSError *error = task.error; - XCTAssertNotNil(error); - XCTAssertEqualObjects(error.domain, PFParseErrorDomain); - XCTAssertEqual(error.code, 1); - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -- (void)testDeauthorizeLoggedInAccount { - id mockedStore = PFStrictClassMock([ACAccountStore class]); - id mockedURLSession = PFStrictClassMock([NSURLSession class]); - - id mockedDialog = PFStrictProtocolMock(@protocol(PFOAuth1FlowDialogInterface)); - PF_Twitter *twitter = [[PF_Twitter alloc] initWithAccountStore:mockedStore urlSession:mockedURLSession dialogClass:mockedDialog]; - twitter.consumerKey = @"consumer_key"; - twitter.consumerSecret = @"consumer_secret"; - twitter.authToken = @"auth_token"; - twitter.authTokenSecret = @"auth_token_secret"; - twitter.userId = @"user_id"; - twitter.screenName = @"screen_name"; - - __block NSURLSessionDataTaskCompletionHandler completionHandler = nil; - [OCMStub([mockedURLSession dataTaskWithRequest:[OCMArg checkWithBlock:^BOOL(id obj) { - NSURLRequest *request = obj; - return [request.URL.lastPathComponent isEqualToString:@"invalidate_token"]; - }] completionHandler:[OCMArg checkWithBlock:^BOOL(id obj) { - completionHandler = obj; - return (obj != nil); - }]]).andDo(^(NSInvocation *invocation) { - completionHandler([NSData data], nil, nil); - }) andReturn:[OCMockObject niceMockForClass:[NSURLSessionDataTask class]]]; - - XCTestExpectation *expectation = [self currentSelectorTestExpectation]; - [[twitter deauthorizeInBackground] continueWithBlock:^id(BFTask *task) { - NSError *error = task.error; - XCTAssertNil(error); - XCTAssertNotNil(task.result); - - XCTAssertNil(twitter.authToken); - XCTAssertNil(twitter.authTokenSecret); - XCTAssertNil(twitter.userId); - XCTAssertNil(twitter.screenName); - - [expectation fulfill]; - return nil; - }]; - [self waitForTestExpectations]; -} - -@end diff --git a/ParseTwitterUtils/Tests/Unit/TwitterUtilsTests.m b/ParseTwitterUtils/Tests/Unit/TwitterUtilsTests.m deleted file mode 100644 index 37f5998e3..000000000 --- a/ParseTwitterUtils/Tests/Unit/TwitterUtilsTests.m +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Copyright (c) 2015-present, Parse, LLC. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "PFTwitterTestCase.h" -#import "PFTwitterUtils_Private.h" -#import "PF_Twitter.h" - -@import Parse; - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -@interface TwitterUtilsTests : PFTwitterTestCase - -@end - -@implementation TwitterUtilsTests - -///-------------------------------------- -#pragma mark - XCTestCase -///-------------------------------------- - -- (void)tearDown { - [PFTwitterUtils _setAuthenticationProvider:nil]; - - [super tearDown]; -} - -///-------------------------------------- -#pragma mark - Tests -///-------------------------------------- - -- (void)testInitialize { - id parseMock = PFStrictClassMock([Parse class]); - OCMStub([parseMock applicationId]).andReturn(@"yolo"); - OCMStub([parseMock clientKey]).andReturn(@"yarr"); - - id userMock = PFStrictClassMock([PFUser class]); - OCMExpect(ClassMethod([userMock registerAuthenticationDelegate:[OCMArg checkWithBlock:^BOOL(id obj) { - return (obj != nil); - }] forAuthType:@"twitter"])); - - [PFTwitterUtils initializeWithConsumerKey:@"a" consumerSecret:@"b"]; - XCTAssertNotNil([PFTwitterUtils twitter]); - XCTAssertEqualObjects([PFTwitterUtils twitter].consumerKey, @"a"); - XCTAssertEqualObjects([PFTwitterUtils twitter].consumerSecret, @"b"); - - OCMVerifyAll(userMock); -} - -- (void)testInitializeTwice { - id parseMock = PFStrictClassMock([Parse class]); - OCMStub([parseMock applicationId]).andReturn(@"yolo"); - OCMStub([parseMock clientKey]).andReturn(@"yarr"); - - id userMock = PFStrictClassMock([PFUser class]); - - [PFTwitterUtils initializeWithConsumerKey:@"a" consumerSecret:@"b"]; - XCTAssertNotNil([PFTwitterUtils twitter]); - XCTAssertEqualObjects([PFTwitterUtils twitter].consumerKey, @"a"); - XCTAssertEqualObjects([PFTwitterUtils twitter].consumerSecret, @"b"); - - [PFTwitterUtils initializeWithConsumerKey:@"b" consumerSecret:@"c"]; - XCTAssertNotNil([PFTwitterUtils twitter]); - XCTAssertEqualObjects([PFTwitterUtils twitter].consumerKey, @"a"); - XCTAssertEqualObjects([PFTwitterUtils twitter].consumerSecret, @"b"); - - OCMVerifyAll(userMock); -} - -- (void)testInitializeRequiresParseInitialize { - PFAssertThrowsInconsistencyException([PFTwitterUtils initializeWithConsumerKey:@"a" consumerSecret:@"b"]); -} - -@end diff --git a/ParseTwitterUtils/third_party_licenses.txt b/ParseTwitterUtils/third_party_licenses.txt deleted file mode 100644 index 492c44335..000000000 --- a/ParseTwitterUtils/third_party_licenses.txt +++ /dev/null @@ -1,35 +0,0 @@ -THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE THAT MAY BE CONTAINED IN PORTIONS OF THE PARSE PRODUCT. - ------ - -The following software may be included in this product: OAuthCore. This software contains the following license and notice below: - -Copyright (C) 2012 Loren Brichter - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - --------------------------------------------------------------------- - -Copyright 2001-2004 Unicode, Inc. - -Disclaimer - -This source code is provided as is by Unicode, Inc. No claims are -made as to fitness for any particular purpose. No warranties of any -kind are expressed or implied. The recipient agrees to determine -applicability of information provided. If this file has been -purchased on magnetic or optical media from Unicode, Inc., the -sole remedy for any claim will be exchange of defective media -within 90 days of receipt. - -Limitations on Rights to Redistribute This Code - -Unicode, Inc. hereby grants the right to freely use the information -supplied in this file in the creation of products supporting the -Unicode Standard, and to make copies of this file in any form -for internal or external distribution as long as this notice -remains attached. diff --git a/ParseUI/.gitignore b/ParseUI/.gitignore new file mode 100644 index 000000000..f4096fee4 --- /dev/null +++ b/ParseUI/.gitignore @@ -0,0 +1 @@ +Package.resolved diff --git a/ParseUI/ParseUI.xcodeproj/project.pbxproj b/ParseUI/ParseUI.xcodeproj/project.pbxproj index ac69130a1..95eaad508 100644 --- a/ParseUI/ParseUI.xcodeproj/project.pbxproj +++ b/ParseUI/ParseUI.xcodeproj/project.pbxproj @@ -3,10 +3,18 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ + 39452DEC2AD8FC110066C2AE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DEB2AD8FC110066C2AE /* ParseObjC */; }; + 39452DF82AD9121D0066C2AE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DF72AD9121D0066C2AE /* ParseObjC */; }; + 39452DFA2AD9121D0066C2AE /* ParseUI in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DF92AD9121D0066C2AE /* ParseUI */; }; + 39452DFD2AD914110066C2AE /* BoltsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DFC2AD914110066C2AE /* BoltsSwift */; }; + 39E22AD72AD0676700D9AE5C /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = 39E22AD62AD0676700D9AE5C /* OCMock */; }; + 39E249A52AD1DD2E0014357C /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39E249A42AD1DD2E0014357C /* ParseObjC */; }; + 6B63F1602BC34E4A00F89DEE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F15F2BC34E4A00F89DEE /* ParseObjC */; }; + 6B63F1662BC3508200F89DEE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F1652BC3508200F89DEE /* ParseObjC */; }; 7C77D109292A509000C4D90E /* PFPurchaseTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0C9292A507500C4D90E /* PFPurchaseTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7C77D10A292A509000C4D90E /* PFTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0CB292A507500C4D90E /* PFTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7C77D10B292A509000C4D90E /* PFQueryTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0CD292A507500C4D90E /* PFQueryTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -125,11 +133,8 @@ 7C77D1A5292A512300C4D90E /* PFActionButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D102292A507500C4D90E /* PFActionButton.m */; }; 7C77D1A6292A512300C4D90E /* PFDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D104292A507500C4D90E /* PFDismissButton.m */; }; 7C77D1A7292A512300C4D90E /* PFLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D108292A507500C4D90E /* PFLoadingView.m */; }; - 7C77D207292A537400C4D90E /* ParseUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D162292A510400C4D90E /* ParseUI.framework */; }; - 7C77D208292A537E00C4D90E /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D202292A534D00C4D90E /* OCMock.framework */; }; 7C77D221292A575B00C4D90E /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D220292A575B00C4D90E /* Social.framework */; }; 7C77D222292A580800C4D90E /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D220292A575B00C4D90E /* Social.framework */; }; - 7C77D22E292A604700C4D90E /* ParseUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D22D292A604700C4D90E /* ParseUI.framework */; }; 8129E5F51A9CB067006752BC /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA71A1AB37500FD6EED /* Images.xcassets */; }; 8129E5F71A9CB067006752BC /* 0.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA91A1AB37500FD6EED /* 0.png */; }; 8129E5F81A9CB067006752BC /* 1.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FAA1A1AB37500FD6EED /* 1.png */; }; @@ -184,275 +189,24 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 4A0ECCAC200DA7D100BA84A3 /* PBXContainerItemProxy */ = { + 39452DF12AD910490066C2AE /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; - remoteGlobalIDString = 4A9A9496200D0329005D8F4B; - remoteInfo = ParseUI; - }; - 4A0ECCB0200DA8DC00BA84A3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4A0ECBE4200D8C0200BA84A3; - remoteInfo = "ParseUI-Dynamic"; - }; - 7C77D138292A50BF00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C3821C19CCA89E0066284A; - remoteInfo = "Parse-iOS"; - }; - 7C77D13A292A50BF00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C5845D1C3B0A98000063C6; - remoteInfo = "Parse-iOS-Dynamic"; - }; - 7C77D13C292A50BF00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 816F449B1A8E8933009CDB32; - remoteInfo = "ParseUnitTests-iOS"; - }; - 7C77D13E292A50BF00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 97010FAC1630B18F00AB761E; - remoteInfo = "Parse-macOS"; - }; - 7C77D140292A50BF00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C09F861AF97A490043B49C; - remoteInfo = "ParseUnitTests-macOS"; - }; - 7C77D142292A50BF00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 815F24151BD04D150054659F; - remoteInfo = "Parse-tvOS"; - }; - 7C77D144292A50BF00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C585BF1C3B0AA1000063C6; - remoteInfo = "Parse-tvOS-Dynamic"; - }; - 7C77D146292A50BF00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 810156691BB3832700D7C7BD; - remoteInfo = "Parse-watchOS"; - }; - 7C77D148292A50BF00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81C5870F1C3B0AA9000063C6; - remoteInfo = "Parse-watchOS-Dynamic"; - }; - 7C77D14A292A50BF00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4AE33A0B1F5451AD0088DCA0; - remoteInfo = "ParseUnitTests-iOS-host"; - }; - 7C77D14E292A50F600C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 81C582E11C3B0A98000063C6; - remoteInfo = "Parse-iOS-Dynamic"; - }; - 7C77D1B0292A51AA00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1A8292A51AA00C4D90E /* ParseTwitterUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D2AAC07E0554694100DB518D; - remoteInfo = "ParseTwitterUtils-iOS"; - }; - 7C77D1B2292A51AA00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1A8292A51AA00C4D90E /* ParseTwitterUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81ECACD71D1E14E000FA7673; - remoteInfo = "ParseTwitterUtils-iOS-Dynamic"; - }; - 7C77D1B4292A51AA00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1A8292A51AA00C4D90E /* ParseTwitterUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81CB98C61AB7905D00136FA5; - remoteInfo = "ParseTwitterUtils-Tests"; - }; - 7C77D1B6292A51AA00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1A8292A51AA00C4D90E /* ParseTwitterUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 8166FB671B4F1D77003841A2; - remoteInfo = ParseTwitterTestApplication; - }; - 7C77D1DF292A522800C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1D5292A522800C4D90E /* ParseFacebookUtilsiOS.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D2AAC07E0554694100DB518D; - remoteInfo = ParseFacebookUtilsiOS; - }; - 7C77D1E1292A522800C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1D5292A522800C4D90E /* ParseFacebookUtilsiOS.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4AAEAA75200C020E00AA7479; - remoteInfo = "ParseFacebookUtilsiOS-Dynamic"; - }; - 7C77D1E3292A522800C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1D5292A522800C4D90E /* ParseFacebookUtilsiOS.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81CB98C61AB7905D00136FA5; - remoteInfo = "ParseFacebookUtils-UnitTests"; - }; - 7C77D1E5292A522800C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1D5292A522800C4D90E /* ParseFacebookUtilsiOS.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = F535C73B1B54B4A800A7D81E; - remoteInfo = ParseFacebookTestApplication; - }; - 7C77D1F9292A534D00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1EF292A534D00C4D90E /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 030EF0A814632FD000B04273; - remoteInfo = OCMock; - }; - 7C77D1FB292A534D00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1EF292A534D00C4D90E /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 03565A3118F0566E003AE91E; - remoteInfo = OCMockTests; - }; - 7C77D1FD292A534D00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1EF292A534D00C4D90E /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 030EF0DC14632FF700B04273; - remoteInfo = OCMockLib; - }; - 7C77D1FF292A534D00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1EF292A534D00C4D90E /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D31108AD1828DB8700737925; - remoteInfo = OCMockLibTests; - }; - 7C77D201292A534D00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1EF292A534D00C4D90E /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = F0B950F11B0080BE00942C38; - remoteInfo = "OCMock iOS"; - }; - 7C77D203292A534D00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1EF292A534D00C4D90E /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 817EB1621BD765130047E85A; - remoteInfo = "OCMock tvOS"; - }; - 7C77D205292A534D00C4D90E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1EF292A534D00C4D90E /* OCMock.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 8DE97CA022B43EE60098C63F; - remoteInfo = "OCMock watchOS"; - }; - 84745C482939EE77002D00B2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 84745C3F2939EE77002D00B2 /* ParseFacebookUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D2AAC07E0554694100DB518D; - remoteInfo = "ParseFacebookUtilsV4-iOS"; - }; - 84745C4A2939EE77002D00B2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 84745C3F2939EE77002D00B2 /* ParseFacebookUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 81FE7F8B1C17790400E6BD34; - remoteInfo = "ParseFacebookUtilsV4-tvOS"; - }; - 84745C4C2939EE77002D00B2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 84745C3F2939EE77002D00B2 /* ParseFacebookUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4AAEAA75200C020E00AA7479; - remoteInfo = "ParseFacebookUtilsV4-iOS-Dynamic"; - }; - 84745C4E2939EE77002D00B2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 84745C3F2939EE77002D00B2 /* ParseFacebookUtils.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4AAEAA90200C022300AA7479; - remoteInfo = "ParseFacebookUtilsV4-tvOS-Dynamic"; - }; - 84745C622939EFD7002D00B2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 81C3821B19CCA89E0066284A; - remoteInfo = "Parse-iOS"; - }; - 84745C6B293B3F03002D00B2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1A8292A51AA00C4D90E /* ParseTwitterUtils.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D; - remoteInfo = "ParseTwitterUtils-iOS"; - }; - 84745C6D293B3F09002D00B2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 84745C3F2939EE77002D00B2 /* ParseFacebookUtils.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D; - remoteInfo = "ParseFacebookUtilsV4-iOS"; - }; - 84745C6F293B3F46002D00B2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7C77D1D5292A522800C4D90E /* ParseFacebookUtilsiOS.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D; - remoteInfo = ParseFacebookUtilsiOS; + remoteGlobalIDString = 81472F661A1AB33800FD6EED; + remoteInfo = ParseUIDemo; }; - BCCBE8CF23BFB89D0044A79C /* PBXContainerItemProxy */ = { + 39452DF52AD911740066C2AE /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 4A9A9496200D0329005D8F4B; remoteInfo = ParseUI; }; - BCCBE8D723BFB9EB0044A79C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 81472F661A1AB33800FD6EED; - remoteInfo = ParseUIDemo; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 39E2499F2AD1DD160014357C /* Parse-SDK-iOS-OSX */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "Parse-SDK-iOS-OSX"; path = ..; sourceTree = ""; }; 4A9A947E200D0226005D8F4B /* convert_images.rb */ = {isa = PBXFileReference; lastKnownFileType = text.script.ruby; path = convert_images.rb; sourceTree = ""; }; 4A9A9480200D02CE005D8F4B /* ParseUI-iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseUI-iOS.xcconfig"; sourceTree = ""; }; 4A9A9482200D02CE005D8F4B /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; @@ -468,18 +222,12 @@ 4A9A948F200D02CE005D8F4B /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 4A9A9490200D02CE005D8F4B /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 4A9A9491200D02CE005D8F4B /* ParseUI-iOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseUI-iOS-Dynamic.xcconfig"; sourceTree = ""; }; - 7C77D0B3292A507500C4D90E /* twitter_icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "twitter_icon@3x.png"; sourceTree = ""; }; 7C77D0B4292A507500C4D90E /* apple_icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apple_icon@3x.png"; sourceTree = ""; }; - 7C77D0B5292A507500C4D90E /* facebook_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "facebook_icon@2x.png"; sourceTree = ""; }; 7C77D0B6292A507500C4D90E /* parse_logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = parse_logo.png; sourceTree = ""; }; - 7C77D0B7292A507500C4D90E /* facebook_icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "facebook_icon@3x.png"; sourceTree = ""; }; 7C77D0B8292A507500C4D90E /* apple_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apple_icon@2x.png"; sourceTree = ""; }; - 7C77D0B9292A507500C4D90E /* twitter_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "twitter_icon@2x.png"; sourceTree = ""; }; 7C77D0BA292A507500C4D90E /* parse_logo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "parse_logo@2x.png"; sourceTree = ""; }; 7C77D0BB292A507500C4D90E /* parse_logo@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "parse_logo@3x.png"; sourceTree = ""; }; 7C77D0BC292A507500C4D90E /* apple_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = apple_icon.png; sourceTree = ""; }; - 7C77D0BD292A507500C4D90E /* facebook_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = facebook_icon.png; sourceTree = ""; }; - 7C77D0BE292A507500C4D90E /* twitter_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = twitter_icon.png; sourceTree = ""; }; 7C77D0BF292A507500C4D90E /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; 7C77D0C2292A507500C4D90E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/ParseUI.strings; sourceTree = ""; }; 7C77D0C3292A507500C4D90E /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/ParseUI.strings; sourceTree = ""; }; @@ -546,15 +294,11 @@ 7C77D106292A507500C4D90E /* PFActionButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFActionButton.h; sourceTree = ""; }; 7C77D107292A507500C4D90E /* PFLoadingView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFLoadingView.h; sourceTree = ""; }; 7C77D108292A507500C4D90E /* PFLoadingView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFLoadingView.m; sourceTree = ""; }; - 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Parse.xcodeproj; path = ../Parse/Parse.xcodeproj; sourceTree = ""; }; 7C77D162292A510400C4D90E /* ParseUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7C77D1A8292A51AA00C4D90E /* ParseTwitterUtils.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ParseTwitterUtils.xcodeproj; path = ../ParseTwitterUtils/ParseTwitterUtils.xcodeproj; sourceTree = ""; }; - 7C77D1D5292A522800C4D90E /* ParseFacebookUtilsiOS.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ParseFacebookUtilsiOS.xcodeproj; path = ../ParseFacebookUtilsiOS/ParseFacebookUtilsiOS.xcodeproj; sourceTree = ""; }; - 7C77D1EF292A534D00C4D90E /* OCMock.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OCMock.xcodeproj; path = ../Carthage/Checkouts/OCMock/Source/OCMock.xcodeproj; sourceTree = ""; }; 7C77D21F292A56F600C4D90E /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseUIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7C77D220292A575B00C4D90E /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; }; 7C77D22D292A604700C4D90E /* ParseUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7C77D22F292A604700C4D90E /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseUIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7C77D22F292A604700C4D90E /* ParseUIDemo-Swift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ParseUIDemo-Swift.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 7C77D230292A604700C4D90E /* SignInWithAppleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SignInWithAppleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 8129E6081A9CB1BE006752BC /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 8129E6391A9CB320006752BC /* UIDemoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIDemoViewController.swift; sourceTree = ""; }; @@ -612,7 +356,6 @@ 81FC6B6B1A9D1CE900104E45 /* SubtitleImageCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubtitleImageCollectionViewController.swift; sourceTree = ""; }; 81FC6B711A9D1CFD00104E45 /* SimpleQueryCollectionStoryboard-Swift.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = "SimpleQueryCollectionStoryboard-Swift.storyboard"; path = "ParseUIDemo/Swift/Resources/SimpleQueryCollectionStoryboard-Swift.storyboard"; sourceTree = SOURCE_ROOT; }; 81FC6B741A9D1D4700104E45 /* CustomProductTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomProductTableViewController.swift; sourceTree = ""; }; - 84745C3F2939EE77002D00B2 /* ParseFacebookUtils.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ParseFacebookUtils.xcodeproj; path = "/Users/admin/Documents/Projects/Parse-SDK-iOS-OSX/ParseFacebookUtils/ParseFacebookUtils.xcodeproj"; sourceTree = ""; }; BC32E14523ABAE04009BDFCD /* ParseUIDemo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = ParseUIDemo.entitlements; path = ParseUIDemo/ParseUIDemo.entitlements; sourceTree = ""; }; BCCBE8CB23BFB89D0044A79C /* SignInWithAppleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SignInWithAppleTests.m; sourceTree = ""; }; BCCBE8CD23BFB89D0044A79C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -629,6 +372,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 6B63F1602BC34E4A00F89DEE /* ParseObjC in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -636,6 +380,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 39E249A52AD1DD2E0014357C /* ParseObjC in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -643,7 +388,10 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 39452DFA2AD9121D0066C2AE /* ParseUI in Frameworks */, + 39452DF82AD9121D0066C2AE /* ParseObjC in Frameworks */, 7C77D221292A575B00C4D90E /* Social.framework in Frameworks */, + 39452DFD2AD914110066C2AE /* BoltsSwift in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -651,6 +399,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 6B63F1662BC3508200F89DEE /* ParseObjC in Frameworks */, 7C77D222292A580800C4D90E /* Social.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -659,9 +408,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7C77D22E292A604700C4D90E /* ParseUI.framework in Frameworks */, - 7C77D208292A537E00C4D90E /* OCMock.framework in Frameworks */, - 7C77D207292A537400C4D90E /* ParseUI.framework in Frameworks */, + 39452DEC2AD8FC110066C2AE /* ParseObjC in Frameworks */, + 39E22AD72AD0676700D9AE5C /* OCMock in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -671,6 +419,7 @@ 0867D691FE84028FC02AAC07 /* Breakpad */ = { isa = PBXGroup; children = ( + 39E2499E2AD1DD160014357C /* Packages */, 4A9A9422200D0226005D8F4B /* ParseUI */, 81472F621A1AB31F00FD6EED /* ParseUIDemo */, BCCBE8CA23BFB89D0044A79C /* SignInWithAppleTests */, @@ -678,21 +427,24 @@ 7C77D162292A510400C4D90E /* ParseUI.framework */, 7C77D21F292A56F600C4D90E /* ParseUIDemo.app */, 7C77D22D292A604700C4D90E /* ParseUI.framework */, - 7C77D22F292A604700C4D90E /* ParseUIDemo.app */, + 7C77D22F292A604700C4D90E /* ParseUIDemo-Swift.app */, 7C77D230292A604700C4D90E /* SignInWithAppleTests.xctest */, - 84745C3F2939EE77002D00B2 /* ParseFacebookUtils.xcodeproj */, ); name = Breakpad; sourceTree = ""; }; + 39E2499E2AD1DD160014357C /* Packages */ = { + isa = PBXGroup; + children = ( + 39E2499F2AD1DD160014357C /* Parse-SDK-iOS-OSX */, + ); + name = Packages; + sourceTree = ""; + }; 3F5307328F84566C90FBCF25 /* Frameworks */ = { isa = PBXGroup; children = ( 7C77D220292A575B00C4D90E /* Social.framework */, - 7C77D1EF292A534D00C4D90E /* OCMock.xcodeproj */, - 7C77D1D5292A522800C4D90E /* ParseFacebookUtilsiOS.xcodeproj */, - 7C77D1A8292A51AA00C4D90E /* ParseTwitterUtils.xcodeproj */, - 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */, ); name = Frameworks; sourceTree = ""; @@ -791,18 +543,12 @@ 7C77D0B2292A507500C4D90E /* Images */ = { isa = PBXGroup; children = ( - 7C77D0B3292A507500C4D90E /* twitter_icon@3x.png */, 7C77D0B4292A507500C4D90E /* apple_icon@3x.png */, - 7C77D0B5292A507500C4D90E /* facebook_icon@2x.png */, 7C77D0B6292A507500C4D90E /* parse_logo.png */, - 7C77D0B7292A507500C4D90E /* facebook_icon@3x.png */, 7C77D0B8292A507500C4D90E /* apple_icon@2x.png */, - 7C77D0B9292A507500C4D90E /* twitter_icon@2x.png */, 7C77D0BA292A507500C4D90E /* parse_logo@2x.png */, 7C77D0BB292A507500C4D90E /* parse_logo@3x.png */, 7C77D0BC292A507500C4D90E /* apple_icon.png */, - 7C77D0BD292A507500C4D90E /* facebook_icon.png */, - 7C77D0BE292A507500C4D90E /* twitter_icon.png */, ); path = Images; sourceTree = ""; @@ -917,59 +663,6 @@ path = Buttons; sourceTree = ""; }; - 7C77D12A292A50BF00C4D90E /* Products */ = { - isa = PBXGroup; - children = ( - 7C77D139292A50BF00C4D90E /* Parse.framework */, - 7C77D13B292A50BF00C4D90E /* Parse.framework */, - 7C77D13D292A50BF00C4D90E /* ParseUnitTests-iOS.xctest */, - 7C77D13F292A50BF00C4D90E /* Parse.framework */, - 7C77D141292A50BF00C4D90E /* ParseUnitTests-macOS.xctest */, - 7C77D143292A50BF00C4D90E /* Parse.framework */, - 7C77D145292A50BF00C4D90E /* Parse.framework */, - 7C77D147292A50BF00C4D90E /* Parse.framework */, - 7C77D149292A50BF00C4D90E /* Parse.framework */, - 7C77D14B292A50BF00C4D90E /* ParseUnitTests-iOS-host.app */, - ); - name = Products; - sourceTree = ""; - }; - 7C77D1A9292A51AA00C4D90E /* Products */ = { - isa = PBXGroup; - children = ( - 7C77D1B1292A51AA00C4D90E /* ParseTwitterUtils.framework */, - 7C77D1B3292A51AA00C4D90E /* ParseTwitterUtils.framework */, - 7C77D1B5292A51AA00C4D90E /* ParseTwitterUtils-Tests.xctest */, - 7C77D1B7292A51AA00C4D90E /* ParseTwitterTestApplication.app */, - ); - name = Products; - sourceTree = ""; - }; - 7C77D1D6292A522800C4D90E /* Products */ = { - isa = PBXGroup; - children = ( - 7C77D1E0292A522800C4D90E /* ParseFacebookUtilsiOS.framework */, - 7C77D1E2292A522800C4D90E /* ParseFacebookUtilsiOS.framework */, - 7C77D1E4292A522800C4D90E /* ParseFacebookUtilsiOS-UnitTests.xctest */, - 7C77D1E6292A522800C4D90E /* ParseFacebookTestApplication.app */, - ); - name = Products; - sourceTree = ""; - }; - 7C77D1F0292A534D00C4D90E /* Products */ = { - isa = PBXGroup; - children = ( - 7C77D1FA292A534D00C4D90E /* OCMock.framework */, - 7C77D1FC292A534D00C4D90E /* OCMockTests.xctest */, - 7C77D1FE292A534D00C4D90E /* libOCMock.a */, - 7C77D200292A534D00C4D90E /* OCMockLibTests.xctest */, - 7C77D202292A534D00C4D90E /* OCMock.framework */, - 7C77D204292A534D00C4D90E /* OCMock.framework */, - 7C77D206292A534D00C4D90E /* OCMock.framework */, - ); - name = Products; - sourceTree = ""; - }; 7C77D246292A606800C4D90E /* Sign In With Apple */ = { isa = PBXGroup; children = ( @@ -1183,17 +876,6 @@ path = ProductTableViewController; sourceTree = ""; }; - 84745C402939EE77002D00B2 /* Products */ = { - isa = PBXGroup; - children = ( - 84745C492939EE77002D00B2 /* ParseFacebookUtilsV4.framework */, - 84745C4B2939EE77002D00B2 /* ParseFacebookUtilsV4.framework */, - 84745C4D2939EE77002D00B2 /* ParseFacebookUtilsV4.framework */, - 84745C4F2939EE77002D00B2 /* ParseFacebookUtilsV4.framework */, - ); - name = Products; - sourceTree = ""; - }; BCCBE8CA23BFB89D0044A79C /* SignInWithAppleTests */ = { isa = PBXGroup; children = ( @@ -1297,9 +979,11 @@ buildRules = ( ); dependencies = ( - 7C77D14F292A50F600C4D90E /* PBXTargetDependency */, ); name = "ParseUI-Dynamic"; + packageProductDependencies = ( + 6B63F15F2BC34E4A00F89DEE /* ParseObjC */, + ); productName = ParseUI; productReference = 7C77D162292A510400C4D90E /* ParseUI.framework */; productType = "com.apple.product-type.framework"; @@ -1316,12 +1000,11 @@ buildRules = ( ); dependencies = ( - 84745C70293B3F46002D00B2 /* PBXTargetDependency */, - 84745C6E293B3F09002D00B2 /* PBXTargetDependency */, - 84745C6C293B3F03002D00B2 /* PBXTargetDependency */, - 84745C632939EFD7002D00B2 /* PBXTargetDependency */, ); name = ParseUI; + packageProductDependencies = ( + 39E249A42AD1DD2E0014357C /* ParseObjC */, + ); productName = ParseUI; productReference = 7C77D22D292A604700C4D90E /* ParseUI.framework */; productType = "com.apple.product-type.framework"; @@ -1337,11 +1020,15 @@ buildRules = ( ); dependencies = ( - 4A0ECCB1200DA8DC00BA84A3 /* PBXTargetDependency */, ); name = "ParseUIDemo-Swift"; + packageProductDependencies = ( + 39452DF72AD9121D0066C2AE /* ParseObjC */, + 39452DF92AD9121D0066C2AE /* ParseUI */, + 39452DFC2AD914110066C2AE /* BoltsSwift */, + ); productName = ParseUIDemo; - productReference = 7C77D22F292A604700C4D90E /* ParseUIDemo.app */; + productReference = 7C77D22F292A604700C4D90E /* ParseUIDemo-Swift.app */; productType = "com.apple.product-type.application"; }; 81472F661A1AB33800FD6EED /* ParseUIDemo */ = { @@ -1355,9 +1042,12 @@ buildRules = ( ); dependencies = ( - 4A0ECCAD200DA7D100BA84A3 /* PBXTargetDependency */, + 39452DF62AD911740066C2AE /* PBXTargetDependency */, ); name = ParseUIDemo; + packageProductDependencies = ( + 6B63F1652BC3508200F89DEE /* ParseObjC */, + ); productName = ParseUIDemo; productReference = 7C77D21F292A56F600C4D90E /* ParseUIDemo.app */; productType = "com.apple.product-type.application"; @@ -1373,10 +1063,13 @@ buildRules = ( ); dependencies = ( - BCCBE8D023BFB89D0044A79C /* PBXTargetDependency */, - BCCBE8D823BFB9EB0044A79C /* PBXTargetDependency */, + 39452DF22AD910490066C2AE /* PBXTargetDependency */, ); name = SignInWithAppleTests; + packageProductDependencies = ( + 39E22AD62AD0676700D9AE5C /* OCMock */, + 39452DEB2AD8FC110066C2AE /* ParseObjC */, + ); productName = SignInWithAppleTests; productReference = 7C77D230292A604700C4D90E /* SignInWithAppleTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; @@ -1432,30 +1125,12 @@ "pt-BR", ); mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; + packageReferences = ( + 39E22AD52AD0676700D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */, + 39452DFB2AD914110066C2AE /* XCRemoteSwiftPackageReference "Bolts-Swift" */, + ); productRefGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 7C77D1F0292A534D00C4D90E /* Products */; - ProjectRef = 7C77D1EF292A534D00C4D90E /* OCMock.xcodeproj */; - }, - { - ProductGroup = 7C77D12A292A50BF00C4D90E /* Products */; - ProjectRef = 7C77D129292A50BF00C4D90E /* Parse.xcodeproj */; - }, - { - ProductGroup = 84745C402939EE77002D00B2 /* Products */; - ProjectRef = 84745C3F2939EE77002D00B2 /* ParseFacebookUtils.xcodeproj */; - }, - { - ProductGroup = 7C77D1D6292A522800C4D90E /* Products */; - ProjectRef = 7C77D1D5292A522800C4D90E /* ParseFacebookUtilsiOS.xcodeproj */; - }, - { - ProductGroup = 7C77D1A9292A51AA00C4D90E /* Products */; - ProjectRef = 7C77D1A8292A51AA00C4D90E /* ParseTwitterUtils.xcodeproj */; - }, - ); projectRoot = ""; targets = ( 81472F661A1AB33800FD6EED /* ParseUIDemo */, @@ -1467,212 +1142,6 @@ }; /* End PBXProject section */ -/* Begin PBXReferenceProxy section */ - 7C77D139292A50BF00C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77D138292A50BF00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D13B292A50BF00C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77D13A292A50BF00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D13D292A50BF00C4D90E /* ParseUnitTests-iOS.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ParseUnitTests-iOS.xctest"; - remoteRef = 7C77D13C292A50BF00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D13F292A50BF00C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77D13E292A50BF00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D141292A50BF00C4D90E /* ParseUnitTests-macOS.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ParseUnitTests-macOS.xctest"; - remoteRef = 7C77D140292A50BF00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D143292A50BF00C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77D142292A50BF00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D145292A50BF00C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77D144292A50BF00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D147292A50BF00C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77D146292A50BF00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D149292A50BF00C4D90E /* Parse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Parse.framework; - remoteRef = 7C77D148292A50BF00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D14B292A50BF00C4D90E /* ParseUnitTests-iOS-host.app */ = { - isa = PBXReferenceProxy; - fileType = wrapper.application; - path = "ParseUnitTests-iOS-host.app"; - remoteRef = 7C77D14A292A50BF00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D1B1292A51AA00C4D90E /* ParseTwitterUtils.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseTwitterUtils.framework; - remoteRef = 7C77D1B0292A51AA00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D1B3292A51AA00C4D90E /* ParseTwitterUtils.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseTwitterUtils.framework; - remoteRef = 7C77D1B2292A51AA00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D1B5292A51AA00C4D90E /* ParseTwitterUtils-Tests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ParseTwitterUtils-Tests.xctest"; - remoteRef = 7C77D1B4292A51AA00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D1B7292A51AA00C4D90E /* ParseTwitterTestApplication.app */ = { - isa = PBXReferenceProxy; - fileType = wrapper.application; - path = ParseTwitterTestApplication.app; - remoteRef = 7C77D1B6292A51AA00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D1E0292A522800C4D90E /* ParseFacebookUtilsiOS.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsiOS.framework; - remoteRef = 7C77D1DF292A522800C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D1E2292A522800C4D90E /* ParseFacebookUtilsiOS.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsiOS.framework; - remoteRef = 7C77D1E1292A522800C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D1E4292A522800C4D90E /* ParseFacebookUtilsiOS-UnitTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ParseFacebookUtilsiOS-UnitTests.xctest"; - remoteRef = 7C77D1E3292A522800C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D1E6292A522800C4D90E /* ParseFacebookTestApplication.app */ = { - isa = PBXReferenceProxy; - fileType = wrapper.application; - path = ParseFacebookTestApplication.app; - remoteRef = 7C77D1E5292A522800C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D1FA292A534D00C4D90E /* OCMock.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = OCMock.framework; - remoteRef = 7C77D1F9292A534D00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D1FC292A534D00C4D90E /* OCMockTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = OCMockTests.xctest; - remoteRef = 7C77D1FB292A534D00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D1FE292A534D00C4D90E /* libOCMock.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libOCMock.a; - remoteRef = 7C77D1FD292A534D00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D200292A534D00C4D90E /* OCMockLibTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = OCMockLibTests.xctest; - remoteRef = 7C77D1FF292A534D00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D202292A534D00C4D90E /* OCMock.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = OCMock.framework; - remoteRef = 7C77D201292A534D00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D204292A534D00C4D90E /* OCMock.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = OCMock.framework; - remoteRef = 7C77D203292A534D00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 7C77D206292A534D00C4D90E /* OCMock.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = OCMock.framework; - remoteRef = 7C77D205292A534D00C4D90E /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84745C492939EE77002D00B2 /* ParseFacebookUtilsV4.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsV4.framework; - remoteRef = 84745C482939EE77002D00B2 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84745C4B2939EE77002D00B2 /* ParseFacebookUtilsV4.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsV4.framework; - remoteRef = 84745C4A2939EE77002D00B2 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84745C4D2939EE77002D00B2 /* ParseFacebookUtilsV4.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsV4.framework; - remoteRef = 84745C4C2939EE77002D00B2 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84745C4F2939EE77002D00B2 /* ParseFacebookUtilsV4.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ParseFacebookUtilsV4.framework; - remoteRef = 84745C4E2939EE77002D00B2 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - /* Begin PBXResourcesBuildPhase section */ 4A0ECC20200D8C0200BA84A3 /* Resources */ = { isa = PBXResourcesBuildPhase; @@ -1857,50 +1326,15 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 4A0ECCAD200DA7D100BA84A3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4A9A9496200D0329005D8F4B /* ParseUI */; - targetProxy = 4A0ECCAC200DA7D100BA84A3 /* PBXContainerItemProxy */; - }; - 4A0ECCB1200DA8DC00BA84A3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4A0ECBE4200D8C0200BA84A3 /* ParseUI-Dynamic */; - targetProxy = 4A0ECCB0200DA8DC00BA84A3 /* PBXContainerItemProxy */; - }; - 7C77D14F292A50F600C4D90E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Parse-iOS-Dynamic"; - targetProxy = 7C77D14E292A50F600C4D90E /* PBXContainerItemProxy */; - }; - 84745C632939EFD7002D00B2 /* PBXTargetDependency */ = { + 39452DF22AD910490066C2AE /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "Parse-iOS"; - targetProxy = 84745C622939EFD7002D00B2 /* PBXContainerItemProxy */; - }; - 84745C6C293B3F03002D00B2 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "ParseTwitterUtils-iOS"; - targetProxy = 84745C6B293B3F03002D00B2 /* PBXContainerItemProxy */; - }; - 84745C6E293B3F09002D00B2 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "ParseFacebookUtilsV4-iOS"; - targetProxy = 84745C6D293B3F09002D00B2 /* PBXContainerItemProxy */; - }; - 84745C70293B3F46002D00B2 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = ParseFacebookUtilsiOS; - targetProxy = 84745C6F293B3F46002D00B2 /* PBXContainerItemProxy */; + target = 81472F661A1AB33800FD6EED /* ParseUIDemo */; + targetProxy = 39452DF12AD910490066C2AE /* PBXContainerItemProxy */; }; - BCCBE8D023BFB89D0044A79C /* PBXTargetDependency */ = { + 39452DF62AD911740066C2AE /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 4A9A9496200D0329005D8F4B /* ParseUI */; - targetProxy = BCCBE8CF23BFB89D0044A79C /* PBXContainerItemProxy */; - }; - BCCBE8D823BFB9EB0044A79C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 81472F661A1AB33800FD6EED /* ParseUIDemo */; - targetProxy = BCCBE8D723BFB9EB0044A79C /* PBXContainerItemProxy */; + targetProxy = 39452DF52AD911740066C2AE /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -1997,7 +1431,8 @@ GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_VARIABLE = YES; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; }; name = Release; }; @@ -2055,8 +1490,12 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_ENABLE_DEBUG_INFO = YES; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; @@ -2115,8 +1554,12 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_ENABLE_DEBUG_INFO = NO; ONLY_ACTIVE_ARCH = YES; SKIP_INSTALL = YES; @@ -2133,6 +1576,7 @@ baseConfigurationReference = 4A9A9480200D02CE005D8F4B /* ParseUI-iOS.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -2168,7 +1612,11 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)", + "$(PROJECT_DIR)", + ); GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -2182,8 +1630,12 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_ENABLE_DEBUG_INFO = YES; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; @@ -2198,6 +1650,7 @@ baseConfigurationReference = 4A9A9480200D02CE005D8F4B /* ParseUI-iOS.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -2234,7 +1687,11 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)", + "$(PROJECT_DIR)", + ); GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -2242,8 +1699,12 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_ENABLE_DEBUG_INFO = NO; ONLY_ACTIVE_ARCH = YES; SKIP_INSTALL = YES; @@ -2274,7 +1735,11 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)", + "$(PROJECT_DIR)", + ); GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -2287,10 +1752,13 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = ParseUIDemo; + PRODUCT_NAME = "ParseUIDemo-Swift"; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -2318,16 +1786,23 @@ COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)", + "$(PROJECT_DIR)", + ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = ParseUIDemo; + PRODUCT_NAME = "ParseUIDemo-Swift"; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2356,7 +1831,11 @@ COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = ""; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)", + "$(PROJECT_DIR)", + ); GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -2369,8 +1848,12 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) /usr/lib/swift @executable_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + /usr/lib/swift, + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.parse.ParseUIDemo; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2398,14 +1881,22 @@ COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)", + "$(PROJECT_DIR)", + ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) /usr/lib/swift @executable_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + /usr/lib/swift, + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.parse.ParseUIDemo; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2445,7 +1936,11 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = SignInWithAppleTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.parseplatform.SignInWithAppleTests; @@ -2482,7 +1977,11 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = SignInWithAppleTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.parseplatform.SignInWithAppleTests; @@ -2551,6 +2050,62 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 39452DFB2AD914110066C2AE /* XCRemoteSwiftPackageReference "Bolts-Swift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/BoltsFramework/Bolts-Swift.git"; + requirement = { + kind = exactVersion; + version = 1.5.0; + }; + }; + 39E22AD52AD0676700D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/erikdoe/ocmock"; + requirement = { + kind = revision; + revision = 67bb9602f0a7541f24dc2d6d0d7389ca3e4c2c89; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 39452DEB2AD8FC110066C2AE /* ParseObjC */ = { + isa = XCSwiftPackageProductDependency; + productName = ParseObjC; + }; + 39452DF72AD9121D0066C2AE /* ParseObjC */ = { + isa = XCSwiftPackageProductDependency; + productName = ParseObjC; + }; + 39452DF92AD9121D0066C2AE /* ParseUI */ = { + isa = XCSwiftPackageProductDependency; + productName = ParseUI; + }; + 39452DFC2AD914110066C2AE /* BoltsSwift */ = { + isa = XCSwiftPackageProductDependency; + package = 39452DFB2AD914110066C2AE /* XCRemoteSwiftPackageReference "Bolts-Swift" */; + productName = BoltsSwift; + }; + 39E22AD62AD0676700D9AE5C /* OCMock */ = { + isa = XCSwiftPackageProductDependency; + package = 39E22AD52AD0676700D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */; + productName = OCMock; + }; + 39E249A42AD1DD2E0014357C /* ParseObjC */ = { + isa = XCSwiftPackageProductDependency; + productName = ParseObjC; + }; + 6B63F15F2BC34E4A00F89DEE /* ParseObjC */ = { + isa = XCSwiftPackageProductDependency; + productName = ParseObjC; + }; + 6B63F1652BC3508200F89DEE /* ParseObjC */ = { + isa = XCSwiftPackageProductDependency; + productName = ParseObjC; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; } diff --git a/ParseUI/ParseUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ParseUI/ParseUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1b8e778f1..919434a62 100644 --- a/ParseUI/ParseUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/ParseUI/ParseUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme b/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme index 94434d58f..0daea4b72 100644 --- a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme +++ b/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme @@ -15,7 +15,7 @@ @@ -31,7 +31,7 @@ @@ -54,7 +54,7 @@ @@ -71,7 +71,7 @@ diff --git a/ParseUI/ParseUI/Internal/Extensions/PFColor.h b/ParseUI/ParseUI/Internal/Extensions/PFColor.h index c03100352..7e03aa06b 100644 --- a/ParseUI/ParseUI/Internal/Extensions/PFColor.h +++ b/ParseUI/ParseUI/Internal/Extensions/PFColor.h @@ -44,8 +44,6 @@ + (UIColor *)loginButtonBackgroundColor; + (UIColor *)signupButtonBackgroundColor; -+ (UIColor *)facebookButtonBackgroundColor; -+ (UIColor *)twitterButtonBackgroundColor; + (UIColor *)appleButtonBackgroundColor; @end diff --git a/ParseUI/ParseUI/Internal/Extensions/PFColor.m b/ParseUI/ParseUI/Internal/Extensions/PFColor.m index 4d873ed2f..59b6c9bc7 100644 --- a/ParseUI/ParseUI/Internal/Extensions/PFColor.m +++ b/ParseUI/ParseUI/Internal/Extensions/PFColor.m @@ -69,20 +69,6 @@ + (UIColor *)signupButtonBackgroundColor { alpha:1.0f]; } -+ (UIColor *)facebookButtonBackgroundColor { - return [UIColor colorWithRed:58.0f/255.0f - green:89.0f/255.0f - blue:152.0f/255.0f - alpha:1.0f]; -} - -+ (UIColor *)twitterButtonBackgroundColor { - return [UIColor colorWithRed:45.0f/255.0f - green:170.0f/255.0f - blue:1.0f - alpha:1.0f]; -} - + (UIColor *)appleButtonBackgroundColor { return [UIColor blackColor]; } diff --git a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.h b/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.h index 0aea3d98e..a7b79552c 100644 --- a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.h +++ b/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.h @@ -8,11 +8,7 @@ #import -#if __has_include() -#import -#else -#import "PFUserAuthenticationDelegate.h" -#endif +@import ParseCore; NS_ASSUME_NONNULL_BEGIN diff --git a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.h b/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.h index 048765191..ff92b4f5c 100644 --- a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.h +++ b/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.h @@ -8,14 +8,7 @@ #import -#if __has_include() -#import -#import -#else -#import "PFConstants.h" -#import "PFUser.h" -#endif - +@import ParseCore; @import AuthenticationServices; NS_ASSUME_NONNULL_BEGIN diff --git a/ParseUI/ParseUI/Resources/Info-iOS.plist b/ParseUI/ParseUI/Resources/Info-iOS.plist index 01e4c5519..e010b6365 100644 --- a/ParseUI/ParseUI/Resources/Info-iOS.plist +++ b/ParseUI/ParseUI/Resources/Info-iOS.plist @@ -13,7 +13,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.7.3 + 3.0.0 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -21,8 +21,8 @@ iPhoneOS CFBundleVersion - 2.7.3 + 3.0.0 MinimumOSVersion - 9.0 + 12.0 diff --git a/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings index 88587dcca..7f8656356 100644 --- a/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings +++ b/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings @@ -22,9 +22,6 @@ /* Error occurred during deletion */ "Error occurred during deletion" = "Fehler beim Löschen"; -/* Facebook */ -"Facebook" = "Facebook"; - /* Forgot Password? */ "Forgot Password?" = "Passwort vergessen?"; @@ -40,12 +37,6 @@ /* Log In */ "Log In" = "Einloggen"; -/* Log In with Facebook */ -"Log In with Facebook" = "Einloggen mit Facebook"; - -/* Log In with Twitter */ -"Log In with Twitter" = "Einloggen mit Twitter"; - /* Login failed alert title in PFLogInViewController */ "Login Failed" = "Anmeldung fehlgeschlagen"; @@ -103,8 +94,5 @@ /* Invalid login credentials alert message in PFLogInViewController */ "The username and password you entered don't match" = "Der Benutzername und das eingegebene Passwort stimmen nicht überein"; -/* Twitter */ -"Twitter" = "Twitter"; - /* Username */ "Username" = "Benutzername"; diff --git a/ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings index 998662295..d656c63c6 100644 Binary files a/ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings and b/ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings differ diff --git a/ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings index 5e1918b67..cf2015c3e 100644 Binary files a/ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings and b/ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings differ diff --git a/ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings index a3e85e3aa..bea566232 100644 Binary files a/ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings and b/ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings differ diff --git a/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings index 9fb6f02bc..97cb0edda 100644 --- a/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings +++ b/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings @@ -22,9 +22,6 @@ /* Error occurred during deletion */ "Error occurred during deletion" = "Ocorreu um erro ao apagar"; -/* Facebook */ -"Facebook" = "Facebook"; - /* Forgot Password? */ "Forgot Password?" = "Esqueceu a senha?"; @@ -40,12 +37,6 @@ /* Log In */ "Log In" = "Inicial Sessão"; -/* Log In with Facebook */ -"Log In with Facebook" = "Iniciar Sessão com o Facebook"; - -/* Log In with Twitter */ -"Log In with Twitter" = "Iniciar Sessão com o Twitter"; - /* Login failed alert title in PFLogInViewController */ "Login Failed" = "Falha ao Entrar"; @@ -103,9 +94,6 @@ /* Invalid login credentials alert message in PFLogInViewController */ "The username and password you entered don't match" = "O nome de usuário e a senha fornecidas não batem"; -/* Twitter */ -"Twitter" = "Twitter"; - /* Username */ "Username" = "Nome de usuário"; diff --git a/ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings index 2ab3c1b9b..ca1c83bd8 100644 Binary files a/ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings and b/ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings differ diff --git a/ParseUI/ParseUI/Source/PFImageView.h b/ParseUI/ParseUI/Source/PFImageView.h index f82c251b7..63a68466b 100644 --- a/ParseUI/ParseUI/Source/PFImageView.h +++ b/ParseUI/ParseUI/Source/PFImageView.h @@ -20,15 +20,10 @@ */ #import - -#if __has_include() -#import -#else -#import "PFConstants.h" -#endif - #import "ParseUIConstants.h" +@import ParseCore; + NS_ASSUME_NONNULL_BEGIN typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError *__nullable error); diff --git a/ParseUI/ParseUI/Source/PFImageView.m b/ParseUI/ParseUI/Source/PFImageView.m index b1d5c6fcd..387b1a4d0 100644 --- a/ParseUI/ParseUI/Source/PFImageView.m +++ b/ParseUI/ParseUI/Source/PFImageView.m @@ -20,6 +20,7 @@ */ #import "PFImageView.h" +#import "PFImageCache.h" #if __has_include() #import @@ -27,13 +28,7 @@ #import "BFTaskCompletionSource.h" #endif -#if __has_include() -#import -#else -#import "PFFileObject.h" -#endif - -#import "PFImageCache.h" +@import ParseCore; @implementation PFImageView diff --git a/ParseUI/ParseUI/Source/PFLogInView.h b/ParseUI/ParseUI/Source/PFLogInView.h index f6381d113..97b1b1e82 100644 --- a/ParseUI/ParseUI/Source/PFLogInView.h +++ b/ParseUI/ParseUI/Source/PFLogInView.h @@ -40,10 +40,6 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { PFLogInFieldsPasswordForgotten = 1 << 1, /** Login button. */ PFLogInFieldsLogInButton = 1 << 2, - /** Button to login with Facebook. */ - PFLogInFieldsFacebook = 1 << 3, - /** Button to login with Twitter. */ - PFLogInFieldsTwitter = 1 << 4, /** Signup Button. */ PFLogInFieldsSignUpButton = 1 << 5, /** Dismiss Button. */ @@ -68,8 +64,6 @@ extern NSString *const PFLogInViewPasswordFieldAccessibilityIdentifier; extern NSString *const PFLogInViewLogInButtonAccessibilityIdentifier; extern NSString *const PFLogInViewSignUpButtonAccessibilityIdentifier; extern NSString *const PFLogInViewPasswordForgottenButtonAccessibilityIdentifier; -extern NSString *const PFLogInViewTwitterButtonAccessibilityIdentifier; -extern NSString *const PFLogInViewFacebookButtonAccessibilityIdentifier; extern NSString *const PFLogInViewAppleButtonAccessibilityIdentifier; extern NSString *const PFLogInViewDismissButtonAccessibilityIdentifier; @@ -149,16 +143,6 @@ extern NSString *const PFLogInViewDismissButtonAccessibilityIdentifier; */ @property (nullable, nonatomic, strong, readonly) UIButton *logInButton; -/** - The Facebook button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *facebookButton; - -/** - The Twitter button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *twitterButton; - /** The Apple button. It is 'nil if the element is not enabled. */ @@ -174,20 +158,6 @@ extern NSString *const PFLogInViewDismissButtonAccessibilityIdentifier; */ @property (nullable, nonatomic, strong, readonly) UIButton *dismissButton; -/** - The facebook/twitter login label. - - @deprecated This property is deprecated and will always be nil. - */ -@property (nullable, nonatomic, strong, readonly) UILabel *externalLogInLabel __attribute__(PARSE_UI_DEPRECATED("This property is deprecated and will always be nil.")); - -/** - The sign up label. - - @deprecated This property is deprecated and will always be nil. - */ -@property (nullable, nonatomic, strong, readonly) UILabel *signUpLabel __attribute__(PARSE_UI_DEPRECATED("This property is deprecated and will always be nil.")); - @end NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFLogInView.m b/ParseUI/ParseUI/Source/PFLogInView.m index f5c1b6dbe..de3a9da81 100644 --- a/ParseUI/ParseUI/Source/PFLogInView.m +++ b/ParseUI/ParseUI/Source/PFLogInView.m @@ -32,8 +32,6 @@ #import "PFTextField.h" static NSString *const PFLogInViewDefaultLogoImageName = @"parse_logo.png"; -static NSString *const PFLogInViewDefaultFacebookButtonImageName = @"facebook_icon.png"; -static NSString *const PFLogInViewDefaultTwitterButtonImageName = @"twitter_icon.png"; static NSString *const PFLogInViewDefaultAppleButtonImageName = @"apple_icon.png"; ///-------------------------------------- @@ -45,8 +43,6 @@ NSString *const PFLogInViewLogInButtonAccessibilityIdentifier = @"PFLogInViewLogInButtonAccessibilityIdentifier"; NSString *const PFLogInViewSignUpButtonAccessibilityIdentifier = @"PFLogInViewSignUpButtonAccessibilityIdentifier"; NSString *const PFLogInViewPasswordForgottenButtonAccessibilityIdentifier = @"PFLogInViewPasswordForgottenButtonAccessibilityIdentifier"; -NSString *const PFLogInViewTwitterButtonAccessibilityIdentifier = @"PFLogInViewTwitterButtonAccessibilityIdentifier"; -NSString *const PFLogInViewFacebookButtonAccessibilityIdentifier = @"PFLogInViewFacebookButtonAccessibilityIdentifier"; NSString *const PFLogInViewAppleButtonAccessibilityIdentifier = @"PFLogInViewAppleButtonAccessibilityIdentifier"; NSString *const PFLogInViewDismissButtonAccessibilityIdentifier = @"PFLogInViewDismissButtonAccessibilityIdentifier"; @@ -66,32 +62,6 @@ + (PFActionButtonConfiguration *)_defaultSignUpButtonConfiguration { return configuration; } -+ (PFActionButtonConfiguration *)_defaultFacebookButtonConfiguration { - PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor facebookButtonBackgroundColor] - image:[PFImage imageNamed:PFLogInViewDefaultFacebookButtonImageName]]; - - [configuration setTitle:PFLocalizedString(@"Facebook", @"Facebook") - forButtonStyle:PFActionButtonStyleNormal]; - [configuration setTitle:PFLocalizedString(@"Log In with Facebook", @"Log In with Facebook") - - forButtonStyle:PFActionButtonStyleWide]; - - return configuration; -} - -+ (PFActionButtonConfiguration *)_defaultTwitterButtonConfiguration { - PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor twitterButtonBackgroundColor] - image:[PFImage imageNamed:PFLogInViewDefaultTwitterButtonImageName]]; - - [configuration setTitle:PFLocalizedString(@"Twitter", @"Twitter") - forButtonStyle:PFActionButtonStyleNormal]; - [configuration setTitle:PFLocalizedString(@"Log In with Twitter", @"Log In with Twitter") - - forButtonStyle:PFActionButtonStyleWide]; - - return configuration; -} - + (PFActionButtonConfiguration *)_defaultAppleButtonConfiguration { PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor appleButtonBackgroundColor] image:[PFImage imageNamed:PFLogInViewDefaultAppleButtonImageName]]; @@ -213,30 +183,6 @@ - (void)_updateAllFields { [_logInButton removeFromSuperview]; _logInButton = nil; } - - if (_fields & PFLogInFieldsFacebook) { - if (!_facebookButton) { - _facebookButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultFacebookButtonConfiguration] - buttonStyle:PFActionButtonStyleNormal]; - _facebookButton.accessibilityIdentifier = PFLogInViewFacebookButtonAccessibilityIdentifier; - [self addSubview:_facebookButton]; - } - } else { - [_facebookButton removeFromSuperview]; - _facebookButton = nil; - } - - if (_fields & PFLogInFieldsTwitter) { - if (!_twitterButton) { - _twitterButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultTwitterButtonConfiguration] - buttonStyle:PFActionButtonStyleNormal]; - _twitterButton.accessibilityIdentifier = PFLogInViewTwitterButtonAccessibilityIdentifier; - [self addSubview:_twitterButton]; - } - } else { - [_twitterButton removeFromSuperview]; - _twitterButton = nil; - } if (_fields & PFLogInFieldsApple) { if (!_appleButton) { @@ -298,40 +244,6 @@ - (void)layoutSubviews { contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); socialButtonsRect = UIEdgeInsetsInsetRect(contentRect, socialButtonsRectInsets); } - - if (_facebookButton && _twitterButton) { - CGSize buttonSize = [_facebookButton sizeThatFits:socialButtonsRect.size]; - buttonSize.width = (socialButtonsRect.size.width - socialButtonsDefaultInset) / 2.0f; - - CGRect frame = PFRectMakeWithOriginSize(socialButtonsRect.origin, buttonSize); - frame.origin.y = CGRectGetMaxY(socialButtonsRect) - buttonSize.height - socialButtonsDefaultInset; - [(PFActionButton *)_facebookButton setButtonStyle:PFActionButtonStyleNormal]; - _facebookButton.frame = frame; - - frame.origin.x = CGRectGetMaxX(frame) + socialButtonsDefaultInset; - [(PFActionButton *)_twitterButton setButtonStyle:PFActionButtonStyleNormal]; - _twitterButton.frame = frame; - - contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); - } else if (_facebookButton) { - CGSize buttonSize = [_facebookButton sizeThatFits:socialButtonsRect.size]; - CGRect frame = PFRectMakeWithOriginSize(socialButtonsRect.origin, buttonSize); - frame.origin.y = CGRectGetMaxY(socialButtonsRect) - buttonSize.height - socialButtonsDefaultInset; - _facebookButton.frame = frame; - - [(PFActionButton *)_facebookButton setButtonStyle:PFActionButtonStyleWide]; - - contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); - } else if (_twitterButton) { - CGSize buttonSize = [_twitterButton sizeThatFits:socialButtonsRect.size]; - CGRect frame = PFRectMakeWithOriginSize(socialButtonsRect.origin, buttonSize); - frame.origin.y = CGRectGetMaxY(socialButtonsRect) - buttonSize.height - socialButtonsDefaultInset; - _twitterButton.frame = frame; - - [(PFActionButton *)_twitterButton setButtonStyle:PFActionButtonStyleWide]; - - contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); - } if (_appleButton) { CGSize buttonSize = [_appleButton sizeThatFits:socialButtonsRect.size]; @@ -343,7 +255,7 @@ - (void)layoutSubviews { contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); } - if (_signUpButton || _facebookButton || _twitterButton || _appleButton) { + if (_signUpButton || _appleButton) { contentRect.size.height -= socialButtonsDefaultInset; } diff --git a/ParseUI/ParseUI/Source/PFLogInViewController.h b/ParseUI/ParseUI/Source/PFLogInViewController.h index bd8f03706..d38ce165d 100644 --- a/ParseUI/ParseUI/Source/PFLogInViewController.h +++ b/ParseUI/ParseUI/Source/PFLogInViewController.h @@ -20,16 +20,11 @@ */ #import - -#if __has_include() -#import -#else -#import "PFConstants.h" -#endif - #import "ParseUIConstants.h" #import "PFLogInView.h" +@import ParseCore; + NS_ASSUME_NONNULL_BEGIN @import AuthenticationServices; @@ -73,13 +68,6 @@ NS_ASSUME_NONNULL_BEGIN */ @property (nullable, nonatomic, weak) id delegate; -/** - The facebook permissions that Facebook log in requests for. - - If unspecified, the default is basic facebook permissions. - */ -@property (nullable, nonatomic, copy) NSArray *facebookPermissions; - /** The sign up controller if sign up is enabled. diff --git a/ParseUI/ParseUI/Source/PFLogInViewController.m b/ParseUI/ParseUI/Source/PFLogInViewController.m index 2eaa95410..cb3cac51f 100644 --- a/ParseUI/ParseUI/Source/PFLogInViewController.m +++ b/ParseUI/ParseUI/Source/PFLogInViewController.m @@ -20,13 +20,6 @@ */ #import "PFLogInViewController.h" - -#if __has_include() -#import -#else -#import "PFUser.h" -#endif - #import "PFActionButton.h" #import "PFUIAlertView.h" #import "PFLocalization.h" @@ -36,30 +29,12 @@ #import "PFLogInView_Private.h" #import "PFAppleUtils.h" +@import ParseCore; + NSString *const PFLogInSuccessNotification = @"com.parse.ui.login.success"; NSString *const PFLogInFailureNotification = @"com.parse.ui.login.failure"; NSString *const PFLogInCancelNotification = @"com.parse.ui.login.cancel"; -/** - This protocol exists so that we can weakly refer to messages to pass to PFFacebookUtils without - actually taking a dependency on the symbols. - */ -@protocol WeaklyReferencedFBUtils - -// FBSDKv3 -+ (void)logInWithPermissions:(NSArray *)permissions block:(PFUserResultBlock)block; -// FBSDKv4 -+ (void)logInInBackgroundWithReadPermissions:(NSArray *)permissions block:(PFUserResultBlock)block; -+ (void)logInInBackgroundWithPublishPermissions:(NSArray *)permissions block:(PFUserResultBlock)block; - -@end - -@protocol WeaklyReferenceTwitterUtils - -+ (void)logInWithBlock:(PFUserResultBlock)block; - -@end - @protocol WeaklyReferencedAppleUtils + (BFTask *)logInInBackground; @@ -117,8 +92,6 @@ - (void)_commonInit { self.modalPresentationStyle = UIModalPresentationFormSheet; _fields = PFLogInFieldsDefault; - _facebookPermissions = @[ @"public_profile" ]; - if ([self respondsToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) { self.automaticallyAdjustsScrollViewInsets = NO; } @@ -271,12 +244,6 @@ - (void)_setupLogInViewActions { [_logInView.passwordForgottenButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; [_logInView.passwordForgottenButton addTarget:self action:@selector(_forgotPasswordAction) forControlEvents:UIControlEventTouchUpInside]; - - [_logInView.facebookButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; - [_logInView.facebookButton addTarget:self action:@selector(_loginWithFacebook) forControlEvents:UIControlEventTouchUpInside]; - - [_logInView.twitterButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; - [_logInView.twitterButton addTarget:self action:@selector(_loginWithTwitter) forControlEvents:UIControlEventTouchUpInside]; [_logInView.appleButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; [_logInView.appleButton addTarget:self action:@selector(_loginWithApple) forControlEvents:UIControlEventTouchUpInside]; @@ -371,99 +338,6 @@ -(void)_loginWithApple API_AVAILABLE(ios(13.0)){ }]; } -#pragma mark Log In With Facebook - -- (void)_loginWithFacebook { - if (self.loading) { - return; - } - - self.loading = YES; - if ([_logInView.facebookButton isKindOfClass:[PFActionButton class]]) { - [(PFActionButton *)_logInView.facebookButton setLoading:YES]; - } - - __weak typeof(self) wself = self; - PFUserResultBlock resultBlock = ^(PFUser *user, NSError *error) { - __strong typeof(wself) sself = wself; - sself.loading = NO; - if ([sself->_logInView.facebookButton isKindOfClass:[PFActionButton class]]) { - [(PFActionButton *)sself->_logInView.facebookButton setLoading:NO]; - } - - if (user) { - [sself _loginDidSucceedWithUser:user]; - } else if (error) { - [sself _loginDidFailWithError:error]; - } else { - // User cancelled login. - } - }; - - Class fbUtils = NSClassFromString(@"PFFacebookUtils"); - if ([fbUtils respondsToSelector:@selector(logInWithPermissions:block:)]) { - // Facebook SDK v3 Login - [fbUtils logInWithPermissions:_facebookPermissions block:resultBlock]; - } else if ([fbUtils respondsToSelector:@selector(logInInBackgroundWithReadPermissions:block:)]) { - // Facebook SDK v4 Login - if ([self _permissionsContainsFacebookPublishPermission:_facebookPermissions]) { - [fbUtils logInInBackgroundWithPublishPermissions:_facebookPermissions block:resultBlock]; - } else { - [fbUtils logInInBackgroundWithReadPermissions:_facebookPermissions block:resultBlock]; - } - } else { - [NSException raise:NSInternalInconsistencyException - format:@"Can't find PFFacebookUtils. Please link with ParseFacebookUtils or ParseFacebookUtilsV4 to enable login with Facebook."]; - } -} - -- (BOOL)_permissionsContainsFacebookPublishPermission:(NSArray *)permissions { - for (NSString *permission in permissions) { - if ([permission hasPrefix:@"publish"] || - [permission hasPrefix:@"manage"] || - [permission isEqualToString:@"ads_management"] || - [permission isEqualToString:@"create_event"] || - [permission isEqualToString:@"rsvp_event"]) { - return YES; - } - } - return NO; -} - -#pragma mark Log In With Twitter - -- (void)_loginWithTwitter { - if (self.loading) { - return; - } - - if ([_logInView.facebookButton isKindOfClass:[PFActionButton class]]) { - [(PFActionButton *)_logInView.twitterButton setLoading:YES]; - } - self.loading = YES; - - Class twitterUtils = NSClassFromString(@"PFTwitterUtils"); - if (twitterUtils && [twitterUtils respondsToSelector:@selector(logInWithBlock:)]) { - [twitterUtils logInWithBlock:^(PFUser *user, NSError *error) { - self.loading = NO; - if ([self->_logInView.facebookButton isKindOfClass:[PFActionButton class]]) { - [(PFActionButton *)self->_logInView.twitterButton setLoading:NO]; - } - - if (user) { - [self _loginDidSucceedWithUser:user]; - } else if (error) { - [self _loginDidFailWithError:error]; - } else { - // User cancelled login. - } - }]; - } else { - [NSException raise:NSInternalInconsistencyException - format:@"Can't find PFTwitterUtils. Please link with ParseTwitterUtils to enable login with Twitter."]; - } -} - #pragma mark Log In - (void)_loginAction { diff --git a/ParseUI/ParseUI/Source/PFProductTableViewController.m b/ParseUI/ParseUI/Source/PFProductTableViewController.m index 2d1488bc1..47271de22 100644 --- a/ParseUI/ParseUI/Source/PFProductTableViewController.m +++ b/ParseUI/ParseUI/Source/PFProductTableViewController.m @@ -20,21 +20,12 @@ */ #import "PFProductTableViewController.h" - -#if __has_include() -#import -#import -#import -#else -#import "PFUser.h" -#import "PFPurchase.h" -#import "PFQuery.h" -#endif - #import "PFUIAlertView.h" #import "PFLocalization.h" #import "PFPurchaseTableViewCell.h" +@import ParseCore; + static NSString *const PFProductMetadataPriceKey = @"price"; static NSString *const PFProductMetadataPriceLocaleKey = @"priceLocale"; diff --git a/ParseUI/ParseUI/Source/PFQueryCollectionViewController.h b/ParseUI/ParseUI/Source/PFQueryCollectionViewController.h index 4cbc0d940..48a97550a 100644 --- a/ParseUI/ParseUI/Source/PFQueryCollectionViewController.h +++ b/ParseUI/ParseUI/Source/PFQueryCollectionViewController.h @@ -20,15 +20,10 @@ */ #import - -#if __has_include() -#import -#else -#import "PFConstants.h" -#endif - #import "ParseUIConstants.h" +@import ParseCore; + NS_ASSUME_NONNULL_BEGIN @class BFTask<__covariant BFGenericType>; diff --git a/ParseUI/ParseUI/Source/PFQueryCollectionViewController.m b/ParseUI/ParseUI/Source/PFQueryCollectionViewController.m index b34802187..0f3ded0fd 100644 --- a/ParseUI/ParseUI/Source/PFQueryCollectionViewController.m +++ b/ParseUI/ParseUI/Source/PFQueryCollectionViewController.m @@ -29,11 +29,7 @@ #import "BFTaskCompletionSource.h" #endif -#if __has_include() -#import -#else -#import "Parse.h" -#endif +@import ParseCore; #import "PFActivityIndicatorCollectionReusableView.h" #import "PFCollectionViewCell.h" diff --git a/ParseUI/ParseUI/Source/PFQueryTableViewController.h b/ParseUI/ParseUI/Source/PFQueryTableViewController.h index 4418015cf..3460f4caf 100644 --- a/ParseUI/ParseUI/Source/PFQueryTableViewController.h +++ b/ParseUI/ParseUI/Source/PFQueryTableViewController.h @@ -20,15 +20,10 @@ */ #import - -#if __has_include() -#import -#else -#import "PFConstants.h" -#endif - #import "ParseUIConstants.h" +@import ParseCore; + NS_ASSUME_NONNULL_BEGIN @class BFTask<__covariant BFGenericType>; diff --git a/ParseUI/ParseUI/Source/PFQueryTableViewController.m b/ParseUI/ParseUI/Source/PFQueryTableViewController.m index 347214a20..655e89e35 100644 --- a/ParseUI/ParseUI/Source/PFQueryTableViewController.m +++ b/ParseUI/ParseUI/Source/PFQueryTableViewController.m @@ -31,11 +31,7 @@ #import "BFTaskCompletionSource.h" #endif -#if __has_include() -#import -#else -#import "Parse.h" -#endif +@import ParseCore; #import "PFActivityIndicatorTableViewCell.h" #import "PFImageView.h" diff --git a/ParseUI/ParseUI/Source/PFResources.h b/ParseUI/ParseUI/Source/PFResources.h index df9f7a399..3adb9f110 100644 --- a/ParseUI/ParseUI/Source/PFResources.h +++ b/ParseUI/ParseUI/Source/PFResources.h @@ -1,16 +1,10 @@ // This is an auto-generated file. #import @interface PFResources : NSObject -+ (NSData *)twitter_icon3x_png;//modified:2022-11-07 15:10:28 +0300 + (NSData *)apple_icon3x_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)facebook_icon2x_png;//modified:2022-11-07 15:10:28 +0300 + (NSData *)parse_logo_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)facebook_icon3x_png;//modified:2022-11-07 15:10:28 +0300 + (NSData *)apple_icon2x_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)twitter_icon2x_png;//modified:2022-11-07 15:10:28 +0300 + (NSData *)parse_logo2x_png;//modified:2022-11-07 15:10:28 +0300 + (NSData *)parse_logo3x_png;//modified:2022-11-07 15:10:28 +0300 + (NSData *)apple_icon_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)facebook_icon_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)twitter_icon_png;//modified:2022-11-07 15:10:28 +0300 @end diff --git a/ParseUI/ParseUI/Source/PFResources.m b/ParseUI/ParseUI/Source/PFResources.m index dc9b1db53..67106e827 100644 --- a/ParseUI/ParseUI/Source/PFResources.m +++ b/ParseUI/ParseUI/Source/PFResources.m @@ -1,14 +1,6 @@ // This is an auto-generated file. #import "PFResources.h" @implementation PFResources - static const unsigned char twitter_icon3x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x36, 0x8, 0x6, 0x0, 0x0, 0x0, 0x73, 0xe7, 0x4f, 0x3f, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x0, 0x9, 0x70, 0x48, 0x59, 0x73, 0x0, 0x0, 0x2e, 0x23, 0x0, 0x0, 0x2e, 0x23, 0x1, 0x78, 0xa5, 0x3f, 0x76, 0x0, 0x0, 0x1, 0xcb, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x34, 0x2e, 0x30, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x74, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x3c, 0x2f, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x31, 0x3c, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0xa, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0xa, 0x29, 0x2e, 0xcd, 0x3d, 0x0, 0x0, 0xb, 0x9, 0x49, 0x44, 0x41, 0x54, 0x68, 0x5, 0xd5, 0x9a, 0x7b, 0xa8, 0xe5, 0x55, 0x15, 0xc7, 0xe7, 0xce, 0x1d, 0xc7, 0xd1, 0x44, 0xcd, 0xde, 0x33, 0x15, 0xa9, 0x94, 0x56, 0x14, 0x64, 0x30, 0x44, 0xa1, 0x5d, 0x1a, 0x2c, 0x6d, 0xe8, 0x61, 0x94, 0x45, 0x30, 0x4a, 0x49, 0x52, 0x50, 0x4a, 0x18, 0x18, 0x64, 0xd0, 0x3, 0x26, 0x8, 0x89, 0xe8, 0x41, 0xfd, 0xa3, 0x21, 0x15, 0xa5, 0xff, 0x68, 0x62, 0x89, 0x77, 0xd4, 0x92, 0xc9, 0xc7, 0x58, 0x8, 0x9a, 0x64, 0xce, 0x4c, 0x83, 0x36, 0x39, 0x5a, 0x96, 0x8f, 0xd1, 0xd2, 0x79, 0xdc, 0xb9, 0x7d, 0x3e, 0xfb, 0xec, 0xf5, 0x73, 0xff, 0x7e, 0xe7, 0xf7, 0x3b, 0xf7, 0x9e, 0x39, 0xe7, 0xdc, 0x99, 0x16, 0x7c, 0xcf, 0x5a, 0x7b, 0xed, 0xb5, 0xd7, 0xde, 0x7b, 0xed, 0xb5, 0xf7, 0x6f, 0x9f, 0x73, 0x7e, 0x53, 0xcb, 0x1a, 0x34, 0x3f, 0x3f, 0x3f, 0x8d, 0x6a, 0x7e, 0x6a, 0x6a, 0xea, 0x40, 0xa3, 0x6a, 0x49, 0x8a, 0xf4, 0xbf, 0xdc, 0x8e, 0xa2, 0x7f, 0xca, 0xab, 0x29, 0xce, 0x80, 0x33, 0xc0, 0xa9, 0xe0, 0x64, 0xf0, 0x6a, 0xb0, 0x1b, 0x6c, 0x7, 0x3b, 0xc0, 0xdd, 0xe0, 0x16, 0xda, 0xdc, 0x3, 0x4f, 0x44, 0xbb, 0x15, 0x94, 0xf7, 0x17, 0xe5, 0x29, 0x64, 0xe7, 0xa6, 0xef, 0x52, 0x7f, 0x24, 0xe5, 0x3d, 0x61, 0xb7, 0x8c, 0x86, 0x1a, 0x56, 0x44, 0x39, 0x35, 0xaa, 0x14, 0x4b, 0x20, 0x94, 0x7d, 0x22, 0xbf, 0x1c, 0x5c, 0x6, 0xb6, 0x82, 0x1a, 0x1d, 0x80, 0x6a, 0x8a, 0x5e, 0xe1, 0x19, 0xd8, 0x2f, 0xc0, 0xbb, 0x62, 0xa8, 0xc8, 0x2b, 0xc1, 0x11, 0x22, 0x74, 0xc1, 0xd1, 0xad, 0x5, 0x5f, 0x7, 0x6b, 0x42, 0x67, 0x10, 0xd2, 0x2a, 0xc0, 0xa7, 0xc1, 0x9b, 0xc0, 0x31, 0x56, 0xc2, 0xfb, 0x1c, 0x54, 0x8d, 0xc6, 0x2c, 0xd8, 0x77, 0xb8, 0x44, 0x7e, 0x1f, 0xb8, 0x17, 0x24, 0xca, 0xf3, 0xde, 0x47, 0x61, 0x2f, 0xd8, 0xf, 0xc, 0xc4, 0x1c, 0x28, 0x75, 0x14, 0x13, 0x3d, 0xc7, 0xa7, 0x13, 0x5c, 0x15, 0xfe, 0x82, 0xab, 0x3, 0xa7, 0x83, 0xef, 0x2, 0xdb, 0x5f, 0x13, 0x75, 0x89, 0xa3, 0x48, 0x13, 0x86, 0xaf, 0x1, 0xf7, 0x81, 0x8d, 0x61, 0x80, 0xbc, 0x22, 0xe4, 0x49, 0x71, 0xfa, 0x48, 0xb, 0xa1, 0x7f, 0xe4, 0xb, 0xc1, 0x1e, 0x20, 0xc5, 0x44, 0x1d, 0xb4, 0x93, 0x6f, 0x45, 0xce, 0x10, 0x6d, 0x9f, 0x7, 0x41, 0xd7, 0x20, 0xbc, 0x12, 0x1c, 0xb, 0xce, 0x0, 0x97, 0x80, 0x9b, 0xc0, 0x6e, 0x20, 0x19, 0xd4, 0x37, 0xe7, 0x3e, 0xa7, 0xd3, 0x96, 0x40, 0x91, 0xb6, 0x5, 0x7c, 0x3, 0x8, 0xba, 0x20, 0x26, 0x8e, 0x62, 0x62, 0xc1, 0xc0, 0xf7, 0x94, 0xc8, 0x3, 0xba, 0x20, 0x3a, 0x87, 0xbb, 0xb2, 0x73, 0x39, 0x1b, 0x5a, 0x3, 0x40, 0x7d, 0x4d, 0x9f, 0x6d, 0x23, 0x88, 0xba, 0xba, 0x7, 0x6c, 0x6, 0xcf, 0x5a, 0x68, 0xd0, 0xa5, 0xb9, 0x4f, 0xb7, 0x4e, 0xa, 0x44, 0x35, 0x49, 0x14, 0xee, 0xb1, 0x20, 0x23, 0x76, 0xde, 0xa4, 0x83, 0x41, 0x1f, 0xa9, 0x7f, 0xf8, 0xbb, 0x41, 0xc, 0xf8, 0xf9, 0x61, 0x2, 0x40, 0xbb, 0x32, 0x20, 0x14, 0xd3, 0xf6, 0x71, 0xb, 0x95, 0xe4, 0x7c, 0xc, 0xae, 0x74, 0x3d, 0x38, 0x3a, 0xe6, 0x96, 0x38, 0x8a, 0x18, 0x88, 0x69, 0xf4, 0x0, 0x90, 0xfe, 0xd3, 0x63, 0x29, 0x7d, 0x2e, 0x8c, 0x6, 0xe8, 0xc6, 0x7a, 0x66, 0xe0, 0x2f, 0xfa, 0x3e, 0x6, 0xf9, 0x8e, 0xdc, 0xa7, 0x2b, 0x5a, 0x4e, 0x6c, 0x68, 0xb9, 0x8, 0xa2, 0xbe, 0xdc, 0x2e, 0xe5, 0x96, 0xf9, 0x15, 0xe5, 0xf2, 0x3c, 0x7a, 0xb, 0xe5, 0xf5, 0x6e, 0x8d, 0xa4, 0x84, 0x9f, 0x6, 0x9e, 0x6, 0x92, 0xd1, 0x2c, 0x53, 0xec, 0xb2, 0x32, 0x18, 0xd4, 0xd5, 0x9e, 0x30, 0x51, 0x37, 0x2c, 0xc7, 0x4f, 0xf4, 0x7d, 0x11, 0x72, 0x90, 0x7b, 0x5d, 0x1a, 0x3a, 0x0, 0x2d, 0x6d, 0xc2, 0x8f, 0xdc, 0x6c, 0xf8, 0x11, 0x58, 0xd, 0x5e, 0x7, 0xce, 0x7, 0xee, 0x80, 0xad, 0xe0, 0x23, 0x6, 0x22, 0x9e, 0x18, 0xeb, 0x90, 0x3d, 0x94, 0xa4, 0x48, 0xab, 0x2a, 0x18, 0x73, 0x73, 0x73, 0x3f, 0x41, 0x7f, 0x9c, 0x93, 0x85, 0x2f, 0x7, 0x55, 0x54, 0x87, 0xd, 0x40, 0xf6, 0x11, 0xd9, 0xe0, 0x61, 0x76, 0x27, 0x90, 0xa2, 0xbf, 0x71, 0x4, 0x21, 0x7c, 0xc4, 0x9c, 0x1e, 0xc6, 0xff, 0xcf, 0xc0, 0x2c, 0x78, 0x14, 0x4, 0xf5, 0x1e, 0xc, 0x94, 0x22, 0x10, 0x67, 0x45, 0xd, 0x3c, 0x1e, 0x51, 0xaa, 0xf6, 0x16, 0xfa, 0x2d, 0xc8, 0xef, 0x8c, 0x89, 0x23, 0xaf, 0x0, 0x6, 0x65, 0xe8, 0xc, 0xa1, 0xcd, 0xca, 0x1c, 0x90, 0xb3, 0x91, 0x63, 0xef, 0x46, 0x5f, 0x31, 0x89, 0x81, 0xbc, 0xd8, 0x2, 0x3, 0xed, 0xf0, 0x6f, 0x7d, 0x2c, 0x2e, 0x62, 0x45, 0xdf, 0x8f, 0xb9, 0x18, 0x84, 0x98, 0xc4, 0x73, 0xc8, 0xfb, 0xa2, 0x22, 0xf3, 0x79, 0xb8, 0xe7, 0x82, 0x37, 0x31, 0x6f, 0x9a, 0x6b, 0xc1, 0x8d, 0xb8, 0xf9, 0xa, 0x58, 0xe5, 0xd, 0xd, 0xa8, 0x37, 0x18, 0x8b, 0xe, 0x8, 0xb6, 0xf6, 0x19, 0xb7, 0x3b, 0x7d, 0xfa, 0xcc, 0xb7, 0x2f, 0xb3, 0x4c, 0x5e, 0xa3, 0x6c, 0x5f, 0xd3, 0x75, 0x15, 0x6, 0xd8, 0xea, 0x7b, 0x2e, 0xc3, 0xe6, 0x57, 0x80, 0x8b, 0x15, 0x68, 0xb3, 0xa2, 0xf7, 0xd1, 0x2b, 0x78, 0x91, 0x7a, 0x1c, 0x48, 0xee, 0xd3, 0x32, 0xca, 0xea, 0x8c, 0x68, 0xec, 0x5f, 0xcb, 0xb7, 0x83, 0xf7, 0xeb, 0x28, 0x88, 0x72, 0xda, 0x32, 0xf2, 0xd0, 0xb5, 0x71, 0xea, 0xab, 0x6d, 0x85, 0xfc, 0x73, 0x20, 0x99, 0xd, 0x65, 0x9f, 0x63, 0x93, 0x73, 0xe6, 0x94, 0x63, 0xff, 0x31, 0x7d, 0xc5, 0xd6, 0x4c, 0xbc, 0xc, 0xc4, 0xf1, 0x54, 0xfe, 0x1, 0x48, 0xee, 0xd5, 0xda, 0x40, 0x8a, 0x34, 0x2c, 0x1d, 0xba, 0xff, 0xae, 0x6, 0xd5, 0xb5, 0x36, 0x26, 0x8e, 0xce, 0x5b, 0xaa, 0x5b, 0x47, 0x1e, 0x59, 0x97, 0xaa, 0xd5, 0x2b, 0xc0, 0x8f, 0x2, 0x9b, 0x80, 0x34, 0x89, 0xf3, 0x21, 0xe6, 0x10, 0xe7, 0x84, 0xc1, 0xfe, 0x6a, 0x31, 0xc6, 0x5e, 0x10, 0x50, 0xb8, 0x72, 0x29, 0x15, 0x49, 0xf1, 0xa7, 0x90, 0xef, 0xca, 0x46, 0xb5, 0x81, 0xab, 0xa3, 0x3e, 0x52, 0x36, 0x52, 0xcc, 0xd4, 0xb6, 0xfd, 0xb9, 0xe0, 0x16, 0x3a, 0xf0, 0x26, 0xb7, 0x1e, 0xbc, 0x88, 0xb2, 0xf6, 0x73, 0xc0, 0xad, 0x63, 0x3a, 0x7a, 0x69, 0x32, 0x28, 0xbd, 0xcb, 0x4b, 0xfe, 0xf2, 0x83, 0xde, 0x73, 0xa2, 0xef, 0x2a, 0x8c, 0x6e, 0x9c, 0xe4, 0xb8, 0x23, 0x43, 0xbf, 0xcc, 0x78, 0xbe, 0xa9, 0x73, 0xc7, 0xe3, 0xf8, 0xa2, 0xa3, 0xe5, 0xe, 0x14, 0x65, 0xa4, 0xea, 0x6f, 0x72, 0x85, 0xe7, 0x82, 0x7b, 0xbf, 0x95, 0xb4, 0xcf, 0x6d, 0x62, 0xcf, 0x1d, 0x89, 0xe1, 0xc7, 0xc0, 0xd, 0xe0, 0x66, 0xea, 0x2e, 0x5, 0x6f, 0x7, 0x47, 0xe9, 0x80, 0x3e, 0xe, 0xd8, 0x29, 0xd8, 0x67, 0x7f, 0xa8, 0xe2, 0x2c, 0xb2, 0xf, 0xcb, 0x93, 0xa4, 0x58, 0x40, 0xfb, 0x78, 0xc0, 0xf, 0xc6, 0x75, 0x84, 0xe3, 0x51, 0xe, 0x8a, 0xd4, 0x88, 0xc, 0xb8, 0x95, 0x8a, 0x59, 0xf0, 0x5e, 0xa0, 0xa1, 0x13, 0x2c, 0x1d, 0x51, 0xac, 0x65, 0x87, 0x67, 0x42, 0x5a, 0xfd, 0x6c, 0xa7, 0xbf, 0x77, 0x64, 0x3c, 0xb, 0xff, 0x23, 0xf5, 0xbf, 0x97, 0x83, 0x7, 0xc1, 0x2e, 0x6, 0xb0, 0x1b, 0xa4, 0x20, 0xc3, 0xfd, 0xc6, 0xf8, 0x77, 0xf4, 0x92, 0x63, 0xe8, 0xeb, 0x2b, 0xd5, 0x8c, 0xef, 0x23, 0x7d, 0x99, 0xc4, 0x5d, 0x5f, 0xf0, 0x53, 0x20, 0x8c, 0x4e, 0x8e, 0x92, 0xfb, 0xf4, 0x3b, 0x18, 0xae, 0x3, 0x6, 0x61, 0x2f, 0x30, 0x7d, 0x3b, 0x7, 0x48, 0x5b, 0xaa, 0xab, 0xd4, 0x73, 0x82, 0x42, 0xa5, 0x9d, 0xce, 0x64, 0xc0, 0x96, 0x3d, 0x6, 0x76, 0xe0, 0x7f, 0x7, 0x7c, 0x27, 0x78, 0x34, 0xe3, 0x78, 0xb8, 0x14, 0x59, 0x99, 0xa, 0xd8, 0xe1, 0xba, 0xb7, 0x1d, 0x4b, 0x39, 0x55, 0xe6, 0x8f, 0x36, 0x7d, 0xa9, 0xcb, 0x72, 0xd9, 0xc4, 0xf9, 0x48, 0xb1, 0xf0, 0xbd, 0x52, 0x9b, 0xc2, 0x1a, 0x1c, 0x5c, 0xe, 0xbb, 0x44, 0x11, 0x98, 0x19, 0x6e, 0x95, 0xce, 0x60, 0x50, 0xd7, 0x24, 0x6d, 0x45, 0x4, 0x25, 0x5, 0xbc, 0x69, 0x94, 0xcb, 0x74, 0x97, 0xb2, 0xaa, 0xa3, 0x7a, 0x24, 0xb5, 0x13, 0x76, 0xf5, 0xd, 0xb2, 0xf3, 0x58, 0x4f, 0x70, 0x67, 0xe9, 0xaf, 0x76, 0x3e, 0xa0, 0xaf, 0x56, 0xd2, 0xc9, 0x9b, 0x1, 0x89, 0x30, 0xfe, 0x12, 0x82, 0xdf, 0xd5, 0x75, 0x64, 0x10, 0x3c, 0x47, 0xfa, 0xa2, 0x88, 0xbe, 0x8b, 0xb4, 0xf5, 0x80, 0x32, 0x0, 0xe, 0xc2, 0x80, 0x78, 0x2e, 0xb8, 0x22, 0xc2, 0x41, 0xa9, 0x93, 0x5c, 0xf9, 0x9e, 0x54, 0x7c, 0x96, 0xfd, 0x95, 0x72, 0x61, 0xe2, 0x98, 0xfb, 0x1a, 0x96, 0x3a, 0x64, 0xcd, 0x63, 0x1, 0xbd, 0x27, 0x3d, 0x53, 0xb6, 0x2f, 0xe5, 0x38, 0x4d, 0xd5, 0x9d, 0x49, 0xc3, 0x2b, 0xc0, 0xba, 0x6c, 0xf0, 0x49, 0xf8, 0xf, 0x80, 0x13, 0x98, 0x66, 0xb0, 0x31, 0xf0, 0x5c, 0x3d, 0x14, 0xf3, 0xa9, 0x61, 0x40, 0xdd, 0x66, 0xf2, 0xd8, 0x6, 0xfa, 0x6c, 0xf5, 0x4b, 0x7f, 0x31, 0x1, 0x23, 0x55, 0xc9, 0xd8, 0x57, 0xd4, 0xa6, 0x2f, 0x75, 0xc8, 0xda, 0x46, 0x5b, 0x7f, 0xda, 0x7b, 0x32, 0x37, 0xee, 0xb, 0x60, 0xba, 0x22, 0xd3, 0xc0, 0xc1, 0xb8, 0xa7, 0x3f, 0xd, 0xce, 0x65, 0xd0, 0xf7, 0xc2, 0x37, 0x83, 0x47, 0xc0, 0x76, 0xf0, 0x46, 0x30, 0x12, 0x95, 0x3, 0xcc, 0x8e, 0xd2, 0xef, 0x10, 0x2d, 0xfa, 0x91, 0xfa, 0x69, 0x69, 0x1c, 0x81, 0x78, 0x9c, 0xba, 0x27, 0x5a, 0xea, 0x93, 0xca, 0xd4, 0x8d, 0xe8, 0xfc, 0x15, 0xd9, 0x93, 0xde, 0x80, 0x78, 0x41, 0x12, 0x92, 0x29, 0x45, 0x6c, 0xe6, 0x7d, 0xd4, 0x86, 0xd3, 0x94, 0x96, 0x51, 0xa6, 0xe, 0xf1, 0x85, 0x83, 0xcd, 0x46, 0x51, 0x56, 0xee, 0xa2, 0x41, 0x36, 0x4d, 0x9f, 0x6d, 0xb6, 0xa5, 0x4d, 0x57, 0x1f, 0x85, 0x7e, 0x27, 0x72, 0x64, 0x44, 0x35, 0x8f, 0xa8, 0x77, 0x6b, 0x44, 0x20, 0x34, 0x14, 0xd2, 0x7f, 0x41, 0x3c, 0x62, 0xe2, 0x2e, 0x50, 0x6b, 0x5c, 0xe, 0xac, 0x29, 0x97, 0xe5, 0xe4, 0xed, 0x20, 0x3e, 0x4a, 0x1f, 0xa5, 0x5c, 0xba, 0xea, 0xd2, 0x17, 0x36, 0x8e, 0x39, 0xb6, 0xff, 0x36, 0xec, 0xdd, 0xe6, 0x52, 0xdf, 0x76, 0xd4, 0x28, 0x4d, 0x10, 0x23, 0x1f, 0x6f, 0x77, 0x6a, 0x5, 0xb9, 0x8f, 0xad, 0xf3, 0x50, 0x8b, 0x80, 0x20, 0xfe, 0xdf, 0x91, 0x13, 0x8e, 0x27, 0xd6, 0x9f, 0x1d, 0xbd, 0x99, 0x2d, 0x53, 0x2e, 0x49, 0xa5, 0xf7, 0x71, 0xb9, 0x74, 0x7d, 0x8f, 0xa5, 0x40, 0x84, 0x93, 0xa8, 0xcb, 0x55, 0x3d, 0x66, 0x5a, 0x86, 0x62, 0x31, 0x72, 0xd8, 0x6, 0xb7, 0x4d, 0xd9, 0xae, 0xd4, 0x2b, 0x97, 0x75, 0xa5, 0x1c, 0x76, 0x4d, 0x9b, 0x52, 0x9f, 0x65, 0xc7, 0x17, 0x2b, 0xef, 0x96, 0xb8, 0x3f, 0xeb, 0x3d, 0xf8, 0xfb, 0x3, 0x91, 0x95, 0x31, 0xd9, 0x59, 0x8c, 0x6f, 0xce, 0xd, 0x22, 0x8d, 0x72, 0xb1, 0xce, 0x4a, 0x67, 0x8b, 0x91, 0xeb, 0xad, 0x7b, 0x67, 0x48, 0xd9, 0x2e, 0xea, 0x43, 0x17, 0x5c, 0x7d, 0x29, 0x87, 0xdd, 0x20, 0x7d, 0x61, 0x13, 0x81, 0xf8, 0xb, 0xba, 0xad, 0x85, 0xbe, 0x4f, 0x4c, 0x1, 0xa0, 0x23, 0x6f, 0x96, 0x46, 0xca, 0x83, 0xd1, 0xcb, 0x94, 0x5b, 0xc2, 0x2f, 0x43, 0x3e, 0xf3, 0xab, 0x95, 0x47, 0xee, 0xa3, 0xae, 0xd5, 0xea, 0x33, 0x5c, 0x7a, 0x85, 0xab, 0x3e, 0x9d, 0xbb, 0xdd, 0xc2, 0xdc, 0xe2, 0xa0, 0x6c, 0xdd, 0xea, 0x91, 0x9, 0xda, 0xc7, 0x59, 0x71, 0x13, 0xf2, 0xc6, 0xec, 0xc0, 0xe7, 0x7e, 0x4, 0xa3, 0x35, 0x20, 0x5d, 0xab, 0x95, 0xdb, 0x1f, 0x2a, 0xe6, 0x58, 0x9d, 0xb0, 0xe7, 0x83, 0xfc, 0x36, 0xe0, 0x76, 0xf3, 0xcb, 0x56, 0x64, 0x89, 0xaa, 0x8a, 0xaa, 0x40, 0x68, 0x80, 0x61, 0x1c, 0x2c, 0xdf, 0xc0, 0xe2, 0xca, 0x6c, 0x65, 0x30, 0xfc, 0x6f, 0x50, 0x7, 0x76, 0xd0, 0x1a, 0x10, 0xf4, 0x87, 0x1b, 0xc5, 0xca, 0xdf, 0xc7, 0xc0, 0xee, 0x58, 0x68, 0x70, 0x55, 0x20, 0x34, 0x24, 0x18, 0x6e, 0x11, 0xef, 0xe1, 0x3a, 0xf9, 0x2c, 0xf8, 0xa1, 0x7a, 0x28, 0xae, 0xdf, 0x6, 0x64, 0xe0, 0xd9, 0x91, 0xac, 0xf, 0xfd, 0x87, 0x8b, 0xe6, 0x93, 0x4f, 0x9a, 0x65, 0x3e, 0xff, 0xec, 0x89, 0x69, 0xcb, 0x67, 0xb1, 0xce, 0x6a, 0x81, 0xb0, 0xaa, 0x8, 0x86, 0xbf, 0x1d, 0x7c, 0x1e, 0xd5, 0x45, 0x60, 0x17, 0xd0, 0xd6, 0x80, 0xd8, 0x41, 0x67, 0x56, 0x94, 0x67, 0x46, 0x29, 0xd3, 0xa6, 0x46, 0xd6, 0xb5, 0xd5, 0x87, 0x2e, 0xb8, 0x8d, 0x4a, 0xb9, 0x74, 0xd2, 0xa1, 0x77, 0x6c, 0x9e, 0x71, 0x8e, 0xd7, 0x73, 0xe1, 0x3a, 0xa0, 0x8f, 0x95, 0xcc, 0xa7, 0xef, 0x69, 0x61, 0x9d, 0x34, 0x68, 0x42, 0xee, 0xa7, 0xb4, 0xfa, 0x38, 0x79, 0x29, 0xb6, 0x9f, 0x1, 0xeb, 0xc1, 0x29, 0xe0, 0xc5, 0xa0, 0x2f, 0x88, 0xe8, 0xe, 0x17, 0x8a, 0xf3, 0xe1, 0x6a, 0xe6, 0xf0, 0x9, 0x7, 0xc5, 0x1c, 0xbc, 0x19, 0xb7, 0x9e, 0xf, 0xd6, 0x77, 0x6, 0x22, 0x37, 0xf6, 0x3b, 0x86, 0x93, 0xde, 0x9e, 0x6d, 0xd7, 0xc2, 0x75, 0xfc, 0x41, 0xe0, 0x55, 0x3c, 0xce, 0xd, 0xc4, 0xc3, 0x82, 0x9c, 0x8f, 0x8b, 0x67, 0xd6, 0xba, 0x8d, 0xcf, 0x61, 0xf2, 0xfe, 0xea, 0x5e, 0x2d, 0x2a, 0xba, 0x56, 0x8a, 0xc3, 0xb1, 0x56, 0x49, 0xc3, 0xf8, 0xbe, 0xee, 0xc4, 0xfd, 0xa1, 0x46, 0xa7, 0x5e, 0xbb, 0x25, 0x3, 0xe0, 0xa3, 0x55, 0x1a, 0x18, 0xc8, 0x9e, 0xc9, 0xd2, 0x7d, 0x32, 0xee, 0xf4, 0xa5, 0x27, 0xf7, 0x78, 0xa3, 0x41, 0xc8, 0x72, 0x1c, 0x9c, 0x9d, 0x83, 0x69, 0xd, 0x44, 0x61, 0xbd, 0x9, 0xf9, 0x69, 0x70, 0x62, 0xa1, 0xb, 0xb1, 0x75, 0xbf, 0xe5, 0xb1, 0xb4, 0xd6, 0x45, 0xc3, 0x9, 0x71, 0xe6, 0x9d, 0xb6, 0xb2, 0xd9, 0xe0, 0x7d, 0xe8, 0x7b, 0xf6, 0xc3, 0x78, 0x16, 0xcc, 0x6, 0xed, 0x5a, 0xf7, 0x39, 0xe, 0xe3, 0xe9, 0xe1, 0x21, 0xb9, 0x51, 0x43, 0xc8, 0xa8, 0x9a, 0x15, 0xd6, 0x75, 0x4e, 0x94, 0xb6, 0x9d, 0x75, 0x3a, 0x99, 0x4, 0x19, 0x7c, 0xfc, 0xba, 0x4d, 0xe3, 0x2, 0xf5, 0x53, 0xc6, 0xf1, 0xdb, 0xdc, 0x97, 0x7, 0xe7, 0x82, 0xd4, 0x99, 0xda, 0x38, 0xf7, 0xa6, 0x19, 0xbf, 0x4c, 0x5d, 0x8b, 0xa7, 0xf, 0x81, 0x48, 0x31, 0x3b, 0x5c, 0xf2, 0x9, 0x2f, 0x30, 0x1b, 0x27, 0x6c, 0x36, 0x3c, 0x4, 0x66, 0x18, 0xfb, 0xc3, 0xcc, 0x21, 0xb6, 0x38, 0xaa, 0xc1, 0xd4, 0x9a, 0x11, 0x36, 0xc9, 0x41, 0xd0, 0x91, 0x13, 0xfe, 0x2, 0xf8, 0x13, 0x30, 0x0, 0x46, 0x3e, 0x45, 0x39, 0xaf, 0x4, 0xc5, 0x43, 0x4a, 0x2e, 0xa6, 0xb, 0x64, 0x10, 0xa4, 0xaf, 0xe5, 0x20, 0xb8, 0x90, 0x8b, 0xca, 0x6, 0x1b, 0x75, 0x6, 0xc2, 0x4a, 0x1d, 0xe5, 0xa8, 0xee, 0xa4, 0xf8, 0x71, 0x60, 0x30, 0xec, 0x30, 0x5d, 0x5d, 0xa9, 0x77, 0x0, 0x91, 0x19, 0x9d, 0xd9, 0x85, 0xcd, 0x24, 0xa9, 0x7c, 0x72, 0x5d, 0xc9, 0x98, 0xae, 0xca, 0x9d, 0xc5, 0xb8, 0xc6, 0xd3, 0xb7, 0xab, 0xe, 0xd2, 0xde, 0x83, 0xbf, 0x6, 0x5c, 0xb, 0x4a, 0x72, 0xfb, 0xf8, 0x37, 0xa0, 0x7f, 0xa7, 0x19, 0xb8, 0xf8, 0x9b, 0x6d, 0xa9, 0xb8, 0xfd, 0x4a, 0xfe, 0x87, 0xf2, 0x12, 0x67, 0xd, 0x5f, 0xe8, 0x21, 0x70, 0x70, 0xc1, 0xc1, 0x71, 0x19, 0xc, 0xff, 0xd4, 0xf1, 0x85, 0xaf, 0xfb, 0x41, 0x1b, 0x2d, 0x55, 0x0, 0xec, 0x27, 0xfe, 0x2f, 0xfd, 0x7, 0xf2, 0x69, 0xa3, 0x4, 0x61, 0xa8, 0x74, 0xa6, 0xb3, 0x74, 0x80, 0xe6, 0xe, 0xbd, 0x68, 0x7d, 0x20, 0xe3, 0x6d, 0x70, 0xef, 0x17, 0x2b, 0xc1, 0x71, 0xc0, 0x2d, 0x57, 0x4b, 0x4d, 0xda, 0x92, 0xb5, 0x2f, 0x3c, 0x51, 0x2c, 0x63, 0xe3, 0xf6, 0x1b, 0x68, 0xa7, 0x4d, 0x7, 0x79, 0x71, 0xb2, 0x3f, 0xef, 0x38, 0x1f, 0xc5, 0xcf, 0xd, 0xf8, 0x4c, 0xfd, 0x36, 0x7d, 0x76, 0xb4, 0x1f, 0x4d, 0x6d, 0x67, 0x31, 0x89, 0xf0, 0x44, 0xd9, 0x3f, 0x77, 0x7d, 0x17, 0xe9, 0x97, 0x20, 0xc8, 0x2d, 0x33, 0xd6, 0xec, 0x28, 0xfe, 0x91, 0x8f, 0x4c, 0xd0, 0xff, 0x86, 0x62, 0x1c, 0x3, 0xcf, 0xbc, 0xb0, 0x1b, 0xb, 0xa7, 0x63, 0x3, 0xe1, 0x1b, 0xad, 0xd5, 0x3e, 0x44, 0x7e, 0x15, 0xf0, 0x25, 0xce, 0x78, 0x2b, 0xae, 0x2f, 0x8, 0xc5, 0x24, 0x52, 0x70, 0x2c, 0x37, 0x75, 0xb4, 0x1f, 0x14, 0x38, 0xaa, 0xd3, 0xab, 0x4d, 0xf1, 0x62, 0x98, 0xe7, 0xd1, 0xa7, 0x62, 0x52, 0xc8, 0xe9, 0x1c, 0x8b, 0xf2, 0xd8, 0x39, 0x1d, 0xa4, 0xf3, 0x1, 0xee, 0xaa, 0xc7, 0x23, 0x2a, 0xf5, 0x43, 0xf9, 0x4, 0xe0, 0x8b, 0x60, 0x7f, 0x3, 0x41, 0xfb, 0x87, 0x9c, 0xe0, 0xa0, 0xc9, 0x47, 0x9d, 0xbe, 0x9d, 0x78, 0x1c, 0x8c, 0xbe, 0xf4, 0xe6, 0x53, 0x2c, 0xc6, 0x31, 0x7a, 0x10, 0x70, 0x18, 0x2b, 0x9c, 0x26, 0x4a, 0x59, 0xee, 0x8a, 0xb, 0xe5, 0xbe, 0x74, 0x43, 0xf7, 0x5a, 0xf0, 0x39, 0xb0, 0x5, 0x4, 0xf9, 0xe4, 0x18, 0x6b, 0x10, 0x72, 0x40, 0xf5, 0xbf, 0xa7, 0x90, 0xb7, 0x51, 0x7e, 0xcf, 0x58, 0x83, 0x80, 0xb3, 0x45, 0x1f, 0x96, 0x74, 0xbe, 0x6, 0x7b, 0xf, 0xc5, 0x75, 0xe0, 0x2c, 0x70, 0x2a, 0x90, 0x3c, 0xec, 0xe2, 0x1b, 0x5f, 0x52, 0x8c, 0xe9, 0xc3, 0xb1, 0x79, 0x4f, 0xf1, 0x52, 0x14, 0x3f, 0xc, 0xfd, 0x1a, 0xf9, 0x8b, 0x1c, 0x86, 0x6, 0x23, 0x2d, 0x10, 0xb2, 0xf7, 0x88, 0x91, 0xc9, 0xb4, 0x7f, 0x3d, 0x5e, 0x7c, 0xfe, 0x3e, 0x6, 0xfc, 0x2e, 0xe1, 0x1f, 0x3a, 0x3e, 0x1, 0x7c, 0x2a, 0xac, 0x6, 0x27, 0x3, 0xdf, 0x59, 0x7e, 0x2b, 0x70, 0xf2, 0xe5, 0xf6, 0xf0, 0xf7, 0x4c, 0xcf, 0xa, 0x7, 0x55, 0x3b, 0xfd, 0x29, 0x1f, 0x14, 0x31, 0x1e, 0xe6, 0x96, 0x26, 0x67, 0x70, 0x23, 0x0, 0xbb, 0x91, 0xbf, 0xd, 0x2e, 0xa7, 0xce, 0x83, 0x32, 0x2e, 0x74, 0x63, 0xe9, 0xd3, 0x81, 0xea, 0xd0, 0xce, 0xce, 0x3, 0x67, 0x83, 0x55, 0xc0, 0x4e, 0xd5, 0xfb, 0xde, 0x82, 0x68, 0x6e, 0xd, 0x57, 0xc8, 0x55, 0xd0, 0xc6, 0xc7, 0x97, 0x83, 0x19, 0xd7, 0x80, 0x7c, 0xb3, 0x26, 0xae, 0xcb, 0x11, 0x4, 0xb3, 0xe0, 0x5b, 0xe8, 0x6f, 0x87, 0x2f, 0xfa, 0xdb, 0xa4, 0xb6, 0x43, 0x13, 0x11, 0x7e, 0x5, 0xb8, 0x18, 0x3c, 0x8, 0x9a, 0xe4, 0x21, 0xe5, 0x2a, 0x78, 0x5a, 0x7b, 0x58, 0x79, 0x80, 0x55, 0x27, 0xfe, 0x28, 0x7, 0x23, 0x6d, 0xf5, 0x55, 0xde, 0x4c, 0x75, 0x1d, 0x74, 0x17, 0xc2, 0x6, 0x60, 0xb0, 0x13, 0x21, 0x1b, 0xfc, 0x89, 0x50, 0xed, 0x8c, 0xa0, 0x23, 0x5f, 0x4, 0xfb, 0x30, 0x38, 0x1f, 0xcc, 0x80, 0x72, 0x1b, 0xb8, 0x52, 0x41, 0x55, 0x3b, 0xda, 0xb0, 0x58, 0x55, 0x31, 0xea, 0x9b, 0xbc, 0x99, 0x31, 0x65, 0x16, 0x35, 0x27, 0xf7, 0x3b, 0x1a, 0x5f, 0x5, 0xae, 0xc3, 0xef, 0x53, 0x3a, 0xa2, 0xf, 0xc7, 0xe1, 0xcb, 0x69, 0x63, 0x39, 0xf, 0xf4, 0xd9, 0x24, 0xcf, 0x8, 0x67, 0xe1, 0x60, 0xaa, 0x8e, 0xd0, 0x1d, 0x4d, 0xf9, 0x74, 0x70, 0xe, 0x38, 0x13, 0x9c, 0x4, 0x9a, 0xe4, 0xa0, 0x9a, 0x13, 0xd4, 0x97, 0x3e, 0xbd, 0x31, 0xb6, 0xd, 0xda, 0x6d, 0xd6, 0x16, 0xb5, 0x1d, 0xe8, 0x37, 0x1, 0xbf, 0xee, 0x6f, 0xa6, 0x6d, 0xfa, 0x35, 0xc, 0x3f, 0xda, 0xfb, 0x5b, 0xe3, 0xa2, 0xbf, 0x45, 0x62, 0x7f, 0x50, 0x54, 0xd, 0x2a, 0x7, 0xc4, 0xe7, 0xb1, 0x1, 0xa9, 0x26, 0x88, 0xde, 0xa7, 0x85, 0x2f, 0x88, 0xcd, 0x80, 0xb5, 0xe0, 0xd, 0xc0, 0xb3, 0x63, 0x14, 0xfa, 0x37, 0x8d, 0xb7, 0x81, 0xbb, 0xc1, 0x6d, 0xc0, 0x7f, 0xa2, 0x1e, 0x81, 0x27, 0xea, 0x1a, 0x4b, 0xd4, 0x4f, 0x82, 0x57, 0x81, 0x8, 0xe7, 0xc5, 0x20, 0x3c, 0xb8, 0x6a, 0xab, 0x4a, 0x9d, 0x5b, 0xe7, 0x44, 0x70, 0x4a, 0x86, 0x99, 0xe2, 0x93, 0xe5, 0x4, 0x70, 0x2c, 0x78, 0x19, 0xd0, 0xc6, 0x76, 0x4f, 0x82, 0x27, 0x80, 0xef, 0x5c, 0xfc, 0xb, 0xec, 0x2, 0xae, 0xbc, 0x1, 0xd8, 0xa, 0x1e, 0xc2, 0x7f, 0x5a, 0x79, 0xe4, 0x44, 0xf8, 0x4f, 0x19, 0x40, 0xa1, 0xb6, 0x18, 0xb9, 0x7a, 0xa2, 0xec, 0x7f, 0x27, 0x77, 0xca, 0xf8, 0x2b, 0x28, 0xe6, 0x63, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)twitter_icon3x_png { - return [NSData dataWithBytes:twitter_icon3x_png length:sizeof(twitter_icon3x_png)]; - } - static const unsigned char apple_icon3x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x42, 0x8, 0x6, 0x0, 0x0, 0x0, 0x1c, 0xf6, 0x25, 0xa, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x4, 0xca, 0x49, 0x44, 0x41, 0x54, 0x68, 0x5, 0xdd, 0x9b, 0x5b, 0x68, 0x15, 0x47, 0x1c, 0xc6, 0x3d, 0xb1, 0xde, 0xad, 0x22, 0xde, 0x83, 0x60, 0xad, 0x18, 0x44, 0xd4, 0x34, 0x6a, 0xd1, 0x7, 0x93, 0xa7, 0x5a, 0xaa, 0x6d, 0xbc, 0xd5, 0x27, 0x9, 0xf8, 0x50, 0x21, 0xa8, 0x8, 0xa2, 0x42, 0x15, 0xbc, 0xa1, 0xc5, 0xb, 0x14, 0x44, 0x41, 0x2d, 0xe2, 0x83, 0x60, 0x29, 0x5a, 0xa8, 0x2d, 0x48, 0x20, 0x79, 0xb0, 0x8d, 0xf, 0xad, 0xd7, 0x62, 0xa9, 0x4a, 0x51, 0x50, 0xe2, 0x9d, 0x88, 0xe2, 0x2d, 0x78, 0x8d, 0xc6, 0xdf, 0x77, 0x3c, 0x7b, 0xd8, 0x73, 0x32, 0xbb, 0xb3, 0xe7, 0x44, 0xe8, 0x8c, 0x7f, 0xf8, 0x32, 0xb3, 0xf3, 0x9f, 0x99, 0xfd, 0xbe, 0xf3, 0x9f, 0xdd, 0x9d, 0x9d, 0xd9, 0xa4, 0x3a, 0x39, 0x66, 0x6d, 0x6d, 0x6d, 0x13, 0xa1, 0x54, 0x3, 0x2a, 0xc0, 0x68, 0x50, 0x9a, 0x4a, 0xa5, 0x5e, 0x93, 0xfa, 0x69, 0x8, 0x9a, 0xb, 0x4e, 0x83, 0x7c, 0xeb, 0xe9, 0xa5, 0x22, 0x54, 0x94, 0x82, 0x5f, 0xf3, 0xd5, 0x64, 0x8e, 0x1f, 0xf9, 0x2a, 0x6a, 0x12, 0x2, 0xee, 0x46, 0x88, 0x52, 0xf1, 0x7f, 0xc5, 0xa, 0x2b, 0x29, 0xb6, 0x61, 0x47, 0xdb, 0x41, 0xba, 0x92, 0x3e, 0x8e, 0x82, 0xfe, 0x31, 0x7d, 0xfd, 0x19, 0xe3, 0x73, 0xcf, 0x85, 0xa8, 0x51, 0xe0, 0x11, 0xb0, 0xd9, 0x6c, 0xf7, 0xd8, 0x47, 0x30, 0x42, 0x49, 0x37, 0xf0, 0x8f, 0x4d, 0x11, 0xfe, 0x7b, 0xc0, 0x9f, 0x1b, 0x7, 0x64, 0x57, 0x26, 0x10, 0xa5, 0x2a, 0x6b, 0x22, 0x7e, 0x1b, 0xf7, 0x8a, 0x21, 0xdb, 0x17, 0x28, 0x12, 0x36, 0xbb, 0x43, 0x85, 0xbe, 0xee, 0x29, 0x88, 0x60, 0x4, 0xd9, 0x25, 0x36, 0x45, 0x19, 0xff, 0xac, 0x88, 0x2e, 0xdc, 0x2c, 0x86, 0x74, 0x63, 0x2, 0x61, 0x3b, 0xdd, 0x64, 0x1f, 0xc1, 0xa, 0x41, 0x1a, 0x86, 0xaf, 0x2c, 0xc2, 0x76, 0xe3, 0x4f, 0x45, 0x74, 0xe1, 0x66, 0x31, 0x84, 0xcb, 0x63, 0x44, 0xbd, 0xc0, 0xb7, 0xce, 0x4d, 0xe6, 0x16, 0x56, 0x10, 0xaf, 0x8e, 0x10, 0x76, 0x86, 0xf2, 0x72, 0x4b, 0xf3, 0x82, 0xdd, 0x1f, 0x14, 0xdc, 0xa2, 0xf8, 0x6, 0xe1, 0x73, 0x3d, 0xa6, 0x9b, 0x7a, 0xb0, 0x87, 0x99, 0xfb, 0x1f, 0xc5, 0x77, 0xe9, 0x40, 0x4b, 0xa2, 0xd2, 0x3, 0x4c, 0x4, 0x43, 0x93, 0xd0, 0xa1, 0x5e, 0x57, 0xd0, 0x2b, 0x49, 0x5d, 0x53, 0x9d, 0x82, 0x2e, 0x54, 0x4e, 0xd4, 0x99, 0x4e, 0xaa, 0xc0, 0xc, 0x30, 0x2, 0x94, 0x82, 0xc1, 0xa0, 0x5, 0x34, 0x81, 0x13, 0xe0, 0x37, 0xa2, 0x50, 0xd0, 0xe4, 0x55, 0x22, 0x68, 0xf7, 0x39, 0xa8, 0x6, 0x9f, 0x82, 0x32, 0x10, 0x88, 0x7a, 0x49, 0xfe, 0x6, 0x38, 0xf, 0x1a, 0x41, 0x1d, 0xfd, 0x5f, 0x24, 0xed, 0xb8, 0x71, 0x62, 0xbd, 0x5a, 0xe8, 0x8e, 0x15, 0x37, 0x13, 0xc7, 0x9d, 0x35, 0x4d, 0x99, 0xbe, 0x5, 0x91, 0xd1, 0xc1, 0x57, 0x2, 0xa6, 0x81, 0x3, 0xe0, 0x21, 0x28, 0xc4, 0xf4, 0xd8, 0xd0, 0x8f, 0x50, 0x9c, 0xd1, 0xb8, 0x27, 0x58, 0xf, 0x5a, 0x40, 0x31, 0xd6, 0x4a, 0xa3, 0x23, 0xa0, 0x6, 0x8c, 0x0, 0xfd, 0xc0, 0x14, 0xf0, 0x1d, 0xb8, 0xa, 0x3a, 0x6a, 0xf5, 0x74, 0xf0, 0xb1, 0x49, 0x5d, 0xe4, 0x50, 0xa4, 0xc1, 0x30, 0x1a, 0xd4, 0x81, 0xf1, 0xa6, 0x86, 0xe, 0x95, 0xdd, 0x87, 0xcb, 0xd7, 0xf9, 0x37, 0x21, 0xe3, 0xfb, 0x18, 0xa2, 0x3e, 0xa1, 0xf2, 0x49, 0xe0, 0xba, 0x28, 0xfd, 0xbe, 0xfd, 0x40, 0x3, 0x9c, 0xe7, 0xea, 0x20, 0xb0, 0x76, 0x11, 0xa3, 0xc2, 0x28, 0x9c, 0x67, 0x40, 0x9f, 0xa0, 0x92, 0x27, 0xe9, 0x13, 0x78, 0x56, 0x11, 0xb9, 0xbf, 0xc5, 0x37, 0x27, 0x62, 0x88, 0xea, 0x41, 0xd9, 0x2f, 0xc0, 0x37, 0x51, 0xd2, 0xa2, 0x77, 0xb7, 0xec, 0xec, 0x25, 0x47, 0x18, 0x8e, 0xdd, 0x60, 0x1c, 0xf0, 0xd1, 0x76, 0x41, 0x7a, 0x5e, 0x40, 0x3c, 0x3b, 0x14, 0x89, 0xd6, 0x14, 0xa, 0x8f, 0x7, 0xe, 0xcf, 0xd2, 0x55, 0xc, 0xc1, 0x6d, 0x61, 0xce, 0xe1, 0x88, 0xad, 0xd, 0x3b, 0x3c, 0xca, 0x6f, 0xca, 0x17, 0x25, 0xee, 0xe9, 0x88, 0x11, 0xad, 0x9, 0xe4, 0xd3, 0x17, 0x9d, 0x47, 0x82, 0x44, 0xb5, 0x1, 0x4c, 0x47, 0x58, 0x5b, 0x3e, 0xef, 0x20, 0x62, 0x4b, 0xf3, 0x1d, 0x1e, 0x1c, 0x6b, 0x31, 0x75, 0x81, 0x49, 0x94, 0xb8, 0x7, 0xc2, 0x34, 0x4f, 0xf3, 0xcd, 0xb6, 0x23, 0xaa, 0x39, 0x8a, 0x74, 0x8a, 0x61, 0x38, 0x6, 0xe7, 0x85, 0xa8, 0xa, 0x8e, 0x96, 0xeb, 0xb5, 0x67, 0x18, 0xc2, 0x14, 0x35, 0xa3, 0x29, 0x62, 0x9f, 0x19, 0x3d, 0x6e, 0x17, 0x36, 0xc4, 0x89, 0x12, 0x75, 0x9, 0x9b, 0xec, 0xb6, 0x6, 0x23, 0xbb, 0x23, 0xc6, 0xd2, 0x50, 0xa1, 0x84, 0xd, 0xa, 0x1d, 0xfb, 0x92, 0xb5, 0x3e, 0x6f, 0x25, 0x6c, 0xa0, 0x2f, 0x6a, 0x42, 0x3c, 0x6f, 0x87, 0xf2, 0xc6, 0xac, 0x8f, 0xc2, 0x5a, 0xb8, 0xbe, 0xf4, 0xc6, 0x1e, 0x6b, 0x12, 0x36, 0x20, 0xb6, 0x86, 0x7b, 0xce, 0x44, 0xdb, 0xb6, 0x12, 0x96, 0xa8, 0xa2, 0x43, 0xfa, 0xfa, 0xf0, 0x88, 0xea, 0x6d, 0xe3, 0x23, 0x61, 0xd6, 0xb0, 0xda, 0x3a, 0xf9, 0x1f, 0xfc, 0x7a, 0xbb, 0x8f, 0x35, 0x9, 0xd3, 0xc3, 0xce, 0x37, 0xd3, 0xcb, 0x70, 0xac, 0x49, 0x98, 0x96, 0xb6, 0x7c, 0xb3, 0x9c, 0x65, 0x0, 0x13, 0x79, 0x9, 0xbb, 0x6c, 0x72, 0x38, 0x5e, 0x36, 0x87, 0xeb, 0xac, 0x6b, 0x1c, 0x47, 0x5f, 0x85, 0x69, 0x53, 0x70, 0xbe, 0x4d, 0x98, 0x56, 0x6f, 0x7d, 0xb4, 0x2d, 0x44, 0x2d, 0x72, 0x6d, 0x46, 0x11, 0xfb, 0xb, 0xbc, 0xf0, 0x50, 0xd9, 0x10, 0x38, 0x6f, 0x8d, 0xe2, 0x5d, 0xc2, 0x53, 0x5c, 0xcb, 0x56, 0x5a, 0x43, 0xf4, 0xd1, 0x16, 0x11, 0xb5, 0xc5, 0x26, 0xe2, 0x8a, 0x98, 0xac, 0x31, 0xfd, 0xd7, 0xcf, 0x3f, 0x3b, 0x11, 0xa7, 0x8f, 0xca, 0x72, 0x2c, 0x10, 0xe6, 0xf3, 0x1e, 0x95, 0x76, 0x80, 0xb4, 0xb1, 0xb1, 0x11, 0x4, 0x7a, 0xb2, 0x8b, 0x39, 0xdd, 0x71, 0xde, 0x3, 0x5a, 0x74, 0xf4, 0xd9, 0x74, 0x23, 0xac, 0xe5, 0xf2, 0xfa, 0x37, 0xbc, 0xae, 0xb8, 0x8f, 0xc2, 0x6f, 0x7c, 0x56, 0x95, 0xe1, 0xae, 0xb9, 0xef, 0xea, 0x6c, 0xe8, 0x38, 0xf8, 0xe1, 0x3d, 0x10, 0x25, 0x9, 0xd2, 0xd4, 0x94, 0x8d, 0x98, 0x4a, 0x18, 0xa3, 0xa7, 0x49, 0x26, 0x29, 0xef, 0xb1, 0x69, 0x5b, 0xa9, 0x34, 0x1c, 0x31, 0x69, 0x79, 0x1f, 0xa2, 0xb6, 0x9f, 0x6b, 0xec, 0x59, 0x7e, 0xc4, 0x74, 0xf3, 0xb8, 0x5, 0x34, 0x65, 0xf1, 0xd1, 0xb4, 0x5f, 0x3d, 0x12, 0x61, 0xd7, 0x73, 0x22, 0x96, 0x79, 0x58, 0xef, 0xf0, 0x51, 0x51, 0x86, 0xf3, 0x8f, 0x12, 0xa5, 0x7c, 0x4e, 0xc4, 0x54, 0xc0, 0x75, 0xf6, 0x21, 0x89, 0x66, 0xfc, 0xbe, 0x2d, 0xf2, 0x28, 0x5a, 0x63, 0x11, 0x76, 0x89, 0x34, 0xbb, 0xc4, 0xad, 0x7c, 0xda, 0x70, 0xe8, 0xc5, 0x73, 0xc3, 0xdb, 0x23, 0xaf, 0xfe, 0x6a, 0xc9, 0x3b, 0x2d, 0x4a, 0xac, 0xdb, 0x45, 0x4c, 0x85, 0x99, 0x27, 0xb8, 0xbe, 0xc7, 0xd5, 0x9e, 0x99, 0xf, 0x76, 0x13, 0x92, 0xa3, 0x11, 0x96, 0x5d, 0xe6, 0xc8, 0xb9, 0xc6, 0x2, 0x5, 0x54, 0xd0, 0x43, 0x6e, 0x21, 0x78, 0x1e, 0x94, 0x39, 0x9e, 0x2e, 0xf, 0x8b, 0x12, 0x57, 0xa3, 0x30, 0x39, 0xa8, 0xa8, 0x8d, 0x8a, 0x15, 0xca, 0x3b, 0x6e, 0x3f, 0xc1, 0xf5, 0xe7, 0x7c, 0x8e, 0xc6, 0xa1, 0x18, 0xae, 0xc4, 0xb0, 0x3c, 0xcc, 0xf1, 0x9c, 0x70, 0x99, 0x43, 0xf9, 0x2b, 0x70, 0xa9, 0x40, 0x58, 0xbb, 0x5d, 0x97, 0x24, 0xc2, 0xf4, 0x1d, 0xc5, 0x59, 0x30, 0xdc, 0x21, 0x41, 0xa2, 0xa2, 0x97, 0xe3, 0x4a, 0x44, 0x9d, 0x32, 0xf1, 0x8a, 0x1c, 0x8a, 0x41, 0x65, 0x1a, 0x6a, 0x8a, 0xf2, 0x25, 0x78, 0x10, 0x94, 0x39, 0x90, 0x6a, 0x6b, 0x56, 0xbb, 0x99, 0x46, 0x51, 0x5, 0xf1, 0x63, 0x48, 0x4e, 0x5, 0x4f, 0x81, 0xb, 0xb6, 0xcc, 0x46, 0xde, 0x3a, 0x14, 0xc3, 0x1d, 0xa0, 0x68, 0x26, 0xc7, 0x7, 0x81, 0x3e, 0x74, 0x49, 0x6a, 0xe7, 0xa8, 0xf8, 0x3b, 0x50, 0xaa, 0x77, 0xbe, 0x56, 0xa0, 0xe1, 0x5d, 0x6, 0xaa, 0x40, 0x25, 0x48, 0xca, 0x43, 0x91, 0x5a, 0x43, 0xa4, 0x36, 0x93, 0xbe, 0x5b, 0x43, 0x9c, 0xfe, 0xd1, 0xe6, 0xa2, 0x25, 0x6c, 0xcd, 0xf8, 0xbf, 0x7, 0xe5, 0xb6, 0xb3, 0x53, 0xe7, 0x23, 0xb0, 0x1e, 0x34, 0x81, 0x38, 0xbb, 0x86, 0xf3, 0x2b, 0x5b, 0x7f, 0x1d, 0xf2, 0x73, 0x2, 0x7d, 0xfd, 0x59, 0xb, 0x8e, 0x1, 0x7d, 0xc3, 0xf8, 0xc, 0x88, 0xd8, 0x21, 0x30, 0xf, 0x74, 0x29, 0xf4, 0x4, 0xb4, 0xd1, 0xf7, 0x8b, 0x5f, 0x80, 0xbd, 0x40, 0xdf, 0x9, 0x4b, 0x88, 0x7e, 0xc0, 0x3a, 0xb0, 0x10, 0x68, 0x82, 0x9e, 0xd8, 0xde, 0x0, 0xa1, 0x3b, 0xe4, 0xa8, 0x44, 0xd8, 0xd7, 0x91, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; @@ -17,14 +9,6 @@ + (NSData *)apple_icon3x_png { return [NSData dataWithBytes:apple_icon3x_png length:sizeof(apple_icon3x_png)]; } - static const unsigned char facebook_icon2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x2c, 0x8, 0x6, 0x0, 0x0, 0x0, 0x1e, 0x84, 0x5a, 0x1, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x44, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x45, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x42, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x43, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0x64, 0xec, 0x39, 0x7f, 0x0, 0x0, 0x2, 0x9a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x97, 0xcf, 0x8f, 0xd2, 0x40, 0x14, 0xc7, 0x99, 0x96, 0xd2, 0xf2, 0x63, 0xbb, 0x18, 0x10, 0x83, 0x42, 0x14, 0x12, 0x4f, 0x12, 0xaf, 0x60, 0xbc, 0x60, 0xf8, 0x2f, 0x8c, 0x81, 0x4, 0x88, 0x5c, 0xbc, 0x7a, 0xf2, 0x60, 0xb8, 0xb0, 0x7f, 0x0, 0xc6, 0x13, 0x7, 0xc2, 0xdd, 0x83, 0x37, 0xc2, 0xca, 0x9, 0x3, 0x44, 0x8d, 0x82, 0x31, 0x21, 0x1c, 0x48, 0x5c, 0x12, 0x48, 0x38, 0xd8, 0x8, 0xba, 0x14, 0x97, 0xa5, 0xf8, 0x6a, 0x62, 0xb2, 0x36, 0x9d, 0x2e, 0x34, 0xed, 0xb2, 0x8d, 0x7d, 0xc9, 0x24, 0x4d, 0xdf, 0xcc, 0x9b, 0x4f, 0xa7, 0x6f, 0xde, 0x7c, 0x7, 0x5, 0x2, 0x1, 0x5f, 0xa9, 0x54, 0x7a, 0x19, 0x8f, 0xc7, 0x1f, 0xd0, 0x34, 0x4d, 0x5a, 0x2e, 0xa1, 0x2d, 0x97, 0x4b, 0xe1, 0x1d, 0x58, 0x36, 0x9b, 0xcd, 0x59, 0xaa, 0xd5, 0xea, 0xab, 0xb5, 0x41, 0xac, 0xdd, 0x6e, 0x1f, 0x22, 0x41, 0x10, 0x7e, 0x20, 0x84, 0x5c, 0x16, 0x63, 0xd8, 0x9, 0x2, 0xf0, 0x29, 0x3c, 0xb0, 0x6, 0x1, 0x5e, 0x88, 0xc0, 0xdf, 0xe1, 0x61, 0xdf, 0x20, 0xc0, 0xbc, 0x9, 0xbc, 0xd1, 0x7f, 0x5d, 0x2c, 0x66, 0xc3, 0xe1, 0xf0, 0x2b, 0xc7, 0x71, 0xdf, 0x4e, 0xc1, 0xec, 0x76, 0x3b, 0x45, 0x92, 0x24, 0xe3, 0x72, 0xb9, 0x9c, 0x2c, 0xcb, 0xee, 0x7b, 0xbd, 0xde, 0xeb, 0x4, 0x41, 0x58, 0xe5, 0x80, 0x2d, 0x22, 0xf0, 0x45, 0xed, 0xf2, 0x6e, 0xb7, 0xdb, 0xcc, 0xe5, 0x72, 0x8f, 0xc2, 0xe1, 0xf0, 0xd, 0x8a, 0xa2, 0x90, 0x94, 0xc6, 0x66, 0xb3, 0x21, 0x8f, 0xc7, 0xe3, 0x18, 0xc, 0x6, 0x9f, 0x31, 0x21, 0xe6, 0x17, 0x6, 0x5c, 0x28, 0x14, 0x9e, 0x31, 0xc, 0x43, 0x6c, 0xf2, 0x7, 0xfa, 0xfd, 0xfe, 0xa7, 0x9d, 0x2, 0xe7, 0xf3, 0xf9, 0xa7, 0x9b, 0xa6, 0x8b, 0xd5, 0x6a, 0xdd, 0x2d, 0x30, 0x14, 0xfb, 0x37, 0xdb, 0xe4, 0xf7, 0x79, 0xc0, 0x84, 0xde, 0x1b, 0xec, 0x0, 0x6c, 0x9b, 0xfe, 0xb0, 0x7, 0xc5, 0x45, 0x5c, 0x63, 0x3f, 0x48, 0x4f, 0xd8, 0xc9, 0x64, 0x72, 0x54, 0xaf, 0xd7, 0xdf, 0x2a, 0xf5, 0xf1, 0xf9, 0x7c, 0x62, 0x55, 0x70, 0x43, 0x95, 0x40, 0x7f, 0x57, 0x18, 0x72, 0x9d, 0xc6, 0xe, 0xd0, 0x33, 0x25, 0x6a, 0xb5, 0xda, 0x6b, 0xdc, 0xbc, 0x4e, 0xa7, 0x93, 0x2e, 0x97, 0xcb, 0x45, 0x28, 0x6d, 0xe3, 0xd5, 0x6a, 0x35, 0x87, 0xee, 0xfc, 0x99, 0x26, 0xe0, 0x52, 0x42, 0xd7, 0x15, 0x1e, 0x8d, 0x46, 0x43, 0x9c, 0x2f, 0x93, 0xc9, 0x3c, 0x4c, 0xa5, 0x52, 0x4f, 0xb6, 0x8d, 0xa9, 0x6b, 0xe, 0x43, 0x3e, 0x2e, 0x70, 0xbe, 0x58, 0x2c, 0x76, 0x4f, 0x4d, 0x4c, 0x5d, 0x81, 0x41, 0x5, 0x62, 0x7d, 0xa0, 0xbd, 0x6d, 0x97, 0xe, 0x58, 0xc9, 0x40, 0xd6, 0xae, 0xd, 0x5, 0xac, 0xd6, 0x74, 0x5, 0x6, 0x51, 0xc3, 0xe0, 0x7c, 0xe, 0x87, 0xc3, 0xae, 0x2a, 0xcd, 0xb4, 0x50, 0x6b, 0xe3, 0xf1, 0xf8, 0xe8, 0x39, 0x98, 0x34, 0x36, 0x9c, 0x58, 0x5f, 0x1a, 0x8d, 0xc6, 0x7, 0xb9, 0x31, 0x89, 0x44, 0xe2, 0x7e, 0x28, 0x14, 0xba, 0x2d, 0x56, 0xd6, 0xb3, 0xef, 0xe1, 0x8e, 0x79, 0xd, 0x42, 0x1d, 0x60, 0x16, 0x53, 0x1b, 0xb5, 0x6, 0x2a, 0xec, 0xbd, 0x56, 0x7f, 0x25, 0x1a, 0x8d, 0xde, 0x55, 0x98, 0x4a, 0x9b, 0xa3, 0x19, 0xb4, 0x2b, 0xa1, 0x54, 0x11, 0xb6, 0xb1, 0x48, 0x24, 0x72, 0xc7, 0x50, 0x9b, 0xe, 0xd2, 0xe4, 0x96, 0x9, 0x2c, 0xa3, 0x47, 0x94, 0x4, 0xd6, 0x56, 0x16, 0xc, 0x6, 0x6f, 0x2a, 0xca, 0x4f, 0x2d, 0x26, 0x81, 0xab, 0xd, 0xe5, 0xf7, 0xfb, 0xaf, 0x4a, 0xa1, 0x79, 0x9e, 0x9f, 0x4f, 0xa7, 0xd3, 0x63, 0xb9, 0x31, 0x6e, 0xb7, 0x7b, 0xf, 0x54, 0xd9, 0x3f, 0x65, 0x4f, 0xbc, 0x36, 0x9d, 0x7, 0xac, 0x49, 0x95, 0x0, 0xb5, 0x75, 0xa, 0x60, 0x9c, 0xb4, 0x15, 0x8b, 0xc5, 0x3c, 0x6e, 0xde, 0x4a, 0xa5, 0xf2, 0x42, 0xda, 0x7f, 0x36, 0x9b, 0x71, 0xa, 0x4a, 0x4d, 0x3b, 0xb5, 0x6, 0x45, 0x82, 0x84, 0xdb, 0xee, 0x15, 0xe9, 0x7b, 0xb8, 0x5, 0xef, 0xe1, 0xc6, 0x80, 0x8f, 0x95, 0x1b, 0xb3, 0xd3, 0x93, 0xe, 0x56, 0x7e, 0xa5, 0xc6, 0x67, 0x6a, 0x9, 0x13, 0xd8, 0x4, 0x36, 0x81, 0x4d, 0x60, 0x13, 0xf8, 0xff, 0x6, 0x46, 0x6, 0xe2, 0x45, 0x22, 0x30, 0x69, 0x20, 0x60, 0x92, 0x68, 0xb5, 0x5a, 0x4d, 0x3d, 0x57, 0x44, 0xa5, 0x4f, 0xd6, 0x7a, 0xbd, 0xde, 0x47, 0x22, 0x9d, 0x4e, 0x3f, 0x6, 0xe8, 0x43, 0x10, 0x4f, 0x3f, 0xff, 0x5c, 0xa3, 0xb5, 0x6d, 0x27, 0xa, 0xf3, 0xff, 0xda, 0x34, 0x8e, 0x20, 0x8, 0xc7, 0x9d, 0x4e, 0xa7, 0x99, 0x4c, 0x26, 0xd3, 0xbf, 0x5, 0x18, 0x0, 0x98, 0xef, 0x3, 0xa7, 0xc, 0x73, 0xce, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)facebook_icon2x_png { - return [NSData dataWithBytes:facebook_icon2x_png length:sizeof(facebook_icon2x_png)]; - } - static const unsigned char parse_logo_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0xde, 0x0, 0x0, 0x0, 0x44, 0x8, 0x6, 0x0, 0x0, 0x0, 0xee, 0x9a, 0x8b, 0x92, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x35, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x36, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x31, 0x30, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x34, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0xf6, 0xc4, 0x10, 0x9d, 0x0, 0x0, 0x11, 0x8e, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x5d, 0x9, 0x98, 0x54, 0xc5, 0x11, 0xae, 0xdd, 0x9d, 0x5, 0x59, 0x90, 0x9b, 0x5, 0xb9, 0x5, 0x11, 0xf0, 0x2, 0x14, 0x54, 0x54, 0x22, 0x6e, 0x44, 0x3c, 0x50, 0xbc, 0x95, 0xc3, 0x88, 0x9, 0x41, 0x3c, 0x21, 0x1e, 0x68, 0x30, 0x11, 0x8f, 0x18, 0x3c, 0x51, 0x14, 0x13, 0x94, 0x28, 0x26, 0x9e, 0x78, 0x44, 0x12, 0x15, 0x25, 0xe0, 0x89, 0x8a, 0x28, 0x88, 0xa0, 0xe2, 0xe2, 0x2, 0x72, 0xca, 0xd, 0xcb, 0xd, 0x7b, 0xb0, 0xe9, 0xdf, 0xf7, 0xf7, 0x37, 0x9d, 0x9, 0xc8, 0xcc, 0xce, 0x3b, 0xe6, 0x3d, 0xba, 0xbe, 0xaf, 0xbe, 0xe9, 0xd9, 0x9d, 0x79, 0xd3, 0xaf, 0xbb, 0xff, 0xea, 0xaa, 0xea, 0xaa, 0x7a, 0x59, 0xfd, 0xae, 0xbd, 0xe5, 0x55, 0x11, 0x69, 0xa3, 0xb8, 0x5c, 0xfc, 0xa1, 0x2c, 0xc5, 0x6b, 0x15, 0x17, 0x2a, 0xfe, 0x54, 0xf1, 0xc7, 0x8a, 0x97, 0x8b, 0x25, 0x4b, 0x11, 0xa5, 0x8a, 0x8a, 0xa, 0xc5, 0x22, 0xf7, 0xe, 0x1f, 0x2a, 0xcd, 0x9b, 0x1c, 0xf4, 0xd3, 0xdf, 0x62, 0x8a, 0x4f, 0x52, 0xdc, 0x30, 0x80, 0xfe, 0xf4, 0x50, 0x7c, 0x9d, 0xe2, 0x95, 0x8a, 0xa7, 0x29, 0xfe, 0x87, 0xe2, 0xc9, 0x8a, 0xcb, 0xec, 0x54, 0x59, 0x8a, 0x3a, 0x1, 0x78, 0xbb, 0xd9, 0xde, 0xaa, 0x78, 0x1, 0x77, 0x24, 0xcf, 0xc0, 0xaf, 0xb8, 0x8a, 0xe2, 0x3a, 0x8a, 0x1b, 0xf0, 0xf7, 0x21, 0x2, 0x2e, 0x26, 0xcf, 0x54, 0x7c, 0xa7, 0xe2, 0x37, 0xed, 0xd4, 0x58, 0x8a, 0x3a, 0xf0, 0x34, 0xcd, 0x50, 0x7c, 0xaa, 0x4f, 0xbf, 0x59, 0x53, 0x71, 0x63, 0xc5, 0xc7, 0x2a, 0x3e, 0x9b, 0xbb, 0x5f, 0x75, 0xc5, 0x9d, 0x15, 0xbf, 0xa1, 0x78, 0x82, 0xe2, 0x6b, 0x15, 0xaf, 0xb3, 0x53, 0x64, 0x29, 0x8a, 0x94, 0x9d, 0x60, 0x7b, 0xf9, 0x41, 0x50, 0x25, 0x37, 0x28, 0xfe, 0x46, 0xf1, 0xd3, 0x8a, 0xcf, 0x53, 0xdc, 0x41, 0xf1, 0x63, 0x8a, 0x77, 0xf2, 0x33, 0x97, 0xd0, 0xfe, 0xeb, 0x64, 0xa7, 0xc8, 0x52, 0xd4, 0x81, 0x17, 0x24, 0x2d, 0x54, 0x7c, 0xbd, 0xe2, 0xe3, 0x15, 0x4f, 0xe7, 0xdf, 0xe0, 0xf0, 0x79, 0x57, 0x71, 0x81, 0x9d, 0x26, 0x4b, 0x16, 0x78, 0xde, 0xd2, 0x1c, 0xc5, 0xa7, 0x28, 0xfe, 0x2b, 0xdf, 0xc3, 0x16, 0x7c, 0x4d, 0xf1, 0x71, 0x76, 0xaa, 0x2c, 0x59, 0xe0, 0x79, 0x4b, 0xbb, 0x14, 0x5f, 0xad, 0xf8, 0x76, 0xbe, 0xaf, 0xad, 0xf8, 0x45, 0xc5, 0xcd, 0xec, 0x74, 0x59, 0xb2, 0xc0, 0xf3, 0x9e, 0xee, 0x56, 0xfc, 0x0, 0xdb, 0x7, 0x2b, 0xfe, 0x8b, 0x8f, 0x76, 0xa8, 0x25, 0x4b, 0xfb, 0x2d, 0xf0, 0x40, 0xb7, 0x88, 0xe3, 0xe5, 0x4, 0xf5, 0x52, 0x7c, 0xa5, 0x9d, 0x32, 0x4b, 0x16, 0x78, 0xde, 0x13, 0xce, 0xfd, 0xe0, 0x74, 0x59, 0xc5, 0xf7, 0xb7, 0x29, 0xce, 0xb7, 0xd3, 0x66, 0xc9, 0x2, 0xcf, 0x7b, 0x5a, 0xac, 0x78, 0x4, 0xdb, 0x4d, 0xc5, 0x89, 0x76, 0xb1, 0x64, 0xc9, 0x2, 0xcf, 0x7, 0x7a, 0x46, 0xf1, 0x6c, 0xb6, 0x2f, 0x57, 0x5c, 0xd7, 0x4e, 0x9d, 0x25, 0xb, 0x3c, 0xef, 0xa9, 0x44, 0xf1, 0xe3, 0x6c, 0xc3, 0xbb, 0xd9, 0xdb, 0x4e, 0x9d, 0x25, 0xb, 0x3c, 0x7f, 0x68, 0xa2, 0x38, 0x1, 0xd5, 0xa0, 0xf3, 0xec, 0xd4, 0x59, 0xb2, 0xc0, 0xf3, 0x87, 0xd6, 0x2b, 0x7e, 0x8f, 0x6d, 0x44, 0xb8, 0x34, 0xb0, 0xd3, 0x67, 0xc9, 0x2, 0xcf, 0x1f, 0xd2, 0xc0, 0x3, 0xe8, 0xe, 0xb7, 0xd3, 0x67, 0x29, 0xac, 0x14, 0xb, 0x59, 0x7f, 0xbf, 0x34, 0xda, 0x0, 0xde, 0x7, 0x2e, 0x5f, 0x1f, 0x7, 0xf4, 0x4d, 0x79, 0xed, 0x76, 0x8a, 0x9b, 0x28, 0xce, 0x13, 0xe7, 0x58, 0x3, 0xb4, 0x51, 0xf1, 0xf, 0x8a, 0xe7, 0x8b, 0x93, 0xc8, 0xbb, 0xde, 0xa7, 0xfb, 0x46, 0xbf, 0xaa, 0x89, 0x93, 0xac, 0xbc, 0xcb, 0xa5, 0x6b, 0xe6, 0x48, 0xfa, 0xc9, 0xcf, 0xb8, 0x46, 0x73, 0xc5, 0x6d, 0xc5, 0x9, 0x72, 0x40, 0xc6, 0x49, 0x9d, 0x84, 0xcf, 0x14, 0x8b, 0x73, 0x1c, 0xb4, 0x48, 0x9c, 0xb4, 0xb3, 0x25, 0x2e, 0xde, 0x83, 0x9b, 0x73, 0xde, 0x8e, 0xf7, 0x1, 0x1f, 0x42, 0xd, 0xce, 0x39, 0xfe, 0xb7, 0x59, 0x9c, 0x44, 0xed, 0x22, 0xc5, 0xf3, 0x14, 0xaf, 0x30, 0xd6, 0xc3, 0x7e, 0x3, 0xbc, 0x95, 0x5c, 0xec, 0xf5, 0x14, 0xb7, 0x76, 0x71, 0xd7, 0xef, 0x48, 0xbb, 0xb1, 0xa7, 0xe2, 0xf6, 0x1c, 0xf8, 0x7d, 0x11, 0xb2, 0xe8, 0x91, 0x41, 0xf1, 0x8a, 0x38, 0x87, 0xfc, 0x9b, 0x3d, 0xbc, 0xef, 0x2b, 0x14, 0xdf, 0x27, 0xce, 0xd1, 0xca, 0x99, 0xfc, 0xed, 0x64, 0xa9, 0x85, 0xe2, 0x13, 0x15, 0x1f, 0xa3, 0xb8, 0x15, 0xb5, 0x85, 0xfa, 0x4, 0xc1, 0xf9, 0xe2, 0x38, 0xae, 0x52, 0x5, 0xdb, 0x9, 0x8a, 0x2f, 0x54, 0xdc, 0x5d, 0x9c, 0x60, 0xf6, 0x6a, 0x49, 0x7e, 0xb7, 0x84, 0xc0, 0xfb, 0x94, 0x36, 0xfb, 0x54, 0x71, 0xf2, 0x40, 0x83, 0xa0, 0xc3, 0x14, 0x5f, 0xa4, 0xf8, 0x74, 0xc5, 0x47, 0x24, 0x39, 0xe7, 0x5b, 0x8, 0xbe, 0x77, 0x14, 0xa3, 0x72, 0xc3, 0x37, 0xfb, 0xb, 0xf0, 0x70, 0xe3, 0x1b, 0x8, 0xbc, 0xfa, 0x69, 0x5e, 0xb, 0x3, 0x8d, 0xe4, 0xdb, 0xdf, 0x8a, 0x13, 0x84, 0x9d, 0x18, 0x8e, 0xb6, 0x9b, 0xd2, 0x7a, 0x13, 0x77, 0x6, 0xec, 0x7c, 0xb5, 0xf9, 0xaa, 0xd5, 0xdd, 0xde, 0x64, 0x2c, 0xa6, 0x87, 0x14, 0x8f, 0x93, 0x78, 0x6a, 0x93, 0x9b, 0xd4, 0x8a, 0xf7, 0x8b, 0x9c, 0xc5, 0x9a, 0x49, 0x0, 0xf, 0xf3, 0x8a, 0x3c, 0xc7, 0x41, 0x8a, 0xbb, 0xf1, 0x7b, 0x89, 0x54, 0x93, 0x80, 0x29, 0x49, 0x41, 0x40, 0x61, 0xbc, 0x6e, 0x56, 0x7c, 0xf4, 0x1e, 0xfe, 0x5f, 0xc6, 0xb1, 0xda, 0xc6, 0x6b, 0x66, 0xf1, 0x77, 0x6b, 0x19, 0xc0, 0xac, 0x42, 0xa0, 0x82, 0x2f, 0xe7, 0xb8, 0x3d, 0x25, 0x4e, 0x38, 0xa0, 0x5f, 0xda, 0x43, 0x77, 0xde, 0xc3, 0xa9, 0xec, 0x8f, 0x49, 0x15, 0x9c, 0x73, 0x8, 0xd1, 0x52, 0xc5, 0xb9, 0x8a, 0xf, 0xe4, 0x3d, 0xe4, 0xb0, 0x7d, 0x1c, 0xf9, 0x36, 0x9a, 0x3e, 0xf, 0x13, 0x88, 0x91, 0x6, 0xde, 0xe, 0x4e, 0xac, 0x96, 0xbc, 0x95, 0x5, 0xdc, 0x60, 0x71, 0x12, 0x6d, 0x5b, 0x24, 0x0, 0xed, 0x3b, 0xc5, 0x1f, 0x2a, 0xfe, 0x84, 0xd2, 0x6c, 0xd, 0x25, 0x72, 0x39, 0x17, 0x4f, 0x4d, 0xaa, 0x56, 0x5d, 0xc4, 0x49, 0xde, 0xfd, 0x5, 0xff, 0x8e, 0xeb, 0x3c, 0xca, 0x9d, 0x69, 0x60, 0x82, 0x4a, 0xec, 0x6, 0x95, 0x1b, 0xb, 0x63, 0x5f, 0x6a, 0xe, 0x42, 0xeb, 0xee, 0x92, 0x3d, 0xe7, 0x32, 0x6e, 0xa5, 0xd6, 0xa0, 0xf3, 0x21, 0x93, 0x15, 0x12, 0x87, 0x2a, 0x1e, 0x2b, 0x4e, 0xe6, 0x88, 0x79, 0xad, 0x4f, 0xa9, 0xee, 0xcf, 0xe6, 0x6e, 0xac, 0x81, 0x57, 0x4a, 0xe0, 0xe5, 0x71, 0xb1, 0xe6, 0x73, 0x87, 0x41, 0xa2, 0xf3, 0x49, 0x6c, 0xc7, 0x38, 0x6e, 0xe8, 0x2b, 0x42, 0x1, 0x6f, 0x55, 0xfc, 0x9c, 0x87, 0x6b, 0x7, 0xf7, 0x70, 0xbf, 0xfc, 0xff, 0x51, 0xd4, 0x7c, 0x2, 0x8, 0x73, 0xfe, 0xad, 0x31, 0xe7, 0xa5, 0xec, 0x63, 0xd, 0xa, 0x7a, 0x7c, 0xbf, 0xab, 0x38, 0x69, 0x6a, 0x1d, 0xf8, 0xbf, 0xd3, 0xc8, 0x28, 0x59, 0x82, 0xf0, 0xc6, 0x39, 0x51, 0x5, 0x5e, 0x2e, 0x59, 0x24, 0xf5, 0x80, 0x69, 0x48, 0xec, 0x3e, 0xe2, 0x94, 0x96, 0x30, 0xd5, 0xd4, 0xd5, 0x8a, 0x5f, 0xe6, 0xa4, 0x7f, 0x29, 0x7b, 0xaf, 0xf9, 0xb2, 0x83, 0xb, 0x16, 0xb, 0xec, 0x23, 0xee, 0x70, 0x87, 0x28, 0xbe, 0x8a, 0xbb, 0xe6, 0x81, 0x5c, 0xec, 0xd3, 0x8, 0xbe, 0x17, 0x7d, 0x1e, 0x9b, 0x7c, 0x4a, 0xdf, 0xbe, 0x9, 0x7f, 0x2f, 0xa2, 0x2a, 0x3c, 0x85, 0x6a, 0xd2, 0xaa, 0x14, 0xd5, 0xcb, 0xd3, 0x39, 0x36, 0xf5, 0xf8, 0x7e, 0xa9, 0xe2, 0x31, 0x8a, 0x5f, 0x52, 0xbc, 0x6c, 0x1f, 0xdf, 0xdd, 0x2e, 0x4e, 0x15, 0x1, 0xd8, 0xc5, 0xa8, 0x70, 0x30, 0x9e, 0x2, 0xf3, 0x8, 0xf6, 0x73, 0x0, 0xfb, 0xd, 0x5b, 0xfa, 0x59, 0xaa, 0xb0, 0x43, 0xb8, 0xe8, 0xdd, 0xa4, 0x6b, 0x14, 0x8f, 0xe4, 0x1c, 0x9, 0x6d, 0xcc, 0x7f, 0x29, 0x7e, 0x42, 0x9c, 0x62, 0x5b, 0x25, 0xfb, 0xd0, 0xb2, 0x56, 0x52, 0x50, 0xfd, 0x93, 0xeb, 0xa8, 0x13, 0x85, 0x6c, 0x7f, 0xee, 0x86, 0x3d, 0xb9, 0x93, 0xde, 0x45, 0x93, 0xa0, 0x3c, 0x99, 0xc5, 0x18, 0x26, 0xca, 0xe3, 0xae, 0x23, 0x29, 0xda, 0x6, 0x47, 0x71, 0xe1, 0x3d, 0x67, 0x80, 0xe, 0x8b, 0x61, 0x28, 0xa5, 0x2f, 0xe2, 0x41, 0x3f, 0x97, 0xd4, 0xb, 0x2d, 0xc1, 0x4e, 0xba, 0x91, 0x92, 0x7c, 0xaa, 0xd1, 0x47, 0x2c, 0xa2, 0x5f, 0xf9, 0x38, 0x2e, 0x28, 0xa1, 0x31, 0x3d, 0x1, 0x74, 0xef, 0x2b, 0x3e, 0x47, 0xf1, 0x91, 0xec, 0xe3, 0x3b, 0x4, 0x4d, 0x2a, 0xa0, 0xc3, 0xae, 0xfe, 0xba, 0x1, 0xba, 0xd1, 0x1c, 0xcb, 0x7, 0x92, 0x0, 0xdd, 0xcf, 0xed, 0xde, 0x73, 0xb8, 0x43, 0x1c, 0xce, 0x5d, 0x48, 0xef, 0xbc, 0x57, 0x11, 0x9c, 0x6e, 0xd1, 0x1, 0xbc, 0xde, 0x18, 0x3, 0x74, 0x93, 0x38, 0x5e, 0x97, 0x70, 0xa7, 0x4b, 0xd5, 0xc6, 0x85, 0x66, 0x34, 0x8b, 0x1a, 0x13, 0xc6, 0xe2, 0x6f, 0xbc, 0xa7, 0xaa, 0x8a, 0xef, 0x21, 0xa0, 0xeb, 0x45, 0xd, 0x78, 0xb5, 0xc, 0xdb, 0x6e, 0x65, 0x92, 0xdf, 0x19, 0x46, 0x69, 0x5b, 0x60, 0x78, 0x26, 0x87, 0x53, 0x5d, 0x18, 0xcd, 0x5d, 0x2c, 0x5d, 0xfa, 0x9e, 0x52, 0xef, 0x21, 0x43, 0xd, 0x1e, 0xc7, 0x85, 0xeb, 0x35, 0x9d, 0x45, 0xd0, 0xb7, 0xe2, 0xfb, 0xc5, 0x74, 0x1a, 0x14, 0x70, 0xa7, 0xab, 0xac, 0x7, 0xb1, 0xa5, 0x38, 0xa1, 0x7a, 0x7, 0x70, 0x61, 0x5d, 0x41, 0x41, 0xb5, 0xc9, 0xc5, 0xbe, 0xaf, 0x23, 0x0, 0x7b, 0x48, 0xbc, 0xc4, 0x63, 0x3f, 0x89, 0xe7, 0x62, 0xa6, 0x43, 0x75, 0x79, 0xff, 0x3, 0xf8, 0xbe, 0x98, 0xf7, 0x80, 0xf1, 0x9a, 0xeb, 0x52, 0xff, 0x97, 0x52, 0xdb, 0x39, 0x8d, 0x42, 0x58, 0xcf, 0x7, 0x2a, 0x27, 0x34, 0x8b, 0x12, 0xf0, 0xe, 0x31, 0xc, 0xf5, 0xc2, 0x24, 0xbf, 0x53, 0xc0, 0xc5, 0x23, 0x54, 0x8f, 0x3a, 0x50, 0xed, 0xd8, 0xe2, 0x72, 0xdf, 0x20, 0x9, 0x6f, 0x12, 0x27, 0x8f, 0x50, 0x3b, 0x12, 0x9e, 0x10, 0x6f, 0xb3, 0x29, 0xe0, 0xe1, 0x7c, 0xcd, 0x90, 0xe6, 0x13, 0xe8, 0xbd, 0x7c, 0xd5, 0x85, 0x6b, 0x63, 0x8c, 0x1a, 0x1b, 0x3b, 0xd1, 0x33, 0x1e, 0xde, 0xc7, 0xc7, 0x54, 0x69, 0x7f, 0xe4, 0xfb, 0x6b, 0xd3, 0x1c, 0xb7, 0xea, 0x1c, 0x17, 0x5d, 0xbc, 0xeb, 0x3b, 0xda, 0xe3, 0x5e, 0xdd, 0x3, 0x76, 0xce, 0xe3, 0xd, 0x27, 0x4b, 0x7, 0xee, 0xac, 0xcd, 0xa2, 0x2, 0xbc, 0x2e, 0x86, 0x93, 0x21, 0x59, 0xe0, 0x5d, 0x47, 0xd5, 0xa0, 0x2f, 0x6d, 0xbc, 0x65, 0x1e, 0xf7, 0x11, 0xd2, 0xfa, 0x79, 0xb6, 0xf, 0xa6, 0xde, 0xef, 0x5, 0x75, 0xa5, 0x1d, 0x59, 0x95, 0xef, 0x1, 0xf8, 0x4b, 0x5d, 0xda, 0xc1, 0xbb, 0xf2, 0x5a, 0xa0, 0x17, 0xb8, 0x7b, 0x7b, 0x4d, 0xdf, 0xd2, 0x16, 0x9b, 0xc4, 0xdf, 0x5e, 0x53, 0xc9, 0xeb, 0xc0, 0xf6, 0xff, 0x3b, 0x6d, 0x2e, 0xe1, 0xdc, 0x43, 0xf8, 0x7e, 0xed, 0x71, 0xff, 0xd7, 0xd3, 0x71, 0xf3, 0x2c, 0xdf, 0x1f, 0x41, 0xb5, 0xb3, 0x6e, 0x14, 0x80, 0x57, 0x60, 0xa8, 0x53, 0xf3, 0x93, 0xfc, 0x4e, 0x11, 0x8d, 0x76, 0x3f, 0x9d, 0x1d, 0x37, 0xb0, 0x8f, 0x42, 0xf5, 0xe6, 0x28, 0x17, 0xaf, 0xd, 0x9b, 0xa4, 0xe, 0x17, 0x97, 0xb6, 0x77, 0x87, 0xbb, 0xa4, 0x9e, 0x69, 0xea, 0x6f, 0x38, 0x21, 0xee, 0xf5, 0x71, 0xdc, 0x26, 0x52, 0x55, 0x7b, 0x2f, 0x8d, 0x6b, 0xdc, 0xa1, 0xf8, 0x2, 0xb6, 0xe1, 0x10, 0xe9, 0x25, 0xf1, 0x7c, 0x4e, 0xaf, 0x9, 0x73, 0xf3, 0x6b, 0xee, 0xb6, 0x42, 0x27, 0xcc, 0x38, 0xd9, 0x83, 0x23, 0x30, 0x4c, 0xc0, 0x6b, 0xc5, 0xed, 0x5c, 0xab, 0x26, 0xdb, 0x53, 0x1c, 0x10, 0x3f, 0x69, 0x4d, 0x82, 0xca, 0x39, 0xd8, 0x45, 0x75, 0x16, 0x93, 0x88, 0xa3, 0x8b, 0x36, 0xfc, 0xdb, 0xa3, 0x54, 0xb, 0xdd, 0xa2, 0xaa, 0x86, 0x8a, 0xf6, 0xae, 0xf, 0x3b, 0x85, 0x9b, 0x84, 0x7e, 0xff, 0x91, 0xed, 0xb5, 0xdc, 0x39, 0x57, 0xf9, 0xdc, 0x87, 0x32, 0xa, 0xdb, 0xcf, 0xf9, 0xfe, 0x7c, 0x9a, 0x20, 0xa1, 0x5, 0xde, 0x25, 0x86, 0x2d, 0xf3, 0x6a, 0x8, 0xfa, 0xfb, 0x3c, 0xd5, 0x27, 0x10, 0xa2, 0x62, 0xdc, 0x8, 0xea, 0xde, 0x4e, 0x67, 0x41, 0x7f, 0x3, 0x18, 0x37, 0xb9, 0xdc, 0xef, 0x36, 0x74, 0xac, 0x80, 0xa6, 0x84, 0x68, 0x7d, 0xc0, 0xae, 0x7b, 0xd0, 0xd8, 0x5d, 0xae, 0x37, 0xc6, 0xdf, 0x6f, 0xda, 0x42, 0xa7, 0x4b, 0x31, 0xdf, 0x23, 0x91, 0xfb, 0xc8, 0x30, 0x2, 0xaf, 0x16, 0x6f, 0x44, 0x1b, 0xca, 0x53, 0x43, 0xd0, 0x67, 0xa8, 0x69, 0xfa, 0x40, 0xb8, 0x11, 0x8d, 0xfb, 0x74, 0xa9, 0xb6, 0x1, 0xb4, 0x62, 0xda, 0xaf, 0x6e, 0x9f, 0x79, 0x35, 0x93, 0x78, 0x44, 0x47, 0x61, 0x88, 0x80, 0x77, 0x3d, 0x9d, 0x1a, 0x42, 0x35, 0xfc, 0xa5, 0x80, 0xfb, 0x33, 0x57, 0xe2, 0x95, 0x13, 0xaa, 0x1b, 0x1a, 0x50, 0xa8, 0x80, 0x37, 0x88, 0x8e, 0xa, 0xa1, 0xce, 0xbc, 0x3d, 0x24, 0xfd, 0x7e, 0xc3, 0x0, 0x86, 0x1b, 0xe5, 0xf1, 0xab, 0x18, 0x76, 0xdd, 0x83, 0x14, 0x42, 0x6e, 0x53, 0xbe, 0xa1, 0xd6, 0xae, 0x9, 0xc9, 0x38, 0xe7, 0xd3, 0x31, 0x3, 0xc2, 0x11, 0xc5, 0x9d, 0x19, 0xd2, 0x2f, 0xd4, 0x87, 0x9d, 0x9e, 0x95, 0x95, 0x25, 0x25, 0xa5, 0x25, 0xbd, 0x67, 0xcd, 0x9d, 0xd7, 0x23, 0x4c, 0xc0, 0x83, 0xea, 0x73, 0x2b, 0xdb, 0x70, 0xa8, 0x3c, 0x1d, 0x22, 0x29, 0x5c, 0x28, 0xf1, 0x40, 0x5a, 0x37, 0xcb, 0xd1, 0xc3, 0x61, 0x34, 0xc6, 0xa3, 0x3e, 0xe7, 0x26, 0xd8, 0x94, 0x61, 0x20, 0xa8, 0xdf, 0x4d, 0xd8, 0x7e, 0x52, 0x9c, 0xe0, 0x88, 0x4c, 0x20, 0x8, 0xdd, 0x3f, 0xa1, 0x11, 0x8b, 0xc5, 0x64, 0xf2, 0x87, 0x9f, 0xdc, 0xb0, 0x79, 0xeb, 0xb6, 0x50, 0x0, 0x2f, 0xc6, 0x5, 0xa6, 0x5d, 0xb2, 0x77, 0x88, 0xbb, 0x7, 0xb8, 0x5e, 0x53, 0xb9, 0x1, 0x3c, 0x44, 0xcc, 0xd4, 0x71, 0xe9, 0xba, 0xe3, 0x3c, 0x1c, 0x87, 0x5d, 0x86, 0x50, 0xae, 0x1f, 0x82, 0x31, 0xc6, 0x19, 0xad, 0x8e, 0x12, 0x82, 0x4b, 0x7f, 0x6c, 0x86, 0xf5, 0xef, 0x6d, 0xc5, 0x1f, 0xc7, 0x72, 0x72, 0x64, 0xed, 0xfa, 0x8d, 0xa7, 0x7d, 0x53, 0x58, 0x74, 0x6c, 0x18, 0x80, 0x37, 0x4a, 0x9c, 0xa8, 0x0, 0xd0, 0xb, 0x19, 0xa0, 0xb7, 0x57, 0x86, 0xb4, 0x81, 0xf, 0xc7, 0x90, 0x1b, 0xcf, 0x21, 0x5c, 0xc7, 0xb1, 0xf0, 0x8a, 0x4c, 0x2f, 0x60, 0xdb, 0x10, 0x8c, 0x2f, 0x82, 0xae, 0x75, 0x52, 0x34, 0xdc, 0xf8, 0xcb, 0x32, 0xac, 0x7f, 0x38, 0x73, 0x46, 0x58, 0x99, 0x28, 0x95, 0x33, 0x7b, 0xea, 0xb4, 0xe9, 0x7d, 0x32, 0x1d, 0x78, 0xa3, 0x24, 0x5e, 0xca, 0xf, 0xbb, 0xc6, 0x10, 0x9, 0x27, 0xad, 0xe0, 0x2b, 0xdc, 0xf4, 0xf5, 0x5c, 0xb8, 0xde, 0x5b, 0xc6, 0x35, 0xbd, 0x20, 0x84, 0xbf, 0xe9, 0x38, 0xd8, 0x30, 0x14, 0x95, 0x3a, 0xc7, 0x68, 0x4f, 0xc8, 0xd0, 0x3e, 0x22, 0x28, 0x60, 0x75, 0x95, 0xdc, 0x5c, 0x59, 0xb8, 0x64, 0xf9, 0x99, 0xab, 0xd6, 0xac, 0xab, 0x96, 0x89, 0xc0, 0x83, 0xf3, 0x0, 0xae, 0xf8, 0xdf, 0xf1, 0x3d, 0x62, 0x32, 0x2f, 0x95, 0xf0, 0x3e, 0x2b, 0xaf, 0x38, 0xc1, 0x39, 0x92, 0x2e, 0xbd, 0xee, 0x71, 0x7f, 0x91, 0x23, 0x37, 0x83, 0x6d, 0x38, 0x3, 0x2e, 0xc8, 0xe0, 0xb1, 0xc5, 0xfa, 0x3d, 0x99, 0x6d, 0xc4, 0x4a, 0x7e, 0x96, 0xa1, 0xfd, 0xc4, 0x99, 0xe2, 0xfb, 0xd9, 0xd9, 0x59, 0xb2, 0x7d, 0xc7, 0xce, 0x43, 0x7f, 0x58, 0xbe, 0xa2, 0x63, 0xa6, 0x1, 0xf, 0x51, 0xb, 0x38, 0x78, 0xec, 0x6b, 0x2c, 0x82, 0xb3, 0x24, 0xb8, 0xf3, 0x18, 0xb7, 0x54, 0xd, 0x31, 0xd4, 0xcd, 0x74, 0x68, 0x87, 0xa4, 0x91, 0xf5, 0x9c, 0x2, 0x99, 0x8e, 0x1b, 0xa8, 0x49, 0xa7, 0x66, 0xe8, 0xd8, 0x1e, 0x4a, 0x6, 0x21, 0x9f, 0x2e, 0x93, 0xbd, 0xdd, 0x3f, 0x1d, 0x81, 0xed, 0x2e, 0x2f, 0x97, 0xa2, 0x45, 0x4b, 0x4e, 0x34, 0x81, 0x17, 0x94, 0x7, 0xb, 0x6, 0x3c, 0xe, 0xc7, 0x91, 0xc6, 0xf2, 0xa6, 0x61, 0x57, 0x20, 0xaf, 0xd, 0x67, 0x5f, 0xb3, 0x25, 0xdc, 0x94, 0xe5, 0x32, 0x88, 0xfd, 0x98, 0xa7, 0x89, 0xda, 0x2e, 0x11, 0xe7, 0xec, 0x10, 0xf3, 0x32, 0x52, 0x32, 0xcf, 0xd9, 0xd2, 0x56, 0xe2, 0x1, 0xf0, 0x9f, 0x64, 0xf8, 0x3a, 0xc0, 0x6e, 0x5c, 0x1e, 0xcb, 0x8d, 0xc9, 0xf7, 0xb, 0x17, 0x77, 0x36, 0x13, 0x61, 0x71, 0x70, 0x8a, 0x4c, 0xe0, 0x1c, 0xf1, 0xfe, 0x39, 0xe8, 0x31, 0xfe, 0x1e, 0xe, 0x3c, 0x3b, 0x25, 0x4c, 0x28, 0xec, 0x8b, 0xfb, 0xc9, 0x41, 0x14, 0xc5, 0xc1, 0xfd, 0xd7, 0xa2, 0xca, 0x8b, 0x7e, 0x9a, 0x45, 0x86, 0xf0, 0xa, 0x7f, 0x30, 0x22, 0x13, 0x76, 0x46, 0x0, 0xc8, 0x3f, 0x47, 0xd7, 0xf1, 0xde, 0xfb, 0xd1, 0x3e, 0xc5, 0x91, 0xe, 0x12, 0x7c, 0x91, 0x34, 0x8c, 0xb8, 0xd7, 0x2f, 0x24, 0xf8, 0xa2, 0x45, 0x87, 0x19, 0xed, 0x4c, 0xf, 0x6d, 0x5b, 0xac, 0x78, 0x69, 0x4e, 0x76, 0xf6, 0xc1, 0xc5, 0x9b, 0xb7, 0xb4, 0x8f, 0x25, 0x48, 0x8f, 0x20, 0x5d, 0xb1, 0xc8, 0x93, 0x7b, 0x89, 0x4e, 0x95, 0x5, 0x3e, 0xfe, 0x2e, 0x4a, 0x39, 0x20, 0x6, 0x14, 0xe9, 0x34, 0x8, 0xeb, 0x69, 0x41, 0x29, 0xaf, 0x81, 0x57, 0x95, 0xbb, 0x4c, 0x49, 0x2, 0xf0, 0x60, 0xbb, 0x21, 0x87, 0xc, 0x67, 0x46, 0x85, 0x64, 0x9c, 0xaf, 0xad, 0x12, 0x17, 0xaa, 0x50, 0x65, 0x0, 0x41, 0xb0, 0xf4, 0xa7, 0x26, 0x82, 0xb3, 0xa8, 0x46, 0x14, 0x90, 0x57, 0x93, 0x8b, 0xf8, 0xbf, 0xa9, 0x4, 0xe1, 0xd2, 0x0, 0xb4, 0xa6, 0xa6, 0x7c, 0x45, 0x8d, 0x94, 0x65, 0x19, 0x3e, 0x9e, 0x58, 0x37, 0x4b, 0xb3, 0x15, 0xf0, 0x36, 0x14, 0x6f, 0x6a, 0x10, 0x54, 0xe9, 0x87, 0x32, 0xe, 0x16, 0xca, 0x2e, 0x7c, 0x25, 0x4e, 0x1e, 0xd3, 0x64, 0xbe, 0xf7, 0x83, 0xb0, 0x88, 0x2e, 0xa4, 0xe3, 0x0, 0xe7, 0x2a, 0x79, 0x49, 0xec, 0x82, 0x3a, 0xf, 0x10, 0x35, 0x38, 0xf4, 0xb1, 0x40, 0xe7, 0x84, 0xcf, 0x6d, 0xe2, 0x82, 0x9c, 0xce, 0x45, 0xf9, 0x1f, 0x9, 0xcf, 0x21, 0xf4, 0xde, 0xe8, 0x29, 0xaa, 0x9e, 0x38, 0x2b, 0x1b, 0x40, 0xe1, 0x84, 0x5d, 0x57, 0x17, 0x2d, 0x1a, 0x44, 0xdb, 0xea, 0x3b, 0xaa, 0x53, 0xa8, 0xc3, 0x32, 0x93, 0x2, 0xa9, 0xd4, 0xe3, 0xbe, 0x69, 0x2f, 0xb1, 0xae, 0x3e, 0x97, 0xe9, 0x84, 0x0, 0x90, 0x93, 0x15, 0xf8, 0x6a, 0x99, 0xc0, 0x83, 0x53, 0xe3, 0xa, 0x4a, 0x79, 0x2f, 0xd5, 0x99, 0x2c, 0x4a, 0x53, 0xec, 0x18, 0xeb, 0x24, 0xf5, 0x72, 0xb, 0xe9, 0x4a, 0xc8, 0x61, 0x94, 0xe4, 0x7b, 0xaa, 0xff, 0x8, 0x75, 0x60, 0x11, 0xa5, 0xe7, 0x7a, 0xee, 0xc2, 0x15, 0x46, 0xbf, 0xb5, 0xa, 0xa, 0xc9, 0x7f, 0x10, 0xd5, 0xe5, 0x46, 0x5c, 0x0, 0xfa, 0xff, 0x9d, 0xc9, 0x50, 0xd5, 0x10, 0x72, 0xf5, 0x63, 0x4, 0x76, 0x3f, 0x8c, 0x5, 0xea, 0xb9, 0x3c, 0x46, 0xcd, 0x0, 0xa9, 0x36, 0x3d, 0x8, 0xc2, 0x3c, 0xf2, 0x31, 0xe4, 0x6b, 0xa8, 0x1d, 0x2c, 0x22, 0x0, 0x3f, 0xa2, 0x20, 0x2a, 0xf2, 0x40, 0x35, 0xad, 0xcd, 0x57, 0x8c, 0xfb, 0xef, 0x25, 0x9e, 0xbd, 0x91, 0xa9, 0x1a, 0x84, 0x3e, 0x6f, 0xcc, 0x33, 0x81, 0xa7, 0x6b, 0x6, 0x46, 0x91, 0x30, 0x19, 0x57, 0x51, 0x65, 0x32, 0x1, 0x57, 0x48, 0xc7, 0xc1, 0x14, 0xda, 0x8, 0xab, 0x53, 0xdc, 0xa1, 0x72, 0x8, 0xba, 0xe6, 0x5c, 0x84, 0xd8, 0x3d, 0x91, 0xfb, 0x87, 0xe2, 0xa8, 0x38, 0x3a, 0xc8, 0x97, 0x68, 0x3d, 0xcf, 0xf, 0x42, 0x72, 0x6, 0x79, 0x4, 0x5, 0xf, 0x92, 0x66, 0x4f, 0xa4, 0xba, 0xde, 0x8e, 0x1a, 0x41, 0x15, 0xb6, 0xdb, 0x51, 0xc8, 0xe1, 0x7b, 0xb, 0xe9, 0x0, 0x41, 0x24, 0x7, 0x2a, 0xb9, 0xad, 0x75, 0xb1, 0x5f, 0x10, 0x7e, 0xb7, 0x67, 0xfa, 0xe0, 0x55, 0x54, 0xc4, 0x2d, 0x90, 0x58, 0x0, 0x46, 0xbb, 0xdf, 0x4, 0xa9, 0x88, 0xf8, 0x4e, 0xf3, 0x41, 0x27, 0x38, 0xd0, 0x1c, 0x4d, 0x75, 0x30, 0x1d, 0x75, 0xa8, 0x9c, 0xbb, 0xda, 0x1a, 0x4a, 0x77, 0x5d, 0x45, 0xb, 0x2a, 0x18, 0x5c, 0xf0, 0xe7, 0x8a, 0x13, 0x59, 0x51, 0x35, 0x82, 0xe3, 0xa, 0x1, 0xb5, 0x84, 0xc, 0xdb, 0x1c, 0x1e, 0x72, 0xc4, 0x4b, 0x76, 0x24, 0x18, 0x1, 0xc4, 0xa3, 0x28, 0x98, 0x62, 0xf4, 0x21, 0x80, 0x91, 0x28, 0xba, 0x81, 0x63, 0xff, 0x22, 0x81, 0xb8, 0x3d, 0x8d, 0xf1, 0x17, 0xc3, 0xf9, 0x95, 0x15, 0x2, 0xe0, 0xa1, 0x8f, 0xa5, 0x31, 0x89, 0x36, 0x21, 0x7, 0xe, 0x19, 0x2, 0xc7, 0xf1, 0x3d, 0xd4, 0x9d, 0x21, 0x9c, 0x6c, 0xaf, 0xa8, 0xdc, 0x70, 0xb6, 0x8c, 0xa1, 0x5d, 0x34, 0x5e, 0xa2, 0x4f, 0xbb, 0xa9, 0xa2, 0x2f, 0x93, 0xf8, 0xe3, 0xb3, 0xeb, 0x13, 0x88, 0xa8, 0xc7, 0xd9, 0x9d, 0x6d, 0xa8, 0xa5, 0x75, 0x69, 0x5f, 0x5f, 0x40, 0x95, 0x14, 0x51, 0xfc, 0x4f, 0x48, 0xea, 0x75, 0x70, 0x36, 0xf2, 0x15, 0x26, 0x2, 0xa, 0xf8, 0xee, 0x90, 0xca, 0xd7, 0x5b, 0xf5, 0x7c, 0xa7, 0x1b, 0x3a, 0xf0, 0x32, 0x69, 0xd6, 0xb8, 0x51, 0x56, 0x69, 0x59, 0x59, 0xa4, 0x81, 0x57, 0x95, 0x12, 0x55, 0x83, 0xe, 0x35, 0x11, 0x7f, 0x23, 0xff, 0x1b, 0x49, 0xe2, 0x7, 0xad, 0x95, 0xfd, 0x97, 0x60, 0xc3, 0x4f, 0x95, 0x78, 0xfe, 0x24, 0x52, 0xbb, 0x7a, 0x12, 0x70, 0xdd, 0x38, 0x47, 0xa8, 0x2c, 0x80, 0x72, 0x81, 0x57, 0x52, 0x28, 0x4e, 0xaa, 0xc4, 0xd8, 0xd6, 0xe2, 0x2e, 0xba, 0x3a, 0x53, 0x7, 0x2, 0xd8, 0x6b, 0x94, 0x5f, 0x5f, 0xe, 0x6a, 0xe8, 0xe4, 0x43, 0x67, 0x47, 0x78, 0xd2, 0x61, 0x83, 0xfc, 0x92, 0x6d, 0xa8, 0x42, 0x17, 0x5, 0x0, 0xba, 0x28, 0xab, 0xf0, 0x95, 0x21, 0x78, 0x3a, 0xc7, 0xd2, 0x31, 0x83, 0x33, 0xdc, 0x51, 0xc6, 0x9c, 0xa0, 0x82, 0x1c, 0xe2, 0x50, 0xff, 0x90, 0xe2, 0xf5, 0xf4, 0xce, 0xda, 0x38, 0x4c, 0x3, 0x11, 0x55, 0xe0, 0xc1, 0xb6, 0x18, 0xca, 0x36, 0xce, 0x98, 0x6, 0x4a, 0xf8, 0xdd, 0xfa, 0x51, 0x23, 0xb8, 0xd6, 0x6f, 0xe4, 0x5c, 0x99, 0xa5, 0xdb, 0x91, 0xa9, 0x3d, 0x2c, 0xc9, 0x6b, 0x98, 0x89, 0xc0, 0x9d, 0x2c, 0xf0, 0x82, 0x27, 0xd4, 0x65, 0xc4, 0xb9, 0x5b, 0x5, 0x27, 0x71, 0x9b, 0x5d, 0xe7, 0x19, 0x4b, 0xb0, 0x9, 0x2f, 0x93, 0x78, 0x26, 0x8a, 0x6, 0xdf, 0xb1, 0x49, 0x7c, 0xb7, 0xd0, 0xd8, 0x31, 0x4f, 0xb2, 0xc0, 0xb, 0x96, 0x60, 0xb8, 0x9f, 0xc5, 0x36, 0xe, 0xe5, 0x3f, 0xb0, 0x6b, 0x3b, 0x14, 0x4, 0x47, 0x94, 0xae, 0x34, 0x80, 0xe3, 0x88, 0x5b, 0x92, 0x4, 0xed, 0x3c, 0x3, 0x78, 0x79, 0x16, 0x78, 0xc1, 0xaa, 0x99, 0x5a, 0xdf, 0x9f, 0x68, 0xd7, 0x73, 0xa8, 0x8, 0x25, 0xf0, 0x75, 0x59, 0x3c, 0xd8, 0x81, 0x2d, 0x93, 0xf8, 0xce, 0xbb, 0x7c, 0xc5, 0x11, 0x4e, 0x57, 0xb, 0xbc, 0xe0, 0xc8, 0xcc, 0x9a, 0x9e, 0x69, 0xd7, 0x72, 0xa8, 0x8, 0x7, 0xed, 0xcf, 0xb0, 0x8d, 0x14, 0xaa, 0x2e, 0x49, 0x7c, 0xe7, 0xd, 0x89, 0x47, 0x17, 0xf5, 0xb1, 0xc0, 0xb, 0x8e, 0x74, 0x1c, 0x25, 0xb2, 0x1c, 0x36, 0xda, 0xb5, 0x1c, 0x3a, 0x9a, 0x61, 0x0, 0xa9, 0x55, 0x12, 0x9f, 0x87, 0xf3, 0x4c, 0xa7, 0x4, 0x21, 0x48, 0xa2, 0xb9, 0x5, 0x5e, 0x30, 0x94, 0x69, 0xee, 0xfb, 0xa, 0x8b, 0xa5, 0x94, 0x68, 0xa5, 0x21, 0x30, 0x93, 0xb5, 0xd9, 0xc6, 0x1b, 0xf6, 0xfd, 0x95, 0x16, 0x78, 0xc1, 0x90, 0x2e, 0x11, 0x51, 0x4d, 0xd2, 0xcf, 0xf8, 0x76, 0x83, 0x1a, 0x5b, 0x2c, 0xa5, 0x44, 0x8, 0xe1, 0x2b, 0x4f, 0xf1, 0x3b, 0xc8, 0x11, 0xd4, 0x4e, 0x16, 0xc4, 0xe4, 0xb6, 0xb6, 0xc0, 0xf3, 0x9f, 0x16, 0xf3, 0x35, 0x27, 0x49, 0x55, 0xc5, 0x6b, 0xea, 0x65, 0xb1, 0x94, 0x12, 0x21, 0xb6, 0xb6, 0xba, 0x61, 0x2e, 0x24, 0x43, 0xf8, 0xdc, 0x68, 0xb6, 0x11, 0x4, 0x7f, 0x77, 0x86, 0xdc, 0x4b, 0x4d, 0x89, 0x3f, 0xc5, 0xa9, 0x6e, 0xd4, 0x81, 0x87, 0x43, 0xd5, 0x1d, 0x6c, 0x17, 0x4, 0xdc, 0x97, 0x6e, 0x16, 0x78, 0x29, 0x53, 0x2b, 0x43, 0xc5, 0x4c, 0x25, 0x21, 0x7a, 0xbc, 0x61, 0xeb, 0xc1, 0xc9, 0xd2, 0x2f, 0x3, 0xee, 0x5, 0xd1, 0x52, 0x88, 0xc4, 0x41, 0xe8, 0xe2, 0xc5, 0x51, 0x7, 0x1e, 0x82, 0x6e, 0x75, 0x9d, 0x96, 0x33, 0x2, 0x54, 0x37, 0x21, 0xb5, 0x1f, 0x92, 0x68, 0x87, 0xe5, 0x79, 0x41, 0xba, 0xb0, 0x12, 0x84, 0xe7, 0x9c, 0x14, 0x55, 0x54, 0x4, 0x4b, 0xe8, 0x27, 0x43, 0x3d, 0x22, 0xf1, 0xfc, 0xb7, 0xa0, 0x4c, 0xc, 0xfd, 0xe4, 0x22, 0xe4, 0x33, 0x4e, 0x8a, 0x3a, 0xf0, 0x40, 0xfa, 0xf9, 0x64, 0xad, 0x29, 0x75, 0x82, 0x20, 0x80, 0xae, 0x4b, 0xc8, 0xc6, 0xd, 0xc5, 0x83, 0x7, 0x5, 0xf8, 0xfb, 0x8, 0x76, 0xd6, 0xe5, 0x4, 0xbf, 0xa0, 0x10, 0x4d, 0x85, 0x90, 0xfd, 0xae, 0x1f, 0x14, 0x82, 0xf8, 0x4d, 0x14, 0xfe, 0x6d, 0x18, 0xd0, 0xbd, 0xe0, 0xf1, 0x69, 0x2d, 0xd8, 0xc6, 0x73, 0x2e, 0x96, 0xee, 0xf, 0xc0, 0xc3, 0x80, 0xeb, 0x8a, 0xc8, 0xb7, 0xca, 0x5e, 0x9e, 0xca, 0xe9, 0x21, 0x41, 0xaf, 0xd7, 0xde, 0x35, 0x84, 0xab, 0x85, 0x21, 0x4e, 0x14, 0xc5, 0x6b, 0x91, 0x14, 0x8c, 0xf4, 0x9c, 0x9b, 0x2, 0xea, 0xc3, 0x10, 0xc3, 0x2e, 0xaf, 0x6c, 0x2a, 0x15, 0x1e, 0xa4, 0xa9, 0x2b, 0x8e, 0x23, 0x98, 0x62, 0x2, 0x1, 0xed, 0xb7, 0xd0, 0xd5, 0x2, 0x4, 0xcf, 0x72, 0x1c, 0x95, 0xf8, 0x81, 0xa8, 0x2, 0xf, 0xa0, 0x7b, 0x98, 0xed, 0x36, 0x46, 0xdb, 0x6b, 0x42, 0x9a, 0xcb, 0x38, 0x89, 0x47, 0xd8, 0x7f, 0xc5, 0x76, 0x18, 0xc6, 0x19, 0x65, 0xf2, 0xf4, 0x3, 0x4b, 0x90, 0xa6, 0x83, 0x10, 0xae, 0x2a, 0x3e, 0xfe, 0x7e, 0x77, 0x71, 0xca, 0x37, 0x80, 0xbe, 0x94, 0xf4, 0x9e, 0xe0, 0x8b, 0x47, 0xba, 0x7d, 0xc8, 0x36, 0xa, 0xde, 0xa2, 0xc2, 0x80, 0x5f, 0xe7, 0x7b, 0x0, 0xd9, 0xd, 0x6c, 0xa3, 0xec, 0xc7, 0x40, 0xd9, 0xc3, 0x83, 0x51, 0xa3, 0x6c, 0x7f, 0x3c, 0x42, 0x69, 0x3, 0x42, 0xa1, 0x9e, 0xfb, 0x3c, 0xfe, 0x3d, 0x44, 0xc7, 0x4f, 0xe3, 0x40, 0x83, 0xe0, 0xe4, 0x39, 0x53, 0xc2, 0x53, 0x8c, 0x17, 0x3b, 0xc3, 0x0, 0x89, 0x67, 0xe4, 0xa3, 0x76, 0xa, 0xc2, 0xb1, 0xda, 0xfb, 0xf0, 0xdb, 0x28, 0x1d, 0xf1, 0xa, 0xc1, 0x5f, 0x46, 0x5b, 0x2d, 0x9d, 0xfa, 0x2c, 0x5b, 0xb9, 0xe3, 0xe8, 0xf9, 0xef, 0xc2, 0xb9, 0x39, 0xc5, 0xc3, 0x7b, 0x40, 0xa2, 0x1d, 0xaa, 0x7c, 0xeb, 0xa, 0xe8, 0xa8, 0x4a, 0x80, 0xa7, 0xc1, 0xee, 0xf1, 0x91, 0xe1, 0x51, 0x6, 0x1e, 0xa4, 0xc, 0x12, 0x5f, 0xf5, 0x73, 0x6, 0x30, 0x99, 0x8f, 0x8b, 0xfb, 0x65, 0x18, 0x1a, 0x11, 0xe4, 0xd3, 0xd, 0x9b, 0x6e, 0x32, 0x25, 0xf8, 0x4a, 0x89, 0x17, 0x5c, 0xd, 0x3, 0xe1, 0x81, 0x8e, 0x88, 0xfe, 0xd0, 0x7, 0xd8, 0x8, 0x3c, 0xfe, 0x8c, 0xea, 0x7a, 0x35, 0x8f, 0x7e, 0x13, 0xa5, 0x20, 0xde, 0x96, 0x78, 0x6d, 0xd5, 0x9b, 0x25, 0x1e, 0x7f, 0x99, 0xe, 0xc1, 0xa1, 0xd1, 0x8b, 0xea, 0xb3, 0x70, 0xc7, 0x9b, 0xc2, 0xdd, 0xdc, 0x6d, 0xd5, 0xf3, 0x22, 0xda, 0xa4, 0xe7, 0xf2, 0x3d, 0xd6, 0x1c, 0x32, 0xe2, 0x67, 0xec, 0xed, 0xb, 0x51, 0xf7, 0xb8, 0xe1, 0x1, 0x1c, 0x28, 0xe3, 0xa7, 0x33, 0x95, 0x51, 0xf, 0x12, 0x2e, 0xe7, 0x13, 0xd2, 0xbc, 0x2e, 0xa2, 0x63, 0x8e, 0x16, 0xa7, 0xea, 0xd6, 0x3c, 0xda, 0x26, 0x0, 0x34, 0x2a, 0x49, 0xd, 0xe7, 0x84, 0xeb, 0x87, 0x3a, 0x9a, 0x55, 0xd4, 0xaa, 0x84, 0x60, 0xcc, 0xde, 0x22, 0xe0, 0x74, 0xb0, 0x32, 0xce, 0xa2, 0x46, 0x52, 0x6d, 0x86, 0xdd, 0x5a, 0xdb, 0x85, 0xdf, 0xc0, 0xf8, 0xa1, 0x4a, 0x38, 0x32, 0xd3, 0x51, 0x3e, 0xf0, 0x40, 0x43, 0x38, 0x3e, 0xe2, 0xe2, 0xbd, 0x6c, 0x22, 0x18, 0xa0, 0xed, 0x20, 0x82, 0x28, 0x87, 0xf6, 0x2b, 0xee, 0x65, 0xb0, 0xc4, 0x1f, 0xf2, 0x59, 0x19, 0xc2, 0xb5, 0x90, 0x4d, 0x8f, 0xda, 0x31, 0x2f, 0x1b, 0x8e, 0x94, 0xf7, 0xb9, 0xbe, 0x3e, 0xff, 0xb9, 0x2f, 0xef, 0xf, 0xae, 0x6e, 0x48, 0x6c, 0x64, 0xa2, 0xeb, 0x67, 0xe, 0x1c, 0x43, 0xfd, 0x7f, 0x22, 0x55, 0xc1, 0x1a, 0x29, 0xa8, 0x12, 0x50, 0x55, 0xee, 0xa0, 0x24, 0xc3, 0xc0, 0x22, 0xef, 0x4f, 0x57, 0x2d, 0x7b, 0x93, 0x3b, 0xde, 0xc8, 0x4, 0xb0, 0xa1, 0xce, 0x8b, 0x3e, 0x57, 0xbc, 0x91, 0xbf, 0x9f, 0xe9, 0x34, 0x8f, 0xc0, 0x18, 0x21, 0xf1, 0x43, 0x6c, 0x3c, 0xa3, 0x60, 0x2c, 0x55, 0x68, 0xd4, 0x48, 0x41, 0xea, 0x55, 0x43, 0x49, 0x3e, 0x44, 0x2f, 0x8f, 0xea, 0xf8, 0x30, 0x8e, 0xdf, 0x7, 0x12, 0xaf, 0x10, 0xb0, 0x96, 0x2, 0xf2, 0x1, 0xf, 0xee, 0xa5, 0x9c, 0x3b, 0xf6, 0x19, 0x9c, 0xb, 0x50, 0x4b, 0xde, 0xc3, 0xb7, 0xb4, 0xff, 0xbb, 0x25, 0xb9, 0xe, 0xe, 0xe0, 0x3d, 0xc0, 0x16, 0x9d, 0x25, 0x4e, 0x3d, 0xd8, 0xee, 0xfc, 0xdf, 0x66, 0xee, 0xd6, 0x0, 0xe3, 0xd2, 0x7d, 0x5d, 0xc8, 0xeb, 0x1a, 0x9a, 0x99, 0x42, 0x5f, 0x53, 0x8a, 0xff, 0x59, 0x1c, 0x77, 0x39, 0xee, 0xbb, 0x37, 0x79, 0x5, 0x8d, 0xf9, 0x79, 0x34, 0x86, 0x35, 0x68, 0x70, 0xe, 0x87, 0xd2, 0x7c, 0x28, 0x61, 0xd7, 0x9a, 0x93, 0x95, 0xf8, 0xec, 0x80, 0x52, 0xaa, 0x95, 0xf, 0x1a, 0xc6, 0x7c, 0x22, 0x2d, 0x20, 0x28, 0xa1, 0x8e, 0xa0, 0xf2, 0xd6, 0x5d, 0x12, 0xcf, 0x17, 0x4c, 0x65, 0x87, 0xf0, 0x9b, 0x76, 0xb1, 0xaf, 0x78, 0x72, 0x13, 0x72, 0xe3, 0xfa, 0x72, 0x4c, 0x1a, 0x71, 0xb7, 0x18, 0x4c, 0x95, 0x74, 0x21, 0xed, 0x98, 0x65, 0x4, 0xd0, 0x4e, 0xf6, 0x17, 0x42, 0xbd, 0x2e, 0x3f, 0xdf, 0x9a, 0xc0, 0x6d, 0x96, 0x20, 0xec, 0xf1, 0x1b, 0xcf, 0x52, 0x98, 0xad, 0xf0, 0xf8, 0x7e, 0x26, 0x4b, 0xbc, 0xee, 0xe7, 0x50, 0xa, 0x8d, 0xa6, 0x6c, 0x83, 0x97, 0x13, 0x88, 0xf3, 0xd9, 0xd6, 0xc9, 0xd3, 0x50, 0xb1, 0x51, 0x3d, 0xd, 0x4e, 0xba, 0xc3, 0xb8, 0xb3, 0x99, 0x5, 0x95, 0xb6, 0x73, 0x8c, 0xee, 0x11, 0xa7, 0xe2, 0x5a, 0x52, 0x14, 0x33, 0x16, 0x5a, 0x79, 0xc4, 0xc1, 0xb7, 0x89, 0x83, 0x3e, 0x8e, 0x52, 0xf7, 0x1c, 0x2e, 0xa4, 0x26, 0xe4, 0xb3, 0x53, 0x58, 0x90, 0xd8, 0x3d, 0xff, 0x4d, 0x87, 0x40, 0x32, 0xcf, 0x21, 0x47, 0x76, 0x35, 0xca, 0xdc, 0x15, 0x48, 0xe5, 0x82, 0xa6, 0x4b, 0x8c, 0x39, 0x2a, 0xf3, 0x79, 0xdc, 0x16, 0x52, 0x58, 0x41, 0x68, 0xf5, 0xe1, 0xce, 0x84, 0x1a, 0xa2, 0xb9, 0xdc, 0xed, 0x75, 0x1, 0xdf, 0x54, 0x68, 0x1, 0x1d, 0x11, 0x4f, 0xed, 0xcd, 0xf9, 0xe0, 0x11, 0xa1, 0x8a, 0xd9, 0xbd, 0x5c, 0x3, 0xfd, 0xe8, 0x74, 0xeb, 0x48, 0x20, 0x35, 0x25, 0xf7, 0x4c, 0xe2, 0x3a, 0x15, 0x14, 0xd4, 0x13, 0x28, 0x38, 0x16, 0xa7, 0xda, 0x91, 0x18, 0x75, 0xe0, 0x6, 0xc9, 0x6c, 0x8f, 0x11, 0xa1, 0xaf, 0x28, 0xbd, 0x5b, 0x52, 0xfd, 0x0, 0x18, 0xe, 0xe7, 0xee, 0x56, 0x9d, 0xea, 0x44, 0x29, 0x25, 0xf7, 0x36, 0x2, 0x56, 0x67, 0x3a, 0xcf, 0xa4, 0x9a, 0x84, 0x85, 0x93, 0xca, 0xd9, 0xdc, 0x6a, 0xaa, 0xb5, 0x9d, 0xa5, 0x72, 0xa9, 0x4a, 0x4f, 0xd2, 0x78, 0xdf, 0x44, 0x69, 0x1c, 0x4, 0x2d, 0xa6, 0x1a, 0x7d, 0x3f, 0x77, 0xaf, 0x6e, 0xdc, 0x41, 0xda, 0x53, 0x70, 0xd5, 0xe4, 0xee, 0x50, 0x8d, 0xbb, 0xda, 0x4e, 0xa, 0x29, 0xf4, 0x79, 0x1d, 0xed, 0xed, 0xd9, 0xb4, 0xb1, 0x67, 0x49, 0x70, 0xf, 0x7d, 0xd1, 0x8e, 0x97, 0x47, 0xe9, 0x6c, 0x3b, 0x92, 0x26, 0x4, 0xec, 0xb2, 0xb6, 0xc4, 0x42, 0xd, 0xae, 0x85, 0xdd, 0xdc, 0xd1, 0xb6, 0x72, 0x37, 0x9f, 0xcf, 0xf9, 0x87, 0x76, 0x33, 0x57, 0xf6, 0x70, 0x4c, 0x90, 0x2c, 0xfd, 0x57, 0x80, 0x1, 0x0, 0xc5, 0xb1, 0xf0, 0x59, 0xcd, 0x2e, 0xe2, 0x4, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; @@ -33,14 +17,6 @@ + (NSData *)parse_logo_png { return [NSData dataWithBytes:parse_logo_png length:sizeof(parse_logo_png)]; } - static const unsigned char facebook_icon3x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x42, 0x8, 0x6, 0x0, 0x0, 0x0, 0xe3, 0x54, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x39, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x41, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x37, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x38, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0x90, 0x6f, 0x2b, 0x47, 0x0, 0x0, 0x3, 0x4d, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x9c, 0xdf, 0x4b, 0x53, 0x61, 0x18, 0xc7, 0xcf, 0x39, 0x9b, 0x4e, 0xdc, 0x28, 0x6d, 0xb3, 0xd4, 0xd9, 0x36, 0x1c, 0x4a, 0x2c, 0x49, 0xa2, 0x1b, 0x17, 0x24, 0xde, 0xc8, 0x48, 0x85, 0xa3, 0x5e, 0xf4, 0x17, 0x94, 0xd2, 0xa5, 0x5e, 0x8c, 0x6, 0x42, 0x41, 0x46, 0x30, 0x6, 0x61, 0x74, 0x57, 0xd7, 0x43, 0x2f, 0x92, 0xae, 0x84, 0x89, 0x45, 0x9b, 0x3f, 0x82, 0x5, 0xf9, 0xa3, 0x99, 0x76, 0xe3, 0x61, 0x3, 0x65, 0x84, 0xc2, 0xf4, 0xa0, 0xec, 0x6c, 0x3b, 0x3b, 0x3d, 0xcb, 0x6e, 0xba, 0x48, 0x5f, 0x73, 0x9c, 0xce, 0xf6, 0x3e, 0xf, 0x1c, 0x36, 0xb6, 0x67, 0xe7, 0x3d, 0xfb, 0xec, 0xf9, 0xf1, 0x7d, 0xde, 0x3, 0x63, 0x19, 0x30, 0x97, 0xcb, 0x65, 0xb, 0x4, 0x2, 0xcf, 0xdc, 0x6e, 0xf7, 0x9d, 0x9a, 0x9a, 0x1a, 0x3, 0xbc, 0xa4, 0x30, 0xe5, 0x6d, 0xec, 0xe1, 0xe1, 0x61, 0xf6, 0xb, 0xd8, 0xd8, 0xd8, 0xd8, 0xe3, 0x48, 0x24, 0xb2, 0x5a, 0x80, 0x60, 0xdf, 0xda, 0xda, 0x8a, 0x29, 0x94, 0x5a, 0x2a, 0x95, 0xda, 0xe9, 0xea, 0xea, 0xba, 0xc9, 0x84, 0x42, 0xa1, 0xa0, 0x42, 0xb9, 0xad, 0xac, 0xac, 0x7c, 0x60, 0x45, 0x51, 0xdc, 0x36, 0x99, 0x4c, 0x8d, 0xc, 0xc5, 0x96, 0xcf, 0xe7, 0xf, 0x38, 0x80, 0xc0, 0x31, 0x94, 0x1b, 0xc7, 0x71, 0x2c, 0x47, 0x41, 0x61, 0x24, 0x31, 0x85, 0x43, 0x6, 0xbf, 0xa3, 0x2, 0x11, 0x20, 0x88, 0xb2, 0x2, 0x91, 0x83, 0xee, 0x97, 0x85, 0x47, 0xf9, 0xbc, 0x27, 0xd2, 0x97, 0xd0, 0x97, 0xce, 0x80, 0x10, 0x5c, 0x9c, 0x9f, 0x9f, 0xff, 0xb8, 0xbc, 0xbc, 0xbc, 0x9a, 0x48, 0x24, 0xb6, 0x41, 0x1d, 0x8a, 0x70, 0xe4, 0xcd, 0x66, 0xb3, 0xe, 0xde, 0xaf, 0x80, 0xc3, 0x0, 0xcf, 0x8d, 0xd5, 0xd5, 0xd5, 0x17, 0xea, 0xea, 0xea, 0xcc, 0x9d, 0x9d, 0x9d, 0xb7, 0x7, 0x6, 0x6, 0x1e, 0x90, 0x95, 0x4b, 0x45, 0xd9, 0xd1, 0xb8, 0xde, 0x91, 0x82, 0xc1, 0xe0, 0xcb, 0x8e, 0x8e, 0xe, 0xd7, 0x59, 0xc9, 0xf5, 0xf5, 0xf5, 0xb9, 0x9, 0xd7, 0xd8, 0xd7, 0x74, 0x44, 0x8, 0x82, 0xf0, 0x75, 0x68, 0x68, 0xe8, 0xfe, 0xdc, 0xdc, 0x5c, 0xf4, 0x5f, 0x3e, 0xf, 0x91, 0x61, 0x2c, 0xf9, 0xd4, 0x88, 0xc5, 0x62, 0x8b, 0xf0, 0x8b, 0xf2, 0xf1, 0x78, 0x7c, 0x8f, 0xda, 0x62, 0x99, 0x4c, 0x26, 0x5, 0x9e, 0xe7, 0x7, 0xd5, 0x82, 0xa0, 0x59, 0x10, 0xa3, 0xa3, 0xa3, 0xf, 0x61, 0x22, 0xfe, 0x41, 0x75, 0xfb, 0x8c, 0x46, 0xa3, 0x33, 0x93, 0x93, 0x93, 0x21, 0xea, 0x75, 0xc4, 0xc4, 0xc4, 0xc4, 0x2b, 0xa8, 0xe2, 0x74, 0xb, 0xaa, 0x54, 0x2a, 0xb5, 0x3d, 0x3b, 0x3b, 0x1b, 0x2e, 0x9a, 0xf0, 0xc8, 0x64, 0x8e, 0x4a, 0xb2, 0x6b, 0x80, 0x60, 0xfa, 0xbc, 0xbb, 0xbb, 0x4b, 0x7c, 0xf1, 0x6d, 0x6d, 0x6d, 0xf6, 0xfe, 0xfe, 0xfe, 0xbb, 0x2d, 0x2d, 0x2d, 0x2e, 0x10, 0x50, 0x26, 0x96, 0x65, 0xff, 0x90, 0x48, 0xf5, 0xf5, 0xf5, 0xd6, 0x92, 0x4, 0xb1, 0xbe, 0xbe, 0xbe, 0x46, 0xea, 0x3b, 0x3c, 0x3c, 0x3c, 0x8, 0x69, 0xf4, 0xc6, 0x60, 0x30, 0xd4, 0x96, 0x5d, 0x6a, 0x80, 0x6c, 0x4e, 0x90, 0xf8, 0xd9, 0xed, 0x76, 0xb, 0x40, 0x78, 0x5d, 0x2c, 0x8, 0x9a, 0x3, 0x1, 0x73, 0xc3, 0x3e, 0x89, 0x1f, 0xcc, 0x10, 0x6e, 0x80, 0x70, 0xa9, 0x6c, 0x8b, 0x25, 0xe4, 0x38, 0xd1, 0x14, 0xd9, 0xdc, 0xdc, 0x6c, 0xc3, 0x31, 0xbc, 0x50, 0xd8, 0xf4, 0xfa, 0xa, 0x4, 0x71, 0x3c, 0x31, 0x2b, 0x8, 0x82, 0xa6, 0x59, 0x3, 0x41, 0x20, 0x88, 0x63, 0xab, 0xac, 0xac, 0x24, 0x2a, 0x82, 0x55, 0x55, 0x55, 0x86, 0xa2, 0x17, 0x60, 0x15, 0xf7, 0x18, 0xe2, 0xd3, 0xd3, 0xd3, 0x6f, 0x4f, 0xea, 0x9e, 0x20, 0xb1, 0x37, 0x48, 0xce, 0x15, 0x89, 0x44, 0x3e, 0x19, 0x8d, 0xc6, 0x17, 0xcc, 0x29, 0x37, 0xa7, 0x7a, 0x7a, 0x7a, 0x3c, 0xe, 0x87, 0xe3, 0x3a, 0x69, 0x5, 0x56, 0x65, 0xcf, 0x32, 0x1c, 0xe, 0xcf, 0xa8, 0x1d, 0x61, 0xb0, 0xe6, 0x3b, 0xd2, 0x3d, 0x4b, 0xd5, 0x52, 0x43, 0xa7, 0xd3, 0xa9, 0x3a, 0xd7, 0x80, 0xf2, 0x64, 0x6d, 0x36, 0x9b, 0x93, 0xfa, 0x62, 0x69, 0xb1, 0x58, 0x2e, 0xc2, 0x44, 0x7a, 0x85, 0x7a, 0x10, 0xd, 0xd, 0xd, 0x97, 0xa1, 0x8e, 0xd4, 0x52, 0xf, 0xc2, 0x6a, 0xb5, 0x36, 0x9e, 0xa5, 0x19, 0x94, 0x2d, 0x8, 0xe8, 0x16, 0x76, 0x14, 0x54, 0xc7, 0x13, 0xaa, 0x3, 0x41, 0x30, 0xbf, 0x36, 0x6f, 0xb4, 0x9, 0x42, 0x96, 0xe5, 0x9c, 0x9a, 0x20, 0x9a, 0x9a, 0x9a, 0xae, 0x6a, 0x52, 0x59, 0x3a, 0x9d, 0xce, 0x6b, 0x81, 0x40, 0xe0, 0xe9, 0x49, 0xca, 0x12, 0x94, 0x67, 0x70, 0x69, 0x69, 0xe9, 0xdb, 0x69, 0xe7, 0xf2, 0x78, 0x3c, 0xee, 0xee, 0xee, 0xee, 0xde, 0xbf, 0x29, 0x4b, 0xd0, 0x2c, 0x6c, 0x6b, 0x6b, 0xeb, 0x8d, 0xb3, 0xce, 0xf6, 0x9a, 0xb9, 0x1b, 0x3e, 0x32, 0x32, 0x72, 0x8f, 0xe4, 0x9a, 0xfd, 0x7e, 0xbf, 0xb7, 0xc8, 0x4b, 0xef, 0x6b, 0xaa, 0x46, 0x48, 0x92, 0x94, 0x25, 0xf1, 0x4b, 0xa7, 0xd3, 0x12, 0x8e, 0xe1, 0xb8, 0x1f, 0x81, 0x20, 0x10, 0x4, 0x82, 0x40, 0x10, 0x8, 0x2, 0x41, 0x20, 0x8, 0x4, 0x81, 0x20, 0x10, 0x4, 0x82, 0x40, 0x10, 0x8, 0x2, 0x41, 0x20, 0x8, 0x4, 0x51, 0x7e, 0x20, 0x58, 0xc4, 0xc0, 0xb0, 0x9c, 0x24, 0x49, 0x88, 0xa1, 0x10, 0x11, 0x85, 0xbf, 0xe, 0xa0, 0x1d, 0x82, 0x20, 0x8, 0xdf, 0x39, 0xaf, 0xd7, 0xeb, 0x13, 0x45, 0x31, 0xa9, 0x95, 0x10, 0x2d, 0xb2, 0xdf, 0xa9, 0x26, 0xcb, 0xf2, 0x91, 0xcf, 0xe7, 0x7b, 0xa4, 0x5f, 0x58, 0x58, 0x58, 0xe3, 0x79, 0xbe, 0xd7, 0xef, 0xf7, 0x3f, 0x6f, 0x6f, 0x6f, 0xbf, 0x55, 0x1, 0xf6, 0x1f, 0x41, 0x64, 0x9, 0xfd, 0xa, 0xf9, 0x7c, 0x70, 0x9e, 0x85, 0x72, 0xb9, 0x9c, 0xbc, 0xb9, 0xb9, 0xb9, 0x31, 0x3e, 0x3e, 0xfe, 0x64, 0x6a, 0x6a, 0xea, 0xfd, 0x4f, 0x1, 0x6, 0x0, 0xec, 0x28, 0x31, 0x86, 0x11, 0x87, 0xbb, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)facebook_icon3x_png { - return [NSData dataWithBytes:facebook_icon3x_png length:sizeof(facebook_icon3x_png)]; - } - static const unsigned char apple_icon2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x2c, 0x8, 0x6, 0x0, 0x0, 0x0, 0xd, 0x53, 0x1a, 0xf5, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x3, 0x6, 0x49, 0x44, 0x41, 0x54, 0x58, 0x9, 0xcd, 0x98, 0xcb, 0x6b, 0xd5, 0x40, 0x14, 0xc6, 0x9b, 0xd6, 0x7, 0x6d, 0x15, 0x8a, 0x50, 0x8a, 0x6e, 0xac, 0xd7, 0xc7, 0x42, 0x41, 0xdd, 0x15, 0xc5, 0x95, 0xf, 0x5c, 0x54, 0xea, 0xc2, 0x85, 0x2b, 0xbb, 0x10, 0x51, 0xa4, 0x20, 0x8, 0xba, 0xf3, 0xf, 0xd0, 0xae, 0x4a, 0x2b, 0xae, 0xc4, 0x85, 0x28, 0x2a, 0xea, 0x4a, 0xc4, 0x85, 0xd5, 0x5a, 0x1f, 0x28, 0x28, 0x15, 0xc1, 0x6e, 0x4a, 0x11, 0x6f, 0xb5, 0xa8, 0x20, 0x22, 0x14, 0xb9, 0x95, 0xda, 0x5e, 0x7f, 0xdf, 0x35, 0x49, 0x27, 0x93, 0xe4, 0xf6, 0xa, 0x66, 0xe2, 0x81, 0x8f, 0x39, 0xe7, 0xcc, 0xc9, 0x7c, 0x1f, 0x93, 0xcc, 0x64, 0x92, 0xba, 0xba, 0xc, 0xad, 0x5c, 0x2e, 0x17, 0xc0, 0x59, 0x30, 0x2, 0xae, 0x64, 0x48, 0x55, 0x7d, 0x68, 0xc8, 0x9b, 0x41, 0x1f, 0x98, 0x5, 0x81, 0x5d, 0xad, 0x7e, 0xd5, 0x9f, 0xde, 0x45, 0xb5, 0x14, 0xfd, 0x4d, 0xd, 0xec, 0x2b, 0xa9, 0xbf, 0xf, 0x36, 0x59, 0xd7, 0x15, 0xad, 0x38, 0xfb, 0x10, 0x31, 0x2d, 0x60, 0x2c, 0x98, 0x12, 0xab, 0xdd, 0x99, 0xbd, 0x2, 0x8b, 0x1, 0x1, 0x37, 0x2d, 0x11, 0x41, 0x58, 0xc4, 0xf9, 0xe7, 0x77, 0xc3, 0xa2, 0x8f, 0x86, 0x10, 0xee, 0x8, 0xd8, 0x13, 0xda, 0x63, 0xd1, 0x6a, 0x7, 0x11, 0x22, 0xd2, 0x66, 0x67, 0x88, 0xbe, 0x7a, 0x7, 0x12, 0xe6, 0x29, 0x20, 0x5c, 0x2, 0x7e, 0x0, 0xdb, 0xde, 0x90, 0x68, 0x9d, 0xaf, 0x74, 0xe4, 0x41, 0xba, 0xce, 0x56, 0x42, 0xac, 0x19, 0x5b, 0xe1, 0x48, 0x42, 0x94, 0x6, 0xe2, 0xe, 0x5f, 0xd0, 0x4f, 0xda, 0xbb, 0x60, 0x6f, 0xb4, 0xa2, 0xf6, 0xc8, 0xab, 0xa5, 0x14, 0x2, 0xed, 0x2d, 0xab, 0xc0, 0x1c, 0x18, 0xf7, 0x3c, 0x6f, 0xca, 0xbc, 0x8e, 0x7e, 0xad, 0x20, 0xf5, 0x4f, 0xd2, 0x37, 0x1b, 0xf4, 0x91, 0x6f, 0xc2, 0x5f, 0xb, 0xa, 0xa0, 0x19, 0x7c, 0x2, 0xaf, 0xec, 0xeb, 0xc9, 0x2d, 0x6c, 0xc, 0xb6, 0x1, 0xf4, 0x83, 0x9, 0x60, 0xdb, 0x5b, 0x12, 0x67, 0x40, 0xbb, 0x3d, 0x12, 0xb9, 0x26, 0x70, 0x8, 0xdc, 0x1, 0xd3, 0xc0, 0x36, 0xed, 0xde, 0x7a, 0x95, 0x9c, 0x0, 0x8d, 0xf6, 0xf5, 0xb1, 0x19, 0xf2, 0x8b, 0xce, 0x51, 0x78, 0x1c, 0x2c, 0xb4, 0x77, 0x94, 0xa9, 0x79, 0x4, 0x86, 0xc1, 0x37, 0xd0, 0x1, 0xba, 0xc0, 0x72, 0x50, 0x8b, 0x69, 0xf7, 0x3e, 0xcc, 0x8c, 0x3d, 0x4c, 0x2c, 0x46, 0x4c, 0x2b, 0x78, 0xe, 0x5c, 0xda, 0xc, 0x64, 0xdd, 0x31, 0x41, 0x24, 0x1b, 0x81, 0x96, 0x69, 0x1e, 0x26, 0x51, 0xbb, 0x24, 0xca, 0xdc, 0xb0, 0x2e, 0x10, 0x6f, 0x8e, 0x29, 0x75, 0x93, 0x18, 0x85, 0x66, 0x22, 0xa4, 0x42, 0xdd, 0xf6, 0x3c, 0xa6, 0xc5, 0xe7, 0x7c, 0x4a, 0xbb, 0x2c, 0x14, 0x23, 0x87, 0xc4, 0xbd, 0x9c, 0x4, 0xbd, 0x87, 0xb7, 0xc5, 0x14, 0xe3, 0x91, 0x58, 0x43, 0xe2, 0x9d, 0x99, 0x74, 0xe8, 0xef, 0x66, 0x85, 0x3d, 0x30, 0xf9, 0xf4, 0xc, 0xed, 0x31, 0x13, 0xe, 0xfd, 0x61, 0x5b, 0x8c, 0xb8, 0x25, 0xa8, 0xf2, 0x74, 0x3b, 0x14, 0x12, 0x50, 0x25, 0x1e, 0x69, 0x25, 0x68, 0x7d, 0x50, 0xe1, 0xb8, 0x1d, 0x4c, 0xe2, 0x93, 0x20, 0xf7, 0xc7, 0x3, 0xd6, 0x11, 0xbc, 0x1f, 0xff, 0x27, 0x41, 0x25, 0x9e, 0x9f, 0x99, 0x34, 0x41, 0xd3, 0x49, 0x1d, 0x19, 0xe7, 0xf4, 0x2, 0x4e, 0x7c, 0xdf, 0xe9, 0x96, 0x7d, 0xc9, 0x98, 0x3c, 0x6d, 0xf8, 0xd5, 0x49, 0x1d, 0x79, 0xa, 0xda, 0x97, 0x26, 0xe8, 0x73, 0x52, 0x87, 0x83, 0x9c, 0xce, 0x4c, 0x9a, 0x90, 0x88, 0x29, 0x31, 0x12, 0xc9, 0xb8, 0xb, 0x36, 0x42, 0x75, 0xd4, 0xa6, 0x93, 0xa0, 0x21, 0x3b, 0xe9, 0x30, 0xee, 0x65, 0x96, 0xb6, 0x98, 0x7c, 0x7a, 0x97, 0xe9, 0x54, 0xa8, 0xd3, 0x5e, 0xe2, 0x53, 0x6f, 0x16, 0x67, 0xe4, 0xeb, 0x9c, 0xdd, 0xc9, 0x36, 0xf0, 0x5a, 0xe3, 0xd7, 0xe3, 0xfc, 0xa2, 0x7d, 0xac, 0x20, 0x27, 0xd3, 0x7, 0xc4, 0x13, 0x26, 0xa6, 0x7, 0x34, 0x54, 0xce, 0xd4, 0x38, 0x7, 0x49, 0x5e, 0xcf, 0x49, 0x90, 0x49, 0x7b, 0x39, 0x10, 0xb4, 0x98, 0xec, 0x7, 0xd0, 0x66, 0xf6, 0xe6, 0xe0, 0x77, 0x57, 0x96, 0x9d, 0xbf, 0x8d, 0x5f, 0xca, 0x41, 0x80, 0x49, 0xf9, 0x95, 0xe0, 0x56, 0x45, 0x90, 0x9f, 0xd5, 0x99, 0xba, 0x64, 0x56, 0x38, 0xf6, 0x7, 0x98, 0x98, 0x52, 0x28, 0x88, 0x40, 0x6f, 0xdf, 0x5e, 0xc7, 0x22, 0x2, 0x3a, 0xcd, 0x4e, 0x7f, 0x10, 0x84, 0x2d, 0xf, 0xb7, 0x3e, 0x85, 0x74, 0xce, 0x75, 0x6d, 0x47, 0x42, 0x11, 0xb6, 0x83, 0x92, 0x2e, 0xc7, 0x6a, 0x9e, 0xc1, 0x57, 0x59, 0x5c, 0xb6, 0x96, 0x30, 0xa6, 0x60, 0xc0, 0x91, 0xa8, 0xef, 0xf0, 0xb4, 0x87, 0xc4, 0x69, 0xe, 0x45, 0x4b, 0xc1, 0xcb, 0x8c, 0x45, 0xcd, 0x31, 0xfe, 0x81, 0x34, 0xd, 0xb1, 0x3c, 0xc5, 0x6d, 0x60, 0x3c, 0x43, 0x51, 0x27, 0x63, 0xa4, 0x24, 0xaa, 0xde, 0x3b, 0xc4, 0x14, 0xa8, 0xb9, 0xd, 0xb6, 0x26, 0x5d, 0x4c, 0x6e, 0xc, 0xdc, 0x0, 0xfa, 0x14, 0x2e, 0x82, 0x6, 0xa0, 0x8f, 0x86, 0xfd, 0xa0, 0x13, 0x68, 0xc3, 0xb5, 0x4d, 0x27, 0xd4, 0xd3, 0xac, 0xea, 0xf3, 0x76, 0x47, 0x4d, 0x31, 0xa2, 0xf4, 0xff, 0x50, 0xff, 0x82, 0x5e, 0x80, 0x29, 0x30, 0xa, 0x2e, 0x82, 0x6d, 0xd5, 0x6, 0xa0, 0x5f, 0x7f, 0x52, 0x4e, 0x81, 0x41, 0xa0, 0x95, 0xab, 0x5f, 0xc3, 0xd7, 0x80, 0x8e, 0x1d, 0xa9, 0xf6, 0x1b, 0xf5, 0x4e, 0xf9, 0x49, 0xea, 0xad, 0xd1, 0x32, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; @@ -49,14 +25,6 @@ + (NSData *)apple_icon2x_png { return [NSData dataWithBytes:apple_icon2x_png length:sizeof(apple_icon2x_png)]; } - static const unsigned char twitter_icon2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x24, 0x8, 0x6, 0x0, 0x0, 0x0, 0xf2, 0xd7, 0xd8, 0x6c, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x0, 0x9, 0x70, 0x48, 0x59, 0x73, 0x0, 0x0, 0x2e, 0x23, 0x0, 0x0, 0x2e, 0x23, 0x1, 0x78, 0xa5, 0x3f, 0x76, 0x0, 0x0, 0x1, 0xcb, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x34, 0x2e, 0x30, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x74, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x3c, 0x2f, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x31, 0x3c, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0xa, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0xa, 0x29, 0x2e, 0xcd, 0x3d, 0x0, 0x0, 0x5, 0xbd, 0x49, 0x44, 0x41, 0x54, 0x58, 0x9, 0xc5, 0x98, 0x5b, 0xa8, 0x95, 0x45, 0x14, 0xc7, 0xdd, 0x9e, 0xa3, 0x42, 0x56, 0x50, 0x91, 0x5, 0x86, 0x9c, 0xae, 0x44, 0x50, 0x68, 0x46, 0xd1, 0x85, 0x12, 0x7a, 0x28, 0x22, 0x88, 0xa0, 0x22, 0x2, 0xe9, 0x25, 0x90, 0x82, 0xea, 0x21, 0xe8, 0xf6, 0x90, 0xd1, 0x4b, 0x29, 0xbd, 0x56, 0x4, 0x81, 0x51, 0x50, 0xd4, 0x93, 0x2f, 0x85, 0x74, 0x21, 0x3a, 0xa6, 0x60, 0x54, 0x90, 0x12, 0x89, 0x91, 0xfa, 0x90, 0x5d, 0xf5, 0xa1, 0x9b, 0x78, 0x3d, 0xbb, 0xdf, 0x6f, 0xed, 0x59, 0xdf, 0xf9, 0xbe, 0x7d, 0xf6, 0xf6, 0xec, 0xbd, 0xf, 0xda, 0x82, 0xff, 0x59, 0x6b, 0xd6, 0xcc, 0xac, 0xf9, 0xcf, 0xcc, 0x9a, 0xd9, 0xf3, 0x9d, 0x79, 0xf3, 0x90, 0x76, 0xbb, 0xdd, 0x52, 0x2b, 0xd8, 0xf3, 0x3b, 0xd6, 0xdc, 0xff, 0xd6, 0x63, 0x61, 0x4f, 0x80, 0xe7, 0xc1, 0x24, 0xf8, 0x19, 0x1c, 0x7, 0x3f, 0x81, 0xcf, 0xc0, 0x33, 0xe0, 0x82, 0x1c, 0x11, 0x7b, 0x1, 0x18, 0xcf, 0xb2, 0x9a, 0xf2, 0x32, 0xd0, 0xd2, 0x8, 0xb2, 0xe8, 0xd3, 0xc0, 0xe9, 0xa5, 0x72, 0xac, 0xde, 0x78, 0x14, 0x9b, 0x58, 0x55, 0xc, 0x6c, 0x89, 0x1e, 0x4, 0x75, 0x99, 0xaa, 0x17, 0xb0, 0xff, 0x6, 0x4f, 0x74, 0x8f, 0x85, 0x6f, 0x5, 0xf8, 0x10, 0x3c, 0x1b, 0x75, 0x18, 0x31, 0x13, 0xf4, 0x23, 0x60, 0x5b, 0x76, 0x48, 0x7f, 0x96, 0x87, 0xd1, 0xf4, 0x8d, 0x5d, 0x42, 0xb7, 0xc0, 0x46, 0x90, 0x72, 0x4, 0x43, 0x1c, 0x3, 0x12, 0x56, 0xa7, 0xf, 0x33, 0xe4, 0x2d, 0xfe, 0xde, 0x8, 0xd6, 0x82, 0xcd, 0x40, 0x39, 0x4, 0xce, 0x4b, 0xc2, 0xb9, 0xc2, 0x9b, 0xa2, 0xaa, 0xdd, 0x7e, 0x27, 0xc9, 0x51, 0x6e, 0x6c, 0x4b, 0xfa, 0x67, 0xd3, 0xf4, 0xcb, 0x98, 0x6f, 0x96, 0x98, 0xe, 0x98, 0x24, 0x25, 0xda, 0xb, 0xd6, 0x8b, 0x5e, 0x72, 0x7b, 0x63, 0x4c, 0x5a, 0x2c, 0x1, 0x7f, 0xd4, 0x5a, 0x7e, 0x80, 0xbd, 0xc0, 0x46, 0xe8, 0x85, 0x8d, 0xc6, 0xb3, 0x14, 0x68, 0x9f, 0x3b, 0x76, 0x7f, 0x89, 0xe7, 0xa, 0xf6, 0x22, 0xd8, 0xcf, 0x97, 0xc4, 0xd5, 0x7f, 0x82, 0x7b, 0xa, 0x8f, 0x55, 0xd8, 0xf, 0xe4, 0x1, 0x73, 0xb9, 0xcf, 0x2e, 0x5c, 0x8e, 0xa0, 0xef, 0x0, 0x5b, 0x69, 0xb0, 0xb4, 0xd5, 0x6a, 0x39, 0xe0, 0x98, 0x28, 0xf5, 0x7d, 0x15, 0x6d, 0x68, 0xde, 0x3a, 0x56, 0x1a, 0x3c, 0xd9, 0xb7, 0xe1, 0x9, 0x2a, 0x88, 0x21, 0x27, 0x77, 0xc8, 0xf1, 0x3e, 0x5, 0x57, 0xe2, 0xdb, 0x89, 0xfe, 0x8, 0xec, 0x5, 0xb1, 0x8a, 0x57, 0xe3, 0xc, 0x99, 0x42, 0x30, 0xe, 0x97, 0xe2, 0x7e, 0xf4, 0xbd, 0xd1, 0xa8, 0xd3, 0x6e, 0x9c, 0x72, 0x5f, 0xe2, 0x59, 0x87, 0xbe, 0x16, 0x28, 0xc6, 0xf2, 0x36, 0xe8, 0xb7, 0x9a, 0x3d, 0xfd, 0x1d, 0xa, 0x55, 0x3f, 0xe3, 0x28, 0x77, 0x26, 0xf, 0xb7, 0xfd, 0x22, 0xf0, 0xaf, 0x5e, 0xc4, 0x1, 0x14, 0x57, 0x36, 0xe5, 0x5d, 0x8c, 0x89, 0xec, 0x80, 0xed, 0x8a, 0x4b, 0x3e, 0x72, 0xb5, 0xe6, 0xcf, 0x74, 0x78, 0x94, 0x3a, 0xe5, 0x28, 0xe8, 0x49, 0xaa, 0xdb, 0x5f, 0x48, 0xd6, 0xdb, 0x66, 0x3e, 0xbb, 0x78, 0x91, 0xc3, 0xe8, 0xce, 0x99, 0xc2, 0xf0, 0xde, 0xfb, 0x1e, 0x28, 0x39, 0x48, 0xda, 0xd9, 0xd1, 0x6b, 0xe7, 0x45, 0xb0, 0x34, 0x9, 0xaa, 0x29, 0xcf, 0x7, 0xb1, 0xf2, 0xe8, 0xc8, 0x77, 0xf4, 0x3a, 0xa0, 0xc, 0x9c, 0xbf, 0x5d, 0x84, 0x73, 0xd1, 0xf6, 0x11, 0xe3, 0xa6, 0x32, 0x4e, 0x90, 0x75, 0xb0, 0x31, 0xf2, 0xee, 0x28, 0xce, 0x4d, 0x56, 0x20, 0x53, 0x1d, 0x25, 0x97, 0x98, 0x91, 0x39, 0x65, 0xbd, 0x77, 0xf4, 0xd3, 0xc0, 0x89, 0x79, 0xf5, 0xdc, 0x6, 0x16, 0xd3, 0x77, 0xca, 0xbc, 0x5, 0xc7, 0x81, 0xf9, 0xaf, 0xe4, 0xd9, 0x30, 0x48, 0x63, 0x17, 0x3a, 0xd5, 0x33, 0xff, 0xd2, 0xb7, 0x5d, 0xf3, 0x1e, 0x2f, 0xf6, 0x1b, 0xf8, 0xbf, 0x20, 0xc6, 0x22, 0x74, 0x9c, 0xd, 0x3, 0x67, 0xc3, 0xd7, 0xb1, 0x1d, 0xd0, 0x55, 0xa, 0xd2, 0x19, 0x84, 0xe, 0xde, 0x18, 0xfa, 0x24, 0x7e, 0x6, 0x58, 0xd, 0x9c, 0xe0, 0xe, 0xea, 0xde, 0x6, 0x6b, 0xc0, 0xd, 0x60, 0x2, 0x9f, 0xf2, 0x4b, 0x47, 0xcd, 0x23, 0x44, 0x83, 0x48, 0x71, 0xf, 0xac, 0xf2, 0x86, 0xca, 0x83, 0x1c, 0x5b, 0x5a, 0xad, 0x0, 0x3, 0x3e, 0x7, 0x94, 0x13, 0x1d, 0x14, 0xeb, 0xdc, 0xea, 0x4c, 0x15, 0xdb, 0xa7, 0x78, 0xd, 0xed, 0x2, 0x7b, 0x8b, 0xa3, 0x9e, 0x93, 0xc3, 0xd8, 0xa6, 0xa5, 0xb2, 0xd6, 0xa9, 0xa1, 0x3b, 0xb9, 0x8b, 0x3d, 0xee, 0xa, 0x20, 0x4b, 0x8a, 0xfd, 0x2, 0xb6, 0xd7, 0xdb, 0xe3, 0xc0, 0x6d, 0xa9, 0xb6, 0x16, 0x3b, 0xc5, 0xe, 0xb, 0xca, 0xca, 0xd9, 0xc6, 0x95, 0xd7, 0x67, 0xac, 0x33, 0xb1, 0x45, 0xe4, 0x13, 0x65, 0xcd, 0xb9, 0xc8, 0xfe, 0xee, 0xce, 0x49, 0xe8, 0xa, 0x2a, 0xbe, 0x63, 0xd0, 0x57, 0xd0, 0x5b, 0xc1, 0x16, 0xe0, 0xf5, 0x15, 0xa9, 0x81, 0xbf, 0x31, 0x72, 0x21, 0x4b, 0x75, 0x4c, 0xc8, 0xd9, 0x7b, 0xe, 0x6c, 0x2b, 0x9c, 0x84, 0xf9, 0x8c, 0x1a, 0x5c, 0xba, 0xc6, 0xc8, 0xce, 0xfb, 0xba, 0x23, 0x44, 0x5, 0x8d, 0x2f, 0xa4, 0x62, 0x17, 0xc8, 0xa5, 0x3f, 0x8c, 0x9d, 0xf9, 0xd3, 0xdd, 0xe7, 0x64, 0x97, 0x3d, 0x53, 0x2e, 0xa4, 0x79, 0xbb, 0x92, 0x89, 0x6f, 0x87, 0x9f, 0xb, 0xe2, 0x42, 0x74, 0xb6, 0x9c, 0xc2, 0x1e, 0xec, 0x6f, 0x74, 0x20, 0x1e, 0xac, 0x45, 0x61, 0xfd, 0x3f, 0x7f, 0xf2, 0x12, 0x70, 0x75, 0xe5, 0xa5, 0xc4, 0x4e, 0x6b, 0xc4, 0x1d, 0xaa, 0x81, 0xbc, 0xdf, 0x51, 0x71, 0x6b, 0x64, 0xa7, 0xe2, 0x3a, 0x35, 0xaa, 0xa4, 0x45, 0x92, 0xfb, 0x96, 0x85, 0xf4, 0xee, 0x9f, 0x8f, 0xae, 0xf8, 0xb8, 0xf4, 0xb1, 0xd4, 0x68, 0xf3, 0xd7, 0xb4, 0x30, 0x15, 0x5c, 0xe5, 0xcc, 0x23, 0xcc, 0x69, 0x29, 0x41, 0xc3, 0x51, 0xb7, 0xa7, 0x5b, 0x8c, 0x6e, 0xd5, 0x89, 0x11, 0xe5, 0x93, 0x12, 0x29, 0xcf, 0x59, 0x14, 0x83, 0x3d, 0x3, 0x7b, 0xc2, 0xf, 0xe1, 0x79, 0xa8, 0x34, 0x92, 0xb4, 0x79, 0x3c, 0x43, 0xba, 0x82, 0xce, 0xa8, 0x9f, 0xa3, 0xc3, 0x95, 0xf4, 0xce, 0x77, 0x11, 0x3f, 0x2e, 0xb1, 0xaa, 0xd5, 0xb5, 0x1c, 0xec, 0x21, 0xe1, 0x9d, 0x2a, 0xe9, 0xcd, 0xf8, 0xee, 0x6, 0x76, 0xc8, 0x3c, 0x6e, 0x74, 0xc0, 0x5f, 0xc9, 0x49, 0x20, 0x9f, 0xbb, 0xfd, 0x39, 0xb1, 0x77, 0x96, 0x1d, 0xcc, 0x14, 0x89, 0x71, 0xab, 0xe5, 0xa6, 0x41, 0x92, 0xde, 0x48, 0xcd, 0x25, 0xc0, 0x5f, 0x32, 0xd3, 0xc2, 0x3c, 0x47, 0x9d, 0x52, 0xd9, 0x50, 0x46, 0xf3, 0x76, 0x68, 0xc, 0x3e, 0x23, 0x4f, 0x21, 0xe7, 0x9b, 0x61, 0x31, 0x30, 0x45, 0xee, 0x2, 0x8f, 0x81, 0x95, 0xc0, 0x99, 0xfa, 0x3, 0x41, 0x8c, 0x4e, 0x90, 0xba, 0x4d, 0xdd, 0x5c, 0xc5, 0xd5, 0xf5, 0x5a, 0xfd, 0x1, 0x5c, 0xc5, 0x18, 0x7e, 0xa5, 0x54, 0x63, 0x65, 0xf0, 0xbc, 0x77, 0xe3, 0x91, 0x52, 0x88, 0x1c, 0xa4, 0xd2, 0xfc, 0x59, 0xe, 0x7e, 0x5, 0xe7, 0x0, 0x25, 0x26, 0x97, 0x64, 0xc3, 0xd1, 0x35, 0xfb, 0x68, 0x35, 0xf7, 0x3f, 0xeb, 0xa, 0x59, 0x53, 0x74, 0xfa, 0xd, 0xd1, 0x2b, 0x2e, 0x33, 0x8a, 0x9, 0xa0, 0x57, 0x83, 0xba, 0xf4, 0x7c, 0x7, 0x74, 0x3d, 0x9, 0x7b, 0xb6, 0x21, 0xc8, 0x6c, 0x7e, 0xc7, 0xf1, 0x6d, 0xa2, 0x7c, 0x9d, 0xbc, 0xb0, 0x67, 0xec, 0x7e, 0xd6, 0xd5, 0x75, 0x6c, 0xb9, 0xe, 0x3a, 0xbc, 0x67, 0x4, 0xc4, 0xcf, 0xf3, 0x7c, 0x9f, 0xce, 0x36, 0xf8, 0x28, 0xf5, 0xc6, 0xce, 0xf8, 0x37, 0x97, 0xb1, 0xab, 0x9d, 0xaf, 0x93, 0xeb, 0x69, 0xd3, 0x39, 0xe, 0x22, 0x7a, 0x11, 0x98, 0x4, 0x6d, 0x56, 0x52, 0x22, 0xbe, 0xfc, 0x3d, 0x98, 0x6, 0x1f, 0x85, 0x58, 0xbf, 0x3e, 0xf9, 0x39, 0xb6, 0x7e, 0x68, 0xb2, 0x39, 0x3, 0x8, 0xc5, 0x77, 0x1b, 0x7a, 0x21, 0x78, 0xd, 0xf4, 0x92, 0x7e, 0x4, 0x6, 0xf5, 0x1b, 0x33, 0xc9, 0x4e, 0xd6, 0xc6, 0x1e, 0x28, 0x15, 0xb2, 0x7d, 0xa5, 0x9, 0x56, 0x7d, 0x6c, 0x62, 0x5f, 0x7, 0x36, 0x80, 0xdd, 0xe0, 0x77, 0x90, 0x3, 0xd, 0x4a, 0xae, 0xbb, 0x1d, 0x21, 0xe2, 0x9f, 0x23, 0xea, 0x3d, 0x20, 0xbe, 0xd8, 0xd1, 0xd5, 0x98, 0x15, 0x91, 0x61, 0xc, 0x2, 0x78, 0x7, 0x37, 0x5e, 0x6d, 0x94, 0x1f, 0x6, 0xe6, 0xb5, 0x32, 0x6a, 0x7a, 0x78, 0x65, 0x29, 0x7e, 0x95, 0x5f, 0x26, 0x27, 0xb4, 0xbf, 0x70, 0xb3, 0xb, 0xd, 0x25, 0x55, 0x47, 0x7e, 0x11, 0x37, 0xbe, 0x8a, 0x69, 0x73, 0x3e, 0x78, 0x19, 0xe4, 0xea, 0xe, 0x4b, 0x96, 0xae, 0x31, 0xc1, 0xec, 0xbf, 0x87, 0xf2, 0xa5, 0x32, 0x44, 0xf, 0x46, 0x76, 0xf6, 0xe9, 0x44, 0xb0, 0xcb, 0x9, 0xf8, 0x12, 0x38, 0x0, 0x52, 0x86, 0x25, 0x6b, 0x4a, 0x78, 0x75, 0xa9, 0x95, 0xcd, 0x20, 0xee, 0x77, 0xf4, 0x50, 0x64, 0xbd, 0xc6, 0x96, 0x41, 0xdc, 0x44, 0x3f, 0x0, 0xdc, 0x7e, 0x3f, 0x97, 0x26, 0xc0, 0x35, 0xe0, 0x56, 0x70, 0x3d, 0xc8, 0x77, 0x85, 0xaf, 0x38, 0xf3, 0x6c, 0x90, 0x83, 0x61, 0x1b, 0x7f, 0x56, 0xf3, 0x7d, 0x90, 0x57, 0xd5, 0x7a, 0x7e, 0x10, 0x9e, 0xc2, 0x1f, 0x2b, 0x8b, 0x6d, 0xcc, 0xc1, 0x5, 0xc2, 0xcb, 0x81, 0xff, 0x61, 0xfc, 0x7, 0xb8, 0x5d, 0xb9, 0x65, 0x98, 0x95, 0xb8, 0x3a, 0xae, 0xaa, 0xd2, 0x38, 0x40, 0xde, 0x78, 0x89, 0x52, 0x67, 0x3b, 0xaf, 0x3f, 0xe3, 0x64, 0x1f, 0xcc, 0xf6, 0x16, 0xe0, 0xe4, 0x43, 0xb0, 0x47, 0x3f, 0x60, 0x74, 0x36, 0x5f, 0x1f, 0x4, 0x5f, 0x81, 0xba, 0xf8, 0xf5, 0x2a, 0x59, 0xa1, 0x2d, 0x24, 0xe3, 0xd5, 0x2c, 0x71, 0xed, 0xee, 0x36, 0xb8, 0x1a, 0xb2, 0x8d, 0xd2, 0x7d, 0x35, 0xa2, 0x8d, 0xb3, 0x91, 0xfe, 0x81, 0x35, 0xc1, 0xaa, 0x17, 0x9b, 0x9d, 0x28, 0xdf, 0x2, 0x5e, 0x5, 0x3f, 0x82, 0x51, 0xc5, 0xbe, 0xde, 0xdf, 0xab, 0xea, 0x44, 0x28, 0x67, 0x5a, 0xd4, 0xdd, 0x43, 0xd9, 0x91, 0x8b, 0x4, 0x52, 0xfb, 0x94, 0xab, 0x1e, 0x1b, 0xf8, 0xcc, 0xdb, 0x15, 0xc0, 0x5c, 0xf6, 0x21, 0x74, 0x31, 0x38, 0x17, 0x9c, 0x5, 0xbc, 0x37, 0x6d, 0x6b, 0xde, 0xff, 0x5, 0x7e, 0x3, 0xbb, 0xc1, 0x76, 0xf0, 0x25, 0xd8, 0x41, 0x2c, 0x5f, 0x7b, 0x21, 0x85, 0xa8, 0x5f, 0xd2, 0x8d, 0xa7, 0x62, 0xd6, 0xf, 0xa3, 0xff, 0x3, 0xf7, 0x93, 0x7f, 0xd4, 0xd5, 0x86, 0x9a, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)twitter_icon2x_png { - return [NSData dataWithBytes:twitter_icon2x_png length:sizeof(twitter_icon2x_png)]; - } - static const unsigned char parse_logo2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x1, 0xbb, 0x0, 0x0, 0x0, 0x88, 0x8, 0x6, 0x0, 0x0, 0x0, 0x7e, 0xf0, 0x45, 0xa9, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x45, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x46, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x43, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x44, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0xe8, 0x51, 0xff, 0x90, 0x0, 0x0, 0x26, 0xd1, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x5d, 0x7, 0x98, 0x14, 0x55, 0xd6, 0xbd, 0xd, 0x33, 0xcc, 0x90, 0x54, 0x24, 0x88, 0xa2, 0x2, 0x8a, 0x28, 0x20, 0x62, 0x40, 0x51, 0x5c, 0x57, 0x10, 0x51, 0x44, 0xd7, 0x35, 0xff, 0xbb, 0x46, 0x5c, 0x31, 0xc3, 0x9a, 0x45, 0xd4, 0x55, 0x74, 0xd7, 0xac, 0xb0, 0x86, 0x5d, 0x73, 0x5e, 0x75, 0x4d, 0x6b, 0x56, 0x14, 0x11, 0xcc, 0x1, 0x41, 0xc9, 0x51, 0x82, 0x8, 0x8, 0x22, 0x82, 0x48, 0x9a, 0xf8, 0xbf, 0x63, 0x9d, 0x96, 0xa6, 0xe6, 0x55, 0x4f, 0xcf, 0x4c, 0x55, 0x77, 0x55, 0xf5, 0x3d, 0xdf, 0x77, 0x3f, 0xe0, 0x55, 0x33, 0x53, 0xfd, 0xea, 0xd5, 0x3b, 0x37, 0xbf, 0xc4, 0x49, 0x83, 0x86, 0xb4, 0x13, 0x91, 0x53, 0x8c, 0x34, 0x96, 0xf8, 0xa2, 0xbe, 0x91, 0xa9, 0x46, 0x66, 0x19, 0x99, 0x61, 0x64, 0xb5, 0x91, 0x52, 0x51, 0x28, 0x14, 0xa, 0x45, 0x6c, 0xb0, 0x66, 0xed, 0x3a, 0x19, 0x3a, 0x68, 0xa0, 0xec, 0xb3, 0x47, 0xd7, 0x2a, 0xd7, 0xa, 0x8c, 0xdc, 0x62, 0xa4, 0xb7, 0x91, 0xe2, 0x18, 0xcf, 0x41, 0x82, 0xe4, 0x56, 0x66, 0xa4, 0xc4, 0xc8, 0x14, 0x92, 0xdf, 0x24, 0xfe, 0x1d, 0xb2, 0x41, 0x97, 0x8a, 0x42, 0xa1, 0x50, 0xc4, 0x13, 0x20, 0xbb, 0xed, 0x8c, 0x34, 0xe3, 0xdf, 0xf3, 0x5, 0x6d, 0x8c, 0x1c, 0xca, 0xbf, 0xff, 0x42, 0xd2, 0xfb, 0xd0, 0xc8, 0x33, 0xfc, 0x7b, 0xa5, 0x2e, 0xd, 0x85, 0x42, 0xa1, 0x88, 0xf, 0xea, 0x19, 0x29, 0x37, 0x52, 0x91, 0xc7, 0x73, 0xd0, 0xc4, 0x48, 0x4f, 0x23, 0x43, 0x8c, 0x8c, 0x33, 0x32, 0xd2, 0xc8, 0x31, 0x46, 0xa, 0x75, 0x79, 0x28, 0x14, 0xa, 0x45, 0x7c, 0xc8, 0x4e, 0xb1, 0x11, 0x20, 0xb8, 0x43, 0x8c, 0xbc, 0x68, 0x64, 0xb4, 0x91, 0x63, 0x75, 0x8e, 0x14, 0xa, 0x85, 0x22, 0xfa, 0xf0, 0x72, 0x5d, 0x22, 0x89, 0x63, 0x6a, 0x8c, 0x8, 0xbd, 0x95, 0x91, 0x46, 0xfc, 0x73, 0xeb, 0xc, 0x9, 0xec, 0x0, 0xca, 0x28, 0x23, 0x7f, 0x17, 0xc7, 0xcd, 0xa9, 0x50, 0x28, 0x14, 0x8a, 0x18, 0x91, 0xdd, 0x93, 0x46, 0x6e, 0x8c, 0xd1, 0xf7, 0x6c, 0x40, 0xb2, 0xdb, 0xca, 0x48, 0x6b, 0x23, 0x9d, 0x53, 0xc8, 0xc, 0xf1, 0xbb, 0x44, 0x9a, 0xff, 0xdb, 0x97, 0x9f, 0xbb, 0xd7, 0xc8, 0x75, 0x46, 0x56, 0xe9, 0xb2, 0x51, 0x28, 0x14, 0x8a, 0xe8, 0x59, 0x3d, 0x36, 0x34, 0x8c, 0xd9, 0xf7, 0x44, 0x6, 0xe6, 0x4a, 0x23, 0x33, 0x8d, 0xbc, 0x4f, 0xe2, 0x3a, 0xd1, 0x48, 0x27, 0x23, 0xfd, 0x8d, 0x3c, 0x6a, 0xe4, 0xbb, 0x34, 0xff, 0x1f, 0x99, 0xaa, 0x17, 0x19, 0x79, 0xdb, 0x48, 0x77, 0x5d, 0x36, 0xa, 0x85, 0x42, 0x11, 0xf, 0xb2, 0xcb, 0x17, 0x20, 0x13, 0x13, 0x9, 0x29, 0x7f, 0x31, 0x72, 0x90, 0x91, 0x2b, 0x8d, 0xcc, 0x4d, 0xf3, 0xf9, 0x1e, 0x46, 0xde, 0x32, 0x32, 0x40, 0x97, 0x8e, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0x45, 0x11, 0xb3, 0x8d, 0xdc, 0x64, 0x64, 0x2f, 0x71, 0xdc, 0x95, 0xcb, 0x3c, 0x3e, 0xd7, 0x82, 0x96, 0x20, 0xdc, 0xbc, 0x9, 0x9d, 0x36, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x22, 0xe0, 0xee, 0x1c, 0x66, 0xa4, 0x8f, 0x91, 0x17, 0xd2, 0x7c, 0x6e, 0xa8, 0x38, 0xee, 0xd0, 0x22, 0x9d, 0x32, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x2a, 0xd0, 0x55, 0xe5, 0x78, 0x23, 0x3, 0x8d, 0xac, 0xf0, 0xf8, 0xcc, 0xd9, 0x46, 0x1e, 0x96, 0xf8, 0xc5, 0x38, 0x15, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xcf, 0x0, 0x32, 0x43, 0xed, 0xdd, 0xd7, 0x1e, 0xd7, 0x4f, 0xa2, 0x85, 0xa7, 0x45, 0xe8, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x69, 0x8c, 0x17, 0xa7, 0x4, 0xe1, 0x4d, 0x8f, 0xeb, 0xa7, 0x89, 0xe3, 0xfa, 0x54, 0x28, 0x14, 0xa, 0x85, 0x92, 0x5d, 0xa4, 0xb1, 0xdc, 0xc8, 0x9f, 0xc4, 0x49, 0x4e, 0xb1, 0x1, 0x99, 0x9c, 0x67, 0xea, 0x34, 0x29, 0x14, 0xa, 0x85, 0x92, 0x5d, 0xd4, 0x81, 0xa3, 0x81, 0x10, 0xc3, 0x7b, 0xc8, 0xe3, 0xfa, 0x8, 0x23, 0xbd, 0x74, 0x9a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xea, 0x40, 0xd3, 0xec, 0xc1, 0xe2, 0xf4, 0xcf, 0x74, 0x3, 0x67, 0x2, 0x22, 0x7e, 0xd7, 0x42, 0xa7, 0x49, 0xa1, 0x50, 0x28, 0x94, 0xec, 0xa2, 0x8e, 0xf5, 0xb4, 0xf0, 0x3e, 0xb6, 0x5c, 0xdb, 0x45, 0x9c, 0x33, 0x2, 0xb, 0x74, 0x9a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xea, 0x40, 0x3d, 0xde, 0x0, 0x23, 0xdf, 0x5a, 0xae, 0x9d, 0x6a, 0xe4, 0x70, 0x9d, 0x22, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x3, 0xe6, 0x18, 0x19, 0x24, 0xce, 0x29, 0xe8, 0xa9, 0x48, 0x9e, 0x0, 0xbf, 0x85, 0x4e, 0x91, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x1, 0xaf, 0x19, 0xb9, 0xdb, 0x32, 0xbe, 0xb3, 0x91, 0x8b, 0x75, 0x7a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0x2e, 0xb8, 0xd9, 0xc8, 0x44, 0xcb, 0xf8, 0x19, 0x46, 0x76, 0xd2, 0xe9, 0x51, 0x28, 0x14, 0xa, 0x25, 0xbb, 0x38, 0xe0, 0x7, 0x23, 0x97, 0x59, 0xc6, 0xb7, 0x11, 0xe7, 0x68, 0x20, 0x85, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x2, 0x38, 0xd1, 0xfc, 0x19, 0xcb, 0x38, 0x92, 0x55, 0xda, 0xeb, 0xf4, 0x28, 0x14, 0xa, 0x85, 0x92, 0x5d, 0x5c, 0x80, 0xa2, 0xf2, 0x9f, 0x5d, 0x63, 0xa8, 0xbd, 0xfb, 0x8b, 0x4e, 0x8d, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x5, 0xe3, 0x8c, 0xbc, 0x6a, 0x19, 0x3f, 0xc1, 0x48, 0x4b, 0x9d, 0x1e, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x93, 0x75, 0xe7, 0x46, 0x47, 0xd1, 0x36, 0x62, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x23, 0x7c, 0x65, 0xe4, 0xd, 0xcb, 0xf8, 0x19, 0x3a, 0x35, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x17, 0x54, 0x1a, 0x79, 0xce, 0x32, 0xde, 0xd3, 0x48, 0x3b, 0x9d, 0x1e, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0xb, 0xde, 0x36, 0x32, 0xd7, 0x35, 0xd6, 0x54, 0x9c, 0x33, 0xf1, 0x14, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0xb, 0x2c, 0x35, 0xf2, 0xa5, 0x65, 0xfc, 0x77, 0x3a, 0x35, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x27, 0xd8, 0xb2, 0x32, 0xf7, 0x36, 0xd2, 0x5a, 0xa7, 0x46, 0xa1, 0x50, 0x28, 0x94, 0xec, 0xe2, 0x82, 0xb1, 0x46, 0x4a, 0x5c, 0x63, 0x68, 0x1d, 0xb6, 0x9d, 0x4e, 0x8d, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x5, 0x3f, 0x1a, 0x99, 0xea, 0x1a, 0x2b, 0x10, 0xed, 0x95, 0xa9, 0x50, 0x28, 0x14, 0x59, 0x87, 0x1e, 0x30, 0x1a, 0x1c, 0x70, 0xc0, 0xeb, 0x27, 0x46, 0xf6, 0x70, 0x8d, 0xef, 0x66, 0xe4, 0xe9, 0x8, 0x7f, 0xaf, 0x42, 0x23, 0xd, 0x8c, 0x34, 0xf1, 0xb0, 0x52, 0x13, 0x46, 0xd6, 0x19, 0x59, 0x48, 0xcb, 0x76, 0x83, 0x38, 0xa7, 0xbb, 0x2b, 0x14, 0x99, 0xee, 0x49, 0xc9, 0x35, 0x86, 0xf5, 0xd5, 0x50, 0x9c, 0xc, 0x67, 0x9b, 0xa2, 0xe, 0x85, 0xf2, 0x7b, 0xae, 0x2f, 0xac, 0xb5, 0x72, 0x9d, 0x3e, 0x5f, 0x90, 0xe0, 0xfc, 0xe3, 0x59, 0x6c, 0x6d, 0x64, 0x4b, 0xcb, 0x3b, 0x8c, 0xf9, 0xc7, 0x99, 0x9e, 0x8b, 0x8c, 0x94, 0x89, 0x73, 0xcc, 0x59, 0x45, 0xd8, 0x17, 0x96, 0x22, 0x38, 0xcc, 0xb0, 0x8c, 0xed, 0x1c, 0xb1, 0x8d, 0x7, 0x27, 0xaf, 0x77, 0x30, 0xd2, 0xc9, 0xc8, 0x5e, 0x46, 0xda, 0xf2, 0xdf, 0x45, 0xdc, 0x94, 0x2a, 0x2d, 0x2f, 0x4a, 0x5, 0x17, 0xff, 0x4f, 0xe2, 0x9c, 0xf9, 0x87, 0x79, 0x98, 0x69, 0x64, 0x16, 0xff, 0xfc, 0x26, 0xa6, 0xcf, 0xbb, 0x1e, 0x37, 0x9, 0xe1, 0xc6, 0x5b, 0xaa, 0xaf, 0x40, 0x5a, 0x6c, 0x6b, 0x64, 0x47, 0xa, 0xd6, 0x19, 0x9a, 0x2f, 0xa0, 0x79, 0xfa, 0xf6, 0x54, 0xa6, 0xa, 0x39, 0xa7, 0x95, 0x1e, 0x1b, 0x72, 0x39, 0x37, 0x5a, 0x6c, 0xba, 0xf3, 0xc5, 0x39, 0x48, 0x79, 0x26, 0xff, 0x3e, 0xdb, 0xc8, 0x2, 0x6e, 0xc6, 0x8a, 0xf4, 0x68, 0xcd, 0xf7, 0xbb, 0x3, 0xf7, 0xa7, 0x2e, 0x46, 0x76, 0x30, 0xd2, 0x86, 0x7b, 0x40, 0x7d, 0x8f, 0xf7, 0x3c, 0x39, 0xff, 0xdf, 0x73, 0xee, 0x67, 0xf0, 0x1d, 0x9f, 0xc2, 0x77, 0x7c, 0x9e, 0x92, 0x5d, 0xfe, 0x60, 0x11, 0x17, 0x49, 0x22, 0x65, 0xac, 0x63, 0xc8, 0xef, 0x19, 0xbd, 0x3c, 0xf, 0x31, 0x72, 0xb0, 0x91, 0xae, 0x5c, 0xfc, 0xad, 0x6a, 0xf1, 0x73, 0x1a, 0xf0, 0x67, 0x61, 0x43, 0xeb, 0x95, 0x32, 0x8e, 0xd, 0x68, 0xba, 0x91, 0x31, 0x46, 0xfe, 0x27, 0x4e, 0x89, 0x46, 0x1c, 0x2c, 0x3f, 0x28, 0x2, 0xb7, 0x53, 0x9, 0x10, 0x6e, 0x2, 0x77, 0x18, 0x79, 0x25, 0x8b, 0xf7, 0xd0, 0x90, 0xd6, 0xd0, 0xce, 0x54, 0x4a, 0x5a, 0xf3, 0x7e, 0x92, 0x8d, 0xc8, 0x8b, 0x68, 0x1, 0x5d, 0x60, 0xe4, 0xbb, 0x1c, 0xcc, 0x11, 0x7e, 0x7f, 0x37, 0x23, 0x87, 0x89, 0x93, 0xac, 0xb5, 0x13, 0x89, 0xae, 0x7e, 0x1d, 0xf6, 0xaf, 0x22, 0xae, 0x33, 0x6c, 0xcc, 0xfb, 0xbb, 0x3c, 0x2b, 0xdf, 0x52, 0xd9, 0x1a, 0x2f, 0xce, 0xb9, 0x93, 0x93, 0xe8, 0x69, 0xc8, 0x77, 0xd4, 0xe7, 0x3e, 0x84, 0xf7, 0xbc, 0x37, 0x9f, 0x43, 0xe7, 0x3a, 0xcc, 0x7f, 0x52, 0x61, 0xe9, 0x9d, 0x72, 0x6d, 0x1e, 0x15, 0x8e, 0x64, 0xb, 0xc5, 0xaf, 0xa5, 0x6a, 0xe, 0x83, 0x92, 0x5d, 0x8c, 0xb0, 0xd8, 0xc8, 0x2f, 0xe2, 0xd4, 0xd8, 0x25, 0xd1, 0x82, 0xda, 0x6a, 0x98, 0x36, 0x78, 0xb8, 0x29, 0x50, 0xf4, 0x7e, 0x84, 0x91, 0xc3, 0x49, 0x50, 0x41, 0xa1, 0x2d, 0xa5, 0x9f, 0x91, 0xeb, 0x8d, 0x7c, 0x64, 0xe4, 0x29, 0x23, 0x6f, 0x8a, 0x53, 0xb2, 0x11, 0x55, 0x1c, 0x21, 0x55, 0x5b, 0xc2, 0x2d, 0xa, 0x98, 0xec, 0xb0, 0x69, 0x75, 0x37, 0xb2, 0x9f, 0x91, 0x3, 0x8c, 0xec, 0x23, 0x4e, 0xf, 0xd6, 0xa2, 0x6a, 0xfe, 0xdf, 0xf3, 0x46, 0xfe, 0x9b, 0xc5, 0xb9, 0x1, 0xb1, 0xf5, 0x31, 0x72, 0x1a, 0xad, 0x87, 0x6c, 0xec, 0x3b, 0xc5, 0xdc, 0xd0, 0x21, 0xfd, 0x8d, 0xc, 0xe5, 0x6, 0x8c, 0x86, 0xf, 0x23, 0xb9, 0xee, 0xf2, 0xd, 0xed, 0xa9, 0xc4, 0x9e, 0xc8, 0xf7, 0xbd, 0x41, 0xc0, 0xbf, 0xab, 0x3d, 0x9, 0x75, 0x8, 0x95, 0x8e, 0xff, 0x70, 0xee, 0xc7, 0x2b, 0xd9, 0xc5, 0xf, 0x38, 0x1, 0x61, 0x8d, 0x8b, 0xec, 0x8a, 0xa8, 0x7d, 0x2f, 0x8, 0xc1, 0xfd, 0x61, 0x23, 0x38, 0x95, 0x1b, 0x75, 0xb7, 0x1c, 0x69, 0xfa, 0x7d, 0x28, 0xd3, 0x8c, 0x3c, 0x6e, 0xe4, 0x3e, 0xa9, 0x7a, 0x72, 0x44, 0x14, 0x60, 0x73, 0xb5, 0x95, 0x7, 0xb8, 0x91, 0x9c, 0xcc, 0x79, 0xeb, 0x4e, 0xcb, 0xa6, 0x26, 0x48, 0x64, 0x61, 0x3e, 0x12, 0x24, 0x19, 0x9c, 0xf8, 0xd1, 0xd7, 0xf5, 0xe, 0xe4, 0x6a, 0xaf, 0x83, 0x5, 0x73, 0x95, 0x38, 0x67, 0x4f, 0xc2, 0xb3, 0x80, 0x23, 0xb9, 0x9e, 0xa5, 0x15, 0x18, 0x67, 0xec, 0x6e, 0xe4, 0x1c, 0x23, 0x87, 0x4a, 0x6e, 0xba, 0x38, 0x25, 0xc3, 0x21, 0xff, 0xe0, 0xdc, 0x7f, 0xc0, 0xf7, 0xfc, 0x1d, 0x7a, 0x40, 0x94, 0xec, 0x62, 0x80, 0xd5, 0x46, 0xd6, 0x5a, 0xb4, 0xf1, 0x46, 0x39, 0xbe, 0xaf, 0x83, 0xb8, 0x9, 0x1d, 0x23, 0x8e, 0xeb, 0xab, 0xa6, 0xc0, 0x26, 0xe, 0x3f, 0x3d, 0x12, 0x51, 0x56, 0x88, 0x13, 0x9b, 0x4a, 0x70, 0xc3, 0x87, 0x65, 0x81, 0x58, 0x4b, 0x73, 0x23, 0x9b, 0xd5, 0xe0, 0x67, 0xc2, 0x8d, 0x72, 0x8b, 0x91, 0xb3, 0xc4, 0x39, 0xf9, 0xfd, 0x71, 0x89, 0x56, 0xcc, 0xab, 0x32, 0xc3, 0xb1, 0xba, 0xa0, 0x27, 0x37, 0xad, 0xa3, 0x42, 0x40, 0x1e, 0xe9, 0x80, 0xe6, 0x9, 0x57, 0x53, 0xab, 0xaf, 0xd, 0xb1, 0xae, 0xa4, 0x60, 0xfe, 0x96, 0x71, 0x43, 0x4c, 0xfe, 0x1c, 0x78, 0x44, 0xb6, 0x20, 0xc1, 0x37, 0xa2, 0x57, 0xa2, 0xb0, 0x86, 0x3f, 0xbf, 0x1, 0x37, 0x7e, 0xc8, 0xa5, 0x46, 0x6e, 0x23, 0xe9, 0xc5, 0xcd, 0xc5, 0x9, 0x4b, 0xff, 0x5c, 0x5a, 0x72, 0xb5, 0xb1, 0xe2, 0xa0, 0x74, 0x22, 0xee, 0xe, 0xf7, 0xe3, 0xf2, 0x94, 0xf5, 0x5c, 0xc9, 0xf5, 0xd7, 0x94, 0xcf, 0x21, 0xe9, 0xad, 0xca, 0x4, 0x9b, 0x1b, 0xf9, 0x3, 0x15, 0x6c, 0x58, 0x78, 0x77, 0xd0, 0xd3, 0x10, 0x78, 0x72, 0x91, 0x92, 0x5d, 0xb0, 0xc0, 0x42, 0xf9, 0xc5, 0xb2, 0x1, 0xe6, 0xc2, 0x85, 0x59, 0x9f, 0x9b, 0xe4, 0x59, 0xb4, 0x8, 0x32, 0x8d, 0x93, 0x94, 0x93, 0xd0, 0x3e, 0x17, 0xa7, 0xc9, 0x35, 0x82, 0xcf, 0x70, 0x37, 0x2e, 0xa1, 0x46, 0x9c, 0x4a, 0x76, 0x15, 0x29, 0x64, 0x87, 0x17, 0xa0, 0x15, 0xad, 0x10, 0x4, 0xbc, 0x7f, 0x4f, 0xcd, 0xba, 0xba, 0x97, 0xe, 0xbe, 0xff, 0x7, 0x8d, 0xfc, 0xd9, 0xc8, 0xe5, 0xb9, 0x72, 0x79, 0x84, 0xc, 0x3d, 0x8c, 0x5c, 0xc8, 0xe7, 0x57, 0x1c, 0xe2, 0xfb, 0x44, 0x72, 0xc9, 0x35, 0x46, 0x4e, 0xcf, 0x70, 0x73, 0xc5, 0xba, 0x41, 0xec, 0x10, 0xb1, 0x34, 0xc4, 0x76, 0xe6, 0x51, 0x89, 0x5a, 0xc9, 0x77, 0x47, 0xaa, 0x21, 0xbb, 0x86, 0x54, 0xaa, 0x40, 0x78, 0xad, 0xb9, 0xce, 0xba, 0xd3, 0x8a, 0xd8, 0x3c, 0xc3, 0xd, 0x78, 0x57, 0x2a, 0x56, 0x3, 0x68, 0x79, 0xbc, 0x17, 0x83, 0xf5, 0x2, 0xeb, 0xed, 0x62, 0x2a, 0xb4, 0x99, 0x5a, 0xfd, 0x78, 0x97, 0x67, 0xf1, 0x3d, 0x1f, 0xc7, 0xe7, 0xb0, 0x84, 0xef, 0x77, 0x2a, 0xd9, 0x25, 0x95, 0xda, 0x26, 0x54, 0x66, 0x93, 0x64, 0xb7, 0xd, 0xdf, 0xef, 0xae, 0x54, 0x76, 0x9a, 0x57, 0xc3, 0x2f, 0x9, 0x3e, 0x2b, 0x58, 0xd7, 0x3, 0x8d, 0xdc, 0x4a, 0x4b, 0x4f, 0xc9, 0x2e, 0xa2, 0xa8, 0x97, 0x25, 0x97, 0x51, 0x75, 0xe8, 0x4f, 0xf7, 0x41, 0xaf, 0x1a, 0x68, 0xd6, 0xe3, 0xb9, 0xf0, 0xb1, 0x0, 0x27, 0xd0, 0x4a, 0xcd, 0x4, 0xc9, 0xec, 0xb7, 0xf9, 0x16, 0x6d, 0x1a, 0x19, 0x5e, 0x87, 0x51, 0xa3, 0x3e, 0xa0, 0x1a, 0xb, 0x17, 0xd6, 0xe7, 0x28, 0x5a, 0x8, 0xff, 0xce, 0xd3, 0xf5, 0x83, 0xac, 0xc4, 0x21, 0x54, 0x50, 0x6a, 0xfa, 0xae, 0x42, 0x2b, 0x5f, 0x98, 0x42, 0x1e, 0x73, 0xb9, 0x69, 0x81, 0x5c, 0x3e, 0xe, 0xe0, 0x5e, 0xf1, 0x5c, 0xef, 0x12, 0x27, 0x26, 0x97, 0xe, 0x3f, 0x70, 0x33, 0x7d, 0x5f, 0x9c, 0xf8, 0xcd, 0x2c, 0xa9, 0xb9, 0x1b, 0x71, 0x59, 0x35, 0x7b, 0x1a, 0x48, 0x10, 0x9, 0x43, 0x7, 0x8a, 0x93, 0xb4, 0xd2, 0x85, 0x9b, 0x71, 0x3a, 0xf4, 0xe6, 0x9a, 0xbc, 0xdb, 0xc8, 0x30, 0x89, 0xa6, 0x2b, 0x1d, 0xdf, 0xfd, 0x4c, 0x2a, 0x1c, 0x99, 0x74, 0x6a, 0x42, 0x1c, 0xed, 0xb, 0x71, 0x7a, 0xf9, 0x7e, 0xc8, 0x77, 0x37, 0xd3, 0x24, 0x12, 0x58, 0xc1, 0x3f, 0x7a, 0x5c, 0xc3, 0xfc, 0xef, 0xce, 0xf7, 0x1c, 0x4a, 0xee, 0xde, 0x24, 0x47, 0x2f, 0xf4, 0xe1, 0xfb, 0xfe, 0xb0, 0x91, 0x9b, 0xa4, 0x6a, 0x5f, 0x61, 0x25, 0x3b, 0x45, 0xb5, 0xc0, 0xb, 0x7f, 0xa5, 0x91, 0x23, 0x33, 0x78, 0xd6, 0x15, 0xd4, 0xb0, 0x9f, 0xe0, 0x46, 0x34, 0xc1, 0xe7, 0x7b, 0xc1, 0x4b, 0x34, 0x83, 0x82, 0x33, 0xff, 0xf6, 0x35, 0x72, 0x34, 0x37, 0xf2, 0x2d, 0x3c, 0xfe, 0x4f, 0x33, 0x23, 0xff, 0xa2, 0xa6, 0x8e, 0x4d, 0x7f, 0x5d, 0x1e, 0x3d, 0xbb, 0x53, 0xb8, 0x69, 0x75, 0xc8, 0xf0, 0xf3, 0x20, 0x8c, 0x89, 0xdc, 0xb8, 0xbe, 0x22, 0xa9, 0x2d, 0x94, 0xec, 0x24, 0xfd, 0xc0, 0xea, 0x84, 0xeb, 0x39, 0x5d, 0x62, 0xc, 0xb2, 0xf1, 0x1e, 0xa5, 0xe5, 0x34, 0x25, 0xc0, 0x7b, 0x29, 0xa3, 0x62, 0x36, 0x96, 0x22, 0x5c, 0x3f, 0x70, 0x1, 0xff, 0x89, 0xa, 0x5f, 0x61, 0x9a, 0xfd, 0xf0, 0x22, 0xbe, 0x37, 0x58, 0x97, 0x33, 0x23, 0xb4, 0x5e, 0x92, 0x61, 0x80, 0x23, 0x32, 0x98, 0x9f, 0xd1, 0xe2, 0x24, 0x8b, 0x20, 0x76, 0xf6, 0x6d, 0x0, 0xf7, 0x82, 0xf7, 0xf4, 0x53, 0x4a, 0x82, 0x64, 0x77, 0x38, 0xd7, 0x74, 0xfb, 0x34, 0x96, 0x1e, 0x2c, 0xbc, 0xbe, 0x5c, 0xf7, 0x4f, 0x28, 0xd9, 0x45, 0xb, 0x30, 0xe5, 0x9b, 0x7a, 0x3c, 0xd8, 0xa0, 0x2d, 0x2, 0xb8, 0x31, 0xce, 0x91, 0xea, 0x33, 0xf3, 0x16, 0xd3, 0x82, 0x7a, 0x82, 0xda, 0x5d, 0xb6, 0xe2, 0x64, 0x9f, 0x51, 0x86, 0xf3, 0x5e, 0xe1, 0xfa, 0xf2, 0x3a, 0xcd, 0x7d, 0x30, 0x5d, 0x24, 0x27, 0xd1, 0xad, 0x12, 0x67, 0x40, 0x23, 0xbf, 0x9d, 0xdf, 0x35, 0x13, 0x5, 0x2, 0x1b, 0xfa, 0x5b, 0x46, 0x5e, 0x26, 0xc1, 0x95, 0x65, 0xf1, 0x5e, 0xb, 0xf9, 0xfc, 0x6, 0xa5, 0xf9, 0xcc, 0x47, 0xb4, 0x96, 0x5e, 0x92, 0xdc, 0xc5, 0x60, 0x93, 0x4a, 0xd6, 0x63, 0xb4, 0x38, 0xce, 0x33, 0x72, 0x6c, 0x1a, 0x25, 0xb, 0xd6, 0x8, 0xd2, 0xe5, 0x7, 0x70, 0xc3, 0x8e, 0x82, 0x62, 0x84, 0xe7, 0xd0, 0x22, 0xcd, 0x67, 0xf0, 0xde, 0xa0, 0xd4, 0xe7, 0x11, 0xbe, 0x77, 0x95, 0x59, 0xba, 0xb7, 0x4a, 0x5a, 0x8f, 0x10, 0xb8, 0x2a, 0x8f, 0xe1, 0xbe, 0xd4, 0xd3, 0xe3, 0xf3, 0xc8, 0xd4, 0x7e, 0x9c, 0x4a, 0xc9, 0x10, 0x7a, 0x2, 0x7c, 0x81, 0xb6, 0xb, 0xb, 0x16, 0x70, 0xd3, 0x15, 0x5b, 0x2c, 0xa8, 0xa0, 0xb2, 0xbf, 0xea, 0x91, 0x34, 0xa0, 0x3d, 0x5f, 0x50, 0xd, 0xd1, 0x2d, 0xa4, 0xbb, 0xe6, 0x20, 0xbe, 0xd4, 0xef, 0xe5, 0x68, 0x33, 0x5a, 0xca, 0x45, 0xdd, 0x87, 0x1b, 0xa2, 0x17, 0xfa, 0x51, 0x1b, 0x6d, 0x16, 0xe3, 0xf5, 0x82, 0xd, 0xe0, 0x9d, 0xc, 0x88, 0x6e, 0x39, 0xad, 0x63, 0x3c, 0x3b, 0xb8, 0x8a, 0xfe, 0x29, 0x8e, 0xdb, 0xb8, 0x2c, 0xcb, 0xf7, 0x3b, 0x22, 0xd, 0xd1, 0x2d, 0xe2, 0xa6, 0x86, 0x24, 0x95, 0xe7, 0x24, 0x1c, 0xc9, 0x46, 0x15, 0xf4, 0x58, 0xc, 0xe4, 0x7a, 0x43, 0x46, 0xa0, 0x57, 0x62, 0x44, 0x47, 0x12, 0xde, 0x81, 0x21, 0x5e, 0x2f, 0x5, 0x24, 0x90, 0xc7, 0xd3, 0x10, 0x5d, 0x5, 0x49, 0x1e, 0xdf, 0xf7, 0x4c, 0x92, 0x77, 0x65, 0x8e, 0xee, 0x17, 0x99, 0xe9, 0x4f, 0xf2, 0x5e, 0xb0, 0xc6, 0xa7, 0xa6, 0xf9, 0xec, 0xe9, 0x54, 0xe2, 0x7a, 0x28, 0xd9, 0x45, 0x3, 0x4d, 0xa5, 0x6a, 0x5c, 0x6a, 0x43, 0x40, 0xae, 0x3, 0x68, 0xac, 0x23, 0xa9, 0xb9, 0xed, 0x98, 0xe6, 0x73, 0x88, 0x91, 0xc0, 0xb5, 0x89, 0xb6, 0x65, 0xd7, 0x85, 0xc8, 0x55, 0x33, 0x99, 0x5a, 0xdf, 0x5f, 0x65, 0x63, 0x72, 0x82, 0x1b, 0x88, 0xb, 0x3d, 0x95, 0x46, 0x23, 0x8f, 0x32, 0x4e, 0xe4, 0xf3, 0xeb, 0x9a, 0xe6, 0x33, 0x8b, 0xa8, 0xa0, 0xec, 0x46, 0x6b, 0xf8, 0xe3, 0x1c, 0xde, 0x2f, 0xea, 0xd6, 0xce, 0xf7, 0xb8, 0xf6, 0x16, 0x35, 0xf3, 0xfb, 0x25, 0xbc, 0xae, 0x67, 0x90, 0xde, 0xb9, 0x54, 0x16, 0x3e, 0xf4, 0xf8, 0x4c, 0xb, 0x2a, 0x58, 0x5d, 0x42, 0x78, 0xff, 0xf0, 0x82, 0x20, 0x83, 0x14, 0xb1, 0x78, 0x2f, 0x4f, 0xd1, 0xe7, 0xfc, 0x7e, 0x20, 0x8e, 0xaf, 0x43, 0x74, 0xef, 0x50, 0xf6, 0x9f, 0x26, 0x91, 0xd, 0x4d, 0x63, 0xbd, 0xc1, 0x9d, 0xfc, 0x6, 0xf7, 0x5, 0x25, 0xbb, 0x90, 0x3, 0xd9, 0x88, 0xee, 0xf4, 0xfb, 0x1f, 0xc4, 0xdf, 0x6c, 0x4c, 0x68, 0x77, 0x97, 0x88, 0xe3, 0x8a, 0xec, 0x5b, 0x8d, 0x1b, 0xe3, 0x6, 0x5a, 0x3, 0x8, 0x2, 0xaf, 0xc, 0xe9, 0x9c, 0xc1, 0xe5, 0x75, 0x38, 0x49, 0xd9, 0x8b, 0xf0, 0x86, 0x4b, 0x38, 0x12, 0x7f, 0xfc, 0xc2, 0x60, 0x6a, 0xdf, 0x4d, 0xd3, 0x68, 0xe7, 0xf, 0x50, 0x23, 0x86, 0x82, 0xb2, 0x24, 0xc7, 0xf7, 0x8b, 0x58, 0xeb, 0xdf, 0x3d, 0xae, 0xdd, 0xc1, 0xeb, 0x73, 0x22, 0x32, 0xf7, 0x88, 0x5f, 0xf5, 0xa7, 0x75, 0x6c, 0xc3, 0xb6, 0xb4, 0x9c, 0xb6, 0xc, 0xd1, 0x3d, 0xb7, 0xa5, 0x17, 0xc4, 0x8b, 0x4, 0xa0, 0x50, 0x27, 0x4b, 0x3f, 0xde, 0xd, 0xf1, 0xdc, 0xc3, 0xd2, 0xbb, 0x99, 0x7b, 0xd2, 0x48, 0x8f, 0xcf, 0x34, 0xe7, 0xfc, 0x5f, 0xa0, 0x64, 0x17, 0x6e, 0x6c, 0x6f, 0x19, 0x9b, 0xef, 0xb3, 0xe5, 0x8, 0x17, 0xd1, 0xed, 0x69, 0xdc, 0x18, 0x58, 0xf8, 0x88, 0xc7, 0xed, 0xc3, 0x17, 0x20, 0xa, 0xbd, 0x2, 0x3f, 0xe5, 0x6, 0xf4, 0x59, 0x1a, 0x17, 0xc7, 0xc5, 0x31, 0x58, 0x1f, 0x50, 0x54, 0xae, 0x15, 0x27, 0x8b, 0xd1, 0x2b, 0x69, 0x2, 0xc9, 0x26, 0x70, 0xe1, 0x9e, 0x1d, 0x12, 0x2b, 0x1c, 0xb1, 0xd3, 0x3b, 0xc5, 0x5e, 0xba, 0x72, 0xa3, 0x38, 0x75, 0x6b, 0x51, 0xab, 0x57, 0x43, 0x79, 0x10, 0x12, 0x53, 0x4e, 0x13, 0x7b, 0x88, 0x61, 0x2f, 0x3e, 0xa7, 0x30, 0x0, 0x56, 0x26, 0xba, 0xd, 0xed, 0xef, 0x71, 0x7d, 0x1a, 0xdf, 0x1d, 0x28, 0xb6, 0x51, 0xc9, 0x28, 0x9d, 0x42, 0x5, 0x17, 0x56, 0x9e, 0x2d, 0xeb, 0xbb, 0x9, 0x95, 0x91, 0xcb, 0x94, 0xec, 0xc2, 0xb, 0x5b, 0x26, 0x9d, 0x9f, 0x1a, 0x2f, 0x5c, 0x19, 0x7, 0xa4, 0xb9, 0xfe, 0x39, 0x17, 0x11, 0x5e, 0xe2, 0xa8, 0x35, 0x5f, 0xfe, 0x86, 0x16, 0xc2, 0x27, 0x1e, 0xd7, 0x61, 0x59, 0xfc, 0x3e, 0xe2, 0xeb, 0x3, 0x75, 0x5d, 0xc3, 0xaa, 0xb1, 0x72, 0xfb, 0xd2, 0x6a, 0xf, 0xb, 0xb0, 0xe9, 0xdb, 0x4e, 0xbb, 0xb8, 0x85, 0xca, 0x54, 0x94, 0x1, 0xa5, 0x10, 0xc9, 0x2b, 0xb6, 0xf8, 0xe2, 0xb9, 0x54, 0x3a, 0x72, 0x89, 0x4e, 0xb4, 0xe8, 0xbc, 0xfa, 0x58, 0xbe, 0x40, 0x6b, 0x2e, 0x8a, 0xb5, 0x82, 0x15, 0xb4, 0xf2, 0x8e, 0x13, 0xef, 0xee, 0x52, 0x37, 0x53, 0x29, 0x51, 0xb2, 0xb, 0x19, 0xa0, 0xa9, 0xef, 0x6a, 0x19, 0x9f, 0xec, 0xe3, 0xef, 0x98, 0x27, 0x76, 0x77, 0x12, 0x12, 0x18, 0xae, 0x20, 0x19, 0x8c, 0x8e, 0xf0, 0x1c, 0x7e, 0xcf, 0xc5, 0x6f, 0x4b, 0x55, 0x47, 0x2d, 0xcf, 0x8, 0x9, 0x77, 0x27, 0x91, 0x74, 0x80, 0x5b, 0x66, 0x88, 0xc7, 0x35, 0x3c, 0x3f, 0xb4, 0x3, 0x43, 0xfc, 0xf2, 0xc7, 0x10, 0xdd, 0x33, 0x14, 0xa7, 0x13, 0x2c, 0xe3, 0x2f, 0x92, 0xe8, 0x2a, 0x63, 0xf0, 0xde, 0xa2, 0x3c, 0xe2, 0x7c, 0xcb, 0x77, 0xc1, 0xfb, 0xdc, 0x26, 0x87, 0xf7, 0x5, 0xc5, 0xf6, 0x71, 0xf1, 0x3e, 0xf, 0x13, 0xef, 0x2, 0x4a, 0x2b, 0xa2, 0x7e, 0xca, 0xc3, 0x3b, 0x5c, 0x67, 0x5f, 0x7a, 0xf0, 0xd5, 0x70, 0x7a, 0xf, 0x94, 0xec, 0x42, 0x4, 0xc4, 0xea, 0xf6, 0xb3, 0x8c, 0xcf, 0xf2, 0xf1, 0x77, 0xe0, 0x85, 0xbc, 0x47, 0x36, 0x3d, 0x1f, 0x6f, 0x24, 0xad, 0x1, 0x68, 0xda, 0x25, 0x31, 0x98, 0xc7, 0x25, 0xb4, 0x4c, 0x6d, 0x41, 0xec, 0x3d, 0xeb, 0xea, 0xda, 0xc8, 0x11, 0x50, 0xc3, 0x75, 0x87, 0xc7, 0x35, 0x14, 0xd4, 0xa2, 0x9d, 0xd2, 0x53, 0x21, 0xbb, 0x67, 0x64, 0x15, 0x5f, 0x2c, 0x55, 0xdd, 0xad, 0x8b, 0x39, 0x5e, 0x16, 0xa3, 0x77, 0x17, 0x1d, 0x7c, 0x1e, 0x4a, 0xf9, 0x37, 0xdc, 0xe9, 0xe8, 0x21, 0xfb, 0x4c, 0x8e, 0xee, 0x7, 0xa, 0x1d, 0x5a, 0x6a, 0xed, 0xed, 0x71, 0xfd, 0x1a, 0x3e, 0x83, 0xb8, 0x9c, 0xe7, 0x87, 0x2c, 0xcd, 0x3f, 0xca, 0xc6, 0x3a, 0x49, 0x9b, 0x17, 0xe1, 0x7c, 0x25, 0xbb, 0xf0, 0x0, 0x8d, 0x95, 0xdd, 0xad, 0x7a, 0x16, 0x5, 0xa0, 0x79, 0x55, 0x70, 0xa1, 0x63, 0x61, 0xdc, 0xc4, 0x45, 0xf2, 0x75, 0xcc, 0xe6, 0x72, 0x2, 0xdd, 0x17, 0xb6, 0xc4, 0x1e, 0x8c, 0xef, 0x16, 0xa1, 0xef, 0x2, 0x57, 0x98, 0x57, 0xcc, 0xb, 0x5d, 0x6b, 0xe, 0x16, 0xef, 0x58, 0x65, 0x2e, 0x81, 0x98, 0x6f, 0x6f, 0xcb, 0xf8, 0xdf, 0x24, 0x98, 0xec, 0xe2, 0x5c, 0x3, 0x1e, 0x13, 0x64, 0x36, 0xa3, 0x1e, 0xf, 0xa1, 0x2, 0xa4, 0xcc, 0xaf, 0xcd, 0xc1, 0x7d, 0x60, 0x9d, 0x20, 0xa6, 0xeb, 0x55, 0x2, 0x71, 0x95, 0x78, 0x27, 0xb, 0x45, 0x19, 0x8b, 0xa9, 0xf4, 0xbd, 0xe2, 0xc1, 0x5b, 0xe8, 0x67, 0xda, 0x5f, 0xc9, 0x2e, 0x1c, 0x38, 0xd2, 0x43, 0x63, 0x59, 0x18, 0xc0, 0xef, 0x5a, 0xca, 0xdf, 0x77, 0x65, 0x4c, 0xac, 0x39, 0x1b, 0x60, 0xe9, 0x3c, 0x6a, 0x19, 0x47, 0xf0, 0x7a, 0x50, 0x44, 0xbe, 0x3, 0x6a, 0xb7, 0xee, 0x13, 0x7b, 0x7f, 0xcb, 0x2f, 0xf9, 0xc, 0xe7, 0x85, 0xf4, 0xde, 0x61, 0xd9, 0xb8, 0x33, 0x60, 0xe1, 0x92, 0x7f, 0x2e, 0xa6, 0xeb, 0xd, 0xef, 0xe9, 0x19, 0xe2, 0x14, 0x62, 0xe7, 0xd2, 0x6a, 0x1d, 0x4c, 0xcf, 0x86, 0x97, 0x45, 0x77, 0x63, 0x8c, 0xf7, 0x50, 0x24, 0xe, 0xd, 0xf0, 0x50, 0xfe, 0x10, 0xc6, 0x40, 0x86, 0x72, 0xa6, 0x1d, 0x86, 0x94, 0xec, 0x2, 0x2, 0xfa, 0x40, 0xda, 0x3a, 0x4, 0xa0, 0x8b, 0x40, 0x50, 0xc5, 0xb5, 0xab, 0xf3, 0x60, 0x5e, 0x87, 0x79, 0x90, 0x1, 0x62, 0x15, 0x5d, 0x43, 0x7e, 0xef, 0x28, 0xf0, 0x47, 0xdd, 0x59, 0x5b, 0xcb, 0xb5, 0xc9, 0xb4, 0x20, 0x16, 0x87, 0xf4, 0xde, 0xe1, 0x92, 0x3f, 0xd4, 0xe2, 0x51, 0xb8, 0x47, 0xaa, 0x36, 0x3a, 0x57, 0xf8, 0x7, 0xa4, 0xe4, 0xdf, 0x22, 0xf6, 0x32, 0x9b, 0xbb, 0x62, 0x6a, 0xd1, 0xb9, 0x81, 0x12, 0x29, 0xc4, 0xed, 0x6d, 0xde, 0xaa, 0x36, 0xb4, 0xb8, 0x33, 0x3a, 0x5d, 0x45, 0xc9, 0x2e, 0x18, 0xa0, 0xc0, 0x7b, 0x67, 0xd7, 0x18, 0xfc, 0xe9, 0x63, 0x74, 0x6a, 0xea, 0x84, 0xef, 0xf8, 0xf2, 0xbb, 0x81, 0x98, 0xc6, 0xd9, 0x21, 0xbf, 0x77, 0xd4, 0xc7, 0xf5, 0xf2, 0xb0, 0x20, 0x50, 0x50, 0x1e, 0x66, 0x57, 0x20, 0x36, 0xdd, 0xad, 0x5d, 0x63, 0x70, 0xc7, 0xbf, 0xac, 0x4b, 0x32, 0x30, 0xa0, 0x6d, 0xdc, 0xdd, 0x62, 0x3f, 0x3d, 0x2, 0x9d, 0x5d, 0x2e, 0xcb, 0xa3, 0xb9, 0xc0, 0x5a, 0x3b, 0xd9, 0xe3, 0x1d, 0x41, 0x8f, 0xdd, 0x8c, 0xca, 0x42, 0x94, 0xec, 0x82, 0xc1, 0x11, 0x16, 0x6d, 0x3, 0xe9, 0xb4, 0x1f, 0xeb, 0xd4, 0xd4, 0x19, 0xe8, 0x68, 0x31, 0xc9, 0x32, 0x7e, 0xbc, 0x64, 0xd6, 0xe9, 0x3d, 0x17, 0x40, 0x31, 0xf8, 0x85, 0x96, 0x71, 0xc4, 0x80, 0x90, 0xac, 0x32, 0x25, 0xe4, 0x73, 0xe, 0x2f, 0x85, 0x3b, 0xc6, 0x88, 0x92, 0x90, 0x65, 0xba, 0x1c, 0x3, 0x3, 0x36, 0x70, 0x5b, 0x89, 0x1, 0x9a, 0x7d, 0xa3, 0xc, 0xa2, 0x24, 0xcf, 0xe6, 0x63, 0x2a, 0xdf, 0x21, 0x9b, 0x67, 0xc, 0x39, 0xb, 0x47, 0x29, 0xd9, 0x65, 0x1f, 0x68, 0xf, 0xf6, 0x7f, 0x96, 0x71, 0xd4, 0xc7, 0x6c, 0xd0, 0xe9, 0xa9, 0x33, 0xd0, 0x75, 0xe1, 0x1e, 0xcb, 0x78, 0xcb, 0x4c, 0x16, 0x7c, 0x96, 0x51, 0x42, 0xab, 0x13, 0xd6, 0xa8, 0xad, 0x4f, 0x29, 0xd2, 0xf5, 0x47, 0x86, 0x7c, 0xbe, 0x11, 0x5f, 0xb4, 0x9d, 0x62, 0xff, 0xb6, 0x2e, 0xc5, 0xc0, 0xd0, 0x97, 0x4a, 0x90, 0x1b, 0xd8, 0x3f, 0xd0, 0x6f, 0x74, 0x71, 0x9e, 0xce, 0xb, 0xf6, 0x50, 0xaf, 0x2c, 0x66, 0xd4, 0xac, 0xb6, 0x50, 0xb2, 0xcb, 0x2e, 0x50, 0x8, 0xdd, 0xd1, 0x35, 0x6, 0x6d, 0xe4, 0x39, 0x9d, 0x1a, 0xdf, 0x80, 0x14, 0xf0, 0x19, 0xae, 0xb1, 0x4, 0xc9, 0xae, 0x28, 0x44, 0xf7, 0x9, 0xb2, 0x43, 0x3d, 0xdd, 0x5e, 0x96, 0x6b, 0x48, 0x7c, 0x18, 0x11, 0x81, 0xb9, 0x46, 0x1f, 0x52, 0xdb, 0xb1, 0x2c, 0x9f, 0xeb, 0x32, 0xc, 0x4, 0x50, 0x8e, 0x6e, 0xb7, 0xec, 0xcd, 0x28, 0x33, 0x42, 0xe6, 0xe5, 0x67, 0x79, 0x3e, 0x3f, 0xc8, 0x38, 0xff, 0xc0, 0x32, 0x8e, 0xce, 0x32, 0x43, 0x94, 0xec, 0xb2, 0x87, 0x22, 0xba, 0x18, 0xdc, 0x80, 0xcb, 0x67, 0x92, 0x4e, 0x8f, 0x6f, 0x40, 0x52, 0xc4, 0xf3, 0x96, 0x71, 0x9c, 0x90, 0xbc, 0x7d, 0x88, 0xee, 0x13, 0x75, 0x51, 0x36, 0xf7, 0xe5, 0x3c, 0x8f, 0xf1, 0xb0, 0x92, 0x9d, 0x7b, 0x4e, 0xe1, 0xbe, 0x5c, 0xa1, 0xcb, 0x30, 0x10, 0x60, 0xff, 0xb0, 0x95, 0xd2, 0x8c, 0x15, 0xe7, 0x6c, 0xc7, 0x7c, 0x7, 0x5a, 0xa0, 0x9d, 0x27, 0xf6, 0xc4, 0xa8, 0xf3, 0x3c, 0x14, 0x4b, 0x25, 0xbb, 0x0, 0x80, 0xd4, 0x71, 0x5b, 0xcf, 0x3a, 0xa4, 0xcd, 0xaf, 0xd7, 0xe9, 0xf1, 0x15, 0xb0, 0x94, 0xdd, 0x1d, 0xf5, 0x51, 0xd7, 0xd8, 0x33, 0x44, 0xf7, 0x88, 0x17, 0xaf, 0xb9, 0x6b, 0xc, 0x59, 0x8c, 0xc3, 0x24, 0x98, 0x12, 0x94, 0x20, 0xd0, 0xc4, 0x62, 0x2d, 0xa3, 0x31, 0xc2, 0x6a, 0x5d, 0x82, 0xbe, 0x3, 0xa7, 0xa9, 0xdb, 0xba, 0x83, 0x60, 0x9d, 0x5f, 0xa4, 0x7b, 0xc8, 0x6f, 0x98, 0x4a, 0xeb, 0xd7, 0x8d, 0x46, 0x95, 0x95, 0x95, 0xd7, 0x16, 0x35, 0x68, 0xd0, 0x40, 0xc9, 0x2e, 0x58, 0xa0, 0xb3, 0x84, 0xad, 0x33, 0xf7, 0x7c, 0x51, 0x17, 0x66, 0x10, 0x80, 0x1b, 0xd3, 0x76, 0x34, 0x4b, 0xbf, 0x90, 0xdf, 0x37, 0xda, 0xb7, 0x3d, 0x1d, 0xa1, 0x79, 0xb6, 0x95, 0x4a, 0x20, 0x76, 0x54, 0xa6, 0x4b, 0xd0, 0x77, 0xa0, 0x2b, 0x88, 0xed, 0x0, 0x63, 0xc4, 0xa8, 0x27, 0xea, 0xf4, 0x6c, 0x2, 0x34, 0x86, 0x9e, 0xe6, 0x1e, 0x34, 0x44, 0xd7, 0xef, 0x8d, 0xd1, 0x1f, 0xf4, 0x56, 0xb2, 0xb, 0x16, 0xa7, 0x79, 0x58, 0x75, 0x88, 0xcb, 0xac, 0xd2, 0xe9, 0xf1, 0x1d, 0x65, 0x1e, 0x64, 0xb7, 0xaf, 0x84, 0x2b, 0x6e, 0xe7, 0x26, 0x89, 0x2b, 0x23, 0x46, 0x14, 0x4d, 0x2c, 0x63, 0x68, 0xdd, 0x56, 0xaa, 0x4b, 0xd0, 0x57, 0x20, 0x2e, 0x3a, 0xc0, 0x32, 0x3e, 0x4f, 0xa2, 0x11, 0xdb, 0xcd, 0x36, 0xb0, 0xa7, 0x5e, 0xef, 0x1e, 0x2c, 0x28, 0x28, 0x28, 0x9c, 0x38, 0x6d, 0xe6, 0x25, 0xd3, 0x67, 0xcf, 0x4d, 0x28, 0xd9, 0x5, 0x3, 0xd4, 0x20, 0x5d, 0x61, 0x19, 0x9f, 0x2d, 0xb9, 0xeb, 0xa7, 0x97, 0xf, 0x40, 0x92, 0x84, 0xdb, 0xb5, 0x83, 0x73, 0xc7, 0x3a, 0x87, 0xf4, 0x7e, 0xd1, 0xc8, 0x77, 0x42, 0xc4, 0xe6, 0xd8, 0xd6, 0xa2, 0x6d, 0xb5, 0xf8, 0x7b, 0x26, 0xa3, 0xc2, 0x51, 0x96, 0xb7, 0xb1, 0x8c, 0xa3, 0x65, 0xd9, 0x12, 0x9d, 0x1e, 0x2b, 0x70, 0xca, 0xc3, 0x26, 0x8d, 0xee, 0x13, 0x86, 0xe2, 0x4a, 0x4a, 0x4b, 0xfb, 0xbe, 0xfc, 0xf6, 0x7b, 0x87, 0x54, 0x54, 0x54, 0x28, 0xd9, 0xf9, 0xc, 0x68, 0x10, 0xe8, 0x64, 0x60, 0x3b, 0x1d, 0xfc, 0x1f, 0xe2, 0x7d, 0xa, 0xaf, 0xa2, 0xee, 0x98, 0x60, 0xd9, 0x8, 0x90, 0xcd, 0xb6, 0x4b, 0x8, 0xef, 0x15, 0xa7, 0x17, 0xdc, 0x11, 0x13, 0x92, 0x80, 0x15, 0x52, 0xac, 0xcb, 0xcf, 0x37, 0x6c, 0xee, 0x61, 0xd5, 0xa1, 0x98, 0xfa, 0x5e, 0x9d, 0x1e, 0x4f, 0xa0, 0x51, 0xc7, 0xad, 0x6e, 0x2f, 0x43, 0xe3, 0x46, 0xd, 0x65, 0xfc, 0xa4, 0xa9, 0x83, 0xbf, 0x9e, 0x3a, 0xa3, 0xbe, 0x92, 0x9d, 0xbf, 0x40, 0xab, 0xaa, 0xd3, 0x2d, 0xe3, 0xef, 0x1b, 0x79, 0x56, 0xa7, 0x27, 0x70, 0x2, 0x59, 0x60, 0x51, 0x3e, 0xc2, 0x48, 0x76, 0x6f, 0x89, 0xbf, 0x27, 0x5e, 0x64, 0x53, 0x99, 0x73, 0xa3, 0xbe, 0x2e, 0x3d, 0x5f, 0x81, 0x63, 0x93, 0x6c, 0xb1, 0xd1, 0x7f, 0x4b, 0xb8, 0x8e, 0x78, 0xa, 0x23, 0x50, 0x86, 0x30, 0xae, 0xa, 0xb, 0x96, 0x57, 0xf4, 0x5a, 0xb7, 0x7e, 0x43, 0x77, 0x25, 0x3b, 0xff, 0x80, 0xb6, 0x60, 0x23, 0x2c, 0xf3, 0x88, 0xf4, 0xd8, 0x28, 0x9e, 0xd8, 0x1c, 0x45, 0x4c, 0xb3, 0x8c, 0x6d, 0x1b, 0xb2, 0x7b, 0x44, 0xbd, 0xdd, 0xdd, 0x11, 0x9d, 0x5f, 0x9b, 0x67, 0x2, 0x87, 0xb7, 0x36, 0xd6, 0xa5, 0xe7, 0xb, 0x10, 0x5f, 0x3e, 0xd6, 0x32, 0x8e, 0xc2, 0xf1, 0xa7, 0x74, 0x7a, 0xaa, 0x5, 0xc2, 0x18, 0x55, 0x4a, 0x32, 0x8a, 0x8b, 0x8b, 0x1a, 0xff, 0xe7, 0xc5, 0xd7, 0x8f, 0x57, 0xb2, 0xf3, 0x7, 0x88, 0xd, 0x3d, 0x6c, 0x64, 0x2b, 0xcb, 0x35, 0xb8, 0xab, 0xbe, 0xd4, 0x29, 0xca, 0xa, 0x6c, 0xf5, 0x8b, 0x88, 0xa1, 0x16, 0x86, 0xe8, 0x1e, 0xdf, 0x95, 0xe8, 0xc5, 0xea, 0x92, 0xb0, 0xc5, 0x8b, 0x60, 0x85, 0x34, 0xd5, 0xa5, 0xe7, 0xb, 0xe0, 0x85, 0xe8, 0x65, 0x19, 0x7f, 0x43, 0xbc, 0x4f, 0xec, 0x56, 0x6c, 0x8a, 0x57, 0xdc, 0x73, 0x55, 0x2f, 0x91, 0x90, 0x1f, 0x57, 0xae, 0x3a, 0xe9, 0xb5, 0x51, 0x63, 0x37, 0x53, 0xb2, 0xab, 0x1b, 0x50, 0x3b, 0x5, 0x17, 0xe5, 0x9e, 0x96, 0x6b, 0x1f, 0x89, 0x73, 0x7c, 0xbc, 0x22, 0x3b, 0xb0, 0x6d, 0x8, 0xcd, 0xc4, 0x69, 0xdb, 0x16, 0x6, 0x20, 0xae, 0xf0, 0x5f, 0x89, 0x6e, 0xaa, 0x3e, 0xba, 0xce, 0x2f, 0x75, 0x8d, 0x41, 0x91, 0xe8, 0xa9, 0x4b, 0xcf, 0x17, 0xf4, 0x11, 0x7b, 0xf6, 0xf0, 0x23, 0x3a, 0x35, 0x19, 0x3, 0x2d, 0x4, 0x1f, 0x4b, 0x1d, 0x48, 0x18, 0xb2, 0x2b, 0x29, 0x29, 0x6d, 0x3d, 0x67, 0xfe, 0xb7, 0x7d, 0x95, 0xec, 0x6a, 0x8f, 0x2d, 0xb8, 0x79, 0x1d, 0x6c, 0xb9, 0x86, 0xae, 0xfc, 0xe8, 0xbe, 0x5f, 0xa2, 0xd3, 0x94, 0x35, 0xd8, 0x3a, 0xa1, 0xb7, 0xe, 0x91, 0xe5, 0x1, 0xcb, 0xe8, 0xf5, 0x8, 0xcf, 0xef, 0x4f, 0x1e, 0x73, 0xfc, 0x47, 0x5d, 0x7a, 0xbe, 0xe0, 0x78, 0xcb, 0xd8, 0x78, 0x8a, 0x22, 0x73, 0xe0, 0x1d, 0xdb, 0xa4, 0xd1, 0x41, 0xc3, 0xe2, 0x6, 0x32, 0x7d, 0xf6, 0xdc, 0xa3, 0xd, 0xe1, 0x29, 0xd9, 0xd5, 0x2, 0xb0, 0x18, 0x9e, 0xf7, 0x20, 0x3a, 0x10, 0xdc, 0x99, 0x62, 0x8f, 0x21, 0x29, 0x82, 0xc3, 0x5a, 0x8b, 0x72, 0x1, 0xa2, 0x6b, 0x10, 0x92, 0xfb, 0x1b, 0x49, 0xc2, 0x88, 0x2a, 0x56, 0x79, 0x6c, 0xbc, 0xb0, 0x48, 0x3a, 0xea, 0xf2, 0xab, 0x13, 0x76, 0x12, 0xfb, 0x39, 0x8c, 0x50, 0xa6, 0xb5, 0x8e, 0xb1, 0x66, 0xc0, 0xc9, 0x21, 0x9b, 0x84, 0xa, 0xa, 0xa, 0xa, 0x64, 0xc9, 0xd2, 0xe5, 0xfb, 0x2d, 0x5f, 0xf1, 0x53, 0x1b, 0x25, 0xbb, 0x9a, 0x1, 0xbe, 0xf5, 0xb7, 0x3c, 0x88, 0xe, 0x18, 0x2c, 0xe1, 0xef, 0x60, 0x1f, 0x47, 0xa0, 0x95, 0x92, 0x3b, 0x89, 0x2, 0xae, 0xc3, 0xb0, 0xa4, 0xf8, 0xc7, 0x21, 0x23, 0x77, 0xb4, 0x65, 0x3e, 0xe1, 0xca, 0xbf, 0x5c, 0x97, 0x5f, 0x9d, 0x80, 0x73, 0x2, 0xdd, 0xee, 0x76, 0xf4, 0x7c, 0xd4, 0xa3, 0xc0, 0x6a, 0xe, 0x24, 0xaa, 0x8c, 0x4a, 0x1d, 0xa8, 0xac, 0xac, 0x34, 0x84, 0x57, 0xbf, 0x5d, 0x79, 0x45, 0xc5, 0xee, 0x4a, 0x76, 0x35, 0x73, 0x35, 0xe0, 0x85, 0xef, 0xe1, 0x71, 0x1d, 0x7, 0x73, 0x3e, 0xa0, 0xd3, 0x94, 0x33, 0x94, 0xbb, 0xfe, 0x8d, 0x1a, 0xb0, 0x30, 0x74, 0x51, 0x81, 0xff, 0x64, 0x72, 0xc, 0xe6, 0xf7, 0x1d, 0x23, 0x73, 0x2d, 0xe3, 0x67, 0x88, 0x93, 0x36, 0xaf, 0xa8, 0x1d, 0xd0, 0x71, 0xc9, 0x5d, 0xda, 0x31, 0x4f, 0xc2, 0x7f, 0xbe, 0x61, 0x58, 0xf1, 0x86, 0x5b, 0x29, 0x6b, 0x58, 0x5c, 0x54, 0xef, 0xc9, 0x17, 0x5e, 0xdb, 0x7f, 0x43, 0x49, 0x89, 0x92, 0x5d, 0x35, 0xc0, 0xf9, 0x48, 0x48, 0x19, 0x47, 0x2f, 0xc3, 0x6d, 0x3c, 0x3e, 0x73, 0x83, 0x38, 0x8d, 0x7d, 0x15, 0xb9, 0x83, 0x7b, 0xc3, 0x40, 0x6, 0x56, 0x93, 0x10, 0xdc, 0xd7, 0xa7, 0x12, 0x8f, 0x3, 0x4e, 0x51, 0x4a, 0x73, 0xbf, 0xc7, 0xb5, 0xfb, 0x8c, 0x1c, 0xa6, 0x4b, 0xb0, 0xc6, 0x40, 0x48, 0xa4, 0x8b, 0x65, 0x1c, 0x56, 0x9d, 0x36, 0xd9, 0xae, 0x1d, 0x10, 0x42, 0x9a, 0xed, 0x1e, 0x2c, 0x2d, 0x2b, 0x3b, 0xa0, 0x41, 0x61, 0x61, 0x42, 0xc9, 0xce, 0xe, 0x6c, 0x94, 0x28, 0x14, 0x47, 0x3b, 0xaa, 0x41, 0x46, 0xa, 0x2c, 0x9f, 0x41, 0x76, 0x1d, 0x8e, 0xe3, 0xb8, 0x5a, 0xa7, 0x2b, 0x94, 0xa8, 0xc, 0xc1, 0x3d, 0x6c, 0x8, 0xc9, 0x7d, 0xf8, 0x81, 0xc7, 0xc4, 0x1e, 0x8f, 0xc6, 0xa6, 0x8d, 0x18, 0xd3, 0xa9, 0xba, 0xe4, 0x6a, 0x84, 0x76, 0x46, 0x3a, 0x59, 0xc6, 0xc7, 0xe8, 0xd4, 0xd4, 0x1a, 0x25, 0xee, 0xf9, 0xfb, 0x35, 0x2b, 0xb3, 0xb4, 0xb4, 0xfb, 0xec, 0x79, 0xb, 0x5a, 0x28, 0xd9, 0x6d, 0x8a, 0x86, 0xe2, 0xb4, 0xed, 0x81, 0xcb, 0x12, 0xa9, 0xbf, 0x3b, 0x78, 0x7c, 0xe, 0xda, 0xfa, 0x49, 0xd4, 0x6a, 0x15, 0xa, 0x2f, 0xc4, 0xe9, 0xfd, 0x5a, 0x2e, 0xce, 0xe1, 0x98, 0xb6, 0x12, 0x8a, 0xcd, 0xf8, 0xbe, 0xa0, 0x13, 0x7d, 0x2b, 0x7d, 0xec, 0x19, 0x61, 0x3b, 0xee, 0x37, 0x6e, 0x5, 0x4d, 0xeb, 0x73, 0xeb, 0x86, 0x8f, 0xdd, 0x64, 0xf7, 0xcb, 0x2f, 0x6b, 0x8b, 0x47, 0x8e, 0xf9, 0x68, 0x8f, 0x7a, 0x21, 0xd6, 0x8a, 0xb3, 0x5, 0xbc, 0xa8, 0xbd, 0xc4, 0xe9, 0x63, 0x9, 0x5f, 0xf9, 0xa3, 0x46, 0xf6, 0x49, 0xf3, 0xf9, 0x2f, 0x8c, 0x1c, 0x22, 0x7a, 0x6c, 0x8f, 0x22, 0xff, 0x80, 0xf4, 0xee, 0x6b, 0x3d, 0xae, 0xa1, 0x85, 0xd8, 0x5, 0xdc, 0xac, 0x71, 0x54, 0x4d, 0x6b, 0x9d, 0xae, 0xb4, 0xb0, 0x35, 0x2b, 0x47, 0x7c, 0x57, 0x9b, 0x3e, 0xd7, 0xd, 0xd3, 0xc5, 0x75, 0xb0, 0x2b, 0x8, 0xaf, 0xb8, 0xa8, 0xa8, 0x73, 0x41, 0x9a, 0x85, 0x8b, 0x6b, 0x89, 0x18, 0x4d, 0x42, 0x25, 0xbf, 0x53, 0x63, 0xba, 0xf, 0xba, 0x89, 0x73, 0x1c, 0xc, 0xfe, 0xbe, 0x67, 0x6, 0xdf, 0x15, 0x49, 0x10, 0x77, 0x8a, 0xd3, 0xf4, 0x79, 0xa5, 0xae, 0x29, 0x45, 0x9e, 0x2, 0xd, 0x13, 0xd0, 0x35, 0xe8, 0xaf, 0x69, 0x2c, 0x96, 0x7b, 0x48, 0x78, 0xaf, 0x89, 0xe3, 0xfe, 0x9c, 0x91, 0x67, 0xa, 0x74, 0x26, 0xb0, 0x95, 0x1c, 0xe0, 0x50, 0x52, 0x3d, 0xa0, 0xb5, 0x6e, 0x40, 0xad, 0xf3, 0x42, 0x71, 0xb9, 0x88, 0xcb, 0xca, 0xcb, 0x3d, 0xc9, 0xe, 0xf1, 0x2a, 0xa4, 0xd8, 0xc7, 0xc9, 0xd, 0x53, 0xc9, 0x97, 0x14, 0x49, 0x27, 0x45, 0x52, 0xb3, 0x66, 0xb6, 0x63, 0xc5, 0xc9, 0xb8, 0x1c, 0x9b, 0xa7, 0xb, 0x8, 0xf3, 0x85, 0x62, 0xfa, 0x86, 0x29, 0xf3, 0x57, 0xc9, 0xf5, 0xd1, 0x82, 0x73, 0x89, 0xf8, 0xd4, 0xa, 0xd7, 0x7c, 0xe3, 0xdf, 0xf0, 0xa3, 0xaf, 0xa1, 0x82, 0xa0, 0xc5, 0xf6, 0xd1, 0x47, 0x5, 0x2d, 0xb8, 0xf9, 0x7c, 0x27, 0xbc, 0x8a, 0xf7, 0x3b, 0x51, 0x40, 0x8a, 0xef, 0x19, 0x79, 0xc9, 0xc8, 0x67, 0xa2, 0x99, 0x86, 0x49, 0xd8, 0x1a, 0x3f, 0xcf, 0x54, 0xa5, 0xa0, 0xce, 0x58, 0x4a, 0xc2, 0xfb, 0x8d, 0xec, 0x1a, 0x35, 0x2c, 0x96, 0xcf, 0x27, 0x4c, 0xda, 0xda, 0x8b, 0xec, 0xb6, 0xa6, 0xe4, 0x3b, 0x92, 0xc7, 0xbf, 0x3f, 0x9d, 0x27, 0x1b, 0x35, 0xda, 0x40, 0xc1, 0xad, 0xbb, 0x87, 0x38, 0x6e, 0x96, 0x5d, 0xb8, 0xe, 0x70, 0x7a, 0x72, 0x33, 0x17, 0xd9, 0x55, 0x90, 0xec, 0x52, 0x8b, 0xb7, 0x93, 0x5a, 0x69, 0xc2, 0x45, 0x76, 0x70, 0x2b, 0xa0, 0x38, 0x19, 0x59, 0x7d, 0xc8, 0x34, 0x43, 0x8b, 0xaf, 0x6f, 0x29, 0xd8, 0x34, 0xe7, 0xf0, 0x73, 0x7a, 0xfa, 0x75, 0x74, 0x80, 0x6, 0xe8, 0xe3, 0xf8, 0x7e, 0xf4, 0x48, 0xf3, 0x39, 0x94, 0x81, 0xf4, 0xa7, 0x2c, 0xe3, 0xff, 0x41, 0x5c, 0xe5, 0x4d, 0x5a, 0x7c, 0xf9, 0xda, 0x2c, 0x7d, 0x7b, 0xf, 0xb2, 0x53, 0xd4, 0x1d, 0xdf, 0x18, 0xe9, 0xeb, 0xb2, 0xec, 0x5a, 0x16, 0xe8, 0xbc, 0x54, 0x1, 0x36, 0x5d, 0xf4, 0xb7, 0x7c, 0x88, 0xda, 0x68, 0xdc, 0xdd, 0xa, 0x70, 0xa7, 0xec, 0x26, 0x4e, 0xaf, 0x43, 0xd4, 0xfd, 0x20, 0x29, 0xa7, 0x71, 0x2d, 0xad, 0x7a, 0xf7, 0x19, 0x67, 0xdb, 0x64, 0xf0, 0x7f, 0x4a, 0x49, 0x80, 0x58, 0xa0, 0x13, 0xc5, 0xa9, 0xe7, 0x9a, 0x4c, 0x57, 0xc4, 0x7c, 0xd1, 0x53, 0xde, 0xc3, 0xc, 0xbc, 0x27, 0xbd, 0x8d, 0x5c, 0x22, 0x4e, 0xf7, 0xa0, 0xed, 0xab, 0xf9, 0x3c, 0x92, 0x57, 0xe, 0xa7, 0x5c, 0xc7, 0xe7, 0x8b, 0x42, 0xe0, 0x4f, 0x48, 0x7c, 0x33, 0xe8, 0x5, 0x88, 0x3b, 0xa0, 0x30, 0x36, 0xb1, 0xec, 0x3b, 0x7a, 0xf6, 0xa5, 0x3f, 0xa8, 0x52, 0x13, 0x9a, 0x48, 0x24, 0x36, 0x57, 0xb2, 0xdb, 0xb8, 0xd0, 0x90, 0x56, 0x8d, 0x93, 0x6f, 0xdf, 0xa7, 0xe6, 0x19, 0x57, 0x77, 0x2, 0x48, 0xac, 0x83, 0x91, 0xa3, 0x8d, 0x1c, 0x6a, 0x64, 0x57, 0x5a, 0x6e, 0xb9, 0xb4, 0x26, 0xb7, 0xa4, 0xec, 0x9d, 0x32, 0xe, 0xab, 0x70, 0x1e, 0x5, 0xee, 0xaf, 0xb1, 0x7c, 0x46, 0xeb, 0x74, 0xb9, 0x86, 0xa, 0x78, 0x1e, 0x48, 0xee, 0x42, 0xf9, 0x1, 0xce, 0x76, 0x1c, 0x28, 0x76, 0x17, 0x9d, 0xed, 0xb9, 0xef, 0x44, 0x39, 0x8f, 0x4a, 0xcd, 0xc, 0x3e, 0x63, 0xbc, 0x7f, 0x1f, 0x50, 0xe1, 0x89, 0xa3, 0xb2, 0x89, 0xee, 0x33, 0xee, 0xbd, 0x17, 0xdf, 0x7f, 0xb9, 0x2e, 0x27, 0x5f, 0x30, 0xdf, 0x32, 0xb6, 0x59, 0xbe, 0x91, 0x1d, 0x5c, 0x26, 0x70, 0xa5, 0xe1, 0x40, 0xc4, 0xa5, 0xdc, 0x48, 0x91, 0x3d, 0x86, 0xda, 0x8c, 0xd9, 0x12, 0xef, 0x7e, 0x74, 0xdb, 0xd0, 0xb4, 0x3f, 0xc5, 0xc8, 0xef, 0x24, 0x1c, 0x1d, 0x46, 0xd2, 0x21, 0x49, 0x80, 0x7b, 0x19, 0x39, 0x8e, 0xcf, 0x6, 0x9a, 0xef, 0x48, 0x12, 0xdf, 0x24, 0x5a, 0x82, 0x3f, 0x8b, 0xc6, 0x39, 0xc2, 0x80, 0x39, 0x24, 0xbd, 0xbb, 0x8c, 0x1c, 0x43, 0xe2, 0x43, 0x56, 0x73, 0xb3, 0xc, 0xff, 0x3f, 0x4e, 0xeb, 0xee, 0x41, 0x39, 0x9d, 0xef, 0xea, 0x12, 0x3e, 0xeb, 0xf, 0x69, 0xf9, 0xcf, 0x90, 0xaa, 0x27, 0x30, 0x44, 0x11, 0xb0, 0xea, 0xdc, 0x39, 0x3, 0x3f, 0xc7, 0xe4, 0xbb, 0x85, 0x1, 0xf3, 0xb8, 0x5f, 0xa4, 0x1e, 0xf3, 0xd5, 0xc8, 0x8b, 0xec, 0x5e, 0xa0, 0xa6, 0x16, 0x27, 0xac, 0xe5, 0x82, 0x4a, 0x92, 0xdd, 0xf7, 0x12, 0x9e, 0xfe, 0x89, 0x41, 0x2, 0xae, 0xa5, 0xb3, 0xb9, 0x1, 0xd5, 0xe5, 0x4, 0xef, 0x52, 0x4a, 0x32, 0x16, 0xb7, 0x58, 0xec, 0x49, 0x3e, 0xb8, 0x8e, 0x7e, 0x7f, 0xdb, 0x52, 0x7b, 0xad, 0xc7, 0x3f, 0xeb, 0x4b, 0xdd, 0x12, 0x9e, 0xa, 0x49, 0xd8, 0x7f, 0xa1, 0xac, 0xa0, 0xc5, 0x87, 0x26, 0xc5, 0xd, 0xf5, 0xfd, 0xe, 0xd, 0xf0, 0x7e, 0x3d, 0x46, 0x41, 0xec, 0xb7, 0x27, 0xd7, 0xde, 0x7e, 0x35, 0x7c, 0x4e, 0x50, 0xc6, 0xda, 0x89, 0x53, 0xf7, 0xa, 0x41, 0x36, 0xf4, 0x4c, 0x92, 0xea, 0x44, 0x92, 0xe0, 0x4, 0x5a, 0x44, 0x51, 0x53, 0x76, 0x90, 0xb1, 0x5a, 0x6c, 0xb1, 0x90, 0xb1, 0x1f, 0xe9, 0xa1, 0xb8, 0x75, 0xc7, 0x1a, 0xae, 0x97, 0x54, 0xb2, 0xdb, 0xc2, 0x8b, 0xec, 0xbe, 0x36, 0xf2, 0xa2, 0xce, 0x59, 0xa4, 0x81, 0xc4, 0x12, 0xc4, 0x51, 0x2e, 0x12, 0x27, 0x93, 0x32, 0x53, 0x20, 0x6b, 0x72, 0x1, 0x5d, 0x1, 0xb, 0x68, 0xf1, 0x22, 0x91, 0x64, 0x91, 0x38, 0x6e, 0xa5, 0xe4, 0x42, 0x42, 0x32, 0x49, 0xc2, 0x83, 0xec, 0xea, 0xa5, 0x2c, 0xb4, 0x26, 0x24, 0x3e, 0x64, 0xed, 0xa1, 0xfb, 0xf8, 0x56, 0xdc, 0xc4, 0xf0, 0xc2, 0xa3, 0x16, 0xab, 0x25, 0xc7, 0x8b, 0x6b, 0x61, 0xf9, 0x25, 0x13, 0x1f, 0x14, 0xe1, 0xc4, 0x57, 0x94, 0x7b, 0xb9, 0x1e, 0xf1, 0xac, 0x10, 0xe3, 0xeb, 0x4a, 0xc5, 0xab, 0x26, 0x9e, 0x25, 0x28, 0x4b, 0x9d, 0x29, 0x47, 0x1a, 0xb9, 0x4a, 0x9c, 0xd3, 0x24, 0xd0, 0xe5, 0xe8, 0x7d, 0x12, 0xdf, 0x2c, 0xb1, 0x1f, 0x47, 0x14, 0x36, 0x94, 0x5b, 0x8, 0x1a, 0xdf, 0x6b, 0xae, 0x2e, 0x19, 0x5f, 0x50, 0x29, 0x16, 0xcf, 0x95, 0xd7, 0x62, 0x2b, 0xd6, 0xf9, 0x8a, 0x34, 0xe0, 0xaa, 0x1c, 0x2a, 0xf6, 0x76, 0x44, 0x36, 0x8b, 0xd, 0xee, 0x21, 0xb8, 0x72, 0x3f, 0xe0, 0xb, 0xb7, 0x40, 0x36, 0x2d, 0x23, 0xa8, 0xd, 0x4a, 0x52, 0xb4, 0x2c, 0x2f, 0xf7, 0x4c, 0xa3, 0x14, 0xb2, 0x83, 0xd5, 0x86, 0x44, 0x19, 0x74, 0x28, 0xef, 0x2e, 0x4e, 0x10, 0xbf, 0x50, 0x1f, 0x65, 0x2c, 0x50, 0x41, 0x65, 0xe9, 0x41, 0x4a, 0x4b, 0xae, 0x4d, 0x3c, 0x6f, 0x34, 0x68, 0x40, 0xbd, 0x6b, 0xb3, 0x1a, 0x92, 0x1f, 0x14, 0xaa, 0xe6, 0x2e, 0x85, 0x7, 0xae, 0x4e, 0x14, 0x15, 0x23, 0xe6, 0x87, 0xd3, 0xe1, 0x91, 0xe8, 0x14, 0x95, 0x6c, 0xcf, 0x7a, 0x6a, 0xd5, 0x5, 0xb, 0x4d, 0x50, 0x89, 0x17, 0x60, 0x2d, 0xdd, 0x40, 0xb2, 0xab, 0x6e, 0xf3, 0x41, 0x6, 0x1c, 0x62, 0x21, 0x38, 0x9f, 0x6f, 0xaa, 0xe4, 0xa6, 0xb4, 0x62, 0x2d, 0x89, 0x35, 0x79, 0xda, 0xf8, 0xb, 0xfc, 0x13, 0xee, 0x2e, 0x24, 0x2e, 0xf4, 0x12, 0xc7, 0xd, 0x6, 0xad, 0xb7, 0x8b, 0xe8, 0x29, 0x1d, 0x71, 0xc1, 0xf, 0x14, 0x28, 0x57, 0xf7, 0xd0, 0xea, 0x7, 0xf9, 0xfd, 0x5e, 0x1c, 0x77, 0x27, 0xce, 0xc9, 0xdb, 0x41, 0x6a, 0x7e, 0xda, 0xfc, 0x8e, 0x94, 0x23, 0x8c, 0x5c, 0x2f, 0x4e, 0xec, 0xe6, 0x15, 0x92, 0xdf, 0x67, 0xa2, 0x31, 0x31, 0x25, 0x3b, 0x45, 0x2c, 0x80, 0xce, 0xf3, 0x48, 0xe, 0xe8, 0x50, 0xd, 0xb9, 0x3c, 0x45, 0xf9, 0x44, 0xc2, 0x9b, 0x90, 0x83, 0xf8, 0xc5, 0x24, 0xca, 0x5d, 0xb4, 0x4, 0x40, 0x76, 0xfb, 0xf3, 0x7b, 0x22, 0x6b, 0xb3, 0x81, 0x3e, 0xf2, 0xd8, 0x0, 0xa5, 0x27, 0x5f, 0x50, 0x80, 0x56, 0x24, 0xbb, 0xce, 0xb4, 0xfa, 0x90, 0xe8, 0x2, 0xb7, 0x67, 0x4d, 0x92, 0xaa, 0xa, 0x49, 0x9a, 0x97, 0x51, 0x90, 0xe5, 0x39, 0x8e, 0xa, 0xd5, 0x58, 0x71, 0xb5, 0x94, 0xca, 0x81, 0x15, 0x97, 0xd0, 0xc7, 0xae, 0x64, 0xa7, 0xa8, 0x39, 0xd0, 0xa5, 0xe2, 0x16, 0xf1, 0x76, 0x3f, 0x23, 0xa5, 0x19, 0x8d, 0x7a, 0x11, 0x3b, 0x99, 0x1f, 0x51, 0x4b, 0x60, 0x2c, 0xe5, 0x66, 0x6e, 0x62, 0x28, 0x9d, 0xe8, 0xc7, 0xcd, 0x50, 0xdd, 0x9d, 0xf1, 0xc2, 0x32, 0xca, 0x67, 0x5c, 0xb7, 0x78, 0xbe, 0x6d, 0xa9, 0xe4, 0xe0, 0x79, 0xef, 0x46, 0x4b, 0x70, 0xab, 0x1a, 0xfc, 0xcc, 0x64, 0xbc, 0xef, 0x34, 0x7a, 0x12, 0x90, 0x80, 0xf7, 0x32, 0x7f, 0x47, 0x2e, 0x3c, 0x1a, 0xe5, 0x2e, 0x4f, 0x5, 0xe2, 0x4c, 0x1b, 0xf4, 0xd1, 0xd7, 0xd, 0xe8, 0x83, 0xb9, 0x6e, 0xfd, 0x6, 0x29, 0x2f, 0xdf, 0xe4, 0x88, 0x4b, 0xc4, 0x7b, 0x57, 0x2a, 0xd9, 0x45, 0x1f, 0x68, 0xcc, 0x3b, 0x2c, 0xcd, 0x75, 0x58, 0x71, 0xb7, 0xd2, 0x4a, 0x8a, 0x3, 0xb0, 0x8a, 0xa7, 0x53, 0xf0, 0xbd, 0x10, 0xaf, 0x79, 0x58, 0x9c, 0x18, 0x9f, 0x22, 0x9e, 0x80, 0x7, 0x62, 0xe, 0xe5, 0x19, 0x92, 0xc4, 0x2e, 0x54, 0x7a, 0x50, 0xaa, 0x70, 0x8, 0x2d, 0xff, 0x4c, 0x2d, 0x3f, 0x10, 0x27, 0x4e, 0x70, 0x18, 0x2c, 0x4e, 0x6c, 0xf, 0xeb, 0xe7, 0xd, 0xa9, 0x7a, 0x8, 0x70, 0x50, 0x40, 0xfc, 0x72, 0xbd, 0x4b, 0x49, 0x83, 0xcb, 0xf5, 0x6c, 0x12, 0xa1, 0xa2, 0x96, 0x58, 0x6f, 0x88, 0xee, 0x98, 0xc3, 0xfa, 0x48, 0x87, 0xf6, 0x6d, 0xdd, 0x96, 0xb4, 0x92, 0x5d, 0xc4, 0x81, 0xb8, 0xc4, 0xdf, 0x3c, 0xae, 0xc1, 0x82, 0xbb, 0x9a, 0x64, 0x17, 0x57, 0x20, 0x23, 0x14, 0x7d, 0x17, 0xd7, 0x28, 0xd9, 0xe5, 0x15, 0x10, 0x73, 0x9e, 0x46, 0x81, 0x75, 0x76, 0x8d, 0x38, 0x25, 0x36, 0x7, 0x18, 0xe9, 0x43, 0xcb, 0x6f, 0xb7, 0xc, 0x7e, 0xe, 0x62, 0x82, 0x47, 0x52, 0xe0, 0x35, 0x18, 0x2e, 0x4e, 0xf3, 0xea, 0xc0, 0xf7, 0x64, 0xa9, 0x9a, 0x8d, 0x9, 0xeb, 0x3, 0x9, 0x35, 0x1a, 0x57, 0xac, 0x8b, 0x56, 0x54, 0x56, 0x26, 0x5d, 0x3a, 0x76, 0x90, 0x6e, 0x5d, 0x76, 0xae, 0x72, 0x4d, 0x3, 0xfe, 0xd1, 0xc5, 0xe0, 0x34, 0x44, 0x7, 0x2d, 0xf5, 0xa0, 0x98, 0x13, 0x5d, 0x12, 0x8d, 0x75, 0x1d, 0xeb, 0x1e, 0x27, 0x4e, 0x26, 0xe6, 0x63, 0xe2, 0x24, 0x67, 0x61, 0xed, 0xa3, 0x81, 0x2, 0x8a, 0xdc, 0x67, 0x65, 0x68, 0xb1, 0xf5, 0x12, 0x27, 0x99, 0xe5, 0x79, 0x5a, 0x8c, 0x41, 0x2, 0x8d, 0x8a, 0xdd, 0x2e, 0x4b, 0x94, 0xd2, 0xb4, 0xd7, 0x47, 0x59, 0x37, 0xc0, 0x8d, 0xb9, 0xa1, 0xc4, 0x9e, 0x6b, 0xa7, 0x9b, 0x44, 0x34, 0x81, 0x6c, 0xb3, 0x5b, 0x3c, 0xae, 0xa1, 0xa7, 0xe7, 0x51, 0xe2, 0xb8, 0x45, 0x14, 0x8a, 0x7c, 0x4, 0x9a, 0x46, 0xbc, 0x4b, 0x65, 0x10, 0x47, 0x79, 0x1d, 0x28, 0x4e, 0xa2, 0xd3, 0xe4, 0xea, 0xf6, 0x4a, 0x71, 0xba, 0xf5, 0x20, 0x4b, 0xf9, 0x1c, 0x9, 0x2e, 0x89, 0x4, 0xbb, 0xf1, 0x32, 0xd7, 0x18, 0xea, 0x51, 0xf5, 0xc, 0xc0, 0x0, 0xa1, 0x64, 0x17, 0x3d, 0x20, 0x28, 0x8f, 0x74, 0x6d, 0x5b, 0x37, 0xa, 0x74, 0xa0, 0x3f, 0x57, 0xf4, 0xf4, 0x0, 0x85, 0x22, 0x9, 0xb8, 0xc, 0x51, 0x7a, 0x70, 0x1, 0x2d, 0x3e, 0xb4, 0x31, 0x7b, 0xb3, 0x1a, 0x6b, 0xf, 0xd9, 0xa0, 0xf7, 0x52, 0x82, 0x6a, 0xab, 0xb7, 0xc0, 0x42, 0xb4, 0x3b, 0xe8, 0xe3, 0x52, 0xb2, 0x53, 0x6c, 0x7c, 0x5e, 0xb0, 0xe8, 0x6c, 0x8d, 0x76, 0x9f, 0x14, 0x27, 0xc5, 0x5a, 0x89, 0x4e, 0xa1, 0xb0, 0x3, 0x59, 0xc9, 0xcf, 0x8a, 0xe3, 0x19, 0x41, 0x6c, 0xef, 0x25, 0x49, 0x5f, 0x5f, 0x7a, 0x36, 0x3f, 0x13, 0x44, 0xa3, 0xf4, 0x19, 0x96, 0xb1, 0x1d, 0xf5, 0x11, 0x29, 0xd9, 0x29, 0x1c, 0xa0, 0xd5, 0xd2, 0x9f, 0x2d, 0xe3, 0x68, 0x97, 0x74, 0x8e, 0x4e, 0x8f, 0x42, 0x91, 0x11, 0x2a, 0xf9, 0xce, 0xa0, 0x67, 0x27, 0xea, 0x36, 0xdf, 0x4b, 0xf3, 0x59, 0x5c, 0x7f, 0x24, 0x0, 0xb, 0xcf, 0x46, 0x76, 0x28, 0xa8, 0xd7, 0xee, 0x55, 0x4a, 0x76, 0x79, 0xf, 0xb8, 0x39, 0x2e, 0x97, 0xaa, 0xc5, 0xd4, 0x88, 0x4f, 0xe0, 0x88, 0x14, 0x4d, 0x59, 0x56, 0x28, 0x6a, 0xe, 0x10, 0x1d, 0x8e, 0xba, 0xba, 0x50, 0x9c, 0x5e, 0x9b, 0x36, 0xc0, 0x12, 0xbc, 0x55, 0xfc, 0x8d, 0xe1, 0x81, 0xec, 0xdc, 0xae, 0x54, 0x94, 0x4f, 0x68, 0x56, 0xb1, 0x92, 0x5d, 0xde, 0x3, 0xf1, 0x86, 0x43, 0x2c, 0xe3, 0xc8, 0x38, 0x9b, 0xa6, 0xd3, 0xa3, 0x50, 0xd4, 0x1a, 0x70, 0xfd, 0xdf, 0x69, 0xe4, 0xf, 0xe2, 0x7d, 0x5a, 0x38, 0x14, 0xca, 0xa3, 0x7c, 0xfc, 0x9d, 0x68, 0xaa, 0xbe, 0xd8, 0x35, 0x6, 0x45, 0xb6, 0x87, 0x3e, 0xe, 0x25, 0xbb, 0x7c, 0xc7, 0xf9, 0x96, 0x31, 0xf4, 0xb4, 0x7c, 0x5c, 0xa7, 0x46, 0xa1, 0xf0, 0x5, 0x48, 0x64, 0x39, 0xc6, 0x83, 0xf0, 0xa, 0xa8, 0x58, 0x36, 0xf5, 0xe9, 0x77, 0x2d, 0xf2, 0x50, 0x52, 0x7b, 0xeb, 0x63, 0x50, 0xb2, 0xcb, 0x67, 0xa0, 0x29, 0xf2, 0xfe, 0x96, 0x71, 0x94, 0x19, 0xfc, 0xa4, 0xd3, 0xa3, 0x50, 0xf8, 0x6, 0x10, 0x10, 0x8a, 0xcc, 0x97, 0x58, 0xae, 0xa1, 0xdd, 0xd8, 0xa9, 0x3e, 0xfd, 0x1e, 0xd4, 0x6, 0x7e, 0x65, 0x19, 0x47, 0x1f, 0x50, 0x8d, 0xdb, 0x29, 0xd9, 0xe5, 0x2d, 0x10, 0xb8, 0x6e, 0xe5, 0x1a, 0x43, 0xbf, 0xc8, 0x67, 0x74, 0x6a, 0x14, 0xa, 0xdf, 0x81, 0x42, 0xf4, 0x81, 0x62, 0x8f, 0x83, 0x23, 0x11, 0xcc, 0xaf, 0xc3, 0x82, 0xd1, 0x8c, 0xdd, 0x7d, 0x80, 0x34, 0x7a, 0x7e, 0xee, 0xae, 0x8f, 0x40, 0xc9, 0x2e, 0x5f, 0xb1, 0x97, 0x65, 0xc, 0xd9, 0x64, 0xda, 0x5a, 0x48, 0xa1, 0x8, 0x6, 0xa8, 0xc5, 0x7b, 0xc9, 0x32, 0x8e, 0xee, 0x2a, 0x7, 0xf8, 0xf4, 0x3b, 0xf0, 0xe, 0xbb, 0x3d, 0x33, 0x4d, 0x7c, 0xfc, 0xf9, 0xa, 0x25, 0xbb, 0x48, 0x1, 0x2e, 0x8d, 0xee, 0x96, 0xf1, 0x51, 0x3a, 0x35, 0xa, 0x45, 0xa0, 0xb8, 0x4d, 0x9c, 0xbe, 0xab, 0xa9, 0x40, 0x12, 0x49, 0x2f, 0x9f, 0x7e, 0xfe, 0xcf, 0x46, 0x46, 0x5b, 0xc6, 0x4f, 0x11, 0x3d, 0xc2, 0x4a, 0xc9, 0x2e, 0xf, 0x81, 0xde, 0x8f, 0xee, 0x33, 0xea, 0x90, 0xb2, 0xfc, 0xb5, 0x4e, 0x8d, 0x42, 0x11, 0x28, 0x26, 0x8a, 0xd3, 0x3a, 0xcc, 0x8d, 0x1e, 0x3e, 0x92, 0xd1, 0x2b, 0x96, 0xb1, 0xae, 0xe2, 0x1c, 0x5a, 0xac, 0x50, 0xb2, 0xcb, 0x3b, 0xcb, 0xce, 0x1d, 0xaf, 0x43, 0x5f, 0xbd, 0xe5, 0x3a, 0x35, 0xa, 0x45, 0xe0, 0x78, 0xce, 0x32, 0x86, 0x98, 0xda, 0x66, 0x3e, 0xfd, 0xfc, 0x31, 0x46, 0xe6, 0x5a, 0xc6, 0x4f, 0xd7, 0xa9, 0x57, 0xb2, 0xcb, 0x37, 0xd8, 0x5a, 0x83, 0x81, 0xec, 0x56, 0xeb, 0xd4, 0x28, 0x14, 0x81, 0x3, 0x19, 0x93, 0xa5, 0xae, 0x31, 0x9c, 0x50, 0xb0, 0xb9, 0x4f, 0x3f, 0x1f, 0x59, 0x9f, 0xef, 0x58, 0xc6, 0x51, 0xe8, 0xae, 0xed, 0xc3, 0x94, 0xec, 0xf2, 0xa, 0x8d, 0x3d, 0x9e, 0x5b, 0x42, 0xa7, 0x46, 0xa1, 0x8, 0x1c, 0xe8, 0x50, 0xb4, 0xd0, 0x32, 0xde, 0xce, 0xc7, 0xdf, 0x81, 0xa3, 0xb8, 0xdc, 0x59, 0x99, 0x68, 0xf8, 0xfe, 0x27, 0x9d, 0x7e, 0x25, 0xbb, 0x7c, 0x42, 0xa5, 0x4e, 0x81, 0x42, 0x91, 0x33, 0xac, 0x12, 0x7b, 0xd6, 0xb3, 0x9f, 0xca, 0x26, 0x4a, 0x10, 0x6c, 0xb1, 0x41, 0x9c, 0x60, 0xd2, 0x5c, 0x1f, 0x81, 0x92, 0x5d, 0xbe, 0xa0, 0xc4, 0x83, 0x0, 0x95, 0x4, 0x37, 0xce, 0x45, 0x85, 0x4e, 0x83, 0x22, 0x20, 0xfc, 0x62, 0x64, 0x45, 0xc0, 0xbf, 0x3, 0xeb, 0xf7, 0x7e, 0xcb, 0x78, 0x1b, 0x12, 0x9e, 0x42, 0xc9, 0x2e, 0x2f, 0xb0, 0xc0, 0x32, 0x6, 0xd7, 0x66, 0x91, 0x4e, 0xcd, 0xaf, 0x40, 0x81, 0x6f, 0x2b, 0x9d, 0x6, 0x45, 0xc0, 0xa, 0x55, 0xd0, 0x78, 0xd5, 0xc8, 0x78, 0xcb, 0xf8, 0x59, 0x46, 0xb6, 0xd7, 0x47, 0xa0, 0x64, 0x97, 0xf, 0x40, 0x17, 0x7, 0x77, 0xad, 0xcf, 0xd6, 0xe2, 0x4, 0xc9, 0x15, 0x4e, 0x9a, 0x76, 0x43, 0x9d, 0x6, 0x45, 0x40, 0x48, 0x64, 0x69, 0x9f, 0xc4, 0x3b, 0x7e, 0xa7, 0x65, 0x7c, 0x3b, 0x23, 0x97, 0xea, 0x63, 0x50, 0xb2, 0xcb, 0x7, 0xac, 0x33, 0xf2, 0x8d, 0x6b, 0xac, 0x91, 0x5a, 0x33, 0xbf, 0xe1, 0x8f, 0x3a, 0x5, 0x8a, 0x0, 0x81, 0xc6, 0xcf, 0xb6, 0xb8, 0x59, 0x10, 0xae, 0x73, 0x94, 0x39, 0x4c, 0xb4, 0x8c, 0xe3, 0x10, 0x59, 0x3d, 0xd, 0xa1, 0x2a, 0xba, 0x89, 0x93, 0xad, 0x9e, 0x11, 0x8f, 0x29, 0xd9, 0x45, 0x83, 0xec, 0xe6, 0x58, 0xc6, 0xf7, 0xd4, 0xa9, 0x91, 0xd6, 0xe2, 0x1c, 0xae, 0xa9, 0x50, 0x4, 0x85, 0x26, 0x16, 0xb2, 0x83, 0x5b, 0x73, 0x56, 0x0, 0xbf, 0x6b, 0x83, 0x91, 0x9b, 0xa5, 0xea, 0x39, 0x77, 0x28, 0x60, 0xbf, 0x4b, 0xfc, 0xab, 0xed, 0x8b, 0xcb, 0xbb, 0xff, 0x82, 0x38, 0xe7, 0x2, 0xbe, 0x6b, 0xe4, 0xa, 0xb1, 0x77, 0x9a, 0x52, 0xb2, 0x8b, 0x10, 0xb0, 0xf0, 0xa7, 0x5a, 0xc6, 0xf, 0xd5, 0xa9, 0xf9, 0x35, 0x9e, 0xd1, 0x46, 0xa7, 0x41, 0x11, 0xf0, 0xa6, 0xda, 0xde, 0x35, 0x86, 0xe3, 0x79, 0xd6, 0x4, 0xf4, 0xfb, 0x5e, 0x34, 0x32, 0xd2, 0x32, 0x8e, 0xd3, 0x10, 0x2e, 0xd6, 0xc7, 0xf1, 0x1b, 0xfe, 0x4f, 0x9c, 0xce, 0x52, 0x68, 0xba, 0x81, 0x63, 0x91, 0x6e, 0xe2, 0xbc, 0x15, 0x2b, 0xd9, 0x45, 0x1b, 0x68, 0xd, 0x56, 0x61, 0xb1, 0xec, 0xb6, 0xcd, 0xe3, 0x39, 0xc1, 0xa9, 0xce, 0x7f, 0xd5, 0xa5, 0xa1, 0x8, 0x18, 0xbb, 0x18, 0xa9, 0xef, 0x1a, 0x9b, 0x2c, 0x4e, 0x96, 0x66, 0x10, 0x40, 0x1, 0xfb, 0x95, 0x62, 0x6f, 0x1a, 0x31, 0xd4, 0xc8, 0xef, 0xf4, 0x91, 0xfc, 0x5a, 0x83, 0x78, 0xa5, 0x65, 0x1c, 0x46, 0x41, 0x99, 0x92, 0x5d, 0xb4, 0x31, 0x9e, 0xda, 0x64, 0x2a, 0xd0, 0xc1, 0xe1, 0xc8, 0x3c, 0x9d, 0xf, 0x24, 0xd, 0xdc, 0x2a, 0x5a, 0x83, 0xa4, 0x8, 0x1e, 0xfd, 0x3c, 0x94, 0xcf, 0xd2, 0x0, 0x7f, 0xe7, 0x24, 0x23, 0x77, 0x58, 0xc6, 0xe1, 0xce, 0xbc, 0xcf, 0xc8, 0x36, 0x79, 0xfe, 0x4c, 0xae, 0x15, 0x7b, 0xce, 0xc2, 0xbf, 0x94, 0xec, 0xa2, 0xf, 0x94, 0x1f, 0x7c, 0x62, 0xd9, 0xf0, 0x8f, 0x95, 0xfc, 0xec, 0x8e, 0x7e, 0x89, 0x91, 0xfe, 0xba, 0x2c, 0x14, 0x1, 0x63, 0x4b, 0xb, 0xd9, 0xc1, 0xc3, 0xf2, 0x65, 0x16, 0x7e, 0xf7, 0x70, 0xb1, 0x17, 0x9a, 0xc3, 0xa3, 0x71, 0xaf, 0xe4, 0x6f, 0xe9, 0x11, 0x14, 0xfc, 0xb3, 0x2c, 0xe3, 0x98, 0xab, 0x37, 0xd3, 0xfd, 0x47, 0x25, 0xbb, 0xe8, 0xc0, 0xd6, 0x1d, 0x1d, 0x2e, 0x8d, 0xdf, 0xe7, 0xd9, 0x3c, 0xc0, 0x3f, 0xff, 0x37, 0x5d, 0xe, 0x59, 0xc1, 0xbe, 0x92, 0xdf, 0x49, 0x11, 0xc7, 0x19, 0x69, 0xe6, 0x1a, 0x83, 0x87, 0x65, 0x42, 0x16, 0x7e, 0x37, 0xdc, 0x98, 0x70, 0xd3, 0xff, 0xe4, 0xb1, 0xe1, 0xff, 0x23, 0xf, 0x9f, 0x7, 0x2c, 0x5a, 0x94, 0x67, 0xd4, 0xb7, 0x5c, 0xbb, 0x41, 0xaa, 0x71, 0x2d, 0x2b, 0xd9, 0x45, 0x7, 0xaf, 0x4b, 0xd5, 0xee, 0xe8, 0xb0, 0xea, 0x2e, 0xcf, 0xa3, 0x39, 0xc0, 0x29, 0xce, 0xf, 0x8b, 0x66, 0xa5, 0x65, 0x3, 0x97, 0x51, 0x5b, 0x7e, 0x44, 0x9c, 0x8c, 0xc4, 0x7c, 0x3, 0x12, 0x1d, 0x4e, 0xb7, 0xec, 0x91, 0xef, 0x19, 0x99, 0x9f, 0xa5, 0x7b, 0x80, 0xbb, 0x14, 0x59, 0x86, 0x36, 0xd7, 0x1c, 0x6a, 0xef, 0x86, 0xe6, 0xd1, 0xf3, 0x68, 0xcc, 0xb5, 0xd8, 0xce, 0x72, 0xed, 0x49, 0x23, 0x6f, 0x57, 0xf7, 0x3, 0x94, 0xec, 0xa2, 0x83, 0xd5, 0xdc, 0xe8, 0xdd, 0x38, 0x58, 0x1c, 0x77, 0x66, 0x3e, 0x68, 0x75, 0xcf, 0x48, 0xd5, 0xcc, 0x38, 0x85, 0xbf, 0x80, 0x7b, 0xc, 0x87, 0x96, 0x22, 0x26, 0x5a, 0xc0, 0xb5, 0x95, 0x8f, 0x84, 0x77, 0x2a, 0x2d, 0x5b, 0x37, 0x1e, 0xcf, 0xf2, 0x7d, 0x3c, 0x64, 0xe4, 0x41, 0x8f, 0x6b, 0xd7, 0x1b, 0x39, 0x39, 0x4f, 0x9e, 0x7, 0xd6, 0xa4, 0x2d, 0x3, 0x1d, 0x8a, 0x47, 0x46, 0x9e, 0x1e, 0x25, 0xbb, 0x68, 0xe1, 0x9, 0xa9, 0xda, 0x81, 0x1d, 0xb1, 0xbb, 0x1b, 0xc5, 0x49, 0x91, 0x8e, 0x2b, 0x90, 0x62, 0x8c, 0x9a, 0x9a, 0x6e, 0x96, 0x6b, 0x3f, 0x48, 0xf0, 0xbd, 0xb, 0xf3, 0x9, 0x37, 0x4a, 0xd5, 0x8e, 0x1d, 0xc7, 0x8b, 0xe3, 0x46, 0xdf, 0x2a, 0x4f, 0xe6, 0xa0, 0x2d, 0x89, 0xc4, 0x8d, 0xb7, 0xc4, 0x1e, 0x47, 0xb, 0x12, 0x88, 0x11, 0x5e, 0xe8, 0x61, 0xb9, 0x14, 0x90, 0x8, 0x4f, 0x8d, 0xf1, 0xb3, 0xc0, 0x77, 0x1c, 0x21, 0xf6, 0x1e, 0xa1, 0x65, 0xf4, 0x40, 0x2c, 0x50, 0xb2, 0x8b, 0x1f, 0xbe, 0x13, 0x27, 0x1b, 0xcb, 0x8d, 0x8e, 0x62, 0xcf, 0xde, 0x8a, 0x3, 0xd0, 0x39, 0x2, 0x45, 0xa3, 0xfb, 0x59, 0xae, 0x7d, 0x6b, 0x64, 0xa0, 0xe8, 0x41, 0xb6, 0x7e, 0xc2, 0x6b, 0x4f, 0x38, 0x88, 0xcf, 0x61, 0xf7, 0x98, 0x7f, 0x7f, 0xc4, 0x83, 0x86, 0x5b, 0x88, 0x1d, 0xd9, 0x97, 0x77, 0x49, 0x9a, 0x6c, 0xbf, 0x0, 0x81, 0x66, 0xf0, 0x3, 0xc4, 0x39, 0x5b, 0xcf, 0x8d, 0x62, 0xee, 0x9, 0x43, 0x62, 0xfa, 0x3c, 0x6e, 0x25, 0xd9, 0xdb, 0x30, 0x82, 0x4a, 0x70, 0x9d, 0x16, 0xb6, 0x22, 0xbc, 0xf8, 0xa7, 0xd8, 0x5b, 0xa, 0x9d, 0x98, 0x66, 0x51, 0x44, 0x15, 0x28, 0x1c, 0x7d, 0x5d, 0xec, 0x7, 0xd8, 0x7e, 0x6f, 0xe4, 0x4, 0x23, 0xa3, 0x44, 0x7b, 0x63, 0xfa, 0x9, 0x58, 0x34, 0x5e, 0x59, 0x6d, 0xbb, 0xf2, 0x79, 0x1c, 0x17, 0xe3, 0xef, 0x7f, 0x9d, 0x91, 0x63, 0x2c, 0xe3, 0x2f, 0x89, 0xbd, 0xd8, 0x3b, 0x5b, 0xc0, 0x7a, 0x87, 0xcb, 0x72, 0xb6, 0xe5, 0x1a, 0xd6, 0x3f, 0x3a, 0xaf, 0xdc, 0x46, 0x4b, 0x28, 0xe, 0x80, 0xdb, 0xfc, 0x1, 0x23, 0x17, 0x79, 0x5c, 0x47, 0x48, 0xa3, 0x46, 0x31, 0x4b, 0x25, 0xbb, 0xe8, 0x61, 0x2d, 0x1f, 0xf2, 0x7a, 0xcb, 0x35, 0x64, 0x68, 0x9d, 0x12, 0x93, 0x85, 0xe, 0x52, 0xc7, 0xa1, 0x96, 0x2d, 0x2c, 0xd7, 0x91, 0x11, 0x7, 0xd7, 0xda, 0xe7, 0xa2, 0xc9, 0x2a, 0x7e, 0xe3, 0x27, 0x6e, 0xaa, 0x5e, 0x1b, 0x3b, 0x3a, 0xd6, 0xfc, 0x87, 0xa4, 0x10, 0xb7, 0xb2, 0x97, 0xab, 0x8d, 0x5c, 0xe5, 0x31, 0x27, 0x57, 0x87, 0xe0, 0xfe, 0xa6, 0x19, 0x39, 0xda, 0xc8, 0x4c, 0x8f, 0xeb, 0x97, 0xf2, 0xd9, 0xb4, 0x8c, 0xf8, 0x73, 0xc0, 0x29, 0xf, 0xe8, 0x13, 0x7a, 0xa6, 0xc7, 0x75, 0x9c, 0x10, 0x1, 0xb7, 0x66, 0xb9, 0x92, 0x5d, 0xfc, 0x81, 0xd8, 0xc1, 0x70, 0xcb, 0x38, 0x32, 0x96, 0x90, 0xc4, 0x12, 0x65, 0x1f, 0x3e, 0xdc, 0x65, 0x63, 0x8c, 0x5c, 0x20, 0xf6, 0x14, 0xe3, 0xe9, 0xd4, 0xbc, 0x3f, 0xd2, 0x65, 0x10, 0x28, 0xe1, 0xc1, 0x53, 0xe0, 0xe5, 0x22, 0x42, 0x12, 0xcb, 0x35, 0x46, 0xde, 0x31, 0xb2, 0x47, 0xc, 0xbe, 0x2f, 0xd6, 0xd9, 0x30, 0x23, 0x7f, 0xb7, 0x5c, 0xc3, 0x86, 0x3a, 0xd8, 0xc3, 0xa2, 0xca, 0x5, 0xa6, 0xd2, 0xb2, 0x9e, 0x93, 0xc6, 0x1b, 0x32, 0x8a, 0xef, 0x51, 0x14, 0x81, 0xfa, 0xd9, 0xb1, 0xe2, 0xdd, 0xf3, 0xf6, 0x25, 0x2a, 0x63, 0xab, 0x6a, 0xfa, 0x83, 0x95, 0xec, 0xa2, 0xb, 0xd4, 0x95, 0xd8, 0xdc, 0x4d, 0x85, 0xe2, 0x14, 0x9d, 0xe, 0x8c, 0xd8, 0xf7, 0xd9, 0x41, 0x9c, 0x60, 0x3b, 0x2c, 0xa, 0xaf, 0x86, 0xae, 0x78, 0x89, 0xf, 0x31, 0xf2, 0x85, 0x3e, 0xfe, 0xac, 0x59, 0x78, 0xf7, 0xa6, 0xf9, 0xcc, 0x81, 0xe2, 0x24, 0x4e, 0xa0, 0x75, 0x53, 0x71, 0x44, 0xbf, 0x27, 0xa, 0xc7, 0x91, 0x6d, 0x7a, 0xad, 0xc7, 0xf5, 0x11, 0xf4, 0x30, 0x84, 0x9, 0x53, 0x8c, 0x1c, 0x2e, 0x55, 0x1b, 0x4d, 0x24, 0xd1, 0x8d, 0xd6, 0xcf, 0xb5, 0x12, 0x9d, 0x2c, 0x5a, 0x3c, 0x87, 0xdb, 0xa9, 0x60, 0xb5, 0x4f, 0x63, 0xd1, 0xd, 0x10, 0x7b, 0x2b, 0x35, 0x25, 0xbb, 0x18, 0x63, 0x2d, 0x9, 0xcd, 0x16, 0xb4, 0x6e, 0x44, 0xe2, 0x80, 0xf5, 0xd7, 0x34, 0xe4, 0xdf, 0x63, 0x3b, 0x5a, 0x9, 0xe3, 0xf9, 0x7d, 0xa, 0x3d, 0x3e, 0x87, 0x56, 0x40, 0x28, 0xa6, 0xfd, 0x4e, 0x1f, 0x7d, 0xd6, 0x80, 0x2e, 0xfc, 0xe7, 0x89, 0x13, 0xb, 0x5e, 0xef, 0xf1, 0x99, 0x96, 0x54, 0xbc, 0x90, 0xa5, 0xf8, 0x87, 0x88, 0x7d, 0x3f, 0x28, 0x4e, 0xef, 0xa6, 0xf1, 0x84, 0x20, 0xfb, 0x39, 0xac, 0xb5, 0x6c, 0x38, 0x75, 0x1, 0x2e, 0xcd, 0xb7, 0x3c, 0xae, 0x37, 0xa6, 0xb5, 0x8a, 0xba, 0xc0, 0x7e, 0x21, 0x7e, 0x6, 0xc8, 0x26, 0x47, 0x48, 0x2, 0x9e, 0x1a, 0x74, 0x46, 0xf2, 0x8a, 0xbf, 0xa3, 0x4, 0x3, 0x21, 0x9a, 0x9f, 0x6b, 0xfb, 0x8b, 0x94, 0xec, 0xa2, 0x8d, 0x25, 0xd4, 0xbe, 0x67, 0x78, 0x5c, 0x47, 0x70, 0x17, 0xae, 0xa6, 0x7d, 0x43, 0x78, 0xef, 0xd0, 0xde, 0x90, 0x41, 0x3a, 0x5a, 0x9c, 0xf8, 0xcf, 0x16, 0x69, 0xbe, 0xe3, 0x69, 0x46, 0x6, 0xa5, 0xd9, 0x70, 0x13, 0x96, 0xb1, 0x72, 0x5d, 0x1e, 0xbe, 0x1, 0x5d, 0x2b, 0xe0, 0xd6, 0xfc, 0x36, 0xcd, 0x67, 0x60, 0x8d, 0xc3, 0xc5, 0xf4, 0x9a, 0x84, 0xdf, 0x85, 0xb6, 0x13, 0xad, 0x39, 0x24, 0xdb, 0x78, 0xb9, 0x61, 0x51, 0xa8, 0x7c, 0x8e, 0xe4, 0x26, 0xfb, 0x32, 0x53, 0x2c, 0x13, 0xa7, 0xe, 0xf2, 0x9f, 0x69, 0x3e, 0xb3, 0x37, 0xbf, 0xe7, 0xb3, 0x46, 0x76, 0xb, 0x19, 0xc9, 0xf5, 0x25, 0x59, 0x23, 0x3e, 0xd7, 0xc9, 0xe3, 0x73, 0xc8, 0x44, 0x45, 0x1c, 0xf5, 0xec, 0xba, 0x10, 0x9d, 0x92, 0x5d, 0x3c, 0x80, 0xa0, 0x35, 0x7c, 0xf8, 0x5e, 0x41, 0xeb, 0x7d, 0x49, 0x28, 0xc8, 0xd4, 0xca, 0xf5, 0x29, 0x9, 0x2d, 0x68, 0x9d, 0xe1, 0xc5, 0x43, 0xb3, 0xdb, 0x8b, 0xb9, 0xf1, 0x78, 0xe1, 0x79, 0x71, 0x5a, 0xa2, 0x3d, 0x91, 0xe6, 0x33, 0x78, 0x19, 0x56, 0x5a, 0xc6, 0x5b, 0xeb, 0xd2, 0xf0, 0x15, 0x20, 0x32, 0x34, 0x30, 0x78, 0x35, 0xcd, 0x67, 0x10, 0xfb, 0x3a, 0x42, 0x1c, 0x77, 0x33, 0x48, 0xef, 0xa8, 0x34, 0x4a, 0x4c, 0x2e, 0xb0, 0x97, 0x38, 0x47, 0xc1, 0x7c, 0x26, 0x4e, 0x77, 0x14, 0x2f, 0x2f, 0xc2, 0xfd, 0x46, 0xce, 0x10, 0xe7, 0x2c, 0xc9, 0xb0, 0x63, 0x1d, 0x95, 0x5a, 0x28, 0xbd, 0xdf, 0xa7, 0x79, 0x2e, 0x27, 0xf0, 0x7b, 0xa3, 0x4c, 0x21, 0x97, 0x2d, 0x6, 0x1b, 0x73, 0xf, 0x0, 0x1, 0x23, 0x64, 0x71, 0x68, 0x35, 0xd6, 0x2b, 0xbc, 0x5, 0xa8, 0xfd, 0xac, 0xf3, 0x61, 0xb9, 0x4a, 0x76, 0xf1, 0x0, 0x82, 0xd6, 0x8, 0xec, 0xbe, 0xeb, 0x71, 0x1d, 0x6e, 0xcd, 0x4b, 0xe9, 0xd2, 0x80, 0x6b, 0x63, 0xfb, 0x2c, 0xde, 0x5b, 0x23, 0x2e, 0xe8, 0xbb, 0x49, 0xba, 0xaf, 0xf0, 0xc5, 0x6b, 0x52, 0xcd, 0x22, 0x3f, 0x85, 0x9f, 0x9b, 0x5b, 0xcd, 0xcf, 0x5f, 0xe5, 0x61, 0xd9, 0x9e, 0x2f, 0xd1, 0x8d, 0x23, 0x85, 0x15, 0x48, 0xd2, 0x80, 0xcb, 0x9, 0x6e, 0xcd, 0xe5, 0xd5, 0xec, 0x2b, 0x47, 0x90, 0x20, 0xf1, 0xcc, 0x6f, 0xa1, 0xe6, 0x5e, 0x98, 0x83, 0x7b, 0xde, 0x92, 0x44, 0xf0, 0x3c, 0xd7, 0xff, 0x15, 0x1c, 0xb3, 0x1, 0xb5, 0x74, 0x70, 0xa5, 0x9d, 0x2b, 0xc1, 0x9e, 0x6a, 0x10, 0x4, 0x10, 0x57, 0xec, 0x43, 0x12, 0xf1, 0x42, 0x43, 0x5a, 0x48, 0xa3, 0x68, 0x51, 0xd, 0xc8, 0x92, 0x32, 0x2, 0x2b, 0x6e, 0x47, 0x71, 0xc2, 0x15, 0xc9, 0x3d, 0xa0, 0x7f, 0x35, 0xfc, 0xf3, 0x0, 0x3d, 0x4, 0xef, 0xf8, 0x75, 0x13, 0x5, 0xfa, 0xfe, 0xc6, 0x6, 0x20, 0x85, 0xa3, 0xb9, 0xb1, 0x9c, 0xe7, 0xf1, 0x19, 0x58, 0x51, 0x8, 0x5a, 0x23, 0xd3, 0xf1, 0x65, 0x71, 0x82, 0xc1, 0xe8, 0xbf, 0xb7, 0xc8, 0xc7, 0xfb, 0xd8, 0x8e, 0xb, 0xbb, 0x2b, 0x35, 0xc8, 0x9e, 0x46, 0xb6, 0x16, 0xbb, 0xab, 0xd1, 0xd, 0xb8, 0xc9, 0x1e, 0x13, 0xc7, 0xbd, 0x99, 0xa9, 0xcb, 0xa2, 0x82, 0x1a, 0xab, 0xbb, 0xf6, 0xb, 0x1a, 0xe1, 0x4, 0x6e, 0x2, 0xb7, 0xd1, 0x2, 0x54, 0xd4, 0x1d, 0x98, 0xc7, 0x3b, 0xb9, 0x9, 0x5d, 0x4d, 0x85, 0x24, 0xdd, 0x3e, 0xb2, 0x27, 0x5, 0x4d, 0x8d, 0x91, 0x58, 0x81, 0xa4, 0xaa, 0x4f, 0xc5, 0xc9, 0xaa, 0x5d, 0xe8, 0x87, 0xc6, 0xee, 0x2, 0x36, 0xef, 0x9d, 0x8d, 0x74, 0xe6, 0xe6, 0x7f, 0xa8, 0xd8, 0xcb, 0x57, 0xdc, 0x98, 0x44, 0x12, 0x1f, 0x13, 0x71, 0x2f, 0xcf, 0x91, 0x24, 0xeb, 0x2b, 0xf8, 0x2e, 0xda, 0x80, 0x92, 0x91, 0x7e, 0x94, 0xdb, 0x68, 0x85, 0xc3, 0xca, 0x9a, 0x4c, 0xc5, 0xb1, 0xd2, 0x87, 0x7b, 0x69, 0xce, 0xe7, 0x0, 0xcf, 0x12, 0x62, 0xa3, 0x7, 0x66, 0xa8, 0x7c, 0x8e, 0x13, 0x27, 0x6, 0xfc, 0x8a, 0xdf, 0x93, 0xa3, 0x64, 0x17, 0x2f, 0xfc, 0x42, 0x8b, 0x6, 0xc9, 0x1e, 0x28, 0x32, 0x6d, 0x99, 0x66, 0x43, 0x18, 0x40, 0x99, 0xc5, 0x17, 0x7d, 0xa, 0x17, 0xda, 0x54, 0x6a, 0xed, 0xa5, 0xdc, 0x88, 0x52, 0x49, 0xaa, 0x92, 0x6b, 0xa6, 0x3e, 0xb5, 0x63, 0xf4, 0xab, 0x44, 0xc1, 0x37, 0x32, 0x29, 0xd1, 0xc5, 0x5, 0x35, 0x58, 0xed, 0x49, 0x76, 0x35, 0xf1, 0x1a, 0xfc, 0x40, 0x4d, 0xe, 0x44, 0x37, 0xa7, 0x16, 0xdf, 0x1b, 0xc4, 0x3d, 0x54, 0xaa, 0x9e, 0x6f, 0x7, 0x6b, 0x62, 0x8, 0x7f, 0xee, 0x22, 0x5d, 0x1e, 0xbe, 0x2, 0x64, 0x75, 0x12, 0xe7, 0x16, 0x73, 0xdf, 0xbb, 0x9a, 0xcf, 0x63, 0xa3, 0xeb, 0x2e, 0x1b, 0x33, 0x6d, 0xe7, 0x92, 0xec, 0xe6, 0x71, 0xed, 0xc1, 0xd, 0xbf, 0x98, 0xe3, 0xa5, 0x24, 0xd5, 0x4a, 0xcb, 0xfa, 0x4b, 0x70, 0xd, 0xd6, 0xe3, 0xfa, 0x83, 0x22, 0xd5, 0x81, 0x8a, 0x5c, 0x27, 0x7a, 0x2d, 0x76, 0xa6, 0x47, 0x21, 0x13, 0xac, 0xa6, 0x72, 0xf5, 0x6f, 0xae, 0xc3, 0xa8, 0xa3, 0x92, 0xdf, 0x5, 0xd6, 0xdb, 0x20, 0x12, 0x5f, 0x3a, 0x8b, 0x1a, 0x8a, 0xc0, 0xe9, 0x94, 0xef, 0xf9, 0x5c, 0xe7, 0x90, 0xf8, 0xb0, 0x17, 0x7c, 0x93, 0x66, 0x3f, 0x10, 0xfe, 0xec, 0x62, 0xce, 0x3f, 0xf6, 0x82, 0x3d, 0x38, 0xff, 0x3b, 0x72, 0x4f, 0xc8, 0xd4, 0xbb, 0xf2, 0x1d, 0x15, 0xf5, 0x27, 0xa5, 0x16, 0x65, 0x5, 0x4a, 0x76, 0xf9, 0x8b, 0x47, 0xe8, 0xb2, 0xb9, 0x96, 0x1b, 0x52, 0xba, 0xc5, 0xde, 0x91, 0x72, 0x1c, 0x5f, 0x94, 0xd, 0xdc, 0x68, 0xd0, 0x6f, 0x6e, 0xbd, 0x6b, 0x71, 0x57, 0x90, 0x40, 0x5b, 0x91, 0xf0, 0xa, 0xea, 0xb8, 0x86, 0xd0, 0x9, 0xe6, 0x7f, 0xe2, 0xd4, 0x6, 0xd6, 0x85, 0x8c, 0xf0, 0x42, 0xc2, 0x4d, 0x3a, 0xcc, 0x72, 0x6d, 0xad, 0xd8, 0xeb, 0xf5, 0x14, 0xfe, 0x0, 0x9b, 0xea, 0x68, 0x5a, 0xd2, 0x83, 0xa8, 0xc1, 0x67, 0xe2, 0xae, 0xdc, 0x81, 0x72, 0x60, 0xca, 0x58, 0x69, 0x8a, 0x5, 0x3e, 0x87, 0x7f, 0xb7, 0x79, 0x4, 0x10, 0x7b, 0x6e, 0x9a, 0xb2, 0xfe, 0x6a, 0xf3, 0x7c, 0x57, 0x71, 0xed, 0xdd, 0x29, 0xf6, 0x8e, 0x44, 0x51, 0xc7, 0x6c, 0x7a, 0x70, 0x1e, 0x15, 0x27, 0x36, 0x7e, 0x94, 0x54, 0x9f, 0x99, 0xdd, 0x9a, 0xd2, 0x3b, 0xe5, 0x7d, 0xc7, 0x33, 0x28, 0xe7, 0x7e, 0xb0, 0xc6, 0xf2, 0x3c, 0xda, 0x51, 0xb1, 0x68, 0x50, 0xcb, 0xbd, 0x60, 0x3a, 0x9f, 0x3, 0xde, 0xdf, 0xa5, 0x41, 0x4e, 0x88, 0xd7, 0x42, 0xd1, 0x58, 0x5e, 0xf4, 0x31, 0x9f, 0xda, 0x1a, 0x88, 0xef, 0x12, 0x6e, 0x46, 0xd5, 0x3d, 0xd7, 0x4, 0x35, 0x31, 0x48, 0xd7, 0x80, 0xee, 0xb, 0x2f, 0xc, 0xe2, 0xa, 0x88, 0xa1, 0x8c, 0x35, 0xf2, 0xa3, 0x4f, 0x3f, 0x17, 0x41, 0xec, 0x5d, 0xa5, 0xaa, 0x3b, 0x33, 0x91, 0xa5, 0xf9, 0xae, 0x9f, 0xe1, 0x58, 0x1c, 0x81, 0x4d, 0x11, 0x6e, 0x27, 0x24, 0xaf, 0x1c, 0x60, 0xe4, 0xcf, 0xe2, 0xc4, 0xf6, 0x6a, 0x7a, 0x92, 0x7c, 0x61, 0xa, 0x51, 0x76, 0xb, 0xe8, 0x5e, 0x57, 0x90, 0x0, 0x9e, 0xa1, 0x7, 0x24, 0xee, 0x40, 0x98, 0x2, 0xa5, 0x15, 0x7b, 0xf3, 0xb9, 0x9c, 0x26, 0xde, 0x31, 0x4b, 0x1b, 0xf, 0x24, 0x2d, 0xb3, 0xce, 0x3e, 0xde, 0x13, 0xc8, 0xf3, 0xb, 0x7a, 0x5, 0x5e, 0x15, 0xef, 0xc4, 0x1a, 0xdf, 0xc9, 0x6e, 0x83, 0x54, 0x6d, 0xfb, 0x53, 0x2a, 0x8a, 0xb8, 0xe0, 0x43, 0xa, 0xb4, 0xb5, 0xf3, 0xb8, 0x19, 0x65, 0xbb, 0x7b, 0x3d, 0x5c, 0x53, 0x53, 0x48, 0x72, 0x6f, 0x4a, 0x30, 0x2e, 0x45, 0xac, 0xd9, 0x93, 0xa9, 0x29, 0x9e, 0x23, 0x1b, 0x5d, 0xb8, 0xd, 0x24, 0x3b, 0xf1, 0x3a, 0x5b, 0x46, 0xe8, 0xea, 0x3c, 0x5b, 0x6b, 0xf0, 0xc, 0x7c, 0x40, 0x41, 0x3c, 0xf, 0x9d, 0x6e, 0x8e, 0xa4, 0xe2, 0xd4, 0x36, 0x87, 0xf7, 0x5, 0x8b, 0xe1, 0x4b, 0xae, 0x3d, 0xa4, 0xb9, 0xe7, 0x63, 0xe3, 0xf0, 0x71, 0x94, 0x9b, 0xf9, 0x9e, 0x20, 0x81, 0xa8, 0xbb, 0x64, 0xb7, 0xe, 0x17, 0x7b, 0xc0, 0xc7, 0x46, 0x9e, 0x16, 0xa7, 0x20, 0x3e, 0xab, 0x65, 0x1d, 0x5, 0x34, 0x71, 0xfb, 0xa4, 0x30, 0x78, 0x5, 0x6f, 0x46, 0x11, 0x2f, 0x8c, 0xa1, 0x40, 0x43, 0xeb, 0xcb, 0x4d, 0x68, 0x1f, 0xf1, 0xbf, 0xc3, 0x42, 0x19, 0x37, 0xf9, 0x9, 0xb4, 0xdc, 0xf0, 0xe7, 0x34, 0xc9, 0xce, 0x81, 0x97, 0x50, 0xdc, 0xae, 0xe1, 0x86, 0x96, 0x4c, 0x8c, 0x81, 0x3b, 0x67, 0x59, 0x16, 0x7e, 0xf7, 0x53, 0xd4, 0x84, 0x1b, 0xf3, 0xdf, 0x20, 0xd8, 0x17, 0xf3, 0x78, 0xbd, 0xc1, 0x62, 0x7f, 0x90, 0x82, 0xf8, 0x4d, 0x17, 0x71, 0x12, 0x96, 0xb0, 0xd7, 0x20, 0xbe, 0xd3, 0x28, 0x40, 0xab, 0x7b, 0x3d, 0x15, 0x2a, 0x28, 0x79, 0xa3, 0x53, 0xd6, 0xa0, 0xc2, 0x79, 0x17, 0x86, 0x53, 0x60, 0xed, 0xe1, 0x34, 0x11, 0x94, 0x94, 0xa0, 0xc4, 0x67, 0x73, 0xf1, 0xd7, 0xab, 0xb7, 0x8e, 0x96, 0x25, 0xba, 0xec, 0x7c, 0xca, 0xbf, 0x2f, 0xcb, 0xd5, 0x17, 0x4f, 0x9c, 0x34, 0x68, 0x88, 0x3e, 0xfe, 0xfc, 0x44, 0x3d, 0x5a, 0x3f, 0xfb, 0x8b, 0x73, 0x8c, 0xe, 0x12, 0x4b, 0x5a, 0xd3, 0xc5, 0xd1, 0x9c, 0x1b, 0x11, 0x12, 0x59, 0x8a, 0x52, 0x88, 0xe4, 0x27, 0x8e, 0x63, 0x33, 0x41, 0xcc, 0x63, 0xd, 0xc7, 0x20, 0xf3, 0x68, 0xc1, 0x21, 0xb0, 0x3d, 0x93, 0xd7, 0x2a, 0x74, 0x9a, 0x15, 0x2e, 0x14, 0x72, 0x7d, 0x81, 0xfc, 0x76, 0x11, 0x27, 0x99, 0xa1, 0xd, 0xd7, 0x5d, 0x33, 0x71, 0xd2, 0xe3, 0x37, 0xe7, 0xda, 0x81, 0xe2, 0x90, 0xda, 0xe8, 0xbb, 0x84, 0x6b, 0x2d, 0xf9, 0xf7, 0x1f, 0xb9, 0xce, 0xf0, 0xe7, 0xf, 0x5c, 0x7f, 0xd3, 0x69, 0xc5, 0x2d, 0xe3, 0x9a, 0x55, 0x64, 0x6, 0xcc, 0x39, 0x92, 0x4b, 0xe0, 0x3e, 0xee, 0x44, 0x45, 0xb1, 0x15, 0xc7, 0x93, 0xe5, 0x9, 0x5b, 0xc8, 0xc6, 0xe, 0x27, 0x6b, 0x52, 0x3c, 0x17, 0x2b, 0xb9, 0x1f, 0x2c, 0xa3, 0x15, 0x8d, 0x78, 0x2b, 0xe2, 0xa0, 0x70, 0x13, 0xc3, 0x6d, 0x9c, 0xb5, 0x6, 0xf, 0x6b, 0xd6, 0xae, 0x93, 0xa1, 0x83, 0x6, 0xca, 0x3e, 0x7b, 0x54, 0x8d, 0xc2, 0xfc, 0xbf, 0x0, 0x3, 0x0, 0x73, 0x78, 0xf7, 0xf2, 0x7e, 0x74, 0x3a, 0x48, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; @@ -75,26 +43,8 @@ + (NSData *)parse_logo3x_png { static const unsigned char apple_icon_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x16, 0x8, 0x6, 0x0, 0x0, 0x0, 0xcd, 0x5f, 0xcc, 0x41, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x1, 0x54, 0x49, 0x44, 0x41, 0x54, 0x38, 0x11, 0xa5, 0x93, 0x31, 0x2c, 0x83, 0x41, 0x14, 0xc7, 0xbf, 0xfb, 0x52, 0xd4, 0x86, 0xa5, 0x13, 0x91, 0x8a, 0x44, 0x22, 0x6, 0x6, 0x83, 0x98, 0x24, 0x62, 0xb3, 0x74, 0xb3, 0x4a, 0xba, 0x32, 0x1a, 0xd, 0x16, 0x89, 0xd1, 0x6a, 0x68, 0x62, 0x94, 0xb0, 0xd9, 0x30, 0x18, 0x6c, 0x48, 0x58, 0x1a, 0x2c, 0x6, 0xb1, 0x10, 0x83, 0x90, 0x56, 0xfa, 0xf9, 0xbd, 0xea, 0xbb, 0x6b, 0x85, 0xc4, 0x3d, 0x2f, 0xf9, 0xe5, 0xbd, 0x77, 0xf7, 0xfe, 0xff, 0x5c, 0xbf, 0xde, 0x25, 0x49, 0x44, 0x64, 0x59, 0x56, 0x86, 0x6b, 0x58, 0x8c, 0x90, 0x85, 0x51, 0x84, 0x29, 0xec, 0x82, 0xc6, 0x68, 0xd8, 0x8d, 0xa8, 0x50, 0xaf, 0xa8, 0x3, 0xf9, 0xc, 0x5c, 0x84, 0x3c, 0x8c, 0x22, 0xbc, 0x6d, 0x19, 0x3d, 0x91, 0x27, 0xc3, 0x4e, 0x44, 0x85, 0xb0, 0x1f, 0x1a, 0x70, 0x4, 0x23, 0xbf, 0x49, 0x3b, 0x8e, 0xc8, 0xe0, 0x18, 0x83, 0x73, 0x30, 0xe, 0xf7, 0xb0, 0xf, 0x55, 0xe8, 0x81, 0x1, 0x28, 0xc1, 0x14, 0x74, 0xc3, 0x25, 0x54, 0x9c, 0x73, 0x8f, 0xe4, 0xaf, 0xc0, 0x20, 0x7, 0xeb, 0xf0, 0x1, 0xdf, 0xe3, 0x9c, 0x85, 0x53, 0xf8, 0x69, 0xef, 0x95, 0xf5, 0x25, 0xf5, 0x49, 0x68, 0xb6, 0xc0, 0x1a, 0x2f, 0x8, 0xb, 0x62, 0x32, 0x1, 0x75, 0xa3, 0x4b, 0xd, 0xdd, 0x6c, 0xf3, 0x44, 0x14, 0x15, 0xa3, 0x89, 0xc8, 0x36, 0xdb, 0x7f, 0xd6, 0xdd, 0x3f, 0x8c, 0xfc, 0x55, 0x70, 0x98, 0xbc, 0xe1, 0x9a, 0xf7, 0xce, 0x7f, 0x2f, 0x1a, 0x8c, 0xf6, 0xf2, 0xaf, 0xd5, 0x44, 0x92, 0x42, 0x5d, 0xa, 0x43, 0x88, 0xd6, 0x1f, 0x40, 0x9a, 0x70, 0xf, 0xe2, 0xdd, 0x16, 0x54, 0x22, 0x46, 0x17, 0xda, 0x18, 0xb2, 0x5c, 0x9b, 0x3e, 0xd1, 0x89, 0xd1, 0xb1, 0xc1, 0x40, 0x25, 0x43, 0x14, 0x87, 0x98, 0xd, 0xca, 0xc7, 0x2e, 0xd0, 0xc8, 0x73, 0xe8, 0xd2, 0x5d, 0x43, 0x3e, 0x49, 0x5b, 0x6f, 0x65, 0xcf, 0x20, 0x6e, 0x97, 0xec, 0x34, 0x1b, 0x4e, 0x55, 0x84, 0x77, 0xb0, 0xc4, 0x15, 0xa2, 0x9c, 0x77, 0xa5, 0x59, 0x33, 0xb8, 0xc8, 0x43, 0x9e, 0xf1, 0x26, 0x52, 0xb0, 0x20, 0xdf, 0xeb, 0x20, 0xd2, 0x6c, 0xb5, 0xc3, 0x44, 0x1b, 0x4c, 0xf2, 0xb0, 0xd, 0xcf, 0x70, 0x3, 0x1b, 0x30, 0xd, 0xc3, 0x30, 0xf, 0xf2, 0x2e, 0x1f, 0xa0, 0xa, 0xcb, 0xaa, 0x93, 0xfc, 0x9, 0x73, 0x3f, 0x88, 0x2b, 0xe2, 0x2d, 0x37, 0x24, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - + (NSData *)apple_icon_png { return [NSData dataWithBytes:apple_icon_png length:sizeof(apple_icon_png)]; } - static const unsigned char facebook_icon_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0x16, 0x8, 0x6, 0x0, 0x0, 0x0, 0xc4, 0xb4, 0x6c, 0x3b, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x46, 0x34, 0x42, 0x46, 0x44, 0x38, 0x36, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x46, 0x34, 0x42, 0x46, 0x44, 0x38, 0x37, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x46, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x38, 0x30, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0x98, 0x50, 0xa6, 0xc2, 0x0, 0x0, 0x1, 0x78, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x62, 0xd8, 0xbc, 0x79, 0xf3, 0x9a, 0xbf, 0x7f, 0xff, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xf, 0x6a, 0xe0, 0x7f, 0xff, 0xfe, 0x7d, 0xdf, 0xb5, 0x6b, 0xd7, 0x26, 0x46, 0x20, 0xe7, 0x2f, 0x3, 0x3, 0x3, 0x13, 0x3, 0x95, 0x1, 0xc8, 0xc0, 0x3f, 0xc, 0xd4, 0x7, 0x7f, 0x59, 0xc8, 0xd1, 0xf5, 0xf9, 0xf3, 0xe7, 0xf, 0x6b, 0xd7, 0xae, 0x5d, 0x75, 0xf6, 0xec, 0xd9, 0x73, 0xbf, 0x7f, 0xff, 0xfe, 0xc9, 0xc1, 0xc1, 0xc1, 0xe5, 0xe1, 0xe1, 0xe1, 0xe, 0xc4, 0x7e, 0x70, 0x45, 0xc0, 0xa0, 0xf8, 0xf9, 0x9f, 0x4, 0x70, 0xef, 0xde, 0xbd, 0x5b, 0x3a, 0x3a, 0x3a, 0x1a, 0xe8, 0x96, 0x65, 0x65, 0x65, 0x25, 0x21, 0x29, 0xfb, 0x43, 0x72, 0xd8, 0xe6, 0xe4, 0xe4, 0x64, 0x5d, 0xb9, 0x72, 0xe5, 0x6, 0x16, 0x29, 0x46, 0x64, 0xe, 0x49, 0x41, 0xf1, 0xe8, 0xd1, 0xa3, 0x7b, 0x7b, 0xf6, 0xec, 0x39, 0x0, 0xe3, 0xeb, 0xeb, 0xeb, 0x6b, 0x45, 0x46, 0x46, 0x46, 0x70, 0x73, 0x73, 0x73, 0x18, 0x1a, 0x1a, 0x1a, 0xa1, 0x28, 0x26, 0x25, 0x28, 0x4e, 0x9e, 0x3c, 0x79, 0x18, 0x59, 0xef, 0x91, 0x23, 0x47, 0xf6, 0xe1, 0x50, 0x4a, 0x5a, 0x50, 0x30, 0x32, 0xa2, 0xf8, 0x96, 0x41, 0x0, 0x8, 0xf0, 0x25, 0x37, 0xa2, 0x1, 0x33, 0x33, 0x33, 0xba, 0xfa, 0xff, 0xb8, 0xd4, 0x12, 0xc, 0xe3, 0x97, 0x2f, 0x5f, 0x3e, 0xf, 0xb, 0xb, 0xb, 0xf9, 0xf9, 0xf3, 0xe7, 0xef, 0x2f, 0x5f, 0xbe, 0x7c, 0x46, 0x96, 0x3, 0x86, 0x6f, 0x2c, 0x17, 0x17, 0x17, 0x37, 0x88, 0x5d, 0x55, 0x55, 0x55, 0xee, 0xe7, 0xe7, 0x17, 0x4c, 0xb4, 0xc1, 0x40, 0x3, 0x7f, 0x1c, 0x3a, 0x74, 0xe8, 0x18, 0x36, 0xb9, 0xcb, 0x97, 0x2f, 0x5f, 0xc3, 0xe5, 0x1b, 0x82, 0x41, 0x1, 0x8a, 0x9, 0x62, 0x82, 0x49, 0x5e, 0x5e, 0x5e, 0x81, 0xa4, 0xa0, 0x10, 0x14, 0x14, 0x14, 0xea, 0xe8, 0xe8, 0x68, 0xfd, 0x3, 0x4, 0x4f, 0x9e, 0x3c, 0x79, 0x38, 0x63, 0xc6, 0x8c, 0x79, 0x48, 0x69, 0x3a, 0x4d, 0x42, 0x42, 0x42, 0x9a, 0x8d, 0x8d, 0x8d, 0x55, 0x51, 0x51, 0x51, 0x99, 0xec, 0xe4, 0x76, 0xed, 0xda, 0xb5, 0x73, 0xc8, 0x7a, 0xef, 0xde, 0xbd, 0x7b, 0x9d, 0x2a, 0xc9, 0xd, 0x18, 0x79, 0x5f, 0xd1, 0xf8, 0x5f, 0xa8, 0x92, 0xdc, 0x48, 0x2d, 0x36, 0x47, 0xd, 0x86, 0x1b, 0x4c, 0x74, 0x9, 0x47, 0x64, 0x92, 0x6, 0xe7, 0x17, 0xa6, 0xdd, 0xbb, 0x77, 0x6f, 0x5, 0x6a, 0xf8, 0x5, 0xad, 0xa2, 0x88, 0xc1, 0xc8, 0x16, 0x61, 0xc8, 0x3, 0xc5, 0x7e, 0x1f, 0x3c, 0x78, 0x70, 0x17, 0x40, 0x80, 0x1, 0x0, 0x86, 0x7f, 0xa9, 0xd0, 0x39, 0x35, 0xd1, 0x78, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)facebook_icon_png { - return [NSData dataWithBytes:facebook_icon_png length:sizeof(facebook_icon_png)]; - } - - static const unsigned char twitter_icon_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0x12, 0x8, 0x6, 0x0, 0x0, 0x0, 0x5f, 0x25, 0x2e, 0x2d, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x0, 0x9, 0x70, 0x48, 0x59, 0x73, 0x0, 0x0, 0x2e, 0x23, 0x0, 0x0, 0x2e, 0x23, 0x1, 0x78, 0xa5, 0x3f, 0x76, 0x0, 0x0, 0x1, 0xcb, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x34, 0x2e, 0x30, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x74, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x3c, 0x2f, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x31, 0x3c, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0xa, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0xa, 0x29, 0x2e, 0xcd, 0x3d, 0x0, 0x0, 0x2, 0x34, 0x49, 0x44, 0x41, 0x54, 0x38, 0x11, 0x8d, 0x93, 0xbd, 0x6b, 0x54, 0x41, 0x14, 0x47, 0xdf, 0x6e, 0x36, 0x51, 0x8b, 0xa0, 0x9d, 0x44, 0x8b, 0x10, 0xb4, 0x10, 0xac, 0x4, 0xb1, 0x52, 0x50, 0x10, 0x8b, 0x80, 0x76, 0x36, 0x16, 0xfe, 0x7, 0xda, 0x5a, 0x58, 0x8b, 0xad, 0x88, 0x20, 0x16, 0x82, 0x36, 0x36, 0x12, 0x10, 0x24, 0xda, 0x89, 0x48, 0x10, 0x92, 0x42, 0xc1, 0x2e, 0x5a, 0xaa, 0x85, 0x22, 0x2a, 0x4a, 0xd4, 0xe8, 0xee, 0xbe, 0x9c, 0x33, 0x6f, 0xee, 0x63, 0xb2, 0x1b, 0xd4, 0xb, 0xe7, 0xdd, 0x3b, 0x77, 0x66, 0x7e, 0xef, 0xce, 0x57, 0x55, 0x61, 0x75, 0x5d, 0x77, 0xb3, 0x9f, 0xd0, 0x6f, 0x65, 0x8c, 0x49, 0x7d, 0xf8, 0x39, 0xb8, 0xb, 0xef, 0xe0, 0x3b, 0x2c, 0xc3, 0xf9, 0x98, 0x43, 0x7c, 0x6, 0xe, 0xa4, 0x36, 0xc1, 0x7d, 0x38, 0x6e, 0x3, 0x3f, 0x5, 0xe9, 0x47, 0xa9, 0xb3, 0xc9, 0x85, 0xe8, 0x41, 0xfa, 0xbe, 0xc0, 0x56, 0xf6, 0x80, 0xe4, 0x4b, 0x58, 0x84, 0x6d, 0xa, 0xed, 0x86, 0x3e, 0xfc, 0x84, 0x13, 0x85, 0xd8, 0x24, 0xed, 0x2e, 0x74, 0x8a, 0xdc, 0x12, 0x6d, 0x6d, 0xd, 0xfa, 0x43, 0xc, 0xff, 0x1b, 0xfe, 0x80, 0xe6, 0xa, 0xae, 0xc2, 0x39, 0x85, 0x67, 0x21, 0x55, 0xd1, 0x8c, 0xab, 0x2f, 0xd3, 0xee, 0x15, 0x62, 0x29, 0x26, 0x77, 0x18, 0x14, 0x1a, 0x64, 0x41, 0xe3, 0x1c, 0xa6, 0xfc, 0x2f, 0xda, 0xda, 0x2b, 0x98, 0x4b, 0xf3, 0x9, 0x56, 0xcd, 0x60, 0x56, 0xae, 0xbd, 0x81, 0x8b, 0xb0, 0xb7, 0xf8, 0xc1, 0x31, 0x3b, 0xb0, 0x41, 0x26, 0x9, 0x13, 0xeb, 0xa3, 0x62, 0x75, 0xb6, 0xc7, 0x1c, 0xab, 0x3e, 0xb, 0x9a, 0x3, 0x5c, 0x5a, 0xd8, 0x57, 0x82, 0x27, 0x70, 0x5, 0x6e, 0xe4, 0x64, 0x2b, 0x98, 0x57, 0x68, 0x3a, 0xe6, 0x3c, 0x56, 0x94, 0x76, 0xaf, 0xc7, 0xc7, 0xaa, 0x76, 0xc0, 0x23, 0x98, 0x87, 0x1, 0xf4, 0xa1, 0x86, 0x9d, 0xe0, 0xbe, 0xa7, 0xbd, 0x57, 0xa1, 0xd3, 0x69, 0xb7, 0xbc, 0x22, 0x76, 0x4c, 0x69, 0x6b, 0xb9, 0x31, 0x74, 0xff, 0xd6, 0xe1, 0x16, 0x78, 0x13, 0xdc, 0x8a, 0x5e, 0x31, 0x61, 0x48, 0xce, 0x1f, 0x69, 0x5d, 0xf2, 0x9b, 0x6e, 0x8b, 0xc9, 0xe6, 0x5f, 0xed, 0xf, 0x56, 0xcd, 0x61, 0x13, 0xe, 0xfe, 0x44, 0x70, 0x1b, 0xa6, 0x60, 0x58, 0x88, 0xd2, 0xac, 0x3a, 0x4c, 0x9c, 0xc4, 0x5b, 0xc0, 0x98, 0x68, 0x1a, 0xd0, 0x54, 0x1d, 0x7d, 0xcb, 0xe6, 0xb0, 0x66, 0x25, 0x4c, 0x9e, 0x86, 0xa7, 0x10, 0xe6, 0x1, 0xb5, 0x7b, 0xf9, 0x8f, 0x38, 0xe, 0xfc, 0x3d, 0xe3, 0x76, 0x25, 0x55, 0xdf, 0x1, 0x8d, 0xb8, 0xfc, 0x33, 0xc4, 0x37, 0xc1, 0x3b, 0xaa, 0xfd, 0xaf, 0xf8, 0x7a, 0x33, 0xbc, 0xbe, 0x96, 0x45, 0x9b, 0xd7, 0x4b, 0x32, 0x84, 0x4f, 0x12, 0x7f, 0x0, 0x85, 0xbd, 0x1d, 0x9b, 0x84, 0xf3, 0xd, 0x18, 0x5d, 0x45, 0x54, 0xfb, 0x8d, 0xf1, 0xb3, 0x6d, 0xb5, 0x6, 0x1a, 0xc9, 0x74, 0xd4, 0xf8, 0x3b, 0xd0, 0x5a, 0xf9, 0x10, 0x48, 0x8e, 0x8a, 0xda, 0x8e, 0x6a, 0x2f, 0x64, 0x9d, 0xf6, 0x61, 0x25, 0x51, 0x6, 0xb4, 0x9, 0xe2, 0x4b, 0xf0, 0x2, 0x3e, 0x43, 0x3c, 0xad, 0x52, 0xd4, 0xb4, 0xab, 0x89, 0x97, 0xb6, 0x90, 0xaa, 0x2b, 0xa, 0x8c, 0xf6, 0x98, 0x67, 0x92, 0xcf, 0xf7, 0x35, 0x68, 0xb1, 0x5c, 0xc5, 0x15, 0xf4, 0x31, 0x44, 0xee, 0x21, 0x71, 0x6c, 0x65, 0xdc, 0x8c, 0x46, 0x8f, 0x8e, 0x3d, 0xb0, 0xf, 0xf6, 0xc3, 0x69, 0xb8, 0x7, 0x3f, 0x40, 0x73, 0xaf, 0x15, 0x51, 0x4c, 0x14, 0xf, 0xbb, 0x1e, 0x15, 0x91, 0x68, 0xe, 0x2c, 0x12, 0x7a, 0x92, 0x87, 0x60, 0x1, 0xa2, 0xa, 0xc2, 0xbf, 0xda, 0x33, 0x7a, 0x4f, 0x85, 0x6, 0xf1, 0xb8, 0x28, 0x9d, 0x71, 0x68, 0xfa, 0xa3, 0xe0, 0x84, 0x23, 0xe0, 0x9, 0xcf, 0x80, 0xaf, 0xee, 0x23, 0xbc, 0x85, 0x15, 0x58, 0xe4, 0x1, 0x3d, 0xc7, 0x5b, 0x90, 0x4b, 0xf7, 0x89, 0x8f, 0x3e, 0x6b, 0xbb, 0xab, 0xd, 0x23, 0x5c, 0xa6, 0xb2, 0xce, 0x6d, 0xd4, 0xea, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)twitter_icon_png { - return [NSData dataWithBytes:twitter_icon_png length:sizeof(twitter_icon_png)]; - } - @end diff --git a/ParseUI/ParseUI/Source/PFSignUpViewController.h b/ParseUI/ParseUI/Source/PFSignUpViewController.h index 4cc695a9c..6c667d15e 100644 --- a/ParseUI/ParseUI/Source/PFSignUpViewController.h +++ b/ParseUI/ParseUI/Source/PFSignUpViewController.h @@ -20,16 +20,11 @@ */ #import - -#if __has_include() -#import -#else -#import "PFConstants.h" -#endif - #import "ParseUIConstants.h" #import "PFSignUpView.h" +@import ParseCore; + @class PFUser; @protocol PFSignUpViewControllerDelegate; diff --git a/ParseUI/ParseUI/Source/PFSignUpViewController.m b/ParseUI/ParseUI/Source/PFSignUpViewController.m index 8addffaa6..2f6431e46 100644 --- a/ParseUI/ParseUI/Source/PFSignUpViewController.m +++ b/ParseUI/ParseUI/Source/PFSignUpViewController.m @@ -20,20 +20,13 @@ */ #import "PFSignUpViewController.h" - -#if __has_include() -#import -#import -#else -#import "PFConstants.h" -#import "PFUser.h" -#endif - #import "PFUIAlertView.h" #import "PFLocalization.h" #import "PFPrimaryButton.h" #import "PFTextField.h" +@import ParseCore; + NSString *const PFSignUpSuccessNotification = @"com.parse.ui.signup.success"; NSString *const PFSignUpFailureNotification = @"com.parse.ui.signup.failure"; NSString *const PFSignUpCancelNotification = @"com.parse.ui.signup.cancel"; diff --git a/ParseUI/ParseUIDemo/Classes/AppDelegate.m b/ParseUI/ParseUIDemo/Classes/AppDelegate.m index a025ce74f..8ea22be75 100644 --- a/ParseUI/ParseUIDemo/Classes/AppDelegate.m +++ b/ParseUI/ParseUIDemo/Classes/AppDelegate.m @@ -20,27 +20,10 @@ */ #import "AppDelegate.h" - -#if __has_include() -#import -#else -#import "Parse.h" -#endif - -#if __has_include() -#import -#else -#import "ParseTwitterUtils.h" -#endif - -#if __has_include() -#import -#else -#import "ParseFacebookUtilsiOS.h" -#endif - #import "PFUIDemoViewController.h" +@import ParseCore; + @implementation AppDelegate #pragma mark - @@ -49,9 +32,6 @@ @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [Parse setApplicationId:@"UdNpOP2XFoEiXLZEBDl6xONmCMH8VjETmnEsl0xJ" clientKey:@"wNJFho0fQaQFQ2Fe1x9b67lVBakJiAtFj1Uz30A9"]; - [PFFacebookUtilsDevice initializeFacebookWithApplicationLaunchOptions:launchOptions]; - [PFTwitterUtils initializeWithConsumerKey:@"3Q9hMEKqqSg4ie2pibZ2sVJuv" - consumerSecret:@"IEZ9wv2d1EpXNGFKGp7sAGdxRtyqtPwygyciFZwTHTGhPp4FMj"]; self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[PFUIDemoViewController alloc] init]]; @@ -64,16 +44,6 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( return YES; } -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation { - return [[FBSDKApplicationDelegate sharedInstance] application:application - openURL:url - sourceApplication:sourceApplication - annotation:annotation]; -} - #pragma mark - #pragma mark Test Data diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m index b9cf905a2..3f71ce92f 100644 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m +++ b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m @@ -27,11 +27,7 @@ #import "BFTask.h" #endif -#if __has_include() -#import -#else -#import "PFObject.h" -#endif +@import ParseCore; @interface DeletionCollectionViewController() diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.m index 826290f74..efd0d6879 100644 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.m +++ b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.m @@ -20,17 +20,10 @@ */ #import "PaginatedCollectionViewController.h" - -#if __has_include() -#import -#import -#else -#import "PFObject.h" -#import "PFQuery.h" -#endif - #import "PFCollectionViewCell.h" +@import ParseCore; + @implementation PaginatedCollectionViewController #pragma mark - diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.m index 2a91c847e..d3391f6d5 100644 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.m +++ b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.m @@ -20,17 +20,10 @@ */ #import "SectionedCollectionViewController.h" - -#if __has_include() -#import -#import -#else -#import "PFObject.h" -#import "PFQuery.h" -#endif - #import "PFCollectionViewCell.h" +@import ParseCore; + #pragma mark - #pragma mark SimpleCollectionReusableView diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.m index bbcc23f9a..3f683af9f 100644 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.m +++ b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.m @@ -20,15 +20,10 @@ */ #import "SimpleCollectionViewController.h" - -#if __has_include() -#import -#else -#import "PFQuery.h" -#endif - #import "PFCollectionViewCell.h" +@import ParseCore; + @implementation SimpleCollectionViewController #pragma mark - diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.m index b8e416a1a..8fd4cae08 100644 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.m +++ b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.m @@ -20,15 +20,10 @@ */ #import "StoryboardCollectionViewController.h" - -#if __has_include() -#import -#else -#import "PFQuery.h" -#endif - #import "PFCollectionViewCell.h" +@import ParseCore; + @implementation StoryboardCollectionViewController #pragma mark - diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.m index dd99c456f..095af1ff8 100644 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.m +++ b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.m @@ -20,16 +20,11 @@ */ #import "SubtitleImageCollectionViewController.h" - -#if __has_include() -#import -#else -#import "PFQuery.h" -#endif - #import "PFCollectionViewCell.h" #import "PFImageView.h" +@import ParseCore; + @implementation SubtitleImageCollectionViewController #pragma mark - diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.m index 072c04c49..535fc00b4 100644 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.m +++ b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.m @@ -21,13 +21,7 @@ #import "CustomProductTableViewController.h" -#if __has_include() -#import -#import -#else -#import "PFQuery.h" -#import "PFPurchase.h" -#endif +@import ParseCore; @implementation CustomProductTableViewController diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.m index b4bb48793..5b3f0b93c 100644 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.m +++ b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.m @@ -27,11 +27,7 @@ #import "BFTask.h" #endif -#if __has_include() -#import -#else -#import "PFObject.h" -#endif +@import ParseCore; @interface DeletionTableViewController() diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.m index 9d4265f82..db202d4fa 100644 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.m +++ b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.m @@ -20,17 +20,10 @@ */ #import "PaginatedTableViewController.h" - -#if __has_include() -#import -#import -#else -#import "PFObject.h" -#import "PFQuery.h" -#endif - #import "PFTableViewCell.h" +@import ParseCore; + @implementation PaginatedTableViewController #pragma mark - diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.m index 46a5fa0bd..9ccdfac00 100644 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.m +++ b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.m @@ -20,17 +20,10 @@ */ #import "SectionedTableViewController.h" - -#if __has_include() -#import -#import -#else -#import "PFObject.h" -#import "PFQuery.h" -#endif - #import "PFTableViewCell.h" +@import ParseCore; + @interface SectionedTableViewController () { NSArray *_sectionSortedKeys; diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.m index 772c90b28..2c2b6d56b 100644 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.m +++ b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.m @@ -20,17 +20,10 @@ */ #import "SimpleTableViewController.h" - -#if __has_include() -#import -#import -#else -#import "PFObject.h" -#import "PFQuery.h" -#endif - #import "PFTableViewCell.h" +@import ParseCore; + @implementation SimpleTableViewController #pragma mark - diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.m index 6fb500e9b..504c7be09 100644 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.m +++ b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.m @@ -20,17 +20,10 @@ */ #import "StoryboardTableViewController.h" - -#if __has_include() -#import -#import -#else -#import "PFObject.h" -#import "PFQuery.h" -#endif - #import "PFTableViewCell.h" +@import ParseCore; + @implementation StoryboardTableViewController #pragma mark - diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.m index 63dace8c5..3998c5dc9 100644 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.m +++ b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.m @@ -20,15 +20,10 @@ */ #import "SubtitleImageTableViewController.h" - -#if __has_include() -#import -#else -#import "PFObject.h" -#endif - #import "PFTableViewCell.h" +@import ParseCore; + @implementation SubtitleImageTableViewController - (UITableViewCell *)tableView:(UITableView *)tableView diff --git a/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m b/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m index 552f99b86..c053dbe54 100644 --- a/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m +++ b/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m @@ -55,8 +55,6 @@ typedef NS_ENUM(uint8_t, PFUIDemoType) { PFUIDemoTypeLogInPasswordForgotten, PFUIDemoTypeLogInDone, PFUIDemoTypeLogInEmailAsUsername, - PFUIDemoTypeLogInFacebook, - PFUIDemoTypeLogInFacebookAndTwitter, PFUIDemoTypeLogInAll, PFUIDemoTypeLogInAllNavigation, PFUIDemoTypeLogInCustomizedLogoAndBackground, @@ -129,8 +127,6 @@ - (void)viewDidLoad { @"Log In Password Forgotten", @"Log In Done Button", @"Log In Email as Username", - @"Log In Facebook", - @"Log In Facebook and Twitter", @"Log In All", @"Log In All as Navigation", @"Log In Customized Background", @@ -272,30 +268,12 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath [self presentViewController:logInController animated:YES completion:nil]; break; } - case PFUIDemoTypeLogInFacebook: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = (PFLogInFieldsUsernameAndPassword - | PFLogInFieldsFacebook - | PFLogInFieldsDismissButton); - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInFacebookAndTwitter: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = PFLogInFieldsFacebook | PFLogInFieldsTwitter | PFLogInFieldsDismissButton; - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } case PFUIDemoTypeLogInAll: { PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; logInController.fields = (PFLogInFieldsUsernameAndPassword | PFLogInFieldsLogInButton | PFLogInFieldsPasswordForgotten | PFLogInFieldsApple - | PFLogInFieldsFacebook - | PFLogInFieldsTwitter | PFLogInFieldsSignUpButton | PFLogInFieldsDismissButton); logInController.delegate = self; @@ -315,8 +293,6 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath logInController.fields = (PFLogInFieldsUsernameAndPassword | PFLogInFieldsLogInButton | PFLogInFieldsPasswordForgotten - | PFLogInFieldsFacebook - | PFLogInFieldsTwitter | PFLogInFieldsSignUpButton | PFLogInFieldsDismissButton); logInController.delegate = self; @@ -332,7 +308,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath } case PFUIDemoTypeLogInCustomizedLogoAndBackground: { PFLogInViewController *logInController = [[CustomLogInViewController alloc] init]; - logInController.fields = PFLogInFieldsDefault | PFLogInFieldsFacebook | PFLogInFieldsTwitter; + logInController.fields = PFLogInFieldsDefault; logInController.delegate= self; PFSignUpViewController *signUpController = [[CustomSignUpViewController alloc] init]; diff --git a/ParseUI/ParseUIDemo/Other/Info.plist b/ParseUI/ParseUIDemo/Other/Info.plist index b237c9e95..6bad7e063 100644 --- a/ParseUI/ParseUIDemo/Other/Info.plist +++ b/ParseUI/ParseUIDemo/Other/Info.plist @@ -33,44 +33,12 @@ CFBundleVersion 1.1.1 - FacebookAppID - 1515945585583756 - FacebookClientToken - 5c2983cb4d07b0693935a24faeb6fe35 - LSApplicationQueriesSchemes - - fbapi - fb-messenger-api - fbauth2 - fbshareextension - LSRequiresIPhoneOS NSAppTransportSecurity NSExceptionDomains - akamaihd.net - - NSExceptionRequiresForwardSecrecy - - NSIncludesSubdomains - - - facebook.com - - NSExceptionRequiresForwardSecrecy - - NSIncludesSubdomains - - - fbcdn.net - - NSExceptionRequiresForwardSecrecy - - NSIncludesSubdomains - - local NSIncludesSubdomains diff --git a/ParseUI/ParseUIDemo/Swift/AppDelegate.swift b/ParseUI/ParseUIDemo/Swift/AppDelegate.swift index d055e5352..4d951a50c 100644 --- a/ParseUI/ParseUIDemo/Swift/AppDelegate.swift +++ b/ParseUI/ParseUIDemo/Swift/AppDelegate.swift @@ -20,9 +20,7 @@ */ import UIKit -import Parse -import ParseFacebookUtilsiOS -import ParseTwitterUtils +import ParseCore @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { @@ -33,8 +31,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { Parse.setApplicationId("UdNpOP2XFoEiXLZEBDl6xONmCMH8VjETmnEsl0xJ", clientKey: "wNJFho0fQaQFQ2Fe1x9b67lVBakJiAtFj1Uz30A9") - PFFacebookUtilsDevice.initializeFacebook(applicationLaunchOptions: launchOptions) - PFTwitterUtils.initialize(withConsumerKey: "3Q9hMEKqqSg4ie2pibZ2sVJuv", consumerSecret: "IEZ9wv2d1EpXNGFKGp7sAGdxRtyqtPwygyciFZwTHTGhPp4FMj") window = UIWindow(frame: UIScreen.main.bounds) window?.rootViewController = UINavigationController(rootViewController: UIDemoViewController()) window?.makeKeyAndVisible() @@ -46,10 +42,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return true } - func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { - return ApplicationDelegate.shared.application(application, open:url, sourceApplication: sourceApplication, annotation: annotation) - } - // MARK: Test Data private func setupTestData() { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/LogInViewController/CustomLogInViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/LogInViewController/CustomLogInViewController.swift index 1a3689b09..59ba336be 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/LogInViewController/CustomLogInViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/LogInViewController/CustomLogInViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI class CustomLogInViewController: PFLogInViewController { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift index 82faeb50a..bb6c6795d 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI class CustomProductTableViewController: PFProductTableViewController { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift index 1ca7d36f8..d93fe60cf 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift @@ -8,10 +8,10 @@ import UIKit -import Parse +import ParseCore import ParseUI -import Bolts.BFTask +import BoltsSwift class DeletionCollectionViewController: PFQueryCollectionViewController, UIAlertViewDelegate { convenience init(className: String?) { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift index 7fbba76bc..caef91883 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI class PaginatedCollectionViewController: PFQueryCollectionViewController { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift index 2bc3000c4..9e32e52c4 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI class SimpleCollectionReusableView : UICollectionReusableView { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift index a713cf647..472e0e4c6 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI class SimpleCollectionViewController: PFQueryCollectionViewController { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift index 87d139e7e..520551d8e 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI class StoryboardCollectionViewController: PFQueryCollectionViewController { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.swift index 90daf8079..e934bd39d 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI class SubtitleImageCollectionViewController: PFQueryCollectionViewController { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift index e90022fe1..34d2d1c1f 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift @@ -8,10 +8,10 @@ import UIKit -import Parse +import ParseCore import ParseUI -import Bolts.BFTask +import BoltsSwift class DeletionTableViewController: PFQueryTableViewController, UIAlertViewDelegate { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.swift index c8d5f705a..f1596353e 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI class PaginatedTableViewController: PFQueryTableViewController { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift index c1774fbe1..c7edab07f 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI class SectionedTableViewController: PFQueryTableViewController { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SimpleTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SimpleTableViewController.swift index 993d0d8c5..ac948c151 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SimpleTableViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SimpleTableViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI class SimpleTableViewController: PFQueryTableViewController { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.swift index 43f103331..8a8ca41b4 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI class StoryboardTableViewController: PFQueryTableViewController { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.swift index 68c158bd7..65cabb92a 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI class SubtitleImageTableViewController: PFQueryTableViewController { diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/SignUpViewController/CustomSignUpViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/SignUpViewController/CustomSignUpViewController.swift index bf885db07..d9d6fcf2e 100644 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/SignUpViewController/CustomSignUpViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/SignUpViewController/CustomSignUpViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI class CustomSignUpViewController: PFSignUpViewController { diff --git a/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift b/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift index 01543634c..11739cfdd 100644 --- a/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift +++ b/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift @@ -21,7 +21,7 @@ import UIKit -import Parse +import ParseCore import ParseUI enum UIDemoType : Int { @@ -30,8 +30,6 @@ enum UIDemoType : Int { case LogInPasswordForgotten case LogInDone case LogInEmailAsUsername - case LogInFacebook - case LogInFacebookAndTwitter case LogInAll case LogInAllNavigation case LogInCustomizedLogoAndBackground @@ -81,10 +79,6 @@ extension UIDemoType : CustomStringConvertible { return "Log In Done Button" case .LogInEmailAsUsername: return "Log In Email as Username" - case .LogInFacebook: - return "Log In Facebook" - case .LogInFacebookAndTwitter: - return "Log In Facebook and Twitter" case .LogInAll: return "Log In All" case .LogInAllNavigation: @@ -201,20 +195,10 @@ extension UIDemoViewController { logInViewController.fields = [.usernameAndPassword, .logInButton, .signUpButton, .dismissButton] logInViewController.emailAsUsername = true present(logInViewController, animated: true, completion: nil) - case .LogInFacebook: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .facebook, .dismissButton] - present(logInViewController, animated: true, completion: nil) - case .LogInFacebookAndTwitter: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.facebook, .twitter, .dismissButton] - present(logInViewController, animated: true, completion: nil) case .LogInAll: let logInViewController = PFLogInViewController() logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .logInButton, .facebook, .twitter, .signUpButton, .dismissButton] + logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .logInButton, .signUpButton, .dismissButton] if let signUpController = logInViewController.signUpController { signUpController.delegate = self signUpController.fields = [.usernameAndPassword, .email, .additional, .signUpButton, .dismissButton] @@ -223,7 +207,7 @@ extension UIDemoViewController { case .LogInAllNavigation: let logInViewController = PFLogInViewController() logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .logInButton, .facebook, .twitter, .signUpButton, .dismissButton] + logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .logInButton, .signUpButton, .dismissButton] if let signUpViewController = logInViewController.signUpController { signUpViewController.delegate = self signUpViewController.fields = [.usernameAndPassword, .email, .additional, .signUpButton, .dismissButton] @@ -232,7 +216,7 @@ extension UIDemoViewController { case .LogInCustomizedLogoAndBackground: let logInViewController = CustomLogInViewController() logInViewController.delegate = self - logInViewController.fields = [.default, .facebook, .twitter] + logInViewController.fields = [.default] let signUpViewController = CustomSignUpViewController() signUpViewController.delegate = self diff --git a/ParseUI/SignInWithAppleTests/SignInWithAppleTests.m b/ParseUI/SignInWithAppleTests/SignInWithAppleTests.m index cb17a0989..b74b76ba0 100644 --- a/ParseUI/SignInWithAppleTests/SignInWithAppleTests.m +++ b/ParseUI/SignInWithAppleTests/SignInWithAppleTests.m @@ -8,7 +8,7 @@ #import #import "PFAppleUtils.h" -#import "Parse/PFUser.h" +@import ParseCore; @import OCMock; diff --git a/README.md b/README.md index 2caa3eeb1..0dde4fa7e 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,12 @@ [![Coverage](https://img.shields.io/codecov/c/github/parse-community/Parse-SDK-iOS-OSX/master.svg)](https://codecov.io/github/parse-community/Parse-SDK-iOS-OSX?branch=master) [![auto-release](https://img.shields.io/badge/%F0%9F%9A%80-auto--release-9e34eb.svg)](https://github.com/parse-community/Parse-SDK-iOS-OSX/releases) +![iOS](https://img.shields.io/badge/iOS-12.0-green?style=flat) +![iPad](https://img.shields.io/badge/ipadOS-12.0-green?style=flat) +![macOS](https://img.shields.io/badge/macOS-10.15-green?style=flat) +![watchOS](https://img.shields.io/badge/watchOS-2.0-green?style=flat) +![tvOS](https://img.shields.io/badge/tvOS-12.0-green?style=flat) + ![SPM](https://img.shields.io/badge/Swift_Package_Manager-compatible-green?style=flat) [![Backers on Open Collective](https://opencollective.com/parse-server/backers/badge.svg)][open-collective-link] @@ -25,9 +31,6 @@ A library that gives you access to the powerful Parse Server backend from your i --- - [Getting Started](#getting-started) - - [Alternative Installation Options](#alternative-installation-options) - - [Compile Source](#compile-source) - - [Add Sub-Project](#add-sub-project) - [How Do I Contribute?](#how-do-i-contribute) - [Dependencies](#dependencies) @@ -41,36 +44,10 @@ The easiest way to install the SDK is via Swift Package Manager. https://github.com/parse-community/Parse-SDK-iOS-OSX ``` 3. Add package -3. Choose the submodules you want to install +4. Choose the submodules you want to install Take a look at the public [documentation][docs] & [API][api] and start building. -### Alternative Installation Options - -#### Compile Source - -If you want to manually compile the SDK, clone it locally, and run the following commands in the root directory of the repository: - -``` -# To pull in extra dependencies (Bolts and OCMock) -git submodule update --init --recursive - -# To install bundler -gem install bundler - -# To install all the gems via bundler -bundle install - -# Build & Package the Frameworks -bundle exec rake package:frameworks -``` - -Compiled frameworks will be inside the `build/release` folder. - -#### Add Sub-Project - -You can also include parse as a subproject inside of your application if you'd prefer, although we do not recommend this, as it will increase your indexing time significantly. To do so, just drag and drop the Parse.xcodeproj file into your workspace. Note that unit tests will be unavailable if you use Parse like this, as OCMock will be unable to be found. - ## How Do I Contribute? We want to make contributing to this project as easy and transparent as possible. Please refer to the [Contribution Guidelines][contributing]. diff --git a/Rakefile b/Rakefile index c40ddbbaf..34509b27e 100644 --- a/Rakefile +++ b/Rakefile @@ -8,14 +8,10 @@ # require_relative 'Vendor/xctoolchain/Scripts/xctask/build_task' -require_relative 'Vendor/xctoolchain/Scripts/xctask/build_framework_task' - -script_folder = File.expand_path(File.dirname(__FILE__)) -build_folder = File.join(script_folder, 'build') -starters_folder = File.join(script_folder, 'ParseStarterProject') -release_folder = File.join(build_folder, 'release') -bolts_build_folder = File.join(script_folder, 'Carthage', 'Build') -bolts_folder = File.join(script_folder, 'Carthage', 'Checkouts', 'Bolts-ObjC') + +SCRIPT_PATH = File.expand_path(File.dirname(__FILE__)) +starters_path = File.join(SCRIPT_PATH, 'ParseStarterProject') + ios_simulator = 'platform="iOS Simulator",name="iPhone 14"' tvos_simulator = 'platform="tvOS Simulator",name="Apple TV"' watchos_simulator = 'platform="watchOS Simulator",name="Apple Watch Series 8 (45mm)"' @@ -25,40 +21,34 @@ build_action = [XCTask::BuildAction::CLEAN, XCTask::BuildAction::BUILD]; module Constants require 'plist' - script_folder = File.expand_path(File.dirname(__FILE__)) - - PARSE_CONSTANTS_HEADER = File.join(script_folder, 'Parse', 'Parse', 'Source/PFConstants.h') - + PARSE_CONSTANT_PATH = File.join(SCRIPT_PATH, 'Parse', 'Parse', 'Source/PFConstants.h') PLISTS = [ - File.join(script_folder, 'Parse', 'Parse', 'Resources', 'Parse-iOS.Info.plist'), - File.join(script_folder, 'Parse', 'Parse', 'Resources', 'Parse-OSX.Info.plist'), - File.join(script_folder, 'Parse', 'Parse', 'Resources', 'Parse-watchOS.Info.plist'), - File.join(script_folder, 'Parse', 'Parse', 'Resources', 'Parse-tvOS.Info.plist'), - File.join(script_folder, 'ParseFacebookUtils', 'ParseFacebookUtils', 'Resources', 'Info-iOS.plist'), - File.join(script_folder, 'ParseFacebookUtils', 'ParseFacebookUtils', 'Resources', 'Info-tvOS.plist'), - File.join(script_folder, 'ParseTwitterUtils', 'ParseTwitterUtils', 'Resources', 'Info-iOS.plist'), - File.join(script_folder, 'ParseUI', 'ParseUI', 'Resources', 'Info-iOS.plist'), - File.join(script_folder, 'ParseLiveQuery', 'ParseLiveQuery', 'Resources', 'Info.plist'), - File.join(script_folder, 'ParseLiveQuery', 'ParseLiveQuery-tvOS', 'Info.plist'), - File.join(script_folder, 'ParseLiveQuery', 'ParseLiveQuery-watchOS', 'Info.plist'), - File.join(script_folder, 'ParseStarterProject', 'iOS', 'ParseStarterProject', 'Resources', 'Info.plist'), - File.join(script_folder, 'ParseStarterProject', 'iOS', 'ParseStarterProject-Swift', 'Resources', 'Info.plist'), - File.join(script_folder, 'ParseStarterProject', 'OSX', 'ParseOSXStarterProject', 'Resources', 'Info.plist'), - File.join(script_folder, 'ParseStarterProject', 'OSX', 'ParseOSXStarterProject-Swift', 'Resources', 'Info.plist'), - File.join(script_folder, 'ParseStarterProject', 'tvOS', 'ParseStarterProject-Swift', 'ParseStarter', 'Info.plist'), - File.join(script_folder, 'ParseStarterProject', 'watchOS', 'ParseStarterProject-Swift', 'ParseStarter', 'Info.plist'), - File.join(script_folder, 'ParseStarterProject', 'watchOS', 'ParseStarterProject-Swift', 'ParseStarter Extension', 'Info.plist'), - File.join(script_folder, 'ParseStarterProject', 'watchOS', 'ParseStarterProject-Swift', 'Resources', 'Info.plist'), + File.join(SCRIPT_PATH, 'Parse', 'Parse', 'Resources', 'Parse-iOS.Info.plist'), + File.join(SCRIPT_PATH, 'Parse', 'Parse', 'Resources', 'Parse-OSX.Info.plist'), + File.join(SCRIPT_PATH, 'Parse', 'Parse', 'Resources', 'Parse-watchOS.Info.plist'), + File.join(SCRIPT_PATH, 'Parse', 'Parse', 'Resources', 'Parse-tvOS.Info.plist'), + File.join(SCRIPT_PATH, 'ParseUI', 'ParseUI', 'Resources', 'Info-iOS.plist'), + File.join(SCRIPT_PATH, 'ParseLiveQuery', 'ParseLiveQuery', 'Resources', 'Info.plist'), + File.join(SCRIPT_PATH, 'ParseLiveQuery', 'ParseLiveQuery-tvOS', 'Info.plist'), + File.join(SCRIPT_PATH, 'ParseLiveQuery', 'ParseLiveQuery-watchOS', 'Info.plist'), + File.join(SCRIPT_PATH, 'ParseStarterProject', 'iOS', 'ParseStarterProject', 'Resources', 'Info.plist'), + File.join(SCRIPT_PATH, 'ParseStarterProject', 'iOS', 'ParseStarterProject-Swift', 'Resources', 'Info.plist'), + File.join(SCRIPT_PATH, 'ParseStarterProject', 'OSX', 'ParseOSXStarterProject', 'Resources', 'Info.plist'), + File.join(SCRIPT_PATH, 'ParseStarterProject', 'OSX', 'ParseOSXStarterProject-Swift', 'Resources', 'Info.plist'), + File.join(SCRIPT_PATH, 'ParseStarterProject', 'tvOS', 'ParseStarterProject-Swift', 'ParseStarter', 'Info.plist'), + File.join(SCRIPT_PATH, 'ParseStarterProject', 'watchOS', 'ParseStarterProject-Swift', 'ParseStarter', 'Info.plist'), + File.join(SCRIPT_PATH, 'ParseStarterProject', 'watchOS', 'ParseStarterProject-Swift', 'ParseStarter Extension', 'Info.plist'), + File.join(SCRIPT_PATH, 'ParseStarterProject', 'watchOS', 'ParseStarterProject-Swift', 'Resources', 'Info.plist'), ] def self.current_version - constants_file = File.open(PARSE_CONSTANTS_HEADER, 'r').read + constants_file = File.open(PARSE_CONSTANT_PATH, 'r').read matches = constants_file.match(/(.*PARSE_VERSION\s*@")(.*)(")/) matches[2] # Return the second match, which is the version itself end def self.update_version(version) - constants_file = File.open(PARSE_CONSTANTS_HEADER, 'r+') + constants_file = File.open(PARSE_CONSTANT_PATH, 'r+') constants = constants_file.read constants.gsub!(/(.*PARSE_VERSION\s*@")(.*)(")/, "\\1#{version}\\3") @@ -78,283 +68,14 @@ module Constants end end -namespace :build do - desc 'Build iOS framework.' - task :ios do - task = XCTask::BuildFrameworkTask.new do |t| - t.directory = script_folder - t.build_directory = build_folder - t.framework_type = XCTask::FrameworkType::IOS - t.framework_name = 'Parse.framework' - - t.workspace = 'Parse.xcworkspace' - t.scheme = 'Parse-iOS' - t.configuration = 'Release' - end - result = task.execute - unless result - puts 'Failed to build iOS Framework.' - exit(1) - end - end - - desc 'Build watchOS framework.' - task :watchos do - task = XCTask::BuildFrameworkTask.new do |t| - t.directory = script_folder - t.build_directory = build_folder - t.framework_type = XCTask::FrameworkType::WATCHOS - t.framework_name = 'Parse.framework' - - t.workspace = 'Parse.xcworkspace' - t.scheme = 'Parse-watchOS' - t.configuration = 'Release' - end - result = task.execute - unless result - puts 'Failed to build watchOS Framework.' - exit(1) - end - end - - desc 'Build macOS framework.' - task :macos do - task = XCTask::BuildFrameworkTask.new do |t| - t.directory = script_folder - t.build_directory = build_folder - t.framework_type = XCTask::FrameworkType::OSX - t.framework_name = 'Parse.framework' - - t.workspace = 'Parse.xcworkspace' - t.scheme = 'Parse-macOS' - t.configuration = 'Release' - end - result = task.execute - unless result - puts 'Failed to build macOS Framework.' - exit(1) - end - end - - desc 'Build tvOS framework.' - task :tvos do - task = XCTask::BuildFrameworkTask.new do |t| - t.directory = script_folder - t.build_directory = build_folder - t.framework_type = XCTask::FrameworkType::TVOS - t.framework_name = 'Parse.framework' - - t.workspace = 'Parse.xcworkspace' - t.scheme = 'Parse-tvOS' - t.configuration = 'Release' - end - result = task.execute - unless result - puts 'Failed to build tvOS Framework.' - exit(1) - end - end - - namespace :parse_live_query do - desc 'Build iOS LiveQuery framework.' - task :ios do - task = XCTask::BuildFrameworkTask.new do |t| - t.directory = script_folder - t.build_directory = File.join(build_folder, 'iOS') - t.framework_type = XCTask::FrameworkType::IOS - t.framework_name = 'ParseLiveQuery.framework' - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseLiveQuery-iOS' - t.configuration = 'Release' - end - result = task.execute - unless result - puts 'Failed to build iOS LiveQuery Framework.' - exit(1) - end - end - - desc 'Build macOS LiveQuery framework.' - task :macos do - task = XCTask::BuildFrameworkTask.new do |t| - t.directory = script_folder - t.build_directory = File.join(build_folder, 'macOS') - t.framework_type = XCTask::FrameworkType::OSX - t.framework_name = 'ParseLiveQuery.framework' - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseLiveQuery-OSX' - t.configuration = 'Release' - end - result = task.execute - unless result - puts 'Failed to build macOS LiveQuery Framework.' - exit(1) - end - end - - desc 'Build watchOS LiveQuery framework.' - task :watchos do - task = XCTask::BuildFrameworkTask.new do |t| - t.directory = script_folder - t.build_directory = File.join(build_folder, 'watchOS') - t.framework_type = XCTask::FrameworkType::WATCHOS - t.framework_name = 'ParseLiveQuery_watchOS.framework' - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseLiveQuery-watchOS' - t.configuration = 'Release' - end - result = task.execute - unless result - puts 'Failed to build watchOS LiveQuery Framework.' - exit(1) - end - end - - desc 'Build tvOS LiveQuery framework.' - task :tvos do - task = XCTask::BuildFrameworkTask.new do |t| - t.directory = script_folder - t.build_directory = File.join(build_folder, 'tvOS') - t.framework_type = XCTask::FrameworkType::TVOS - t.framework_name = 'ParseLiveQuery_tvOS.framework' - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseLiveQuery-tvOS' - t.configuration = 'Release' - end - result = task.execute - unless result - puts 'Failed to build tvOS LiveQuery Framework.' - exit(1) - end - end - end - - namespace :facebook_utils do - desc 'Build iOS FacebookUtils framework.' - task :ios do - task = XCTask::BuildFrameworkTask.new do |t| - t.directory = script_folder - t.build_directory = File.join(build_folder, 'iOS') - t.framework_type = XCTask::FrameworkType::IOS - t.framework_name = 'ParseFacebookUtilsV4.framework' - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseFacebookUtilsV4-iOS' - t.configuration = 'Release' - end - - result = task.execute - unless result - puts 'Failed to build iOS FacebookUtils Framework.' - exit(1) - end - end - - desc 'Build tvOS FacebookUtils framework.' - task :tvos do - task = XCTask::BuildFrameworkTask.new do |t| - t.directory = script_folder - t.build_directory = File.join(build_folder, 'tvOS') - t.framework_type = XCTask::FrameworkType::TVOS - t.framework_name = 'ParseFacebookUtilsV4.framework' - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseFacebookUtilsV4-tvOS' - t.configuration = 'Release' - end - result = task.execute - unless result - puts 'Failed to build tvOS FacebookUtils Framework.' - exit(1) - end - end - end - - namespace :twitter_utils do - desc 'Build iOS TwitterUtils framework.' - task :ios do - task = XCTask::BuildFrameworkTask.new do |t| - t.directory = script_folder - t.build_directory = File.join(build_folder, 'iOS') - t.framework_type = XCTask::FrameworkType::IOS - t.framework_name = 'ParseTwitterUtils.framework' - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseTwitterUtils-iOS' - t.configuration = 'Release' - end - - result = task.execute - unless result - puts 'Failed to build iOS TwitterUtils Framework.' - exit(1) - end - end - end - - namespace :parseui do - task :framework do - task = XCTask::BuildFrameworkTask.new do |t| - t.directory = script_folder - t.build_directory = File.join(build_folder, 'iOS') - t.framework_type = XCTask::FrameworkType::IOS - t.framework_name = 'ParseUI.framework' - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseUI' - t.configuration = 'Release' - end - - result = task.execute - unless result - puts 'Failed to build ParseUI' - exit(1) - end - end - - task :demo_objc do - task = XCTask::BuildTask.new do |t| - t.directory = script_folder - t.workspace = 'Parse.xcworkspace' - - t.scheme = 'ParseUIDemo' - t.sdk = 'iphonesimulator' - t.destinations = [ios_simulator] - t.configuration = 'Debug' - t.additional_options = { "GCC_INSTRUMENT_PROGRAM_FLOW_ARCS" => "YES", - "GCC_GENERATE_TEST_COVERAGE_FILES" => "YES" } - - t.actions = build_action - t.formatter = XCTask::BuildFormatter::XCPRETTY - end - - result = task.execute - unless result - puts 'Failed to build ParseUI Demo.' - exit(1) - end - end - - task :demo_swift do - task = XCTask::BuildTask.new do |t| - t.directory = script_folder - t.workspace = 'Parse.xcworkspace' - - t.scheme = 'ParseUIDemo-Swift' - t.sdk = 'iphonesimulator' - t.destinations = [ios_simulator] - t.configuration = 'Debug' - t.additional_options = { "GCC_INSTRUMENT_PROGRAM_FLOW_ARCS" => "YES", - "GCC_GENERATE_TEST_COVERAGE_FILES" => "YES" } - - t.actions = build_action - t.formatter = XCTask::BuildFormatter::XCPRETTY - end - - result = task.execute - unless result - puts 'Failed to build iOS ParseUI Swift Demo.' - exit(1) - end - end +namespace :package do + task :set_version, [:version] do |_, args| + version = args[:version] || Constants.current_version + Constants.update_version(version) end +end +namespace :build do namespace :ios_starters do task :all do Rake::Task['build:ios_starters:objc'].invoke @@ -363,9 +84,9 @@ namespace :build do task :objc do project = 'ParseStarterProject' - ios_starters_folder = File.join(starters_folder, 'iOS', project) + ios_starters_path = File.join(starters_path, 'iOS', project) task = XCTask::BuildTask.new do |t| - t.directory = ios_starters_folder + t.directory = ios_starters_path t.project = "#{project}.xcodeproj" t.scheme = project t.configuration = 'Debug' @@ -382,9 +103,9 @@ namespace :build do task :swift do project = 'ParseStarterProject-Swift' - ios_starters_folder = File.join(starters_folder, 'iOS', project) + ios_starters_path = File.join(starters_path, 'iOS', project) task = XCTask::BuildTask.new do |t| - t.directory = ios_starters_folder + t.directory = ios_starters_path t.project = "#{project}.xcodeproj" t.scheme = project t.configuration = 'Debug' @@ -407,7 +128,7 @@ namespace :build do end task :objc do - macos_starter_folder = File.join(starters_folder, 'OSX', 'ParseOSXStarterProject') + macos_starter_folder = File.join(starters_path, 'OSX', 'ParseOSXStarterProject') task = XCTask::BuildTask.new do |t| t.directory = macos_starter_folder t.project = 'ParseOSXStarterProject.xcodeproj' @@ -424,7 +145,7 @@ namespace :build do end task :swift do - macos_starter_folder = File.join(starters_folder, 'OSX', 'ParseOSXStarterProject-Swift') + macos_starter_folder = File.join(starters_path, 'OSX', 'ParseOSXStarterProject-Swift') task = XCTask::BuildTask.new do |t| t.directory = macos_starter_folder t.project = 'ParseOSXStarterProject-Swift.xcodeproj' @@ -449,7 +170,7 @@ namespace :build do end task :swift do - tvos_starter_folder = File.join(starters_folder, 'tvOS', 'ParseStarterProject-Swift') + tvos_starter_folder = File.join(starters_path, 'tvOS', 'ParseStarterProject-Swift') task = XCTask::BuildTask.new do |t| t.directory = tvos_starter_folder t.project = 'ParseStarter-Swift.xcodeproj' @@ -474,7 +195,7 @@ namespace :build do end task :swift do - watchos_starter_folder = File.join(starters_folder, 'watchOS', 'ParseStarterProject-Swift') + watchos_starter_folder = File.join(starters_path, 'watchOS', 'ParseStarterProject-Swift') task = XCTask::BuildTask.new do |t| t.directory = watchos_starter_folder t.project = 'ParseStarter-Swift.xcodeproj' @@ -493,159 +214,10 @@ namespace :build do desc 'Build all starters' task :starters do - Rake::Task['build:ios_starters:all'].invoke - Rake::Task['build:macos_starters:all'].invoke Rake::Task['build:tvos_starters:all'].invoke Rake::Task['build:watchos_starters:all'].invoke - end -end - -namespace :package do - package_ios_name = 'Parse-iOS.zip' - package_macos_name = 'Parse-macOS.zip' - package_tvos_name = 'Parse-tvOS.zip' - package_watchos_name = 'Parse-watchOS.zip' - package_starter_ios_name = 'ParseStarterProject-iOS.zip' - package_starter_osx_name = 'ParseStarterProject-OSX.zip' - package_starter_tvos_name = 'ParseStarterProject-tvOS.zip' - package_starter_watchos_name = 'ParseStarterProject-watchOS.zip' - package_parseui_name = 'ParseUI.zip' - - task :prepare do - `rm -rf #{build_folder} && mkdir -p #{build_folder}` - `#{bolts_folder}/scripts/build_framework.sh -n -c Release --with-watchos --with-tvos` - end - - task :set_version, [:version] do |_, args| - version = args[:version] || Constants.current_version - Constants.update_version(version) - end - - desc 'Build all frameworks and starters' - task :release do |_| - Rake::Task['package:frameworks'].invoke - end - - desc 'Build and package all frameworks for the release' - task :frameworks, [:version] => :prepare do |_, args| - version = args[:version] || Constants.current_version - Constants.update_version(version) - - ## Build macOS Framework - Rake::Task['build:macos'].invoke - bolts_path = File.join(bolts_build_folder, 'osx', 'Bolts.framework') - osx_framework_path = File.join(build_folder, 'Parse.framework') - make_package(release_folder, - [osx_framework_path, bolts_path], - package_macos_name) - - ## Build iOS Framework - Rake::Task['build:ios'].invoke - bolts_path = File.join(bolts_build_folder, 'ios', 'Bolts.framework') - ios_framework_path = File.join(build_folder, 'Parse.framework') - make_package(release_folder, - [ios_framework_path, bolts_path], - package_ios_name) - - ## Build tvOS Framework - Rake::Task['build:tvos'].invoke - bolts_path = File.join(bolts_build_folder, 'tvOS', 'Bolts.framework') - tvos_framework_path = File.join(build_folder, 'Parse.framework') - make_package(release_folder, - [tvos_framework_path, bolts_path], - package_tvos_name) - - ## Build watchOS Framework - Rake::Task['build:watchos'].invoke - bolts_path = File.join(bolts_build_folder, 'watchOS', 'Bolts.framework') - watchos_framework_path = File.join(build_folder, 'Parse.framework') - make_package(release_folder, - [watchos_framework_path, bolts_path], - package_watchos_name) - - Rake::Task['build:facebook_utils:ios'].invoke - ios_fb_utils_framework_path = File.join(build_folder, 'iOS', 'ParseFacebookUtilsV4.framework') - make_package(release_folder, [ios_fb_utils_framework_path], 'ParseFacebookUtils-iOS.zip') - - Rake::Task['build:twitter_utils:ios'].invoke - ios_tw_utils_framework_path = File.join(build_folder, 'iOS', 'ParseTwitterUtils.framework') - make_package(release_folder, [ios_tw_utils_framework_path], 'ParseTwitterUtils-iOS.zip') - - Rake::Task['build:facebook_utils:tvos'].invoke - tvos_fb_utils_framework_path = File.join(build_folder, 'tvOS', 'ParseFacebookUtilsV4.framework') - make_package(release_folder, [tvos_fb_utils_framework_path], 'ParseFacebookUtils-tvOS.zip') - - Rake::Task['build:parseui:framework'].invoke - parseui_framework_path = File.join(build_folder, 'iOS', 'ParseUI.framework') - make_package(release_folder, - [parseui_framework_path], - package_parseui_name) - - Rake::Task['build:parse_live_query:ios'].invoke - ios_lq_framework_path = File.join(build_folder, 'iOS', 'ParseLiveQuery.framework') - make_package(release_folder, [ios_lq_framework_path], 'ParseLiveQuery-iOS.zip') - - Rake::Task['build:parse_live_query:watchos'].invoke - watchos_lq_fb_utils_framework_path = File.join(build_folder, 'watchOS', 'ParseLiveQuery_watchOS.framework') - make_package(release_folder, [watchos_lq_fb_utils_framework_path], 'ParseLiveQuery-watchOS.zip') - - Rake::Task['build:parse_live_query:tvos'].invoke - tvos_lq_framework_path = File.join(build_folder, 'tvOS', 'ParseLiveQuery_tvOS.framework') - make_package(release_folder, [tvos_lq_framework_path], 'ParseLiveQuery-tvOS.zip') - - Rake::Task['build:parse_live_query:macos'].invoke - macos_lq_utils_framework_path = File.join(build_folder, 'macOS', 'ParseLiveQuery.framework') - make_package(release_folder, [macos_lq_utils_framework_path], 'ParseLiveQuery-OSX.zip') - end - - def make_package(target_path, items, archive_name) - temp_folder = File.join(target_path, 'tmp') - `mkdir -p #{temp_folder}` - - item_list = '' - items.each do |item| - `cp -R #{item} #{temp_folder}` - - file_name = File.basename(item) - item_list << " #{file_name}" - end - - archive_path = File.join(target_path, archive_name) - `cd #{temp_folder}; zip -r --symlinks #{archive_path} #{item_list}` - `rm -rf #{temp_folder}` - puts "Release archive created: #{File.join(target_path, archive_name)}" - end - - def make_starter_package(target_path, starter_projects, framework_archive, archive_name) - starter_projects.each do |project_path| - `git clean -xfd #{project_path}` - `cd #{project_path} && unzip -o #{framework_archive}` - - xcodeproj_path = Dir.glob(File.join(project_path, '*.xcodeproj'))[0] - prepare_xcodeproj(xcodeproj_path) - end - make_package(target_path, starter_projects, archive_name) - - starter_projects.each do |project_path| - `git clean -xfd #{project_path}` - `git checkout #{project_path}` - end - end - - def prepare_xcodeproj(path) - project = Xcodeproj::Project.open(path) - project.targets.each do |target| - if target.name == 'Bootstrap' - target.remove_from_project - else - target.dependencies.each do |dependency| - dependency.remove_from_project if dependency.display_name == 'Bootstrap' - end - end - end - project.save - - `rm -rf #{File.join(path, 'xcshareddata', 'xcschemes', '*')}` + Rake::Task['build:ios_starters:all'].invoke + Rake::Task['build:macos_starters:all'].invoke end end @@ -653,16 +225,14 @@ namespace :test do desc 'Run iOS Tests' task :ios do |_, args| task = XCTask::BuildTask.new do |t| - t.directory = script_folder + t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' - t.scheme = 'Parse-iOS' t.sdk = 'iphonesimulator' t.destinations = [ios_simulator] t.configuration = 'Debug -enableCodeCoverage YES' - t.actions = [XCTask::BuildAction::TEST] - t.formatter = XCTask::BuildFormatter::XCODEBUILD + t.formatter = XCTask::BuildFormatter::XCPRETTY end unless task.execute puts 'iOS Tests Failed!' @@ -673,15 +243,13 @@ namespace :test do desc 'Run macOS Tests' task :macos do |_, args| task = XCTask::BuildTask.new do |t| - t.directory = script_folder + t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' - t.scheme = 'Parse-macOS' t.sdk = 'macosx' t.configuration = 'Debug -enableCodeCoverage YES' - t.actions = [XCTask::BuildAction::TEST] - t.formatter = XCTask::BuildFormatter::XCODEBUILD + t.formatter = XCTask::BuildFormatter::XCPRETTY end unless task.execute puts 'macOS Tests Failed!' @@ -689,76 +257,25 @@ namespace :test do end end - namespace :facebook_utils do - desc 'Test iOS FacebookUtils framework.' - task :ios do - task = XCTask::BuildTask.new do |t| - t.directory = script_folder - t.workspace = 'Parse.xcworkspace' - - t.scheme = 'ParseFacebookUtilsV4-iOS' - t.sdk = 'iphonesimulator' - t.destinations = [ios_simulator] - t.configuration = 'Debug -enableCodeCoverage YES' - - t.actions = [XCTask::BuildAction::TEST] - t.formatter = XCTask::BuildFormatter::XCODEBUILD - end - - result = task.execute - unless result - puts 'Failed to build iOS FacebookUtils Framework.' - exit(1) - end - end - end - - namespace :twitter_utils do - desc 'Test iOS TwitterUtils framework.' - task :ios do - task = XCTask::BuildTask.new do |t| - t.directory = script_folder - t.workspace = 'Parse.xcworkspace' - - t.scheme = 'ParseTwitterUtils-iOS' - t.sdk = 'iphonesimulator' - t.destinations = [ios_simulator] - t.configuration = 'Debug -enableCodeCoverage YES' - - t.actions = [XCTask::BuildAction::TEST] - t.formatter = XCTask::BuildFormatter::XCODEBUILD - end - - result = task.execute - unless result - puts 'Failed to build iOS TwitterUtils Framework.' - exit(1) - end - end - end - namespace :parseui do task :all do Rake::Task['test:parseui:framework'].invoke Rake::Task['test:parseui:demo_objc'].invoke + Rake::Task['test:parseui:demo_swift'].invoke end task :framework do task = XCTask::BuildTask.new do |t| - t.directory = script_folder + t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseUI' t.sdk = 'iphonesimulator' t.destinations = [ios_simulator] t.configuration = 'Debug -enableCodeCoverage YES' - t.actions = [XCTask::BuildAction::TEST] - t.formatter = XCTask::BuildFormatter::XCODEBUILD + t.formatter = XCTask::BuildFormatter::XCPRETTY end - - result = task.execute - unless result + unless task.execute puts 'Failed to build ParseUI' exit(1) end @@ -766,20 +283,16 @@ namespace :test do task :demo_objc do task = XCTask::BuildTask.new do |t| - t.directory = script_folder + t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseUIDemo' t.sdk = 'iphonesimulator' t.destinations = [ios_simulator] t.configuration = 'Debug' - t.actions = build_action t.formatter = XCTask::BuildFormatter::XCPRETTY end - - result = task.execute - unless result + unless task.execute puts 'Failed to build ParseUI Demo.' exit(1) end @@ -787,20 +300,16 @@ namespace :test do task :demo_swift do task = XCTask::BuildTask.new do |t| - t.directory = script_folder + t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseUIDemo-Swift' t.sdk = 'iphonesimulator' t.destinations = [ios_simulator] t.configuration = 'Debug' - t.actions = build_action t.formatter = XCTask::BuildFormatter::XCPRETTY end - - result = task.execute - unless result + unless task.execute puts 'Failed to build iOS ParseUI Swift Demo.' exit(1) end @@ -817,20 +326,16 @@ namespace :test do task :ios do task = XCTask::BuildTask.new do |t| - t.directory = script_folder + t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseLiveQuery-iOS' t.sdk = 'iphonesimulator' t.destinations = [ios_simulator] t.configuration = 'Debug' - t.actions = build_action t.formatter = XCTask::BuildFormatter::XCPRETTY end - - result = task.execute - unless result + unless task.execute puts 'Failed to build ParseLiveQuery' exit(1) end @@ -838,20 +343,15 @@ namespace :test do task :tvos do task = XCTask::BuildTask.new do |t| - t.directory = script_folder + t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseLiveQuery-tvOS' t.destinations = [tvos_simulator] t.configuration = 'Debug' - - t.actions = build_action t.formatter = XCTask::BuildFormatter::XCPRETTY end - - result = task.execute - unless result + unless task.execute puts 'Failed to build ParseLiveQuery-tvOS.' exit(1) end @@ -859,20 +359,15 @@ namespace :test do task :watchos do task = XCTask::BuildTask.new do |t| - t.directory = script_folder + t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseLiveQuery-watchOS' t.destinations = [watchos_simulator] t.configuration = 'Debug' - - t.actions = build_action t.formatter = XCTask::BuildFormatter::XCPRETTY end - - result = task.execute - unless result + unless task.execute puts 'Failed to build ParseLiveQuery-watchOS.' exit(1) end @@ -880,19 +375,14 @@ namespace :test do task :osx do task = XCTask::BuildTask.new do |t| - t.directory = script_folder + t.directory = SCRIPT_PATH t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseLiveQuery-OSX' t.configuration = 'Debug' - - t.actions = build_action t.formatter = XCTask::BuildFormatter::XCPRETTY end - - result = task.execute - unless result + unless task.execute puts 'Failed to build ParseLiveQuery-OSX.' exit(1) end diff --git a/Scripts/build_third_party.rb b/Scripts/build_third_party.rb deleted file mode 100755 index 507b7078d..000000000 --- a/Scripts/build_third_party.rb +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env ruby -# -# Copyright (c) 2015-present, Parse, LLC. -# All rights reserved. -# -# This source code is licensed under the BSD-style license found in the -# LICENSE file in the root directory of this source tree. An additional grant -# of patent rights can be found in the PATENTS file in the same directory. -# - -framework_path = ARGV[0] -build_script = ARGV[1] - -if framework_path.nil? || build_script.nil? - puts "Use this script to build a third party framework for iOS/OSX." - puts "It is intended to support building Bolts.framework and FacebookSDK.framework" - puts "Usage: 'build_third_party.rb " - exit(1) -end - -# Don't use rubygems git to make it run in any environment -last_revision = `git log -n 1 --format=%h #{framework_path}` - -build_revision_path = File.join(framework_path, 'build', 'build_revision') -build_revision = File.exist?(build_revision_path) ? File.open(build_revision_path, 'rb').read : nil - -if last_revision == build_revision - puts "No changes in #{framework_path}. Skipping build." -else - puts "Found local changes in #{framework_path}. Building third party." - - result = system("XCTOOL=xcodebuild ./#{build_script}") - if result - File.open(build_revision_path, 'w') { |f| f.write(last_revision) } - exit(0) - else - exit(1) - end -end diff --git a/package-lock.json b/package-lock.json index 0d654dbbe..66a70da49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "parse-sdk-ios-osx", - "version": "2.7.3", + "version": "3.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1423,6 +1423,12 @@ "p-is-promise": "^3.0.0" } }, + "ip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", + "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", + "dev": true + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -2673,11 +2679,6 @@ "validate-npm-package-name": "^4.0.0" } }, - "ip": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, "ip-regex": { "version": "4.3.0", "bundled": true, diff --git a/package.json b/package.json index f4f4ce4a9..1a77b5b5f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-sdk-ios-osx", - "version": "2.7.3", + "version": "3.0.0", "private": true, "repository": { "type": "git",