diff --git a/e2e-tests/MaestroTestApp/README.md b/e2e-tests/MaestroTestApp/README.md
new file mode 100644
index 00000000..1985393c
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/README.md
@@ -0,0 +1,55 @@
+# Maestro E2E Test App
+
+A minimal Cordova app used by Maestro end-to-end tests to verify RevenueCat SDK integration.
+
+## Prerequisites
+
+- Node.js & npm
+- Xcode (iOS) / Android Studio (Android)
+- [Maestro](https://maestro.mobile.dev/) CLI
+- Gradle (for Android builds)
+
+## Setup
+
+```bash
+npm install
+npx cordova prepare
+```
+
+## Running Locally
+
+```bash
+# iOS
+npx cordova run ios --emulator
+
+# Android
+npx cordova run android --emulator
+```
+
+## API Key
+
+The app initialises RevenueCat with the placeholder `MAESTRO_TESTS_REVENUECAT_API_KEY`.
+In CI, the Fastlane lane replaces this placeholder with the real key from the
+`RC_E2E_TEST_API_KEY_PRODUCTION_TEST_STORE` environment variable (provided by the
+CircleCI `e2e-tests` context) before building.
+
+To run locally, either:
+- Replace the placeholder in `www/js/app.js` with a valid API key (do **not** commit it), or
+- Export the env var and run the same `sed` command the Fastlane lane uses.
+
+## RevenueCat Project
+
+The test uses a RevenueCat project configured with:
+- A **V2 Paywall** (the test asserts "Paywall V2" is visible)
+- A `pro` entitlement (the test checks entitlement status after purchase)
+- The **Test Store** environment for purchase confirmation
+
+## Dependencies
+
+`cordova-plugin-purchases` is referenced as a local `file:` dependency so the E2E
+tests always exercise the code on the current branch, not a published npm version.
+
+## Note on Cordova
+
+Cordova does not have a native RevenueCat UI plugin, so the paywall is implemented as
+a custom HTML overlay that manually calls `Purchases.purchasePackage()`.
diff --git a/e2e-tests/MaestroTestApp/config.xml b/e2e-tests/MaestroTestApp/config.xml
new file mode 100644
index 00000000..81b8e3b3
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/config.xml
@@ -0,0 +1,9 @@
+
+
+ MaestroTestApp
+ Maestro E2E test app for cordova-plugin-purchases
+
+
+
+
+
diff --git a/e2e-tests/MaestroTestApp/package-lock.json b/e2e-tests/MaestroTestApp/package-lock.json
new file mode 100644
index 00000000..640e36f1
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/package-lock.json
@@ -0,0 +1,1340 @@
+{
+ "name": "MaestroTestApp",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "devDependencies": {
+ "cordova-android": "^13.0.0",
+ "cordova-ios": "^8.0.0",
+ "cordova-plugin-add-swift-support": "^2.0.2",
+ "cordova-plugin-purchases": "file:../../"
+ }
+ },
+ "../..": {
+ "version": "7.3.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cordova-annotated-plugin-android": "^1.0.4"
+ },
+ "devDependencies": {
+ "@types/jest": "^27.1.5",
+ "@types/node": "^12.6.8",
+ "@types/prettier": "2.6.0",
+ "jest": "^27.0.0",
+ "prettier": "1.18.2",
+ "ts-jest": "^27.0.0-next.12",
+ "tslint": "^5.20.1",
+ "tslint-config-prettier": "^1.18.0",
+ "typedoc": "^0.21.0",
+ "typescript": "^4.2.0"
+ }
+ },
+ "../../../../../../../../private/tmp/cordova-plugin-purchases-clean": {
+ "name": "cordova-plugin-purchases",
+ "version": "7.3.1",
+ "extraneous": true,
+ "license": "MIT",
+ "dependencies": {
+ "cordova-annotated-plugin-android": "^1.0.4"
+ },
+ "devDependencies": {
+ "@types/jest": "^27.1.5",
+ "@types/node": "^12.6.8",
+ "@types/prettier": "2.6.0",
+ "jest": "^27.0.0",
+ "prettier": "1.18.2",
+ "ts-jest": "^27.0.0-next.12",
+ "tslint": "^5.20.1",
+ "tslint-config-prettier": "^1.18.0",
+ "typedoc": "^0.21.0",
+ "typescript": "^4.2.0"
+ }
+ },
+ "../../../../../../../../tmp/cordova-plugin-purchases-clean": {
+ "name": "cordova-plugin-purchases",
+ "version": "7.3.1",
+ "extraneous": true,
+ "license": "MIT",
+ "dependencies": {
+ "cordova-annotated-plugin-android": "^1.0.4"
+ },
+ "devDependencies": {
+ "@types/jest": "^27.1.5",
+ "@types/node": "^12.6.8",
+ "@types/prettier": "2.6.0",
+ "jest": "^27.0.0",
+ "prettier": "1.18.2",
+ "ts-jest": "^27.0.0-next.12",
+ "tslint": "^5.20.1",
+ "tslint-config-prettier": "^1.18.0",
+ "typedoc": "^0.21.0",
+ "typescript": "^4.2.0"
+ }
+ },
+ "node_modules/@netflix/nerror": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz",
+ "integrity": "sha512-b+MGNyP9/LXkapreJzNUzcvuzZslj/RGgdVVJ16P2wSlYatfLycPObImqVJSmNAdyeShvNeM/pl3sVZsObFueg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "extsprintf": "^1.4.0",
+ "lodash": "^4.17.15"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.8.11",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz",
+ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/abbrev": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz",
+ "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/android-versions": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-2.1.1.tgz",
+ "integrity": "sha512-dYeO3KHDO81WvEwZFK+OF0dJl/ESvxV3QZE/qo/AAnG/uijco6DOXJJla3CdoC8Eg53YBlbRIyobRGYqIAGw8Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.2"
+ }
+ },
+ "node_modules/ansi": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz",
+ "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/big-integer": {
+ "version": "1.6.52",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
+ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
+ "dev": true,
+ "license": "Unlicense",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/bplist-creator": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz",
+ "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "stream-buffers": "2.2.x"
+ }
+ },
+ "node_modules/bplist-parser": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz",
+ "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "big-integer": "1.6.x"
+ },
+ "engines": {
+ "node": ">= 5.10.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cordova-android": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-13.0.0.tgz",
+ "integrity": "sha512-uQG+cSyrB1NMi2aIzihldIupHB9WGpZVvrMMMAAtnyc6tDlEk7gweSSaFsEONyGAnteRYpIvrzg/YwDW08PcUg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "android-versions": "^2.0.0",
+ "cordova-common": "^5.0.0",
+ "dedent": "^1.5.3",
+ "execa": "^5.1.1",
+ "fast-glob": "^3.3.2",
+ "fs-extra": "^11.2.0",
+ "is-path-inside": "^3.0.3",
+ "nopt": "^7.2.1",
+ "properties-parser": "^0.6.0",
+ "semver": "^7.6.2",
+ "string-argv": "^0.3.1",
+ "untildify": "^4.0.0",
+ "which": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.13.0"
+ }
+ },
+ "node_modules/cordova-android/node_modules/abbrev": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+ "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/cordova-android/node_modules/cordova-common": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-5.0.1.tgz",
+ "integrity": "sha512-OA2NQ6wvhNz4GytPYwTdlA9xfG7Yf7ufkj4u97m3rUfoL/AECwwj0GVT2CYpk/0Fk6HyuHA3QYCxfDPYsKzI1A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@netflix/nerror": "^1.1.3",
+ "ansi": "^0.3.1",
+ "bplist-parser": "^0.3.2",
+ "cross-spawn": "^7.0.6",
+ "elementtree": "^0.1.7",
+ "endent": "^2.1.0",
+ "fast-glob": "^3.3.3",
+ "lodash.zip": "^4.2.0",
+ "plist": "^3.1.0",
+ "q": "^1.5.1",
+ "read-chunk": "^3.2.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/cordova-android/node_modules/dedent": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz",
+ "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/cordova-android/node_modules/isexe": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz",
+ "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cordova-android/node_modules/nopt": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
+ "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^2.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/cordova-android/node_modules/which": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+ "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/cordova-common": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-6.0.0.tgz",
+ "integrity": "sha512-16WPC1DuxVdshV3RoQUXqhcJVdhxWGwiFysA4TkYuboqoev6mgt0JuIJFxmQbzR/DuyuONaVe0L0O0Hf1C08Mg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@netflix/nerror": "^1.1.3",
+ "ansi": "^0.3.1",
+ "bplist-parser": "^0.3.2",
+ "elementtree": "^0.1.7",
+ "endent": "^2.1.0",
+ "fast-glob": "^3.3.3",
+ "plist": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ }
+ },
+ "node_modules/cordova-ios": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/cordova-ios/-/cordova-ios-8.0.0.tgz",
+ "integrity": "sha512-QsynOV8rnRIhDC3qwM1KdRr1gy5RaqzVCzdOaB+DSBPeR5wVEUGpyyJO0FzlCACzY5X25iDc5O3kbn/F06dJ5Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bplist-parser": "^0.3.2",
+ "cordova-common": "^6.0.0",
+ "elementtree": "^0.1.7",
+ "execa": "^5.1.1",
+ "nopt": "^9.0.0",
+ "plist": "^3.1.0",
+ "semver": "^7.7.3",
+ "simctl": "^3.0.0",
+ "which": "^6.0.0",
+ "xcode": "^3.0.1"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/cordova-plugin-add-swift-support": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/cordova-plugin-add-swift-support/-/cordova-plugin-add-swift-support-2.0.2.tgz",
+ "integrity": "sha512-K03WDnsD3GT+n7Od3BnS17D8rYnAFZbZjjQJa2r7qW8QLq8+h7hGbFaiF+w5+nUtyAqUNq+HT/d/MdqBGLNzxA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "glob": "^7.1.3",
+ "semver": "^6.0.0",
+ "xcode": "^2.0.0"
+ }
+ },
+ "node_modules/cordova-plugin-add-swift-support/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/cordova-plugin-add-swift-support/node_modules/uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "bin/uuid"
+ }
+ },
+ "node_modules/cordova-plugin-add-swift-support/node_modules/xcode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.1.0.tgz",
+ "integrity": "sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "simple-plist": "^1.0.0",
+ "uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/cordova-plugin-purchases": {
+ "resolved": "../..",
+ "link": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/elementtree": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz",
+ "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "sax": "1.1.4"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/endent": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz",
+ "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dedent": "^0.7.0",
+ "fast-json-parse": "^1.0.3",
+ "objectorarray": "^1.0.5"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/extsprintf": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz",
+ "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-json-parse": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz",
+ "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.3.4",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz",
+ "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz",
+ "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.zip": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz",
+ "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz",
+ "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^4.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/objectorarray": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz",
+ "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/plist": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
+ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@xmldom/xmldom": "^0.8.8",
+ "base64-js": "^1.5.1",
+ "xmlbuilder": "^15.1.1"
+ },
+ "engines": {
+ "node": ">=10.4.0"
+ }
+ },
+ "node_modules/properties-parser": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/properties-parser/-/properties-parser-0.6.0.tgz",
+ "integrity": "sha512-qvr2cSmoA0dln0MARAKwBzPkkXn7FqwX+RVVNpMdMJc7rt9mqO2cXwluxtux9fHrLhjnPFaQkS8BM0kFrTCnSw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.3.1"
+ }
+ },
+ "node_modules/q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+ "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.0",
+ "teleport": ">=0.2.0"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/read-chunk": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz",
+ "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^4.0.1",
+ "with-open-file": "^0.1.6"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz",
+ "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/simctl": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/simctl/-/simctl-3.0.0.tgz",
+ "integrity": "sha512-AoScwFvWCLU7lx9AlqmooHlxQDQDjGdSGAdyLySDeR2IP6ji5L4Z6DdHxmBLAQM61ftaHylXfnF1KWCR56P58w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.17.0"
+ }
+ },
+ "node_modules/simple-plist": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz",
+ "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bplist-creator": "0.1.0",
+ "bplist-parser": "0.3.1",
+ "plist": "^3.0.5"
+ }
+ },
+ "node_modules/simple-plist/node_modules/bplist-parser": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz",
+ "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "big-integer": "1.6.x"
+ },
+ "engines": {
+ "node": ">= 5.10.0"
+ }
+ },
+ "node_modules/stream-buffers": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz",
+ "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==",
+ "dev": true,
+ "license": "Unlicense",
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/string-argv": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
+ "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.19"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
+ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/which": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz",
+ "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^4.0.0"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/with-open-file": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz",
+ "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-finally": "^1.0.0",
+ "p-try": "^2.1.0",
+ "pify": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/xcode": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz",
+ "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "simple-plist": "^1.1.0",
+ "uuid": "^7.0.3"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/xmlbuilder": {
+ "version": "15.1.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
+ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0"
+ }
+ }
+ }
+}
diff --git a/e2e-tests/MaestroTestApp/package.json b/e2e-tests/MaestroTestApp/package.json
new file mode 100644
index 00000000..72d0dd47
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/package.json
@@ -0,0 +1,17 @@
+{
+ "devDependencies": {
+ "cordova-android": "^13.0.0",
+ "cordova-ios": "^8.0.0",
+ "cordova-plugin-add-swift-support": "^2.0.2",
+ "cordova-plugin-purchases": "file:../../"
+ },
+ "cordova": {
+ "plugins": {
+ "cordova-plugin-purchases": {}
+ },
+ "platforms": [
+ "android",
+ "ios"
+ ]
+ }
+}
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/.gitignore b/e2e-tests/MaestroTestApp/platforms/ios/.gitignore
new file mode 100644
index 00000000..cc76483f
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/.gitignore
@@ -0,0 +1,5 @@
+*.mode1v3
+*.perspectivev3
+*.pbxuser
+.DS_Store
+build/
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App.xcodeproj/project.pbxproj b/e2e-tests/MaestroTestApp/platforms/ios/App.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..80104154
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App.xcodeproj/project.pbxproj
@@ -0,0 +1,625 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 60;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0CB5E348C05247CAEE939B53 /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09640854FF895B7C113C3716 /* Pods_App.framework */; };
+ 2A1DDBFE06EC450FBC8DF701 /* PurchasesPlugin+PurchasesDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FCCD916FF6C45A4BC25F173 /* PurchasesPlugin+PurchasesDelegate.swift */; };
+ 4B08DAD49AB14F109E42DB93 /* PurchasesPlugin+Purchasing.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8BE520BB23439DAF66EDF5 /* PurchasesPlugin+Purchasing.swift */; };
+ 79D76B9807BD485A863C57DD /* PurchasesPlugin+Users.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3253E690675E4E6D96CA62F7 /* PurchasesPlugin+Users.swift */; };
+ 8E9DA0A02AC64B639392D642 /* PurchasesPlugin+VirtualCurrencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BB9A397BB3C45F69F26C79A /* PurchasesPlugin+VirtualCurrencies.swift */; };
+ 907F98562C06B87200D2D242 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 907F98552C06B87200D2D242 /* PrivacyInfo.xcprivacy */; };
+ 907F98662C06BC1B00D2D242 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 907F98652C06BC1B00D2D242 /* config.xml */; };
+ 907F986A2C06BCD300D2D242 /* www in Resources */ = {isa = PBXBuildFile; fileRef = 907F98692C06BCD300D2D242 /* www */; };
+ 90A914592CA3D370003DB979 /* Cordova in Frameworks */ = {isa = PBXBuildFile; productRef = 90A914582CA3D370003DB979 /* Cordova */; };
+ 90BD9B7A2C06907D000DEBAB /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 90BD9B792C06907D000DEBAB /* Base */; };
+ 90BD9B7C2C06907E000DEBAB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 90BD9B7B2C06907E000DEBAB /* Assets.xcassets */; };
+ 90BD9B7F2C06907E000DEBAB /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 90BD9B7E2C06907E000DEBAB /* Base */; };
+ 90CBB5282C06968500B805A2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90CBB5272C06968500B805A2 /* AppDelegate.swift */; };
+ 90CBB52A2C06968500B805A2 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90CBB5292C06968500B805A2 /* SceneDelegate.swift */; };
+ 90CBB52C2C06968500B805A2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90CBB52B2C06968500B805A2 /* ViewController.swift */; };
+ 90D82ABD2CF19AEA001383CF /* CordovaPlugins in Frameworks */ = {isa = PBXBuildFile; productRef = 90D82ABC2CF19AEA001383CF /* CordovaPlugins */; };
+ E4267458D4B0452CB160BBD5 /* PurchasesPlugin+APIHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF74F250D2A54F9E8D4A661B /* PurchasesPlugin+APIHelpers.swift */; };
+ EF8F04B76828495FB4511E60 /* PurchasesPlugin+Attribution.swift in Sources */ = {isa = PBXBuildFile; fileRef = A270727C1B3E49B6BAFCD943 /* PurchasesPlugin+Attribution.swift */; };
+ F67BFA19F7EF4CB3A8C25C72 /* PurchasesPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FDDB3AE37604B77A3405EA3 /* PurchasesPlugin.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 902AE2152C6C059A0041150F /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 09640854FF895B7C113C3716 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 2B33D34D851713793D2AB14A /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = ""; };
+ 2FCCD916FF6C45A4BC25F173 /* PurchasesPlugin+PurchasesDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "PurchasesPlugin+PurchasesDelegate.swift"; path = "cordova-plugin-purchases/PurchasesPlugin+PurchasesDelegate.swift"; sourceTree = ""; };
+ 3253E690675E4E6D96CA62F7 /* PurchasesPlugin+Users.swift */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "PurchasesPlugin+Users.swift"; path = "cordova-plugin-purchases/PurchasesPlugin+Users.swift"; sourceTree = ""; };
+ 4B7CBDB8FAECC7AB4A9E66D7 /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = ""; };
+ 6FDDB3AE37604B77A3405EA3 /* PurchasesPlugin.swift */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = PurchasesPlugin.swift; path = "cordova-plugin-purchases/PurchasesPlugin.swift"; sourceTree = ""; };
+ 8BB9A397BB3C45F69F26C79A /* PurchasesPlugin+VirtualCurrencies.swift */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "PurchasesPlugin+VirtualCurrencies.swift"; path = "cordova-plugin-purchases/PurchasesPlugin+VirtualCurrencies.swift"; sourceTree = ""; };
+ 9040B1872C6DD3EB00662C5D /* Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Bridging-Header.h"; sourceTree = ""; };
+ 9040B1882C6DD41B00662C5D /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; name = www; path = ../../www; sourceTree = ""; };
+ 907F98552C06B87200D2D242 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 907F98622C06B97000D2D242 /* Entitlements-Debug.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Entitlements-Debug.plist"; sourceTree = ""; };
+ 907F98632C06B9C800D2D242 /* Entitlements-Release.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Entitlements-Release.plist"; sourceTree = ""; };
+ 907F98652C06BC1B00D2D242 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = ""; };
+ 907F98692C06BCD300D2D242 /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = SOURCE_ROOT; };
+ 9080B40F2C6DD7EC00078F33 /* config.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = config.xml; path = ../../config.xml; sourceTree = ""; };
+ 90BD9B6C2C06907D000DEBAB /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 90BD9B792C06907D000DEBAB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 90BD9B7B2C06907E000DEBAB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 90BD9B7E2C06907E000DEBAB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/CDVLaunchScreen.storyboard; sourceTree = ""; };
+ 90BD9B802C06907E000DEBAB /* App-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "App-Info.plist"; sourceTree = ""; };
+ 90CBB5272C06968500B805A2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 90CBB5292C06968500B805A2 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
+ 90CBB52B2C06968500B805A2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
+ 90EB303B2C6DD83300CEEB2F /* build.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = build.xcconfig; path = cordova/build.xcconfig; sourceTree = SOURCE_ROOT; };
+ 90EB303C2C6DD83300CEEB2F /* build-extras.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "build-extras.xcconfig"; path = "cordova/build-extras.xcconfig"; sourceTree = SOURCE_ROOT; };
+ 90EB303F2C6DD87600CEEB2F /* build-debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "build-debug.xcconfig"; path = "cordova/build-debug.xcconfig"; sourceTree = SOURCE_ROOT; };
+ 90EB30402C6DD87600CEEB2F /* build-release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "build-release.xcconfig"; path = "cordova/build-release.xcconfig"; sourceTree = SOURCE_ROOT; };
+ 90F7E7002C6EB78900AD84C2 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
+ 90F7E7012C6EB78900AD84C2 /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = ""; };
+ A270727C1B3E49B6BAFCD943 /* PurchasesPlugin+Attribution.swift */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "PurchasesPlugin+Attribution.swift"; path = "cordova-plugin-purchases/PurchasesPlugin+Attribution.swift"; sourceTree = ""; };
+ AF74F250D2A54F9E8D4A661B /* PurchasesPlugin+APIHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "PurchasesPlugin+APIHelpers.swift"; path = "cordova-plugin-purchases/PurchasesPlugin+APIHelpers.swift"; sourceTree = ""; };
+ DD8BE520BB23439DAF66EDF5 /* PurchasesPlugin+Purchasing.swift */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "PurchasesPlugin+Purchasing.swift"; path = "cordova-plugin-purchases/PurchasesPlugin+Purchasing.swift"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 90BD9B692C06907D000DEBAB /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 90A914592CA3D370003DB979 /* Cordova in Frameworks */,
+ 90D82ABD2CF19AEA001383CF /* CordovaPlugins in Frameworks */,
+ 0CB5E348C05247CAEE939B53 /* Pods_App.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 905D2F6D2C6DDEE100117937 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ path = Resources;
+ sourceTree = "";
+ };
+ 907F98542C06B85800D2D242 /* Plugins */ = {
+ isa = PBXGroup;
+ children = (
+ 6FDDB3AE37604B77A3405EA3 /* PurchasesPlugin.swift */,
+ AF74F250D2A54F9E8D4A661B /* PurchasesPlugin+APIHelpers.swift */,
+ A270727C1B3E49B6BAFCD943 /* PurchasesPlugin+Attribution.swift */,
+ 2FCCD916FF6C45A4BC25F173 /* PurchasesPlugin+PurchasesDelegate.swift */,
+ DD8BE520BB23439DAF66EDF5 /* PurchasesPlugin+Purchasing.swift */,
+ 3253E690675E4E6D96CA62F7 /* PurchasesPlugin+Users.swift */,
+ 8BB9A397BB3C45F69F26C79A /* PurchasesPlugin+VirtualCurrencies.swift */,
+ );
+ path = Plugins;
+ sourceTree = "";
+ };
+ 907F98602C06B8F000D2D242 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 09640854FF895B7C113C3716 /* Pods_App.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 9080B40D2C6DD79000078F33 /* config */ = {
+ isa = PBXGroup;
+ children = (
+ 90EB303F2C6DD87600CEEB2F /* build-debug.xcconfig */,
+ 90EB30402C6DD87600CEEB2F /* build-release.xcconfig */,
+ 90EB303C2C6DD83300CEEB2F /* build-extras.xcconfig */,
+ 90EB303B2C6DD83300CEEB2F /* build.xcconfig */,
+ );
+ name = config;
+ sourceTree = "";
+ };
+ 9080B40E2C6DD7A100078F33 /* staging */ = {
+ isa = PBXGroup;
+ children = (
+ 907F98652C06BC1B00D2D242 /* config.xml */,
+ 907F98692C06BCD300D2D242 /* www */,
+ );
+ name = staging;
+ sourceTree = "";
+ };
+ 90BD9B632C06907D000DEBAB = {
+ isa = PBXGroup;
+ children = (
+ 9080B40F2C6DD7EC00078F33 /* config.xml */,
+ 9040B1882C6DD41B00662C5D /* www */,
+ 90BD9B6E2C06907D000DEBAB /* App */,
+ 90BD9B6D2C06907D000DEBAB /* Products */,
+ 907F98602C06B8F000D2D242 /* Frameworks */,
+ A6912107363F0EFADF230000 /* Pods */,
+ );
+ name = CustomTemplate;
+ sourceTree = "";
+ };
+ 90BD9B6D2C06907D000DEBAB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 90BD9B6C2C06907D000DEBAB /* App.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 90BD9B6E2C06907D000DEBAB /* App */ = {
+ isa = PBXGroup;
+ children = (
+ 90CBB5272C06968500B805A2 /* AppDelegate.swift */,
+ 90CBB5292C06968500B805A2 /* SceneDelegate.swift */,
+ 90CBB52B2C06968500B805A2 /* ViewController.swift */,
+ 90BD9B7D2C06907E000DEBAB /* CDVLaunchScreen.storyboard */,
+ 90BD9B782C06907D000DEBAB /* Main.storyboard */,
+ 90BD9B7B2C06907E000DEBAB /* Assets.xcassets */,
+ 90BD9B802C06907E000DEBAB /* App-Info.plist */,
+ 907F98552C06B87200D2D242 /* PrivacyInfo.xcprivacy */,
+ 907F98622C06B97000D2D242 /* Entitlements-Debug.plist */,
+ 907F98632C06B9C800D2D242 /* Entitlements-Release.plist */,
+ 90F7E7002C6EB78900AD84C2 /* AppDelegate.h */,
+ 9040B1872C6DD3EB00662C5D /* Bridging-Header.h */,
+ 90F7E7012C6EB78900AD84C2 /* MainViewController.h */,
+ 907F98542C06B85800D2D242 /* Plugins */,
+ 905D2F6D2C6DDEE100117937 /* Resources */,
+ 9080B40D2C6DD79000078F33 /* config */,
+ 9080B40E2C6DD7A100078F33 /* staging */,
+ );
+ path = App;
+ sourceTree = "";
+ };
+ A6912107363F0EFADF230000 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 4B7CBDB8FAECC7AB4A9E66D7 /* Pods-App.debug.xcconfig */,
+ 2B33D34D851713793D2AB14A /* Pods-App.release.xcconfig */,
+ );
+ name = Pods;
+ path = Pods;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 90BD9B6B2C06907D000DEBAB /* App */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 90BD9B852C06907E000DEBAB /* Build configuration list for PBXNativeTarget "App" */;
+ buildPhases = (
+ 0A45A8977B29DD960F0F9C4B /* [CP] Check Pods Manifest.lock */,
+ 90BD9B682C06907D000DEBAB /* Sources */,
+ 90BD9B692C06907D000DEBAB /* Frameworks */,
+ 90BD9B6A2C06907D000DEBAB /* Resources */,
+ 902AE2152C6C059A0041150F /* Embed Frameworks */,
+ BF5328AE5E49ECFA5B02E68D /* [CP] Embed Pods Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = App;
+ packageProductDependencies = (
+ 90A914582CA3D370003DB979 /* Cordova */,
+ 90D82ABC2CF19AEA001383CF /* CordovaPlugins */,
+ );
+ productName = App;
+ productReference = 90BD9B6C2C06907D000DEBAB /* App.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 90BD9B642C06907D000DEBAB /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = YES;
+ LastSwiftUpdateCheck = 1540;
+ LastUpgradeCheck = 2600;
+ TargetAttributes = {
+ 90BD9B6B2C06907D000DEBAB = {
+ CreatedOnToolsVersion = 15.4;
+ };
+ };
+ };
+ buildConfigurationList = 90BD9B672C06907D000DEBAB /* Build configuration list for PBXProject "App" */;
+ compatibilityVersion = "Xcode 15.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 90BD9B632C06907D000DEBAB;
+ packageReferences = (
+ 90A914572CA3D370003DB979 /* XCLocalSwiftPackageReference "cordova-ios" */,
+ 90D82ABB2CF19AEA001383CF /* XCLocalSwiftPackageReference "cordova-ios-plugins" */,
+ );
+ productRefGroup = 90BD9B6D2C06907D000DEBAB /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 90BD9B6B2C06907D000DEBAB /* App */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 90BD9B6A2C06907D000DEBAB /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 907F986A2C06BCD300D2D242 /* www in Resources */,
+ 90BD9B7C2C06907E000DEBAB /* Assets.xcassets in Resources */,
+ 90BD9B7F2C06907E000DEBAB /* Base in Resources */,
+ 907F98562C06B87200D2D242 /* PrivacyInfo.xcprivacy in Resources */,
+ 90BD9B7A2C06907D000DEBAB /* Base in Resources */,
+ 907F98662C06BC1B00D2D242 /* config.xml in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 0A45A8977B29DD960F0F9C4B /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ BF5328AE5E49ECFA5B02E68D /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 90BD9B682C06907D000DEBAB /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 90CBB52C2C06968500B805A2 /* ViewController.swift in Sources */,
+ 90CBB5282C06968500B805A2 /* AppDelegate.swift in Sources */,
+ 90CBB52A2C06968500B805A2 /* SceneDelegate.swift in Sources */,
+ F67BFA19F7EF4CB3A8C25C72 /* PurchasesPlugin.swift in Sources */,
+ E4267458D4B0452CB160BBD5 /* PurchasesPlugin+APIHelpers.swift in Sources */,
+ EF8F04B76828495FB4511E60 /* PurchasesPlugin+Attribution.swift in Sources */,
+ 2A1DDBFE06EC450FBC8DF701 /* PurchasesPlugin+PurchasesDelegate.swift in Sources */,
+ 4B08DAD49AB14F109E42DB93 /* PurchasesPlugin+Purchasing.swift in Sources */,
+ 79D76B9807BD485A863C57DD /* PurchasesPlugin+Users.swift in Sources */,
+ 8E9DA0A02AC64B639392D642 /* PurchasesPlugin+VirtualCurrencies.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 90BD9B782C06907D000DEBAB /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 90BD9B792C06907D000DEBAB /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 90BD9B7D2C06907E000DEBAB /* CDVLaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 90BD9B7E2C06907E000DEBAB /* Base */,
+ );
+ name = CDVLaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 90BD9B832C06907E000DEBAB /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ "DEPLOYMENT_LOCATION[sdk=iphonesimulator*]" = YES;
+ "DEPLOYMENT_LOCATION[sdk=macosx*]" = YES;
+ "DEPLOYMENT_LOCATION[sdk=xrsimulator*]" = YES;
+ DSTROOT = "$(SRCROOT)/build";
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ 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;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ "INSTALL_PATH[sdk=iphonesimulator*]" = "$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
+ "INSTALL_PATH[sdk=macosx*]" = "$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
+ "INSTALL_PATH[sdk=xrsimulator*]" = "$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ STRING_CATALOG_GENERATE_SYMBOLS = YES;
+ SUPPORTS_MACCATALYST = YES;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_WORKSPACE = NO;
+ };
+ name = Debug;
+ };
+ 90BD9B842C06907E000DEBAB /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ "DEPLOYMENT_LOCATION[sdk=iphonesimulator*]" = YES;
+ "DEPLOYMENT_LOCATION[sdk=macosx*]" = YES;
+ "DEPLOYMENT_LOCATION[sdk=xrsimulator*]" = YES;
+ DSTROOT = "$(SRCROOT)/build";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_NO_COMMON_BLOCKS = YES;
+ 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;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ "INSTALL_PATH[sdk=iphonesimulator*]" = "$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
+ "INSTALL_PATH[sdk=macosx*]" = "$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
+ "INSTALL_PATH[sdk=xrsimulator*]" = "$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ STRING_CATALOG_GENERATE_SYMBOLS = YES;
+ SUPPORTS_MACCATALYST = YES;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 90BD9B862C06907E000DEBAB /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 90EB303F2C6DD87600CEEB2F /* build-debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_ENTITLEMENTS = "$(TARGET_NAME)/Entitlements-$(CONFIGURATION).plist";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1.0.0;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = "$(TARGET_NAME)/$(TARGET_NAME)-Info.plist";
+ INFOPLIST_KEY_CFBundleDisplayName = "$(PRODUCT_NAME)";
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = CDVLaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0.0;
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ "-ObjC",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "com.revenuecat.maestro.e2e";
+ PRODUCT_NAME = "MaestroTestApp";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator";
+ SUPPORTS_MACCATALYST = YES;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_OBJC_BRIDGING_HEADER = "$(TARGET_NAME)/Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2,6,7";
+ };
+ name = Debug;
+ };
+ 90BD9B872C06907E000DEBAB /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 90EB30402C6DD87600CEEB2F /* build-release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_ENTITLEMENTS = "$(TARGET_NAME)/Entitlements-$(CONFIGURATION).plist";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1.0.0;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = "$(TARGET_NAME)/$(TARGET_NAME)-Info.plist";
+ INFOPLIST_KEY_CFBundleDisplayName = "$(PRODUCT_NAME)";
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = CDVLaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0.0;
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ "-ObjC",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "com.revenuecat.maestro.e2e";
+ PRODUCT_NAME = "MaestroTestApp";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator";
+ SUPPORTS_MACCATALYST = YES;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_OBJC_BRIDGING_HEADER = "$(TARGET_NAME)/Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2,6,7";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 90BD9B672C06907D000DEBAB /* Build configuration list for PBXProject "App" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 90BD9B832C06907E000DEBAB /* Debug */,
+ 90BD9B842C06907E000DEBAB /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 90BD9B852C06907E000DEBAB /* Build configuration list for PBXNativeTarget "App" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 90BD9B862C06907E000DEBAB /* Debug */,
+ 90BD9B872C06907E000DEBAB /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCLocalSwiftPackageReference section */
+ 90A914572CA3D370003DB979 /* XCLocalSwiftPackageReference "cordova-ios" */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = "packages/cordova-ios";
+ };
+ 90D82ABB2CF19AEA001383CF /* XCLocalSwiftPackageReference "cordova-ios-plugins" */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = "packages/cordova-ios-plugins";
+ };
+/* End XCLocalSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ 90A914582CA3D370003DB979 /* Cordova */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = Cordova;
+ };
+ 90D82ABC2CF19AEA001383CF /* CordovaPlugins */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = CordovaPlugins;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = 90BD9B642C06907D000DEBAB /* Project object */;
+}
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/e2e-tests/MaestroTestApp/platforms/ios/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..21fc716e
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,25 @@
+
+
+
+
+
+
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/e2e-tests/MaestroTestApp/platforms/ios/App.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App.xcworkspace/contents.xcworkspacedata b/e2e-tests/MaestroTestApp/platforms/ios/App.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..b301e824
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/e2e-tests/MaestroTestApp/platforms/ios/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App.xcworkspace/xcshareddata/xcschemes/App.xcscheme b/e2e-tests/MaestroTestApp/platforms/ios/App.xcworkspace/xcshareddata/xcschemes/App.xcscheme
new file mode 100644
index 00000000..3f54405f
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App.xcworkspace/xcshareddata/xcschemes/App.xcscheme
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/.gitignore b/e2e-tests/MaestroTestApp/platforms/ios/App/.gitignore
new file mode 100644
index 00000000..cc76483f
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/.gitignore
@@ -0,0 +1,5 @@
+*.mode1v3
+*.perspectivev3
+*.pbxuser
+.DS_Store
+build/
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/App-Info.plist b/e2e-tests/MaestroTestApp/platforms/ios/App/App-Info.plist
new file mode 100644
index 00000000..83e3bd5b
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/App-Info.plist
@@ -0,0 +1,45 @@
+
+
+
+
+ UTImportedTypeDeclarations
+
+
+ UTTypeConformsTo
+
+ public.data
+
+ UTTypeDescription
+ WebAssembly
+ UTTypeIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ UTTypeTagSpecification
+
+ public.filename-extension
+ wasm
+ public.mime-type
+ application/wasm
+
+
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+ UIWindowSceneSessionRoleApplication
+
+
+ UISceneConfigurationName
+ Default Configuration
+ UISceneDelegateClassName
+ $(PRODUCT_MODULE_NAME).SceneDelegate
+ UISceneStoryboardFile
+ Main
+
+
+
+
+
+
\ No newline at end of file
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/AppDelegate.h b/e2e-tests/MaestroTestApp/platforms/ios/App/AppDelegate.h
new file mode 100644
index 00000000..62a77631
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/AppDelegate.h
@@ -0,0 +1,29 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+*/
+
+#import
+
+#ifndef __CORDOVA_SILENCE_HEADER_DEPRECATIONS
+ #warning It is unsafe to rely on the AppDelegate class as an extension point. \
+ Update your code to extend CDVAppDelegate instead -- \
+ This code will stop working in Cordova iOS 9!
+#endif
+
+@interface AppDelegate : CDVAppDelegate
+@end
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/AppDelegate.swift b/e2e-tests/MaestroTestApp/platforms/ios/App/AppDelegate.swift
new file mode 100644
index 00000000..d0ec40f4
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/AppDelegate.swift
@@ -0,0 +1,33 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+*/
+
+import UIKit
+
+@main
+#if compiler(>=6.1)
+@objc @implementation
+#else
+@_objcImplementation
+#endif
+extension AppDelegate {
+ open override func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
+ return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
+ }
+}
+
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..2c8c083a
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "images" : [
+ {
+ "filename" : "icon.png",
+ "idiom" : "universal",
+ "platform": "ios",
+ "size" : "1024x1024"
+ },
+ {
+ "filename" : "icon.png",
+ "idiom" : "universal",
+ "platform": "watchos",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/AppIcon.appiconset/icon.png b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/AppIcon.appiconset/icon.png
new file mode 100644
index 00000000..b9250b12
Binary files /dev/null and b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/AppIcon.appiconset/icon.png differ
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/BackgroundColor.colorset/Contents.json b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/BackgroundColor.colorset/Contents.json
new file mode 100644
index 00000000..38ce5e7c
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/BackgroundColor.colorset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "colors": [
+ {
+ "idiom": "universal",
+ "color": {
+ "platform": "ios",
+ "reference": "systemBackgroundColor"
+ }
+ }
+ ],
+ "info": {
+ "author": "Xcode",
+ "version": 1
+ }
+}
\ No newline at end of file
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/Contents.json b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/Contents.json
new file mode 100644
index 00000000..da4a164c
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/LaunchStoryboard.imageset/Contents.json b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/LaunchStoryboard.imageset/Contents.json
new file mode 100644
index 00000000..c0ac4835
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/LaunchStoryboard.imageset/Contents.json
@@ -0,0 +1,872 @@
+{
+ "images": [
+ {
+ "idiom": "universal",
+ "scale": "1x",
+ "width-class": "compact",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "universal",
+ "scale": "1x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "1x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "1x",
+ "width-class": "compact"
+ },
+ {
+ "idiom": "universal",
+ "scale": "1x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "1x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "1x",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "universal",
+ "scale": "1x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "1x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "1x"
+ },
+ {
+ "idiom": "universal",
+ "scale": "1x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "1x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "2x",
+ "width-class": "compact",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "universal",
+ "scale": "2x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "2x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "2x",
+ "width-class": "compact"
+ },
+ {
+ "idiom": "universal",
+ "scale": "2x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "2x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "2x",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "universal",
+ "scale": "2x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "2x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "2x"
+ },
+ {
+ "idiom": "universal",
+ "scale": "2x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "2x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "3x",
+ "width-class": "compact",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "universal",
+ "scale": "3x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "3x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "3x",
+ "width-class": "compact"
+ },
+ {
+ "idiom": "universal",
+ "scale": "3x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "3x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "3x",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "universal",
+ "scale": "3x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "3x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "3x"
+ },
+ {
+ "idiom": "universal",
+ "scale": "3x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "universal",
+ "scale": "3x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "1x",
+ "width-class": "compact",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "ipad",
+ "scale": "1x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "1x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "1x",
+ "width-class": "compact"
+ },
+ {
+ "idiom": "ipad",
+ "scale": "1x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "1x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "1x",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "ipad",
+ "scale": "1x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "1x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "1x"
+ },
+ {
+ "idiom": "ipad",
+ "scale": "1x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "1x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "2x",
+ "width-class": "compact",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "ipad",
+ "scale": "2x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "2x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "2x",
+ "width-class": "compact"
+ },
+ {
+ "idiom": "ipad",
+ "scale": "2x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "2x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "2x",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "ipad",
+ "scale": "2x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "2x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "2x"
+ },
+ {
+ "idiom": "ipad",
+ "scale": "2x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "ipad",
+ "scale": "2x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "1x",
+ "width-class": "compact",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "iphone",
+ "scale": "1x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "1x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "1x",
+ "width-class": "compact"
+ },
+ {
+ "idiom": "iphone",
+ "scale": "1x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "1x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "1x",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "iphone",
+ "scale": "1x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "1x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "1x"
+ },
+ {
+ "idiom": "iphone",
+ "scale": "1x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "1x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "2x",
+ "width-class": "compact",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "iphone",
+ "scale": "2x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "2x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "2x",
+ "width-class": "compact"
+ },
+ {
+ "idiom": "iphone",
+ "scale": "2x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "2x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "2x",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "iphone",
+ "scale": "2x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "2x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "2x"
+ },
+ {
+ "idiom": "iphone",
+ "scale": "2x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "2x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "3x",
+ "width-class": "compact",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "iphone",
+ "scale": "3x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "3x",
+ "width-class": "compact",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "3x",
+ "width-class": "compact"
+ },
+ {
+ "idiom": "iphone",
+ "scale": "3x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "3x",
+ "width-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "3x",
+ "height-class": "compact"
+ },
+ {
+ "idiom": "iphone",
+ "scale": "3x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "3x",
+ "height-class": "compact",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "3x"
+ },
+ {
+ "idiom": "iphone",
+ "scale": "3x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "dark"
+ }
+ ]
+ },
+ {
+ "idiom": "iphone",
+ "scale": "3x",
+ "appearances": [
+ {
+ "appearance": "luminosity",
+ "value": "light"
+ }
+ ]
+ }
+ ],
+ "info": {
+ "author": "Xcode",
+ "version": 1
+ }
+}
\ No newline at end of file
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/SplashScreenBackgroundColor.colorset/Contents.json b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/SplashScreenBackgroundColor.colorset/Contents.json
new file mode 100644
index 00000000..38ce5e7c
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/SplashScreenBackgroundColor.colorset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "colors": [
+ {
+ "idiom": "universal",
+ "color": {
+ "platform": "ios",
+ "reference": "systemBackgroundColor"
+ }
+ }
+ ],
+ "info": {
+ "author": "Xcode",
+ "version": 1
+ }
+}
\ No newline at end of file
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/StatusBarBackgroundColor.colorset/Contents.json b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/StatusBarBackgroundColor.colorset/Contents.json
new file mode 100644
index 00000000..38ce5e7c
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Assets.xcassets/StatusBarBackgroundColor.colorset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "colors": [
+ {
+ "idiom": "universal",
+ "color": {
+ "platform": "ios",
+ "reference": "systemBackgroundColor"
+ }
+ }
+ ],
+ "info": {
+ "author": "Xcode",
+ "version": 1
+ }
+}
\ No newline at end of file
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Base.lproj/CDVLaunchScreen.storyboard b/e2e-tests/MaestroTestApp/platforms/ios/App/Base.lproj/CDVLaunchScreen.storyboard
new file mode 100644
index 00000000..be89abe1
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Base.lproj/CDVLaunchScreen.storyboard
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Base.lproj/Main.storyboard b/e2e-tests/MaestroTestApp/platforms/ios/App/Base.lproj/Main.storyboard
new file mode 100644
index 00000000..3372d5d2
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Base.lproj/Main.storyboard
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Bridging-Header.h b/e2e-tests/MaestroTestApp/platforms/ios/App/Bridging-Header.h
new file mode 100644
index 00000000..9dec5295
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Bridging-Header.h
@@ -0,0 +1,25 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import
+
+#define __CORDOVA_SILENCE_HEADER_DEPRECATIONS
+#import "AppDelegate.h"
+#import "MainViewController.h"
+#undef __CORDOVA_SILENCE_HEADER_DEPRECATIONS
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Entitlements-Debug.plist b/e2e-tests/MaestroTestApp/platforms/ios/App/Entitlements-Debug.plist
new file mode 100644
index 00000000..1ed4ae5b
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Entitlements-Debug.plist
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Entitlements-Release.plist b/e2e-tests/MaestroTestApp/platforms/ios/App/Entitlements-Release.plist
new file mode 100644
index 00000000..1ed4ae5b
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Entitlements-Release.plist
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/MainViewController.h b/e2e-tests/MaestroTestApp/platforms/ios/App/MainViewController.h
new file mode 100644
index 00000000..ddb37c4a
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/MainViewController.h
@@ -0,0 +1,29 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+*/
+
+#import
+
+#ifndef __CORDOVA_SILENCE_HEADER_DEPRECATIONS
+ #warning It is unsafe to rely on the MainViewController class as an extension point. \
+ Update your code to extend CDVViewController instead -- \
+ This code will stop working in Cordova iOS 9!
+#endif
+
+@interface MainViewController : CDVViewController
+@end
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/README b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/README
new file mode 100644
index 00000000..87df09f2
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/README
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+Put the .h and .m files of your plugin here. The .js files of your plugin belong in the www folder.
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+APIHelpers.swift b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+APIHelpers.swift
new file mode 100644
index 00000000..6b62762e
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+APIHelpers.swift
@@ -0,0 +1,54 @@
+//
+// PurchasesPlugin+APIHelpers.swift
+// PurchasesPlugin
+//
+// Created by Joshua Liebowitz on 7/5/22.
+//
+
+import Foundation
+import PurchasesHybridCommon
+import RevenueCat
+
+extension CDVPurchasesPlugin {
+
+ func sendOKFor(command: CDVInvokedUrlCommand, messageAsArray: [Any]? = nil) {
+ let pluginResult = CDVPluginResult(status: .ok, messageAs: messageAsArray ?? [])
+ self.commandDelegate.send(pluginResult, callbackId: command.callbackId)
+ }
+
+ func sendBadParameterFor(command: CDVInvokedUrlCommand, parameterNamed: String, expectedType: Any.Type) {
+ self.sendBadParametersFor(command: command, parametersNamed: [parameterNamed], expectedTypes: [expectedType])
+ }
+
+ func sendBadParametersFor(command: CDVInvokedUrlCommand,
+ parametersNamed: [String],
+ expectedTypes: [Any.Type]) {
+
+ let args = zip(parametersNamed, expectedTypes)
+ .map { name, type in "parameter: \(name), type: \(type)" }
+ .joined(separator: ", ")
+
+ let pluginResult = CDVPluginResult(status: .error, messageAs: "Invalid or missing parameter(s): \(args)")
+ self.commandDelegate.send(pluginResult, callbackId: command.callbackId)
+ }
+
+ func responseCompletion(forCommand command: CDVInvokedUrlCommand) -> HybridResponseBlock {
+ let callback: HybridResponseBlock = { response, error in
+ let result: CDVPluginResult
+ if let error = error {
+ result = CDVPluginResult(status: .error, messageAs: error.info)
+ } else {
+ result = CDVPluginResult(status: .ok, messageAs: response ?? [:])
+ }
+ self.commandDelegate.send(result, callbackId: command.callbackId)
+ }
+ return callback
+ }
+
+ func sendUnsupportedErrorFor(command: CDVInvokedUrlCommand) {
+ let error = ErrorContainer(error: ErrorCode.unsupportedError, extraPayload: [:])
+ let result = CDVPluginResult(status: .error, messageAs: error.info)
+ self.commandDelegate.send(result, callbackId: command.callbackId)
+ }
+
+}
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+Attribution.swift b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+Attribution.swift
new file mode 100644
index 00000000..f33a3c40
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+Attribution.swift
@@ -0,0 +1,173 @@
+//
+// PurchasesPlugin+Attribution.swift
+// PurchasesPlugin
+//
+// Created by Joshua Liebowitz on 7/5/22.
+//
+
+import Foundation
+import PurchasesHybridCommon
+
+@objc public extension CDVPurchasesPlugin {
+
+ @objc(enableAdServicesAttributionTokenCollection:)
+ func enableAdServicesAttributionTokenCollection(command: CDVInvokedUrlCommand) {
+ if #available(iOS 14.3, macOS 11.1, macCatalyst 14.3, *) {
+ CommonFunctionality.enableAdServicesAttributionTokenCollection()
+ } else {
+ NSLog("[Purchases] Warning: tried to enable AdServices attribution token collection, but it's only available on iOS 14.3 or greater or macOS 11.1 or greater.");
+ }
+ self.sendOKFor(command: command)
+ }
+
+ @objc(setAttributes:)
+ func setAttributes(command: CDVInvokedUrlCommand) {
+ guard let attributes = command.arguments[0] as? [String: String] else {
+ self.sendBadParameterFor(command: command, parameterNamed: "attributes", expectedType: NSDictionary.self)
+ return
+ }
+
+ CommonFunctionality.setAttributes(attributes)
+ self.sendOKFor(command: command)
+ }
+
+ @objc(setEmail:)
+ func setEmail(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command, name: "email", setFunction: CommonFunctionality.setEmail)
+ }
+
+ @objc(setPhoneNumber:)
+ func setPhoneNumber(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command,
+ name: "phoneNumber",
+ setFunction: CommonFunctionality.setPhoneNumber)
+ }
+
+ @objc(setDisplayName:)
+ func setDisplayName(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command,
+ name: "displayName",
+ setFunction: CommonFunctionality.setDisplayName)
+ }
+
+ @objc(setPushToken:)
+ func setPushToken(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command,
+ name: "pushToken",
+ setFunction: CommonFunctionality.setPushToken)
+ }
+
+ @objc(setAdjustID:)
+ func setAdjustID(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command, name: "adjustID", setFunction: CommonFunctionality.setAdjustID)
+ }
+
+ @objc(setCleverTapID:)
+ func setCleverTapID(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command, name: "cleverTapID", setFunction: CommonFunctionality.setCleverTapID)
+ }
+
+ @objc(setFirebaseAppInstanceID:)
+ func setFirebaseAppInstanceID(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command, name: "firebaseAppInstanceID", setFunction: CommonFunctionality.setFirebaseAppInstanceID)
+ }
+
+ @objc(setMixpanelDistinctID:)
+ func setMixpanelDistinctID(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command, name: "mixpanelDistinctID", setFunction: CommonFunctionality.setMixpanelDistinctID)
+ }
+
+ @objc(setAppsflyerID:)
+ func setAppsflyerID(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command,
+ name: "appsFlyerID",
+ setFunction: CommonFunctionality.setAppsflyerID)
+ }
+
+ @objc(setFBAnonymousID:)
+ func setFBAnonymousID(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command,
+ name: "fbAnonymousID",
+ setFunction: CommonFunctionality.setFBAnonymousID)
+ }
+
+ @objc(setMparticleID:)
+ func setMparticleID(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command,
+ name: "mparticleID",
+ setFunction: CommonFunctionality.setMparticleID)
+ }
+
+ @objc(setOnesignalID:)
+ func setOnesignalID(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command,
+ name: "onesignalID",
+ setFunction: CommonFunctionality.setOnesignalID)
+ }
+
+ @objc(setAirshipChannelID:)
+ func setAirshipChannelID(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command,
+ name: "airshipChannelID",
+ setFunction: CommonFunctionality.setAirshipChannelID)
+ }
+
+ @objc(setMediaSource:)
+ func setMediaSource(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command,
+ name: "mediaSource",
+ setFunction: CommonFunctionality.setMediaSource)
+ }
+
+ @objc(setCampaign:)
+ func setCampaign(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command, name: "campaign", setFunction: CommonFunctionality.setCampaign)
+ }
+
+ @objc(setAdGroup:)
+ func setAdGroup(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command, name: "adGroup", setFunction: CommonFunctionality.setAdGroup)
+ }
+
+ @objc(setAd:)
+ func setAd(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command, name: "ad", setFunction: CommonFunctionality.setAd)
+ }
+
+ @objc(setKeyword:)
+ func setKeyword(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command, name: "keyword", setFunction: CommonFunctionality.setKeyword)
+ }
+
+ @objc(setCreative:)
+ func setCreative(command: CDVInvokedUrlCommand) {
+ self.setSubscriberAttribute(command: command, name: "creative", setFunction: CommonFunctionality.setCreative)
+ }
+
+ @objc(setProxyURLString:)
+ func setProxyURLString(command: CDVInvokedUrlCommand) {
+ CommonFunctionality.proxyURLString = command.arguments[0] as? String
+ self.sendOKFor(command: command)
+ }
+
+ @objc(collectDeviceIdentifiers:)
+ func collectDeviceIdentifiers(command: CDVInvokedUrlCommand) {
+ CommonFunctionality.collectDeviceIdentifiers()
+ self.sendOKFor(command: command)
+ }
+
+}
+
+private extension CDVPurchasesPlugin {
+
+ func setSubscriberAttribute(command: CDVInvokedUrlCommand, name: String, setFunction: (String) -> Void) {
+ guard let setValue = command.arguments[0] as? NSString else {
+ self.sendBadParameterFor(command: command, parameterNamed: name, expectedType: NSString.self)
+ return
+ }
+
+ setFunction(setValue as String)
+ self.sendOKFor(command: command)
+ }
+
+}
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+PurchasesDelegate.swift b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+PurchasesDelegate.swift
new file mode 100644
index 00000000..d3af1026
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+PurchasesDelegate.swift
@@ -0,0 +1,31 @@
+//
+// PurchasesPlugin+PurchasesDelegate.swift
+// PurchasesPlugin
+//
+// Created by Joshua Liebowitz on 7/5/22.
+//
+
+import Foundation
+import PurchasesHybridCommon
+import RevenueCat
+
+extension CDVPurchasesPlugin: PurchasesDelegate {
+
+ public func purchases(_ purchases: Purchases, receivedUpdated customerInfo: CustomerInfo) {
+ let result = CDVPluginResult(status: .ok, messageAs: CommonFunctionality.encode(customerInfo: customerInfo))
+ result.setKeepCallbackAs(true)
+ self.commandDelegate.send(result, callbackId: self.updatedCustomerInfoCallbackID)
+ }
+
+ public func purchases(_ purchases: Purchases,
+ readyForPromotedProduct product: StoreProduct,
+ purchase makeDeferredPurchase: @escaping DeferredPromotionalPurchaseBlock) {
+ // TODO: This is not threadsafe.
+ self.defermentBlocks.append(makeDeferredPurchase)
+ let position = self.defermentBlocks.count - 1
+ let result = CDVPluginResult(status: .ok, messageAs: ["callbackID": NSNumber(value: position)])
+ result.setKeepCallbackAs(true)
+ self.commandDelegate.send(result, callbackId: self.shouldPurchasePromoProductCallbackID ?? "")
+ }
+
+}
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+Purchasing.swift b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+Purchasing.swift
new file mode 100644
index 00000000..a591af24
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+Purchasing.swift
@@ -0,0 +1,322 @@
+//
+// PurchasesPlugin+Purchasing.swift
+// PurchasesPlugin
+//
+// Created by Joshua Liebowitz on 7/5/22.
+//
+
+import Foundation
+import PurchasesHybridCommon
+
+@objc public extension CDVPurchasesPlugin {
+
+ @objc(getOfferings:)
+ func getOfferings(command: CDVInvokedUrlCommand) {
+
+ CommonFunctionality.getOfferings(completion: self.responseCompletion(forCommand: command))
+ }
+
+ @objc(getProducts:)
+ func getProducts(command: CDVInvokedUrlCommand) {
+ guard let products = command.arguments[0] as? [String] else {
+ self.sendBadParameterFor(command: command, parameterNamed: "products", expectedType: NSArray.self)
+ return
+ }
+
+ CommonFunctionality.getProductInfo(products) {
+ self.sendOKFor(command: command, messageAsArray: $0)
+ }
+ }
+
+ @objc(getEligibleWinBackOffersForProduct:)
+ func getEligibleWinBackOffersForProduct(command: CDVInvokedUrlCommand) {
+ guard let productIdentifier = command.arguments[0] as? String else {
+ self.sendBadParameterFor(command: command, parameterNamed: "productIdentifier", expectedType: String.self)
+ return
+ }
+
+ if #available(iOS 18.0, macOS 15.0, tvOS 18.0, watchOS 11.0, visionOS 2.0, *) {
+ CommonFunctionality.eligibleWinBackOffers(for: productIdentifier) { eligibleOffers, error in
+ if let error = error {
+ let result = CDVPluginResult(status: .error, messageAs: error.info)
+ self.commandDelegate.send(result, callbackId: command.callbackId)
+ } else {
+ self.sendOKFor(command: command, messageAsArray: eligibleOffers)
+ }
+ }
+ } else {
+ NSLog("[Purchases] Warning: tried to call fetch eligible win-back offers, but it's only available on iOS 18.0+")
+ sendUnsupportedErrorFor(command: command)
+ }
+ }
+
+ @objc(purchaseProductWithWinBackOffer:)
+ func purchaseProductWithWinBackOffer(command: CDVInvokedUrlCommand) {
+ guard let productIdentifier = command.arguments[0] as? String else {
+ self.sendBadParameterFor(command: command, parameterNamed: "productIdentifier", expectedType: String.self)
+ return
+ }
+
+ guard let winBackOfferIdentifier = command.arguments[1] as? String else {
+ self.sendBadParameterFor(command: command, parameterNamed: "winBackOfferIdentifier", expectedType: String.self)
+ return
+ }
+
+ if #available(iOS 18.0, macOS 15.0, tvOS 18.0, watchOS 11.0, visionOS 2.0, *) {
+ CommonFunctionality.purchase(
+ product: productIdentifier,
+ winBackOfferID: winBackOfferIdentifier,
+ completion: self.responseCompletion(forCommand: command)
+ )
+ } else {
+ NSLog("[Purchases] Warning: tried to purchase a product with a win-back offer, but win-back offers are only available on iOS 18.0+")
+ sendUnsupportedErrorFor(command: command)
+ }
+ }
+
+ @objc(purchasePackageWithWinBackOffer:)
+ func purchasePackageWithWinBackOffer(command: CDVInvokedUrlCommand) {
+ guard let packageIdentifier = command.arguments[0] as? String else {
+ self.sendBadParameterFor(command: command, parameterNamed: "packageIdentifier", expectedType: String.self)
+ return
+ }
+
+ guard let offeringIdentifier = command.arguments[1] as? String else {
+ self.sendBadParameterFor(command: command, parameterNamed: "offeringIdentifier", expectedType: String.self)
+ return
+ }
+
+ guard let winBackOfferIdentifier = command.arguments[2] as? String else {
+ self.sendBadParameterFor(command: command, parameterNamed: "winBackOfferIdentifier", expectedType: String.self)
+ return
+ }
+
+ if #available(iOS 18.0, macOS 15.0, tvOS 18.0, watchOS 11.0, visionOS 2.0, *) {
+ CommonFunctionality.purchase(
+ package: packageIdentifier,
+ presentedOfferingContext: ["offeringIdentifier": offeringIdentifier],
+ winBackOfferID: winBackOfferIdentifier,
+ completion: self.responseCompletion(forCommand: command)
+ )
+ } else {
+ NSLog("[Purchases] Warning: tried to purchase a package with a win-back offer, but win-back offers are only available on iOS 18.0+")
+ sendUnsupportedErrorFor(command: command)
+ }
+ }
+
+ @objc(purchaseProduct:)
+ func purchaseProduct(command: CDVInvokedUrlCommand) {
+ guard let productIdentifier = command.arguments[0] as? String else {
+ self.sendBadParameterFor(command: command, parameterNamed: "productIdentifier", expectedType: String.self)
+ return
+ }
+
+ CommonFunctionality.purchase(product: productIdentifier,
+ signedDiscountTimestamp: nil,
+ completion: self.responseCompletion(forCommand: command))
+ }
+
+ @objc(purchasePackage:)
+ func purchasePackage(command: CDVInvokedUrlCommand) {
+ guard let packageIdentifier = command.arguments[0] as? String,
+ let offeringIdentifier = command.arguments[1] as? String else {
+ self.sendBadParametersFor(command: command,
+ parametersNamed: ["packageIdentifier", "offeringIdentifier"],
+ expectedTypes: [String.self, String.self])
+ return
+ }
+
+ CommonFunctionality.purchase(package: packageIdentifier,
+ presentedOfferingContext: ["offeringIdentifier": offeringIdentifier],
+ signedDiscountTimestamp: nil,
+ completion: self.responseCompletion(forCommand: command))
+ }
+
+ @objc(restorePurchases:)
+ func restorePurchases(command: CDVInvokedUrlCommand) {
+ CommonFunctionality.restorePurchases(completion: self.responseCompletion(forCommand: command))
+ }
+
+ @objc(syncPurchases:)
+ func syncPurchases(command: CDVInvokedUrlCommand) {
+ CommonFunctionality.syncPurchases(completion: self.responseCompletion(forCommand: command))
+ }
+
+ @objc(recordPurchase:)
+ func recordPurchase(command: CDVInvokedUrlCommand) {
+ guard let productIdentifier = command.arguments[0] as? String else {
+ self.sendBadParameterFor(command: command,
+ parameterNamed: "productIdentifier",
+ expectedType: String.self)
+ return
+ }
+ if #available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) {
+ CommonFunctionality.recordPurchase(productID: productIdentifier,
+ completion: self.responseCompletion(forCommand: command))
+ } else {
+ NSLog("[Purchases] Warning: tried to record purchase, but it's only available on iOS 15.0+")
+ sendUnsupportedErrorFor(command: command)
+ }
+ }
+
+ @objc(setSimulatesAskToBuyInSandbox:)
+ func setSimulatesAskToBuyInSandbox(command: CDVInvokedUrlCommand) {
+ guard let askToBuyInSandbox = command.arguments[0] as? Bool else {
+ self.sendBadParameterFor(command: command,
+ parameterNamed: "setSimulatesAskToBuyInSandbox",
+ expectedType: Bool.self)
+ return
+ }
+
+ CommonFunctionality.simulatesAskToBuyInSandbox = askToBuyInSandbox
+ self.sendOKFor(command: command)
+ }
+
+ @objc(presentCodeRedemptionSheet:)
+ func presentCodeRedemptionSheet(command: CDVInvokedUrlCommand) {
+ func logPresentCodeRedemptionSheetNotAvailable() {
+ NSLog("%@", "[Purchases] Warning: tried to present codeRedemptionSheet, but it's only available on iOS 14.0 or greater.")
+ }
+
+ #if targetEnvironment(macCatalyst)
+ logPresentCodeRedemptionSheetNotAvailable()
+ #else
+ if #available(iOS 14.0, *) {
+ CommonFunctionality.presentCodeRedemptionSheet()
+ } else {
+ logPresentCodeRedemptionSheetNotAvailable()
+ }
+ #endif
+
+ self.sendOKFor(command: command)
+ }
+
+ @objc(canMakePayments:)
+ func canMakePayments(command: CDVInvokedUrlCommand) {
+ let canMakePayments = CommonFunctionality.canMakePaymentsWithFeatures([])
+ let result = CDVPluginResult(status: .ok, messageAs: canMakePayments)
+ self.commandDelegate.send(result, callbackId: command.callbackId)
+ }
+
+ @objc(checkTrialOrIntroductoryPriceEligibility:)
+ func checkTrialOrIntroductoryPriceEligibility(command: CDVInvokedUrlCommand) {
+ guard let products = command.arguments[0] as? [String] else {
+ self.sendBadParameterFor(command: command, parameterNamed: "productIdentifiers", expectedType: NSArray.self)
+ return
+ }
+
+ CommonFunctionality.checkTrialOrIntroductoryPriceEligibility(for: products) {
+ let result = CDVPluginResult(status: .ok, messageAs: $0)
+ self.commandDelegate.send(result, callbackId: command.callbackId)
+ }
+ }
+
+ @objc(makeDeferredPurchase:)
+ func makeDeferredPurchase(command: CDVInvokedUrlCommand) {
+ let callbackID = command.arguments[0] as! Int
+ assert(callbackID >= 0)
+ let defermentBlock = self.defermentBlocks[callbackID]
+ CommonFunctionality.makeDeferredPurchase(defermentBlock,
+ completion: self.responseCompletion(forCommand: command))
+ }
+
+ @objc(beginRefundRequestForActiveEntitlement:)
+ func beginRefundRequestForActiveEntitlement(command: CDVInvokedUrlCommand) {
+#if os(iOS)
+ if #available(iOS 15.0, *) {
+ let completion = beginRefundRequestCompletionFor(command: command)
+ CommonFunctionality.beginRefundRequestForActiveEntitlement(completion: completion)
+ } else {
+ sendUnsupportedErrorFor(command: command)
+ }
+#else
+ sendUnsupportedErrorFor(command: command)
+#endif
+ }
+
+ @objc(beginRefundRequestForEntitlementId:)
+ func beginRefundRequestForEntitlementId(command: CDVInvokedUrlCommand) {
+ guard let entitlementIdentifier = command.arguments[0] as? String else {
+ self.sendBadParameterFor(command: command, parameterNamed: "entitlementIdentifier", expectedType: String.self)
+ return
+ }
+#if os(iOS)
+ if #available(iOS 15.0, *) {
+ let completion = beginRefundRequestCompletionFor(command: command)
+ CommonFunctionality.beginRefundRequest(entitlementId: entitlementIdentifier, completion: completion)
+ } else {
+ sendUnsupportedErrorFor(command: command)
+ }
+#else
+ sendUnsupportedErrorFor(command: command)
+#endif
+ }
+
+ @objc(beginRefundRequestForProductId:)
+ func beginRefundRequestForProductId(command: CDVInvokedUrlCommand) {
+ guard let productIdentifier = command.arguments[0] as? String else {
+ self.sendBadParameterFor(command: command, parameterNamed: "productIdentifier", expectedType: String.self)
+ return
+ }
+#if os(iOS)
+ if #available(iOS 15.0, *) {
+ let completion = beginRefundRequestCompletionFor(command: command)
+ CommonFunctionality.beginRefundRequest(productId: productIdentifier, completion: completion)
+ } else {
+ sendUnsupportedErrorFor(command: command)
+ }
+#else
+ sendUnsupportedErrorFor(command: command)
+#endif
+ }
+
+ @objc(showInAppMessages:)
+ func showInAppMessages(command: CDVInvokedUrlCommand) {
+ let intMessageTypes = command.argument(at: 0, withDefault: nil) as? [Int]
+#if os(iOS) || targetEnvironment(macCatalyst)
+ if #available(iOS 16.0, *) {
+ if let intMessageTypes {
+ let messageTypes = intMessageTypes.map({ intNumber in
+ NSNumber(integerLiteral: intNumber)
+ })
+ CommonFunctionality.showStoreMessages(forRawValues: Set(messageTypes)) { [weak self] in
+ self?.sendOKFor(command: command)
+ }
+ } else {
+ CommonFunctionality.showStoreMessages { [weak self] in
+ self?.sendOKFor(command: command)
+ }
+ }
+ } else {
+ NSLog("[Purchases] Warning: tried to show in app messages, but it's only available on iOS 16.0+")
+ self.sendOKFor(command: command)
+ }
+#else
+ NSLog("[Purchases] Warning: tried to show in app messages, but it's only available on iOS or macCatalyst")
+ self.sendOKFor(command: command)
+#endif
+ }
+
+ private func beginRefundRequestCompletionFor(command: CDVInvokedUrlCommand) -> (ErrorContainer?) -> Void {
+ return { error in
+ let result: CDVPluginResult
+ guard let error = error else {
+ result = CDVPluginResult(status: .ok, messageAs: 0)
+ self.commandDelegate.send(result, callbackId: command.callbackId)
+ return
+ }
+ if ((error.info["userCancelled"]) != nil) {
+ result = CDVPluginResult(status: .ok, messageAs: 1)
+ } else {
+ result = CDVPluginResult(status: .error, messageAs: error.info)
+ }
+ self.commandDelegate.send(result, callbackId: command.callbackId)
+ }
+ }
+
+ @objc(purchaseSubscriptionOption:)
+ func purchaseSubscriptionOption(command: CDVInvokedUrlCommand) {
+ sendUnsupportedErrorFor(command: command)
+ }
+
+}
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+Users.swift b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+Users.swift
new file mode 100644
index 00000000..b437b8ae
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+Users.swift
@@ -0,0 +1,51 @@
+//
+// PurchasesPlugin+Users.swift
+// PurchasesPlugin
+//
+// Created by Joshua Liebowitz on 7/5/22.
+//
+
+import Foundation
+import PurchasesHybridCommon
+
+@objc public extension CDVPurchasesPlugin {
+
+ @objc(getAppUserID:)
+ func getAppUserID(command: CDVInvokedUrlCommand) {
+ let result = CDVPluginResult(status: .ok, messageAs: CommonFunctionality.appUserID)
+ self.commandDelegate.send(result, callbackId: command.callbackId)
+ }
+
+ @objc(logIn:)
+ func logIn(command: CDVInvokedUrlCommand) {
+ guard let appUserID = command.arguments[0] as? String else {
+ self.sendBadParameterFor(command: command, parameterNamed: "appUserID", expectedType: String.self)
+ return
+ }
+
+ CommonFunctionality.logIn(appUserID: appUserID, completion: self.responseCompletion(forCommand: command))
+ }
+
+ @objc(logOut:)
+ func logOut(command: CDVInvokedUrlCommand) {
+ CommonFunctionality.logOut(completion: self.responseCompletion(forCommand: command))
+ }
+
+ @objc(getCustomerInfo:)
+ func getCustomerInfo(command: CDVInvokedUrlCommand) {
+ CommonFunctionality.customerInfo(completion: self.responseCompletion(forCommand: command))
+ }
+
+ @objc(isAnonymous:)
+ func isAnonymous(command: CDVInvokedUrlCommand) {
+ let result = CDVPluginResult(status: .ok, messageAs: CommonFunctionality.isAnonymous)
+ self.commandDelegate.send(result, callbackId: command.callbackId)
+ }
+
+ @objc(invalidateCustomerInfoCache:)
+ func invalidateCustomerInfoCache(command: CDVInvokedUrlCommand) {
+ CommonFunctionality.invalidateCustomerInfoCache()
+ self.sendOKFor(command: command)
+ }
+
+}
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+VirtualCurrencies.swift b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+VirtualCurrencies.swift
new file mode 100644
index 00000000..5c3c7de9
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin+VirtualCurrencies.swift
@@ -0,0 +1,30 @@
+//
+// PurchasesPlugin+Users.swift
+// PurchasesPlugin
+//
+// Created by Will Taylor on 8/6/2025.
+//
+
+import Foundation
+import PurchasesHybridCommon
+
+@objc public extension CDVPurchasesPlugin {
+
+ @objc(getVirtualCurrencies:)
+ func getVirtualCurrencies(command: CDVInvokedUrlCommand) {
+ CommonFunctionality.getVirtualCurrencies(completion: self.responseCompletion(forCommand: command))
+ }
+
+ @objc(invalidateVirtualCurrenciesCache:)
+ func invalidateVirtualCurrenciesCache(command: CDVInvokedUrlCommand) {
+ CommonFunctionality.invalidateVirtualCurrenciesCache()
+ self.sendOKFor(command: command)
+ }
+
+ @objc(getCachedVirtualCurrencies:)
+ func getCachedVirtualCurrencies(command: CDVInvokedUrlCommand) {
+ let cachedVirtualCurrencies = CommonFunctionality.getCachedVirtualCurrencies()
+ let result = CDVPluginResult(status: .ok, messageAs: cachedVirtualCurrencies ?? [:])
+ self.commandDelegate.send(result, callbackId: command.callbackId)
+ }
+}
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin.swift b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin.swift
new file mode 100644
index 00000000..2a0e514a
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Plugins/cordova-plugin-purchases/PurchasesPlugin.swift
@@ -0,0 +1,109 @@
+//
+// PurchasesPlugin.swift
+// PurchasesPlugin
+//
+// Created by Joshua Liebowitz on 6/27/22
+//
+// the code for the plugin lives in CDVPurchasesPlugin
+
+import Foundation
+import PurchasesHybridCommon
+import RevenueCat
+
+@objc(CDVPurchasesPlugin) public class CDVPurchasesPlugin : CDVPlugin {
+
+ public typealias DeferredPromotionalPurchaseBlock = (@escaping PurchaseCompletedBlock) -> Void
+ typealias HybridResponseBlock = ([String: Any]?, ErrorContainer?) -> Void
+
+ var updatedCustomerInfoCallbackID: String!
+ var shouldPurchasePromoProductCallbackID: String?
+ var defermentBlocks: [DeferredPromotionalPurchaseBlock] = []
+
+ private var purchases: Purchases!
+
+ @objc(setupDelegateCallback:)
+ func setupDelegateCallback(command: CDVInvokedUrlCommand) {
+ self.updatedCustomerInfoCallbackID = command.callbackId
+ let pluginResult = CDVPluginResult(status: .noResult)
+ pluginResult.setKeepCallbackAs(true)
+ self.commandDelegate.send(pluginResult, callbackId: command.callbackId)
+ }
+
+ @objc(configure:)
+ func configure(command: CDVInvokedUrlCommand) {
+ guard let apiKey = command.arguments[0] as? String else {
+ self.sendBadParameterFor(command: command, parameterNamed: "apiKey", expectedType: String.self)
+ return
+ }
+ let appUserID = command.arguments[1] as? String
+ let purchasesAreCompletedBy = command.arguments[2] as? String ?? nil
+ let userDefaultsSuiteName = command.arguments[3] as? String
+ let storeKitVersion = command.arguments[4] as? String ?? "DEFAULT"
+ let shouldShowInAppMessagesAutomatically = command.arguments[6] as? Bool ?? true
+
+ self.purchases = Purchases.configure(apiKey: apiKey,
+ appUserID: appUserID,
+ purchasesAreCompletedBy: purchasesAreCompletedBy,
+ userDefaultsSuiteName: userDefaultsSuiteName,
+ platformFlavor: self.platformFlavor,
+ platformFlavorVersion: self.platformFlavorVersion,
+ storeKitVersion: storeKitVersion,
+ dangerousSettings: nil,
+ shouldShowInAppMessagesAutomatically: shouldShowInAppMessagesAutomatically)
+ self.purchases.delegate = self
+ self.sendOKFor(command: command)
+ }
+
+ @objc(setupShouldPurchasePromoProductCallback:)
+ func setupShouldPurchasePromoProductCallback(command: CDVInvokedUrlCommand) {
+ self.shouldPurchasePromoProductCallbackID = command.callbackId
+ }
+
+ @objc(setDebugLogsEnabled:)
+ func setDebugLogsEnabled(command: CDVInvokedUrlCommand) {
+ guard let debugLogsEnabled = command.arguments[0] as? Bool else {
+ self.sendBadParameterFor(command: command, parameterNamed: "debugLogsEnabled", expectedType: Bool.self)
+ return
+ }
+
+ CommonFunctionality.setDebugLogsEnabled(debugLogsEnabled)
+ self.sendOKFor(command: command)
+ }
+
+ @objc(setLogLevel:)
+ func setLogLevel(command: CDVInvokedUrlCommand) {
+ guard let level = command.arguments[0] as? String else {
+ self.sendBadParameterFor(command: command, parameterNamed: "level", expectedType: String.self)
+ return
+ }
+
+ CommonFunctionality.setLogLevel(level)
+ self.sendOKFor(command: command)
+ }
+
+ @objc(setLogHandler:)
+ func setLogHandler(command: CDVInvokedUrlCommand) {
+ CommonFunctionality.setLogHander { logDetails in
+ let pluginResult = CDVPluginResult(status: .ok, messageAs: logDetails)
+ pluginResult.setKeepCallbackAs(true)
+ self.commandDelegate.send(pluginResult, callbackId: command.callbackId)
+ }
+ let pluginResult = CDVPluginResult(status: .noResult)
+ pluginResult.setKeepCallbackAs(true)
+ self.commandDelegate.send(pluginResult, callbackId: command.callbackId)
+ }
+
+}
+
+
+extension CDVPurchasesPlugin {
+
+ var platformFlavor: String {
+ return "cordova"
+ }
+
+ var platformFlavorVersion: String {
+ return "7.3.1"
+ }
+
+}
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/PrivacyInfo.xcprivacy b/e2e-tests/MaestroTestApp/platforms/ios/App/PrivacyInfo.xcprivacy
new file mode 100644
index 00000000..4b2e70fd
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/PrivacyInfo.xcprivacy
@@ -0,0 +1,32 @@
+
+
+
+
+
+ NSPrivacyTracking
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+
+
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/Resources/README b/e2e-tests/MaestroTestApp/platforms/ios/App/Resources/README
new file mode 100644
index 00000000..1872c8e9
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/Resources/README
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+Put resource files to embed in the app bundle here.
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/SceneDelegate.swift b/e2e-tests/MaestroTestApp/platforms/ios/App/SceneDelegate.swift
new file mode 100644
index 00000000..82b592e7
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/SceneDelegate.swift
@@ -0,0 +1,24 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+*/
+
+import Cordova
+
+class SceneDelegate: CDVSceneDelegate {
+}
+
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/ViewController.swift b/e2e-tests/MaestroTestApp/platforms/ios/App/ViewController.swift
new file mode 100644
index 00000000..0f29fed2
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/ViewController.swift
@@ -0,0 +1,31 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+*/
+
+import Cordova
+
+#if compiler(>=6.1)
+@objc @implementation
+#else
+@_objcImplementation
+#endif
+extension MainViewController {
+}
+
+class ViewController: MainViewController {
+}
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/App/config.xml b/e2e-tests/MaestroTestApp/platforms/ios/App/config.xml
new file mode 100644
index 00000000..09797200
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/App/config.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MaestroTestApp
+ Maestro E2E test app for cordova-plugin-purchases
+
+
+
+
+
+
+
+
+
+
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/Podfile b/e2e-tests/MaestroTestApp/platforms/ios/Podfile
new file mode 100644
index 00000000..e46af40e
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/Podfile
@@ -0,0 +1,8 @@
+# DO NOT MODIFY -- auto-generated by Apache Cordova
+source 'https://github.com/CocoaPods/Specs.git'
+platform :ios, '16.0'
+use_frameworks!
+target 'App' do
+ project 'App.xcodeproj'
+ pod 'PurchasesHybridCommon', '17.41.1'
+end
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/Podfile.lock b/e2e-tests/MaestroTestApp/platforms/ios/Podfile.lock
new file mode 100644
index 00000000..a3129bf1
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/Podfile.lock
@@ -0,0 +1,20 @@
+PODS:
+ - PurchasesHybridCommon (17.41.1):
+ - RevenueCat (= 5.59.2)
+ - RevenueCat (5.59.2)
+
+DEPENDENCIES:
+ - PurchasesHybridCommon (= 17.41.1)
+
+SPEC REPOS:
+ https://github.com/CocoaPods/Specs.git:
+ - PurchasesHybridCommon
+ - RevenueCat
+
+SPEC CHECKSUMS:
+ PurchasesHybridCommon: 8eb130ab98f8dab600dea932a2599dee79304bb5
+ RevenueCat: f352b3661288080bd8bf30bbb96e331940e73c88
+
+PODFILE CHECKSUM: 7cb67c74098032c0a69396211bc157735e7d9ba6
+
+COCOAPODS: 1.16.2
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/Pods/Manifest.lock b/e2e-tests/MaestroTestApp/platforms/ios/Pods/Manifest.lock
new file mode 100644
index 00000000..a3129bf1
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/Pods/Manifest.lock
@@ -0,0 +1,20 @@
+PODS:
+ - PurchasesHybridCommon (17.41.1):
+ - RevenueCat (= 5.59.2)
+ - RevenueCat (5.59.2)
+
+DEPENDENCIES:
+ - PurchasesHybridCommon (= 17.41.1)
+
+SPEC REPOS:
+ https://github.com/CocoaPods/Specs.git:
+ - PurchasesHybridCommon
+ - RevenueCat
+
+SPEC CHECKSUMS:
+ PurchasesHybridCommon: 8eb130ab98f8dab600dea932a2599dee79304bb5
+ RevenueCat: f352b3661288080bd8bf30bbb96e331940e73c88
+
+PODFILE CHECKSUM: 7cb67c74098032c0a69396211bc157735e7d9ba6
+
+COCOAPODS: 1.16.2
diff --git a/e2e-tests/MaestroTestApp/platforms/ios/Pods/Pods.xcodeproj/project.pbxproj b/e2e-tests/MaestroTestApp/platforms/ios/Pods/Pods.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..b067f8b5
--- /dev/null
+++ b/e2e-tests/MaestroTestApp/platforms/ios/Pods/Pods.xcodeproj/project.pbxproj
@@ -0,0 +1,2791 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 60;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 001602D3680D1D798A55CDA7C8806989 /* CachingTrialOrIntroPriceEligibilityChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22F6DD5AE3228D84A03651163F045D95 /* CachingTrialOrIntroPriceEligibilityChecker.swift */; };
+ 01BFB44EEA988D5C06CF190F898AD5CA /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = E6C69D0347CD9870EDC9B9E2A36E2E16 /* PrivacyInfo.xcprivacy */; };
+ 02E1542278A8D2D5859BFFA8C2813164 /* OfferingStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1AD6B3724C693795D04A81FBDDCA37D /* OfferingStrings.swift */; };
+ 030C4AB920D4945E144BDDFB3796CBFD /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 421EAA5204753DA3639CE19B2FB2752D /* Configuration.swift */; };
+ 03183A3B2358AA4112BC58439084EDA1 /* PurchasesHybridCommon-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A617AD237C24722AE93154558C4BD548 /* PurchasesHybridCommon-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 033121D335DAB7DE8C1097A0A157A355 /* WebBillingProduct+SimulatedStoreProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416DB5A58251BC0BA7DA6C8F7BE5E68C /* WebBillingProduct+SimulatedStoreProduct.swift */; };
+ 03B6CCFD551AA712027E915231F2D5E3 /* CommonFunctionality.swift in Sources */ = {isa = PBXBuildFile; fileRef = 093422977BA2834C3C9EE9B19661FF77 /* CommonFunctionality.swift */; };
+ 043AE6B23610A87FB2FD32380FD24DF9 /* ProductPaidPrice.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8B8D1442C20FE45C844F1A8CF2FC978 /* ProductPaidPrice.swift */; };
+ 04CDB63D6B40DCFBB65C16B951F53BFF /* AttributionStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C107B155D13EA52F7FFE15268FC1567 /* AttributionStrings.swift */; };
+ 05A8D362305FBD5E683851F6838B0B56 /* PaywallFontManagerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2603375AE11B4D193BD0781F8C9E31F /* PaywallFontManagerType.swift */; };
+ 05AA3E46F27FCB5D62907A5A687C70DC /* WebOfferingProductsCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8C79631CF5388121CCCFAAD1C90129 /* WebOfferingProductsCallback.swift */; };
+ 07A59F29E59B77C88F03B6ECE606B3D6 /* HealthReportAvailabilityResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93CA4450613241C9258EF62F5E9908B6 /* HealthReportAvailabilityResponse.swift */; };
+ 07F85EE88D25BE60F0E332D642D204F4 /* EmptyFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4146B5A85087D99E08A1A3BD37BD8606 /* EmptyFile.swift */; };
+ 08186A0136D03D87561D6E38C3F4A663 /* PurchasesDiagnostics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E572374C713EAE0F6925B0C4177016B /* PurchasesDiagnostics.swift */; };
+ 091D391F1C499F73AA36F42F345A00CF /* SynchronizedUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E1B2587339CB18DD341DDAD7C5BAD1E /* SynchronizedUserDefaults.swift */; };
+ 09BA0309D2BACF6583F84B8E5DFB407D /* PaywallTabsComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AD5E61E36E46150F5EB885D9379D202 /* PaywallTabsComponent.swift */; };
+ 09DC7E85F60D7186ECA3B9729BE7EB33 /* SubscriberAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CC23020549490D059E953FE9D3A1EF9 /* SubscriberAttribute.swift */; };
+ 0ADB6FCD9734BB9B0F11B62ACC65F715 /* UInt8+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6C95818A043218391EF6DDF699C76F1 /* UInt8+Extensions.swift */; };
+ 0C9437A2E830FCFD7769A6299724B3E6 /* AdEventStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 244DB81E8FD0371C546E639D39A9F21A /* AdEventStore.swift */; };
+ 106641AB276CBAFF92012750D0211C75 /* StoredFeatureEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF9F718CE997930CE32118B4B91C4B82 /* StoredFeatureEvent.swift */; };
+ 10A3B1D0006E841479F7899966C53BFE /* CustomerCenterConfigAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C2D7B43E931C1C9B757627A675B90B /* CustomerCenterConfigAPI.swift */; };
+ 10EC64BFB17FECD8B875C8CB843CD363 /* SK1StoreProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D46CB95801AB522A4036DEC508DC5B6 /* SK1StoreProduct.swift */; };
+ 10F4FD55E13BF23D01BBD6C3D188CCA4 /* AttributionTypeFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C45E16C55EA2AE8F0D1E7CFF16B685 /* AttributionTypeFactory.swift */; };
+ 1264A93DE7517ACD4F98008BC4B3BEBF /* StoredAdEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 609E66457F5C58D8FDEDD2F9C08CE662 /* StoredAdEvent.swift */; };
+ 12B4AE6D86BD110458267EE6548EB932 /* PaywallColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC398DE3CBF2CF951D9F1956821D9D92 /* PaywallColor.swift */; };
+ 131859884B3C435DFA786DDFB550A8C6 /* SimulatedStorePurchaseHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88E4E5667EA6813DACB860344998405E /* SimulatedStorePurchaseHandler.swift */; };
+ 13ECC7EC33ECA8C85DC2811C69CC2E19 /* ASIdManagerProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73E16ABFCE212CEDA5D3816F74A918ED /* ASIdManagerProxy.swift */; };
+ 1409E78A536830E13709AD12EAFD1D20 /* FeatureEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DF9870E61DE1C5D9647AF5CCB7BD04B /* FeatureEvent.swift */; };
+ 148D0FDFA60D4FC5D3610A080C7E79BD /* TrialOrIntroPriceEligibilityChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31E998A2F775507890CED89B91DA99CC /* TrialOrIntroPriceEligibilityChecker.swift */; };
+ 14E381357117FB5E25B3CB2D4A6070A7 /* PaywallComponentBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CFEAB3D036DEBADB4C70917B3971425 /* PaywallComponentBase.swift */; };
+ 14E4C48C41BBA672B94EAAE59F45AABD /* PurchasesAreCompletedBy+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDE5AC53E0E96375CC1225DD7E66C583 /* PurchasesAreCompletedBy+HybridAdditions.swift */; };
+ 1515DF0219C03EFA63EFCDE2A575096E /* LoggerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59F0EFFF8F045F27D410C4438F766BD3 /* LoggerType.swift */; };
+ 152F5160ED3F8B7530021E3BC9B0B885 /* PaywallAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28302208340DDFACF06CF1E952BCD375 /* PaywallAnimation.swift */; };
+ 1566C952453E9745B770FE20B8CA8DB3 /* PurchasesAreCompletedBy.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEDCED199AD06DAFF4A82B6206F88905 /* PurchasesAreCompletedBy.swift */; };
+ 156B39BB4CAAA1CC6CA823BEE8DD84B8 /* IgnoreHashable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F17AE553BB4DF6C497F6AD3AE734D2F5 /* IgnoreHashable.swift */; };
+ 15742E67D3780DD5E1ED310B56F9D192 /* Locale+Comparison.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BE26AC956D611F452BF266415E186C7 /* Locale+Comparison.swift */; };
+ 16BDDF5C12987345DF60FEA70303FC34 /* PaywallsStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 493EE7C69C52E3CE4E013AAD381662DB /* PaywallsStrings.swift */; };
+ 17AF2784A076FECBD67D0C12206718CA /* PurchaseParamsBuilder+HybridExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAD2798C0929EA1B458ADB701AE1FFD5 /* PurchaseParamsBuilder+HybridExtensions.swift */; };
+ 180D839229B3B662F65D8B8838D5B690 /* NSDate+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D31C9077CE472B5356BE6196B56FFE3F /* NSDate+HybridAdditions.swift */; };
+ 1A81A29142D26A1B8EAF60C5D5BB2F28 /* SubscriptionInfo+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C189A64874CE704A5EB5F9E4814B82AF /* SubscriptionInfo+HybridAdditions.swift */; };
+ 1BB0D75317F0646F5F673D0AF4473C6A /* PurchaseParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD6C6D3C09F444D3FD7D1A51DB59C6DD /* PurchaseParams.swift */; };
+ 1BBABCCF8C05DBA0BF23313C4EED1ECD /* PromotionalOffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77E382909CD71BFADC9E5050D833E866 /* PromotionalOffer.swift */; };
+ 1CCCDFE36E423640BB45B58EC5D3B6BE /* TimeInterval+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C223355B1D7BA7EF7055BA32F0132078 /* TimeInterval+Extensions.swift */; };
+ 1CEFEF736D8E92EC0A86ED83DC62F947 /* RevenueCat-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 05CE0A318507A1B03E71FC3AE3B8A616 /* RevenueCat-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1DD7DC56178A4753AB7CD93B74860D01 /* VirtualCurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = A47F72C2370452B72036EC0A6F194747 /* VirtualCurrency.swift */; };
+ 1F17AD87208F203FB6966A49AFE59E39 /* TestStoreProductDiscount.swift in Sources */ = {isa = PBXBuildFile; fileRef = ACEEBBF233CE279392D2E23CD2EB2B5E /* TestStoreProductDiscount.swift */; };
+ 1FCAA2B2EE9DEB70AD020C866AC0737B /* WebOfferingProductsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = E06D51866D5E4D037B1DF0A7248BB569 /* WebOfferingProductsResponse.swift */; };
+ 1FDA6BD059FE84BC7AB93AF0A3B8C7FD /* PaywallVideoComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA9C293797882DD49FABBACE0A9A4C7A /* PaywallVideoComponent.swift */; };
+ 20573DE31015C3DFEEF2C9073840BB09 /* StoreKit2ObserverModePurchaseDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7117D2E3139747D4C0AF1A2007E49862 /* StoreKit2ObserverModePurchaseDetector.swift */; };
+ 206FF8E3E673450A193CD90B95D0EA72 /* EntitlementInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE57945CF7FB4E615C08C02571AEA631 /* EntitlementInfo.swift */; };
+ 208340C06D4DA3F40D229407246FD4A1 /* EntitlementVerificationMode+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27B3A3294778ED9BEE5035B2AE722969 /* EntitlementVerificationMode+HybridAdditions.swift */; };
+ 20B615542DF3C519130C52650E9DE1CB /* ProcessInfo+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB52161BBB21E3DB944AAD6127619230 /* ProcessInfo+Extensions.swift */; };
+ 21041155EA9AAC704A2C275E02133F4E /* Dimension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 982DD257A0E6F11A61B10C78C75219D1 /* Dimension.swift */; };
+ 213005A27193AF89E6C69108C18E0454 /* ProductsFetcherSK1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BDA3EC3179F2D6F9366E6B08F62428E /* ProductsFetcherSK1.swift */; };
+ 213F980DD8DA00BC54F6590CC4DA68D3 /* AnyEncodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5496A5BB6EFD4B1E2F477B637CB4E48D /* AnyEncodable.swift */; };
+ 21691E8A6A56203ABEBB5644BD232747 /* Package+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669737EF3E7F2EBAFEF056A15A64F9BC /* Package+HybridAdditions.swift */; };
+ 2191A6742168C17FB9632D624A206768 /* DebugContentViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640C6F5ADC38815FB221C4355EAC255C /* DebugContentViews.swift */; };
+ 21F61D7BDA1AEBDFD9FEC5DE13A74307 /* CommonPurchaseParams.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9667579EAAB94933AEA8860ECB03D7FD /* CommonPurchaseParams.swift */; };
+ 2206DFEB66D51DB4A4B80502EDF906F6 /* Offering.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6722B0341B3AF578C8A665E4C784C884 /* Offering.swift */; };
+ 2218ED4EBA9CE52918838D34B8EA4F3B /* Deprecations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01E1E4328DE00E9A112E7B280A00D700 /* Deprecations.swift */; };
+ 223D8C5B39CA7D94879522EEDEBF9EC0 /* SigningStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F37C08824D3E2BC8EFAD684F8DD2D30 /* SigningStrings.swift */; };
+ 23640BE7C9C4E7874AED750478FC9A04 /* SimulatedStoreProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6E844CEC04570752215BC22D972BE5D /* SimulatedStoreProduct.swift */; };
+ 2377BEA5A8937BA519CBCA176F399C83 /* SystemInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF759005470A151F5C92C1ABCF08A1C /* SystemInfo.swift */; };
+ 23BF085B8F093E4DCC370ECD4461CAE9 /* Pods-App-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D748E1EB3CD22A59197E91481E3FBE9 /* Pods-App-dummy.m */; };
+ 2471BB2C5F6475EA1D566E721F7AD571 /* AnalyticsStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0A3E95AB022B7D010C4ECA6DCE48491 /* AnalyticsStrings.swift */; };
+ 24D59F614C7F7DF7BF6F5BFE7E7798F7 /* ProductsManagerFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43982CC961296BCB9016F25DF5636068 /* ProductsManagerFactory.swift */; };
+ 25060BEFF76C4B7369DF4E8F4D7A36EC /* PaywallViewMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37F15050F581CBB4C04E20BB331FDA3A /* PaywallViewMode.swift */; };
+ 2579B7B799C41C0CECACDCA597517BF1 /* Dictionary+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCBBBCD0B4137EC4520A77CE9DB8616 /* Dictionary+Extensions.swift */; };
+ 276F8B6366A20E819F8B35BCBC0B3A83 /* FeatureEventStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 953A994B046DCFCD2FEE652AD8AD2103 /* FeatureEventStore.swift */; };
+ 278374A2154BB820AD45C86AE5C8C001 /* SK2StoreProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB7802D37966EE1823520BCEF311C699 /* SK2StoreProduct.swift */; };
+ 29DE1B55467F0D04EC4A300C21A0D88A /* LogInCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CDB60101318931DC0BC33B504865A0B /* LogInCallback.swift */; };
+ 2A0D491FC575852938DCC01611B838D4 /* EventsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04640A438AEB80D9CDC05F4498C45246 /* EventsManager.swift */; };
+ 2A1344CCB1AB136C7ADCC7E1D3438B21 /* SKError+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A1ECCA9B0AFF30A5B3239C7337FEA0 /* SKError+Extensions.swift */; };
+ 2A4DDD439C25E03965FB12619124E959 /* StoreMessageType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CA34C54BB65ECDFACD48E340F35CFAD /* StoreMessageType.swift */; };
+ 2AE918F82916DD9EB251134CE888B904 /* ProductEntitlementMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57CF47D0307513EBACAECEEFE998F34D /* ProductEntitlementMapping.swift */; };
+ 2B5236D888BF52D775DF0CCFF7BE3DB8 /* HealthOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ACD1A5A68737844A45D1D0FCB388D9A /* HealthOperation.swift */; };
+ 2BEEDE76AB0D00EFBD78E793B071D7B3 /* IntroEligibility+HybridExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72F24EE29B2E7AA79A16E34349BD4FE7 /* IntroEligibility+HybridExtensions.swift */; };
+ 2CDAE1C27C590A918B0FCD78AB1913B2 /* ISODurationFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66395F21F3D3732A876F3989EFDAACAB /* ISODurationFormatter.swift */; };
+ 2D356B2490FDBBE760935EE7F2ECC501 /* FakeSigning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64EFE56FF515BDDBC227CB67D1730EFF /* FakeSigning.swift */; };
+ 2E43C8EE5DE7DE000CA8132A2BF4195D /* WinBackOffer+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A88F340A4914A1B38585A668F787ED /* WinBackOffer+HybridAdditions.swift */; };
+ 2EDE750731D055CE89039F9DE66E2176 /* CustomerInfo+ActiveDates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 920E9A6F1FBF9A3E24676E196676231C /* CustomerInfo+ActiveDates.swift */; };
+ 2F0B92E488BE14E847168B6E4ECE9E5F /* WebBillingHTTPRequestPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8951ED7C8061999BC1457F7F8F15F9E /* WebBillingHTTPRequestPath.swift */; };
+ 2F49EC74AA36DBB0D436B9B790A92E78 /* Optional+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D73AAC4299967BF45F9FF01CB8787F /* Optional+Extensions.swift */; };
+ 3076382EF535E9F1060CFC140617348F /* ReceiptParsingError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC6F53A0BB095AE1E03AF662A04BDA52 /* ReceiptParsingError.swift */; };
+ 308296D6BB22879826E82F568F6A6420 /* RevenueCat-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5CEC8A93A161ABEAA5C71216AAF12613 /* RevenueCat-dummy.m */; };
+ 30E7269EB51FF197416794A96A97481A /* FeatureEventHTTPRequestPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF2593C6653218A284C93AB9622A4E53 /* FeatureEventHTTPRequestPath.swift */; };
+ 3107ACB6D1A55D8A8C8DB0192DB69A03 /* ProductsManagerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C07C024B48CD014121D93FFE67D317D /* ProductsManagerType.swift */; };
+ 3246AD757F5D3E065B6E22396BEB57BC /* DebugViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1309DABE4238A9917EB560A21A7DA63A /* DebugViewModel.swift */; };
+ 32758E91A629958F6F9597D7F8B0BC14 /* NetworkStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 163559D4E96350598D8E7A1511432D47 /* NetworkStrings.swift */; };
+ 327B6DE2691BA35C6FCC8FBC380A403F /* ProductEntitlementMappingResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = B86DA289E7F22C32D00FC998DA306C51 /* ProductEntitlementMappingResponse.swift */; };
+ 33F8A0FF2F9F88E58EADB444432FA656 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C21042E9373E06C1FF2749EEB2023EC3 /* StoreKit.framework */; };
+ 34BD2C8AE79882E9CD1E4B20F3B83AD7 /* GetCustomerInfoOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 219AB6D5487157E08F7CE7DC21CBC1FF /* GetCustomerInfoOperation.swift */; };
+ 34D26CD371C4C4A0C9413A96A2D06D1C /* Locale+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67DB6BB03C169A5A099A774B7A97BC20 /* Locale+Extensions.swift */; };
+ 34D795D69C1896928A9844E252BB8552 /* OperationQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA56B412BDF2C937EFB1687014EC5990 /* OperationQueue+Extensions.swift */; };
+ 36235CC944CE2FC473A71E5BF5948A0E /* OfflineCustomerInfoCreator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 620A422511B4CA19BF6E2009C98AE691 /* OfflineCustomerInfoCreator.swift */; };
+ 36A15A464BF447DD40144709F5ADDFB6 /* Storefront.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFE092025639D2E60A58D4B9686537B2 /* Storefront.swift */; };
+ 36AB5D7CB2009E336A8B5AC837B261A1 /* EventsRequest+CustomerCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 050860AE16CF6518B71B90904CA8F627 /* EventsRequest+CustomerCenter.swift */; };
+ 378F1FB4146DC53F3E38FE12B83A4A23 /* PriceFormatterProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FDDFFADA25052A655640C88A443EC44 /* PriceFormatterProvider.swift */; };
+ 3847043C02DE3BA5AED254C37AE3FCF3 /* AttributionData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08DEBD207C132DF1952C479926EF40A2 /* AttributionData.swift */; };
+ 3920B1552E7225DDF97B799DB049E613 /* VirtualCurrenciesAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD09B3518B3902E39C9B44C28578B656 /* VirtualCurrenciesAPI.swift */; };
+ 39A7159CCC5FE2E6402B841C11F21A57 /* StoreKit1Wrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9885CBEA1078E82811ED1AB2167DAFCA /* StoreKit1Wrapper.swift */; };
+ 3A0AB7D40C480569B52BB0C568F9A09B /* DispatchTimeInterval+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCDB0AFAEE59344FC83922BAFAA8F84F /* DispatchTimeInterval+Extensions.swift */; };
+ 3AEBA4EAF76EE56781B8C11EFA181843 /* NonSubscriptionTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFC6733DC521170E9EC0E84187ABAC82 /* NonSubscriptionTransaction.swift */; };
+ 3AFC91C477936253792D4D67F9929D0C /* CallbackCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = C748BCC3EB0BE2C32357DD969EEC2957 /* CallbackCache.swift */; };
+ 3B00006AFCB08F69DCFB35B6A74C62C1 /* PostRedeemWebPurchaseOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92CFDC0C567E64E8CD81EC9BE7A59DC7 /* PostRedeemWebPurchaseOperation.swift */; };
+ 3CA663B0D64A682B6E10835DCD3CF6ED /* Signing.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6997D4CD82F1DBB88676A21436D1B00 /* Signing.swift */; };
+ 3D072DD0150F8C6220A34AC6FBA4897A /* IdentityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E64E1C26D494FBF0137B5E18D5B02B5D /* IdentityManager.swift */; };
+ 3D43F3A991DDCBF702DAFB921D0E045C /* Integer+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B5E9919901D1A85E2C8CE70E94B48B /* Integer+Extensions.swift */; };
+ 3DCD237C98945FF5237F779681167768 /* EnsureNonEmptyCollectionDecodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402596F229D0A94560681BDDA848E0B4 /* EnsureNonEmptyCollectionDecodable.swift */; };
+ 3E88E03632FC38E5F995E32D8C901050 /* Store+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F52B96394F66BDADDF3D23F148FA8C4D /* Store+Extensions.swift */; };
+ 3F6EC5931284554C8723F2136C18B2D6 /* TransactionPoster.swift in Sources */ = {isa = PBXBuildFile; fileRef = 581324E62C9B9C66F986C485D64EC0C6 /* TransactionPoster.swift */; };
+ 3F8316FB0AE284C8A7F3B0B1A1BD1567 /* LargeItemCacheType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A88512127CC7038A2B20295A1BE47EDA /* LargeItemCacheType.swift */; };
+ 405E859EE0416E12CBCE6FD40BB3993E /* SwiftVersionCheck.swift in Sources */ = {isa = PBXBuildFile; fileRef = B862D15197CF3107C7B56884695C03BF /* SwiftVersionCheck.swift */; };
+ 41B66027F6EB3ECD1889410068488926 /* OfflineEntitlementsStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B358AABC35CB2D00DF8167FA1693D9 /* OfflineEntitlementsStrings.swift */; };
+ 4245D221CFEF6AAB8D9F4EA719DE8396 /* StoreKit2TransactionListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8230177979D569F3B9611599288B690E /* StoreKit2TransactionListener.swift */; };
+ 42693FAE530586342A09CF9EC588E5B2 /* PostOfferResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ECE680BBFCE5A638EAF2E3100B14519 /* PostOfferResponse.swift */; };
+ 42BEDE9FED3C4B88BBB111407DEB9285 /* UIConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA708953532C337EB9E943F1E130927 /* UIConfig.swift */; };
+ 4351539D4BCCD9C914D9F53BFBC07584 /* HTTPResponseBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF3D640A2B8E39DDEB652E3C42552FE /* HTTPResponseBody.swift */; };
+ 43870D37B89CBD1F87144783926160D7 /* Atomic.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC9BC9A8E600BC4B32CFBD0FBA5B222F /* Atomic.swift */; };
+ 44970CF5CBACB735A2E96D73CFC8D4F1 /* ErrorUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F5CC5B8C02683C98E9A43443D3C0005 /* ErrorUtils.swift */; };
+ 44C7EF3324C7975E053E620CC0BEDF9C /* PaywallComponentLocalization.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB1B62E71CD509474F1D600D45F213A /* PaywallComponentLocalization.swift */; };
+ 4537CCA3F7D854F8423527D1AD861FC6 /* DebugViewSheetPresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5DE0B7AD6EE4A13EEDBA37EF4239ED3 /* DebugViewSheetPresentation.swift */; };
+ 45D06B4201AC9DD5A44F16D0025773C0 /* PostAttributionDataOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C6ED52688C7A48D11AF18260782774E /* PostAttributionDataOperation.swift */; };
+ 45D4F61E2302D7AD6F8DDA325F912E45 /* LocalReceiptFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE2736B26E9D8B3CF17719478794A9DB /* LocalReceiptFetcher.swift */; };
+ 477F337DBB860F7FA41141DA6E8D2CAF /* StoreKitError+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A8AE57A74B292C1510B351C293C0CA /* StoreKitError+Extensions.swift */; };
+ 492EFD12496C5BBBFC5749C88C4071B3 /* VirtualCurrencyStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41A835CD3320BF4219C95068A6A91A85 /* VirtualCurrencyStrings.swift */; };
+ 4995A36CE81246962C7A1E55F3A1AC85 /* StoreKitWorkarounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 419AFCB98F8B32E3B67CBE20C5AD78EE /* StoreKitWorkarounds.swift */; };
+ 49A9A167B76A20D10074132B1C53BEE8 /* SynchronizedLargeItemCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0163E5B4BF6BDC1A473065C2478040B /* SynchronizedLargeItemCache.swift */; };
+ 4A30A63B65AF75F662364BA66ECA3DE3 /* DescribableError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBF8ECB2D76A2E8A1CA77B8CE8169924 /* DescribableError.swift */; };
+ 4A480AA741A5F40A2D5078A3B5B079FB /* CacheStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D4E5CAC728FFED4E79837CA237069E2 /* CacheStatus.swift */; };
+ 4AF96C30871F7CB233FCF1B47E5C654B /* PaywallIconComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8E77E31E19C324E81B04C28117B1A99 /* PaywallIconComponent.swift */; };
+ 4AFCE3BDDAA0B1B4BE39C95DF95F35D6 /* AttributionFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66616998505D0C66379137483045A4DF /* AttributionFetcher.swift */; };
+ 4C5D08E7EEE4B916161F07C0AAE6D5C4 /* SubscriptionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4E38DB9CE7A8E23D6C8B7FEE1C4DA92 /* SubscriptionInfo.swift */; };
+ 4C9CC1416B0122CB6519DF3A15A41029 /* ETagStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79F69394BA6293A6E77539088AB6A35B /* ETagStrings.swift */; };
+ 4CCE38129034AAEB9608AA5800C7EAD9 /* StoreKit2StorefrontListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35158BFC494344C16B5ABBC1099786BF /* StoreKit2StorefrontListener.swift */; };
+ 4D0111C816C4202EBCABD84588611821 /* SK1StoreProductDiscount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 276E2BC6FC3AF1829144103AC86A4FEC /* SK1StoreProductDiscount.swift */; };
+ 4D34A508E2D2714BAFE6E4D2119A74DA /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89575BF68A8CEE956D14067908790200 /* Box.swift */; };
+ 4D50158AF043606EAA5ADED80F15ED23 /* WebBillingProductsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98E870720B12A477833EC662153EAA94 /* WebBillingProductsResponse.swift */; };
+ 4D5C54021F5BC6B250F65AC2FFB2431F /* StoredAdEventSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4429BAC03814B14CCA05FA621E7945B4 /* StoredAdEventSerializer.swift */; };
+ 4D6E07073A8D14E4AFA27A6475007323 /* CustomerInfoStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D16F31D095A5E8B7668451E9766B3C8B /* CustomerInfoStrings.swift */; };
+ 4D6EC71482A650EAA558F7D1A228BAF4 /* PaywallStickyFooterComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 267F75A0D2086BDC6DCC403A0CF82358 /* PaywallStickyFooterComponent.swift */; };
+ 4DF1428C9BBD4E84EFB82EDDAE9709C2 /* ProductEntitlementMappingCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AF8A07013B121F68476D9577FD026EC /* ProductEntitlementMappingCallback.swift */; };
+ 4EDB5F0189CA9D0ED02DDE39F806AF5B /* RateLimiter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E0093159D58F9F03FE9A34BDCDCE831 /* RateLimiter.swift */; };
+ 4EF17FEDC16DDA63618ADAE6F884E77C /* CustomerInfoResponseHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54C6E8D902D8921B25981F3137A22646 /* CustomerInfoResponseHandler.swift */; };
+ 4F1D869A61AC9895817A0D1E186516B1 /* PurchasesOrchestrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE040262DF475BDC6D9F04D91E9F6071 /* PurchasesOrchestrator.swift */; };
+ 501533E437DC8A1D3358AE04129C3322 /* IdentityStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 678FD19DD03283F7C4DE61D0D2AC2379 /* IdentityStrings.swift */; };
+ 515A661C6F29D2093AE703E342A4080C /* StoreTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3829F4F6709CEF1D465E1B090726BF /* StoreTransaction.swift */; };
+ 517CCB855DCDD46EC3D8ED0DA41C2B96 /* EntitlementInfos.swift in Sources */ = {isa = PBXBuildFile; fileRef = C21C6634D66B5478C5D81E580547D16F /* EntitlementInfos.swift */; };
+ 51900CD62D52368F2A4624C539E755CD /* SK2BeginRefundRequestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C453716CD6B42DA4DACF0707ACD5DD1B /* SK2BeginRefundRequestHelper.swift */; };
+ 52810FA18198B6C56C3EF93B32F51080 /* SimpleNetworkServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D41ADD45E9FC908CBB9064A6CB0FE5C1 /* SimpleNetworkServiceType.swift */; };
+ 52D7645AEFCC26A59FB1610F154FF794 /* PaywallEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = E43D3F8ED7D4AE425544CEF8B68DADFD /* PaywallEvent.swift */; };
+ 53202F238900EBC88086410C61471CD5 /* PostIsPurchaseAllowedByRestoreBehaviorOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02E068784BF9CDD02905819DA9274C3E /* PostIsPurchaseAllowedByRestoreBehaviorOperation.swift */; };
+ 5351D5668E2B378389BB09AB962DABAD /* RedeemWebPurchaseAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95531205282ED304C416F800F98EA53F /* RedeemWebPurchaseAPI.swift */; };
+ 53B4B42F7FD86E3F31C226E61261C96D /* OfferingsFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B60F293050E52C352755F0B7DDBCDB2 /* OfferingsFactory.swift */; };
+ 53CE3CF2A4F3A055984E482FA53D27B4 /* GetCustomerCenterConfigOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A743E94DDA53FDEB5D7426089CB278 /* GetCustomerCenterConfigOperation.swift */; };
+ 5522B6C4005A1080C598A41E60C1D678 /* Lock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46428AF439B212CAE8C44D1B2187C9E9 /* Lock.swift */; };
+ 55D8028893DADE1FA8510654182DBB25 /* OfferingsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DBA6A441AA1F122717DFA33959AACE3 /* OfferingsResponse.swift */; };
+ 56C2B5FBB55D0C700D9C0C164AE07D37 /* StoreProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1C458C2BE7CC01A36C8235C83BC8EBC /* StoreProduct.swift */; };
+ 56D9EC3F3BDE13F44396F49859BE37AA /* PurchasesHybridCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = FD0E802DBD924DC3546667A598B442B0 /* PurchasesHybridCommon.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 586114F07AFA49A0BD3D2B25689EA539 /* OfferingsAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 574D90A224BA283F29C96807AD089D4D /* OfferingsAPI.swift */; };
+ 586EE3D92C7EF6FBBBE671BD0849BC0B /* PurchasesType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05373132568C97719C8133092E0A62CC /* PurchasesType.swift */; };
+ 5925A21D702BA8CB8C9A1DD7EFF6CA06 /* CustomerCenterEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E54FD6EBD1D6AF85E66D46923BEFDC /* CustomerCenterEvent.swift */; };
+ 5987821275DA7D2D54545DE990E43E3F /* CustomerCenterConfigResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2B3CC18E70A7CEC9AA5D543C14B079B /* CustomerCenterConfigResponse.swift */; };
+ 59D4C3938D6B2424BD231E14777D0427 /* DangerousSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DE6D62CB5B0507D61F0943DC5B7803F /* DangerousSettings.swift */; };
+ 5ADC8C584D7D620CF86FCAC95A63761E /* SDKHealthManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5DED6775202924EF0C04B2E2A8F425 /* SDKHealthManager.swift */; };
+ 5C05E3117F5DBD93C0C76B9A643EEBC8 /* LogIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC42359A1CA61861ADE99307393F1E0 /* LogIntent.swift */; };
+ 5C0F7B99BB5D06D5681CC84531B894AA /* OfferingsCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = C71FFD0EB89D5CDF617AF3EB7C1AC6DD /* OfferingsCallback.swift */; };
+ 5CA1FC8A23AE6F619CE711089F093C39 /* CustomerInfo+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7106C3714AC8B3947AAF7682205D64DC /* CustomerInfo+HybridAdditions.swift */; };
+ 5CAF071FB8EDFF15366291521C86F4F6 /* StoreKitRequestFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 741F1FE82F5563A51C18047143318D51 /* StoreKitRequestFetcher.swift */; };
+ 5E659DB78ACF16037276DEDF6AAD3A5D /* PaymentAuthorizationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A53E1B1FF57A749F9042B85E80B999E /* PaymentAuthorizationProvider.swift */; };
+ 5EC08752843008B7FA2C77868785B2E1 /* ErrorContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48E7FA372B2126E960DD9345ACD310EC /* ErrorContainer.swift */; };
+ 5EED0714A88E74BFCA2EA2114331CD65 /* PurchasesDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5259A4BCC0961A44A79FD7A37E3201F1 /* PurchasesDelegate.swift */; };
+ 5F38C55DD408F6339712D08BB4A6279F /* URL+WebPurchaseRedemption.swift in Sources */ = {isa = PBXBuildFile; fileRef = C62B0FEC9381399A0CF313D658B62FB9 /* URL+WebPurchaseRedemption.swift */; };
+ 6057874615E5DFDF77819375000B318C /* AsyncExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 411B45CA57486D588D69BE38012EBC60 /* AsyncExtensions.swift */; };
+ 60C9149A5F902CEB43020283532E7B15 /* ExitOffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A92823154D5BF0558321E066DD375B81 /* ExitOffer.swift */; };
+ 61011136C7896358E6EE825B52E44EC1 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 190C1838CF4C354E2B7F9EC2FD60CCA0 /* Logger.swift */; };
+ 61D0AB83A1BF334C4F44E532C30AE0E5 /* HTTPRequest+Signing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4600CE4F86683888FA412DD3200ABE /* HTTPRequest+Signing.swift */; };
+ 61DE9725A7F168F8B27ECE5A6AEF263E /* PaywallPurchaseButtonComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A724FFF66F3706AF6B6F9F03DDCBD30 /* PaywallPurchaseButtonComponent.swift */; };
+ 61E359193242F00C15B62EDA65305196 /* HTTPRequestTimeoutManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B782EEACC35423EE8396C87C2A44FDBD /* HTTPRequestTimeoutManager.swift */; };
+ 624E5CDEA0823014638AA663F7BDB89D /* SK2AppTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0DFF719C20AC527A6BC2DC98C963E13 /* SK2AppTransaction.swift */; };
+ 625BD2AFC9EFFCD1F39237B27254B9F9 /* VirtualCurrencyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ACF413EA2CEFBC52AFDBF08039BC2B1A /* VirtualCurrencyManager.swift */; };
+ 62691C2B39C26024F110B743D49D35D5 /* Checksum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4461612DEFB559B4AF58297EE6A4E5BF /* Checksum.swift */; };
+ 626F76E0D8E45C0C562BAD8E06E43A5A /* EventsRequest+Paywall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 167781201460DD988699AD9F132B8239 /* EventsRequest+Paywall.swift */; };
+ 6455060844D0E34AEF3B3EE3DEFBC38F /* AdEventsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0C17CB45538B27EDBE538A2174480E /* AdEventsRequest.swift */; };
+ 65633024139A171F23654CD4E335976E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 87A71B489ED684C9F56752C38BF66DF8 /* Foundation.framework */; };
+ 65F39BF1ED8ADF7900D8E1A27AD22A0B /* DebugView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2A1A9A4FD00BFC410C13FDDD69ED238 /* DebugView.swift */; };
+ 65F402692D84E0334C9BEF775C8A8799 /* RevenueCat-RevenueCat in Resources */ = {isa = PBXBuildFile; fileRef = D83AE5D93C653BDBFDDF59AC3D1E32BB /* RevenueCat-RevenueCat */; };
+ 66D8491B3A36D4C420D5ABEB74EDC4C6 /* StoreKitVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = B55C188AC2C1A94092CD8E91790E6C08 /* StoreKitVersion.swift */; };
+ 6783F4EB72088C6CDE3F2CD7E72A6DEA /* URLWithValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C3AA691053AC1526EA7AD7112D87EB9 /* URLWithValidation.swift */; };
+ 67FA180A0D518DDCD2F3A499C9895F15 /* ProductsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F6ECC6C4DD98E625F6E37A6F6C399C8 /* ProductsManager.swift */; };
+ 6883F9EBCA20083096B2D52AD3530F05 /* EntitlementInfos+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5377D542CC6A8DEE15A5FF76640C8D0D /* EntitlementInfos+HybridAdditions.swift */; };
+ 68C2CA5FD79C893D82CF145A749D52E2 /* HTTPRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9577237390742DC703110594A2987D /* HTTPRequest.swift */; };
+ 6911A2866BA68E26F43227BBB14332F7 /* NetworkOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A66AD16E450533FF112985315A1A6117 /* NetworkOperation.swift */; };
+ 699F09290490B89C7ADA9A61DE216485 /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7743565FD090970EC752509A9331B24 /* String+Extensions.swift */; };
+ 6A4AE283A715A3537A23D34CC178CE48 /* ProductEntitlementMappingFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9878330F2E5A509C95464B5A9BDF996 /* ProductEntitlementMappingFetcher.swift */; };
+ 6A883EC0F7E1C3C42185398701DB0187 /* NonSubscriptionTransaction+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF9D0CF26D635488D863AE5E82D2E617 /* NonSubscriptionTransaction+HybridAdditions.swift */; };
+ 6BC16D6C4EF5D73855198617F3C570FE /* InternalAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6321C6CAE67AD0B90C77BDE9108FE3B2 /* InternalAPI.swift */; };
+ 6C590FD333D3C1FA9D221016E847A422 /* Purchases+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12DE160C6746F68C2CD64AC5F7170E14 /* Purchases+HybridAdditions.swift */; };
+ 6D421A2A914E6A0303FAF92EEB0C5A80 /* OfflineEntitlementsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFA6135F25B7790E77FF9616C066DB77 /* OfflineEntitlementsManager.swift */; };
+ 6D86FE4F481EF154900291B74D4A8499 /* HTTPRequestPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB05F7D7A24B3D579504E3878AEA3208 /* HTTPRequestPath.swift */; };
+ 6DA0F9994A547B5FFA7A205F4192AFD2 /* FileRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CFF995830964954DCE98FA86C0769AC /* FileRepository.swift */; };
+ 6F16EBFB28BD79915C768BD45DFD8F94 /* PaymentQueueWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF6A2D87D8C4049AC7CDFE088303F699 /* PaymentQueueWrapper.swift */; };
+ 6F29229B7DAF07FE2BD52D41A48EBCA6 /* IntroEligibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76DCD34563B705E96DD53FE3CC8659EB /* IntroEligibility.swift */; };
+ 70425D2CF9B0EB920FA5274A3694E587 /* AdTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49962DEFE7B07C16FBD2C37C37CBBE1F /* AdTracker.swift */; };
+ 70F9FFE974854A0332AFEFF01AFFD806 /* VirtualCurrenciesCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0D5E64BCD5A731B05D799C3899BD45 /* VirtualCurrenciesCallback.swift */; };
+ 71A4E7B1ABBA2010596B4796BD205747 /* PostSubscriberAttributesOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B4C221F9E26239D362F074E8B3AB200 /* PostSubscriberAttributesOperation.swift */; };
+ 71AAB546724AAAEC9F32A0827B397009 /* PaywallData+Localization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0399EA39C6ECD0B8E9FF2EAC45A595A1 /* PaywallData+Localization.swift */; };
+ 7256E12C68AAC32714327F166B7F22B4 /* EncodedAppleReceipt.swift in Sources */ = {isa = PBXBuildFile; fileRef = C72682CB26A8A8798A45276B14DCD6FE /* EncodedAppleReceipt.swift */; };
+ 72B32094C7DD9E4EC0B6809D97C3ED38 /* PurchaseOwnershipType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B27429EA2264D28F334AF7BA26B273E /* PurchaseOwnershipType+Extensions.swift */; };
+ 737C86EBA24A886E53EE6DCCC2C986BF /* DiagnosticsHTTPRequestPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F16A164D387C89633751E0685FF7E70 /* DiagnosticsHTTPRequestPath.swift */; };
+ 74419E4695126A2956F0510CFA6BE611 /* ReceiptFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9291FD1CC3EDC9A696B0E9D715A228CF /* ReceiptFetcher.swift */; };
+ 747618F3DD2FF5CFF3923AA87F4184DD /* CustomerInfo+NonSubscriptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB9C59CAF6D0718768842AFA6937ACB7 /* CustomerInfo+NonSubscriptions.swift */; };
+ 74FDA5758CB9026D3C1269DF1D925927 /* TransactionReason.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18BCDD139ADDE82AB46C6785541DFA6D /* TransactionReason.swift */; };
+ 763E2F69BD19993134A8B6AEB1D89994 /* IdentityAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 794983798EEBEA8147747C6AA24D41A4 /* IdentityAPI.swift */; };
+ 76AE94A1A86A32AD29413EAA5CA7A1BD /* Attribution.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB1A30CEB1B8DE6971D0078A39D1608D /* Attribution.swift */; };
+ 76FF8B4502362A884D951F14109F5F10 /* WebPurchaseRedemptionResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 724E4C9353C10489676F511523A082CA /* WebPurchaseRedemptionResult.swift */; };
+ 772206C12DD0B5CE7BD2E2A5FE46197E /* Assertions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E43177DE9BFE35EAF4DDF828B198ED0F /* Assertions.swift */; };
+ 7742BBC1F5D4443E3E1EBDCDE250A77E /* DiagnosticsTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14073EAA11882BFEA66F9D5446A20C01 /* DiagnosticsTracker.swift */; };
+ 77C3355901AE40A27B546502B75E0129 /* VirtualCurrencies+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A738020BF03183667C17B8A12819E7E6 /* VirtualCurrencies+HybridAdditions.swift */; };
+ 780EE2DE01CD3710169FE4D9D47BEEDD /* WinBackOfferEligibilityCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F52AACBDDB4E40E83FF56FA1DA1B314F /* WinBackOfferEligibilityCalculator.swift */; };
+ 7819B2F212D80297276A833E670E9C8E /* GetWebBillingProductsOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39085DB222F7F991FA160FDD2EA404DD /* GetWebBillingProductsOperation.swift */; };
+ 784BF0E8882593223EACA3FF833E85CB /* DebugViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6727B22C2DD81436B87F5B07744FFED /* DebugViewController.swift */; };
+ 7A301B3E33A2B101D7872CC170310629 /* RedirectLoggerTaskDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D758AE9F572BFC5F198EA01E9DF975E /* RedirectLoggerTaskDelegate.swift */; };
+ 7AF61D3301BF23C426CBF119C8EFA692 /* SubscriberAttributesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EEF5C7982E9B875772855739D85E3A1 /* SubscriberAttributesManager.swift */; };
+ 7B5198CCF1CFA02ED61EEB40CAA26E34 /* SDKHealthCheckStatus+Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9689278B1C8252427CB02806EDD0966C /* SDKHealthCheckStatus+Icon.swift */; };
+ 7B81B7AAC93B9AD9A4A3BCD5577D9E30 /* PaywallExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171EF18DDC6787FAF20A5F9BF6D4BD8F /* PaywallExtensions.swift */; };
+ 7BE399E51C92F93CFFE1EE6D5F913365 /* CodableStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585A42B7A612959DAFDF99089F7076E2 /* CodableStrings.swift */; };
+ 7BF461163C11F166126C05049E220874 /* ManageSubscriptionsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE1F9C9F63501650001C13DA131E2616 /* ManageSubscriptionsHelper.swift */; };
+ 7CAD224349EB3588B0A73F1464D5E580 /* StoreKit2PromotionalOfferPurchaseOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE9F5CD71E870407DC34DB7812BF0C48 /* StoreKit2PromotionalOfferPurchaseOptions.swift */; };
+ 7CBECC8C698BCBB1049FA8278BBE6D37 /* TransactionMetadataStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861F711AED94FA2C6115C3A7757FD1A6 /* TransactionMetadataStrings.swift */; };
+ 7DBBFC773DA0A00D66A543FED131F14F /* IsPurchaseAllowedByRestoreBehaviorResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370718947692D51A24D4CE246D0158C9 /* IsPurchaseAllowedByRestoreBehaviorResponse.swift */; };
+ 7DFB68F5928E7F081CFEDF21659A8C66 /* StoreMessagesHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2E8626622CAC40EF643A18775639D0D /* StoreMessagesHelper.swift */; };
+ 7E26F9F95EDE7747AB14F7BD5FF55340 /* InAppPurchase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 807C132E2A49B7544A75717CD942AE59 /* InAppPurchase.swift */; };
+ 7E92EA37828F4E9F88E37497092D246F /* CustomerInfoManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16DDEB9434DD6BAA4198327BE0524964 /* CustomerInfoManager.swift */; };
+ 7EB2E4F9725D1CFB15D63E6D62257B7E /* FrameworkDisambiguation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A79718881EF41876F0ACC9A8C44AB73 /* FrameworkDisambiguation.swift */; };
+ 7F793D6609B0771DAB205DC80413F8A0 /* DiagnosticsEventsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09349528089AE3BF1C1ADA84D9101E55 /* DiagnosticsEventsRequest.swift */; };
+ 7F923D4B265D853318B659E8C94EAFB0 /* InAppPurchaseBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29F9D1208D1C4BB939FC2F38F8B5E866 /* InAppPurchaseBuilder.swift */; };
+ 8009EFBD68459BD7F154554CDAF0C476 /* BackendErrorStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38001264FD37589AF13374D1B55C3580 /* BackendErrorStrings.swift */; };
+ 80C5E97875B2415C462721211CFCB32C /* DeepLinkParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2260E01F523D44DA02E6F1C279B3324B /* DeepLinkParser.swift */; };
+ 822B45B6091245E60A73AAD509430F59 /* PaywallTextComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD2A25D4575F6BE627919815E3E1F7DC /* PaywallTextComponent.swift */; };
+ 829CF3270E4E5F05FE0CE9ADA8B12822 /* PurchasesReceiptParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E473F9E55BE0F0931A5F499C838EB5F /* PurchasesReceiptParser.swift */; };
+ 83D077583C157AF74986453F33B08073 /* HealthReport+Validate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72B95D42A565758D0A54C319A7A37A5 /* HealthReport+Validate.swift */; };
+ 83DD040E6E7F68E92C206BE88A7B45A9 /* GetVirtualCurrenciesOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3091166AE010D315AFE23BA999429369 /* GetVirtualCurrenciesOperation.swift */; };
+ 853F20C7F5DCA7D4EC281364F5E277A5 /* DiagnosticsFileHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4675D69D85060AD0CCF95F2F433C4CB6 /* DiagnosticsFileHandler.swift */; };
+ 862570941311AA81CEC0E70D64715D65 /* ReceiptParserLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = E25AAC9EDB04491D60DB27AEF0131F56 /* ReceiptParserLogger.swift */; };
+ 8665003E6691051A04F90065D92C03A5 /* AttributionNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BF7E8C10125597CD5C46CA7F0A69A95 /* AttributionNetwork.swift */; };
+ 86C07CAD53C2BD9945ADB4522C193583 /* DateExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3413C64E09BB73FF739C2F58A9CCB69B /* DateExtensions.swift */; };
+ 8708176D793338D813D8DEE81E4C696E /* WebPurchaseRedemption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472FC5C89285A9712BEABCDDD91FAAF5 /* WebPurchaseRedemption.swift */; };
+ 88200664E20C83D20178541A941DDAEC /* HealthReportResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7746B40EE5186834473EF0C65F15A607 /* HealthReportResponse.swift */; };
+ 897C85D1CFB8BE60EF2DA468FEC0A233 /* HTTPRequestBody+Signing.swift in Sources */ = {isa = PBXBuildFile; fileRef = A916D6FBB0F53B12D9BC92722540B52D /* HTTPRequestBody+Signing.swift */; };
+ 89CC55C8ED64E48C2D7A72EBBC47963C /* StoreKit2PurchaseIntentListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCEA109D76F5730F49E697444344B367 /* StoreKit2PurchaseIntentListener.swift */; };
+ 8A7D431240AFF8546554FC76593ACA98 /* HTTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22CD3659713C78546E489A2A66815B86 /* HTTPClient.swift */; };
+ 8AEEC4076B85C1ED87BA1D0E028A3001 /* AttributionKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6618B807930840144456BE060ECF4A6 /* AttributionKey.swift */; };
+ 8AF8CA1ECAA366030F181DBFAA3539B2 /* Signing+ResponseVerification.swift in Sources */ = {isa = PBXBuildFile; fileRef = B585AC5FD94D011C8EAB750F531DD9D4 /* Signing+ResponseVerification.swift */; };
+ 8AF928B7B5596A441C8F6488EE215714 /* WebPurchaseRedemptionHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 154AAA9A3B0432A54E8802E6C7AD0CAB /* WebPurchaseRedemptionHelper.swift */; };
+ 8B1D04C144AC73F5B3B44393CA784D59 /* InMemoryCachedObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42A3AB7080B77B6F0334F03A9C8B2D84 /* InMemoryCachedObject.swift */; };
+ 8B93842F2A0FA79826FFB176092CA68A /* AttributionDataMigrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E068FB1DD1D8B6F0726EB4AF89FDAB3E /* AttributionDataMigrator.swift */; };
+ 8D068435B740743AFC141359A635C6A6 /* PackageType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4A49717BD402DBC31C202C38543A009 /* PackageType.swift */; };
+ 8E41613FD4C11C71F3B715E34966553A /* ManageSubscriptionsStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C6DCE5AA49AC6AD95CAD94D34DC7107 /* ManageSubscriptionsStrings.swift */; };
+ 8F1F6D04F6AF938E4148E9DD473D433A /* CustomerCenterPresentationMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = E42E9F22C0F3B953366046EB72B1452A /* CustomerCenterPresentationMode.swift */; };
+ 8F5121FB350068C2AAD309B7717E5E14 /* PurchasesHybridCommon-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E636DE5DDB3B5BDF5FFC68F773CC609 /* PurchasesHybridCommon-dummy.m */; };
+ 8F86481D857009B299B6076E890F2386 /* Result+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1334C5F2A9F962CA1F7F2F47425A447F /* Result+Extensions.swift */; };
+ 8F88765D915734873DB5C3AEFF7D236E /* WinBackOffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69AEABD735DE880752B3A57DA9663F93 /* WinBackOffer.swift */; };
+ 8F957D5CBF21994528EDE0E92C695455 /* PeriodType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C16D040BEC10E29CB27DE018724380 /* PeriodType+Extensions.swift */; };
+ 90C75EA6052F479E1B4E3B755C52B5E4 /* SandboxEnvironmentDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0406D4D0D251FD0240084DDDD47A2AAC /* SandboxEnvironmentDetector.swift */; };
+ 90ECDA89BFA33C09C0EA7CACB705E38D /* OperationDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = D45B91C86E29354B695E56BD1795F6E0 /* OperationDispatcher.swift */; };
+ 917EE0107F13098DFA3C601C16F4439D /* CacheFetchPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF1E3F994BD3D68530C7CA1F5172F71 /* CacheFetchPolicy.swift */; };
+ 91D926DFE01EE8CDE6598B81CFE8ABBD /* Enums+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE1A893E27001C650745F283602FF9C5 /* Enums+HybridAdditions.swift */; };
+ 929B2D1E9201C129D1F99911AD4E4BC6 /* ETagManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B37235A9E7F563EA5613B6127EEF9071 /* ETagManager.swift */; };
+ 92A7CAA793F08187EFD059636A0F0B8A /* SimulatedStoreTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A1C3EFF43297F918D2F35BA617C14C8 /* SimulatedStoreTransaction.swift */; };
+ 9348952875E729527572646A4E96F13F /* StoreProduct+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CFCD5D3EF7A3B23BE90664F4C137688 /* StoreProduct+HybridAdditions.swift */; };
+ 939417F0CD8A6316FD00164A9354FA7A /* Purchases+async.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8B8C9C0633CE6C25F0B33F42EC298D /* Purchases+async.swift */; };
+ 954021FD040EE33AD0E79B993266CF6E /* WebBillingAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = E405D92F1496D54E211947AE2BF80437 /* WebBillingAPI.swift */; };
+ 9541631B9653458879686FCBAB3C62EF /* ConnectionErrorReason.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B60220F8AF0AD933C4600331FFC21F1 /* ConnectionErrorReason.swift */; };
+ 954D0E7EC83418A5BA496C10200DC885 /* Border.swift in Sources */ = {isa = PBXBuildFile; fileRef = 254D224EE53AC495F856B7B6FAFE64FA /* Border.swift */; };
+ 9630DBC2BEAF472CF6A6849A5ADD3FD0 /* WinBackOfferEligibilityCalculatorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C80098D91C52427263BECAB1F82D20F /* WinBackOfferEligibilityCalculatorType.swift */; };
+ 963E80788E5ADD9CDC5E340AE6A6C024 /* VirtualCurrenciesResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3769014434C82BEC6EC59E4F1156A10 /* VirtualCurrenciesResponse.swift */; };
+ 966AE973DE8439C5CB230AB8309AA9B3 /* Obsoletions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55FD547023F2A20FF4544B62F0E586CF /* Obsoletions.swift */; };
+ 967E930166FD79D29E7F5948FA8ED5A4 /* PlatformInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4064ABA2F049CCB130535FF67203494 /* PlatformInfo.swift */; };
+ 96A612B7F976E0B4D8E641ED758987BE /* StoredFeatureEventSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA26904737F608373C9C7B92857448C4 /* StoredFeatureEventSerializer.swift */; };
+ 9722BD750D05A2A5760EDBC4FCAF9611 /* Offering+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 153B8FA4E5198A2A285226070C62493D /* Offering+HybridAdditions.swift */; };
+ 9A1F93903A42A477256B361727DE8DB4 /* GetIntroEligibilityResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10B1AA5292666C89BB23EAA215885DDF /* GetIntroEligibilityResponse.swift */; };
+ 9A6A9D2FEDA333096CC65CE0A824CC0F /* StoreKitVersion+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C61AF345273EF54AC3D469D70F0E0A8 /* StoreKitVersion+HybridAdditions.swift */; };
+ 9A780CB6C011F7FB63EAC26167D9617E /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ADC5CF5FB80DF59ABBB2AA88301A337 /* NetworkError.swift */; };
+ 9B3C4DE8E8018B995E6837023D39ECAF /* ErrorCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECB122B30DFFF8EA3C1D320B8CFA0735 /* ErrorCode.swift */; };
+ 9D229E91428C0F33D6FC67A756522D71 /* ReceiptRefreshPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 181E1EE6E30B8FC9E1493E8579F6148D /* ReceiptRefreshPolicy.swift */; };
+ 9EC4720EF15F220A22D6624FC065D7D9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 87A71B489ED684C9F56752C38BF66DF8 /* Foundation.framework */; };
+ 9EC557C2B69D43E3754F865D87FBBA25 /* TestStoreTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9ECBD5A10BECFD6D6B78D9B18815437 /* TestStoreTransaction.swift */; };
+ 9EE03FCDD1577723000E62E384E389F8 /* DateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6DAEC63578C194A8F591F33C0A58342 /* DateProvider.swift */; };
+ 9F3C9F43E51710EAB7D3D4C91EE3C7C6 /* Either.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EA2D22D2E6CA3B7F5956EC6500603A5 /* Either.swift */; };
+ 9F45845EC907C7D3E8EC5CBF358C9F65 /* ErrorResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7884B518EF2556A1388CDEBB756A896B /* ErrorResponse.swift */; };
+ 9F60DC3031BEE3F5F12C70726312349B /* DiagnosticsPostOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51058E8152DEB2BF828A53F4AD450B01 /* DiagnosticsPostOperation.swift */; };
+ A05D19095E9514CD12EEA8B7DE67FAA1 /* PurchasesHybridCommon-PurchasesHybridCommon in Resources */ = {isa = PBXBuildFile; fileRef = 3AA9124C018EA7BF6460091D86216692 /* PurchasesHybridCommon-PurchasesHybridCommon */; };
+ A093A62DF992EB27B7113BC2016C6982 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 87A71B489ED684C9F56752C38BF66DF8 /* Foundation.framework */; };
+ A0C13F33ACA277E525CB93548C576AB5 /* EntitlementInfo+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CB6178E26439BA8FBAAB00CFD0DD1CE /* EntitlementInfo+HybridAdditions.swift */; };
+ A11EBD6CCE3111CE42181721BB84A904 /* PaywallV2CacheWarming.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34416EDC539D29D5CF431CD65CEE0A3C /* PaywallV2CacheWarming.swift */; };
+ A13D3A2C9C9DF25E4DC35F306F82915C /* IntroEligibilityCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C19E63EBCB8B1A3E5DC6B1417EC36C8 /* IntroEligibilityCalculator.swift */; };
+ A1B28F49322BEED2B0403265DE934BBD /* Array+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 042E2E05C8AAA27935046E9B1CC28EEE /* Array+Extensions.swift */; };
+ A1EF5406367450EA2FA41E0E79E9A0D1 /* BackendErrorCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = E60AE353D45C0E32FD77A16F2525C134 /* BackendErrorCode.swift */; };
+ A31A78934D6EDB7302F56AC436DAED00 /* UserDefaults+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 741E28294C6E366139D9B1A98FF4D201 /* UserDefaults+Extensions.swift */; };
+ A39B25F4B8AC63AF7A0DD44B03199E33 /* AnyDecodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E58C73BFF7155DD4AB1509DC65F6F6AA /* AnyDecodable.swift */; };
+ A3E05972292D1D8C3574B2A158737E7F /* ProductRequestData+Initialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2403A13AAAE0FE4A1CEA7184A02C573 /* ProductRequestData+Initialization.swift */; };
+ A46F46AA15270BCAD792746BB0D04CC0 /* WebBillingProductsCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA50CB4C6E0ABB414E82FBFBC3B5B259 /* WebBillingProductsCallback.swift */; };
+ A494E13FA39145F50323095B61A9F57C /* PostAdServicesTokenOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56A90A644DA1F65D4BABA53C91FB3839 /* PostAdServicesTokenOperation.swift */; };
+ A4E7E2ABFDDB45A490DB0BDE92DAAEDB /* PaywallTimelineComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = E69D0ED836DC2584E63FEA604B3AA390 /* PaywallTimelineComponent.swift */; };
+ A630B3770983BFA4E1062A4A206AAB98 /* OfferingsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65CAC8117AD855E94F9AD43DE1CEE746 /* OfferingsManager.swift */; };
+ A71B299E41E020C2BC475091C4320F38 /* CustomerInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614C8BDF4EF615DC21C0252EC9C68B1A /* CustomerInfo.swift */; };
+ A7FD09C1F62919A6631C9447C9FFA244 /* Data+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A65AECEC43CBADA572E58C2084B63AF0 /* Data+Extensions.swift */; };
+ A915CFF4FC0215FE996E2CF88D55B3FE /* ASN1ContainerBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABA3121E4FE255F17E267E7B7E5D9DE0 /* ASN1ContainerBuilder.swift */; };
+ A99D9A97FBCF14F226E24723A7910C8A /* SubscriptionPeriod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 067849C6531AF8172F2B92E8C70E55AC /* SubscriptionPeriod.swift */; };
+ AA2393F2E17333DAA72DD5003E79B56D /* ProductStatus+Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48FDD55070B9A0A8C52F0337FEAB59F /* ProductStatus+Icon.swift */; };
+ AA77866411E19FB9D6D9B78F214667B8 /* AppleReceipt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89B36287D3878611A40796176083DBE4 /* AppleReceipt.swift */; };
+ AA7A0B547083A7449975B1845E17D74A /* PurchasedProductsFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1898596839397C9AD5DA180A888003F5 /* PurchasedProductsFetcher.swift */; };
+ AB7713C6FC578FE6FB5E0ED725B6C823 /* ProductRequestData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B109616F0DBB8B553145755A69337FE8 /* ProductRequestData.swift */; };
+ AC007C5CC26D3C43D3979B33C60C3CD4 /* CachingProductsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B02F3C6E2F57EE78C8EF72930F25E8A /* CachingProductsManager.swift */; };
+ AC342B627EC87B9B653555D36B18EEA4 /* LogInOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12CCC30F9D4787599E16E9D03D5AA781 /* LogInOperation.swift */; };
+ ACC3BE0CDB49D4B1FF8C850B90E8368D /* SK2StoreProductDiscount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86F3ED86A3C76F0AA6BED070C70CF4BE /* SK2StoreProductDiscount.swift */; };
+ ACD871A1CA99981795758CBC85256AE8 /* StoreKitErrorHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 464B54FC3CD735207FE9083CB9904FED /* StoreKitErrorHelper.swift */; };
+ ADDC57AE1CCD0B526EAADE6ADB77AC48 /* EventsHTTPRequestPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B8724774D8EAA3D595E2AD2D6F0A2DA /* EventsHTTPRequestPath.swift */; };
+ AEC3A5F2ECBB090DCE4B0A5ABEB3DA9F /* Clock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 339746A8D84F4A4528121114106A6473 /* Clock.swift */; };
+ AF979601CEF7E72C1239B2C5C0C0073E /* DNSChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13771028F9A83D1381BAB98A92991E48 /* DNSChecker.swift */; };
+ AF9833D45A51C28186500A67ECBE5BEC /* PaywallStackComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0988BF1A4E391F5D1E424FD6ECFF537 /* PaywallStackComponent.swift */; };
+ AF9854824B9384417638A854FFDE4790 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 50A6A3B1299C884DECA9398CA5434A53 /* PrivacyInfo.xcprivacy */; };
+ B12F5B7D39A17ADFEA70C32D5EC30CE5 /* ArraySlice_UInt8+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A5A36BE17EDC4996FA118995EFF95A3 /* ArraySlice_UInt8+Extensions.swift */; };
+ B1DB0CF5F53E8E4FF5197EBEF12C0308 /* RawDataContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 492DC2973A8438B3FD8BC91EE2D1C3AF /* RawDataContainer.swift */; };
+ B3126D5E3BFB1E308624F3DF43C4D248 /* PurchasesError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36B3F59C973860A8269FBAC688EF48C8 /* PurchasesError.swift */; };
+ B36A384567B248BE57D25650874C60EE /* HealthReportOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2942D1070605FA57789397BE3734694 /* HealthReportOperation.swift */; };
+ B43EC17C209109CEAA80252ACAB47DF8 /* HealthReportAvailabilityOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F929B4C2C5B3A0269A40D220994CFB9 /* HealthReportAvailabilityOperation.swift */; };
+ B46898EA7DC1D219FB751D276307F4FA /* IsPurchaseAllowedByRestoreBehaviorCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 125FD7AF9118CF5729AF7B557AF935A8 /* IsPurchaseAllowedByRestoreBehaviorCallback.swift */; };
+ B5911DA4A44191BF54F3884779787DB4 /* IOSAPIAvailabilityChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECABB8B06C508A1B0CFD0A60244244B5 /* IOSAPIAvailabilityChecker.swift */; };
+ B63B5E6E34ED0F380A4AFB04069E2B18 /* AdHTTPRequestPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C74858ACCB6718D09F9A76A94E45922 /* AdHTTPRequestPath.swift */; };
+ B7B57DEE52B2B092F409EB6F1E227D2D /* TransactionsFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 881041EB30032A832A0F458D97E93162 /* TransactionsFactory.swift */; };
+ B8B7151332606D3D4807004DFDEDA602 /* CacheStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FFBAFA262DFF87E003DA4F5E7D85D01 /* CacheStrings.swift */; };
+ B8CB1C1FC3F33EECBBD296220920E42A /* GetProductEntitlementMappingOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFD39CF476F2A473004A7DDCD750F056 /* GetProductEntitlementMappingOperation.swift */; };
+ B9B9D6096020353B530D6CC1D4852FB8 /* ReservedSubscriberAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D72D231BD7B9A3D4F83AF06454B15416 /* ReservedSubscriberAttributes.swift */; };
+ BB9EB99AB72DACF1697085BD308515A9 /* TrackingManagerProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28909F20999A48234075586D77F3D448 /* TrackingManagerProxy.swift */; };
+ BC06E4B60F818A12740499225E78A417 /* GetWebOfferingProductsOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BA54EC4A66CAF29728AD641B5EC7462 /* GetWebOfferingProductsOperation.swift */; };
+ BC337DB759014BA9A848C8A127A8E000 /* PurchaseOwnershipType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B313A8CDB736DB52EDDD3634F8131A94 /* PurchaseOwnershipType.swift */; };
+ BD48C95A7EA78365D974A0124E1BE62E /* PaywallTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614A2D3670D47E6D1CA8428911162808 /* PaywallTransition.swift */; };
+ BDBD3F8531DA20BA63A631D71D209B5E /* NonEmptyStringDecodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FDBADD2C97E2A55FDF2261BA910C2D2 /* NonEmptyStringDecodable.swift */; };
+ BE842972F21FE22B5803128040E2A0CA /* ProductsRequestFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB1AE29494FF679ED68FC6191B1007F9 /* ProductsRequestFactory.swift */; };
+ BFE5D0420E2FBBDFE558DAF5C03498C4 /* PurchaseStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A23286ED5558C93B7CD6515FDFF13D6B /* PurchaseStrings.swift */; };
+ C0787A171FA2D751F4946AC3EBE99EF0 /* HTTPStatusCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BA2B0446F8676CF6AFB955BC90BCF40 /* HTTPStatusCode.swift */; };
+ C08BD9D29FF795235836F0DB1B140307 /* ReceiptStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AC56A666004484EE48980FB66564EA4 /* ReceiptStrings.swift */; };
+ C0EBC01260388290B43203BA88D0D011 /* CustomerInfo+OfflineEntitlements.swift in Sources */ = {isa = PBXBuildFile; fileRef = 204CC1573F6C6826DCCCCADDFE4D2458 /* CustomerInfo+OfflineEntitlements.swift */; };
+ C10AFAFC73FC999742DC38C505C4ED4C /* OfflineEntitlementsAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0022D458214DD88C567CC6ADA1AA796 /* OfflineEntitlementsAPI.swift */; };
+ C19C4F122086D1B2EC60182C91C3EF4A /* PaywallComponentPropertyTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D58E95383516C9168038CFA612FAB5 /* PaywallComponentPropertyTypes.swift */; };
+ C1FF83EF8C0E2E49AD87DEA5EBD0154D /* FileRepositoryStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38EDA47D097A5C9EB5899D446B2AB23B /* FileRepositoryStrings.swift */; };
+ C37877E7BE08E313E0239948775E8604 /* DateFormatter+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B3CED652BC3338C72625BF4EC37592C /* DateFormatter+Extensions.swift */; };
+ C40942B092E7382C3D80DC5C389D736C /* EligibilityStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 609D91E64EC4D4A6D042D33246E4A6AD /* EligibilityStrings.swift */; };
+ C4486D13B4187D2F6631CEF197088440 /* PostFeatureEventsOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92791C0DE028C10279B0A9C37325E3BB /* PostFeatureEventsOperation.swift */; };
+ C497D9F2D7CF9A3139F931212AAA229E /* Offerings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 965338A4A31115163DF10EB0DAB5A35F /* Offerings.swift */; };
+ C4C5A2513784F2D139190C7C2779238A /* TimingUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = A22F90A4358F5D13F7E0BF83F7DABD18 /* TimingUtil.swift */; };
+ C4DFEBD184F7D3E5DBC21DA205AB5FF3 /* DeviceCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAD2628DBF8716B69F39514E51E899E8 /* DeviceCache.swift */; };
+ C51BF6C3E3CE4B055CAD1DFD243F4501 /* CustomerInfoResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92CFD404DC47FA588A5FCDBD87FE890A /* CustomerInfoResponse.swift */; };
+ C524453D31C15223446D9DF4E856A117 /* PromotionalOffer+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A6CDA6B79CEF8E8C41348883E4B7D6B /* PromotionalOffer+HybridAdditions.swift */; };
+ C5B982498BFBD84F5D0AD4EC5E7FBEA1 /* ConfigureStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11DFE5F44BA4F88D8736526122B43005 /* ConfigureStrings.swift */; };
+ C5E92926FE1B42120709EDA8524842B9 /* LocalTransactionMetadataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0903967F6943A1CFA693D640698292 /* LocalTransactionMetadataStore.swift */; };
+ C61D4C05EC2F02FF6157FBB228784A19 /* DiagnosticsStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AA483A3A60C364D45C2DC333D452445 /* DiagnosticsStrings.swift */; };
+ C6B34F3A3347FC317ABBFB2DBF7962CE /* UIApplication+RCExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA9B90A92058E60129DF12B69DC9B22C /* UIApplication+RCExtensions.swift */; };
+ C71A17355E7F729ACE56A36F76FFB396 /* Purchases+nonasync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D6433F205FDA9C6CA5BF3413B1A6544 /* Purchases+nonasync.swift */; };
+ C9911D0E33DB5ACA693F5161033F688B /* PaywallCarouselComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC22E86D5F7D7434FC244609913CDA0F /* PaywallCarouselComponent.swift */; };
+ C9C3DBB60EDD836FE5542EACF92603A3 /* StorefrontProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBF1CC7C6CDEDA70A5B1B4A698B43255 /* StorefrontProvider.swift */; };
+ CA33BC7DD153E27579F689CDB273E6D6 /* FatalErrorUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 573585F29EDFC095922D625F0D3B18D8 /* FatalErrorUtil.swift */; };
+ CB7BCFB33043BAFEDD6C9CE15A47ED42 /* Backend.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12090462D9731132865898CF0C5FB3FD /* Backend.swift */; };
+ CC1DA1DCA4BEA977787BCC17C039CB7D /* PaywallCacheWarming.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DA853BC3FDB08FEDFB505FA5E0C6173 /* PaywallCacheWarming.swift */; };
+ CC76A950588A6C13FCCF7AFB6FEDB475 /* StoreEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 910374F9FAEC162807F13EA3A8C85814 /* StoreEnvironment.swift */; };
+ CCB5D0C444055BFDC81D53B54A30ACC6 /* ErrorDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EE0CE490CF7D279BCAC2D9008011A53 /* ErrorDetails.swift */; };
+ CD027B2DD4808DA282F2F36C61D210A2 /* CustomerAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52A64F0DFB604EFF49C3D9E0B8E4237B /* CustomerAPI.swift */; };
+ CD608C8E934B7B25F1EFA643D1DBC531 /* FileHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADF15DBECBD34E96E716BA9E933D2A96 /* FileHandler.swift */; };
+ CFAD65732AA47E2E7B6078E390F9B3BA /* ASN1ObjectIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C826229AC0D01A9A1DCAFD3FA49D664 /* ASN1ObjectIdentifier.swift */; };
+ CFC0971372AF616EFDB66BBD3ED1D554 /* ProductType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D077092FF4842866C6ADEAEA1F7656 /* ProductType.swift */; };
+ D0BDD146E036E53D6C4377121470A0AE /* SimulatedStoreProductsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3C639366CDC49C8E10C63953916B94A /* SimulatedStoreProductsManager.swift */; };
+ D14222F2BE3D20ADD09C6B163B80877D /* TestStoreProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48ED6D60D075E6F7AEF9F00648E6578B /* TestStoreProduct.swift */; };
+ D1EBE83909E908C2FE17803BBD1D8749 /* PaywallCountdownComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC6258085318619BB7C3D5AE8E2F820D /* PaywallCountdownComponent.swift */; };
+ D21CA64CD17B1D2F4F9DD1C6D1E5A1E4 /* DiagnosticsSynchronizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9551D15B300B9E49AB65E0AD100281DB /* DiagnosticsSynchronizer.swift */; };
+ D2A2D1F3F6F9284AAF2CE0F0CC9652DF /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C21042E9373E06C1FF2749EEB2023EC3 /* StoreKit.framework */; };
+ D2EA911BF05E202B311D755DB5C43D81 /* GetOfferingsOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DCDC2ECAE3A42D908B510F6E822DB23 /* GetOfferingsOperation.swift */; };
+ D30B4DB5DB2894428DD65EE18C73E57D /* ISOPeriodFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F49C84CFA1863E7868E02361FBB88D1 /* ISOPeriodFormatter.swift */; };
+ D32850FA660E05D72D8600D49FDC45A9 /* VerificationResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CC8A563BB74D631FDCBB5C81A713BD /* VerificationResult.swift */; };
+ D3CE6AB8A9F13F5F6CFCA33483BD26F4 /* StoreKit2Receipt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 235323C5CE7B865F32673CFFCD7AABAF /* StoreKit2Receipt.swift */; };
+ D47A2A68E3C44BE5D93D241403171340 /* GetIntroEligibilityOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7A22950F419E154E9F7E62484B3CC02 /* GetIntroEligibilityOperation.swift */; };
+ D4DC5EF6A39ABF5419B24DA4719BA0D6 /* Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20084C04DD4D0456F699564398A40991 /* Background.swift */; };
+ D5724DED5E59DB0B69944DD19A7A76FD /* SDKHealthStatus+Icon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7807B1C6EB2D20BFF2529D4C0FF0040E /* SDKHealthStatus+Icon.swift */; };
+ D5A739E830743C21564B04F620C23262 /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8992CDB73A6B912E0847E88CDC2A50E4 /* Strings.swift */; };
+ D5CDAAE0B97EB7C65DD5B77F004AC24F /* BeginRefundRequestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A355796FDA7429F6C3F8AEECF26D13B /* BeginRefundRequestHelper.swift */; };
+ D676EC928CF04E162D3B97B0623901D1 /* PostAdEventsOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CA4FE0D817A656D07A8BECEA1FA4048 /* PostAdEventsOperation.swift */; };
+ D78890D9555AC822C78851ADFD587D27 /* LocalTransactionMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75F61E994F0997F8CE394AAC208B4DC8 /* LocalTransactionMetadata.swift */; };
+ D7A4AAE763DE5C21E9320332071185CF /* Decoder+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9C72F237269BCD25DF95B5E2164B13E /* Decoder+Extensions.swift */; };
+ D7A4E34586ECC6E5D9DC63D6E9F61649 /* SK2StoreTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C18D1196A56E0AFB6F74E4B0D3575CB /* SK2StoreTransaction.swift */; };
+ D8A65A63D27980274ABF72BC3C6A46FC /* StoreProductDiscount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EDEA4635193B221F9EE2E133BC48482 /* StoreProductDiscount.swift */; };
+ D8CE88E583458C9A6FFE816B81DC3FA6 /* PostOfferForSigningOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66FEA9280C5974DC10249711D910CB10 /* PostOfferForSigningOperation.swift */; };
+ D9751900FB7AED06B4C1C181793CB8A4 /* DiagnosticsEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D57A0A13A7C4FE366352708CEC295C5 /* DiagnosticsEvent.swift */; };
+ D97FD83BB13F2936D4D159C25D47B11D /* PaywallData.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39331A8229EED7942827BCE62A01F4D /* PaywallData.swift */; };
+ D9D214FCD2F31E8B3A9286E2D6408142 /* SDKHealthError+CustomNSError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFC2C7BF166DA2E780161AEDA0440880 /* SDKHealthError+CustomNSError.swift */; };
+ DA43B7486BD9A21FBCD6B73FF4C10777 /* PaywallPackageComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515D62CFA3C38D397A27B63D5F56FB63 /* PaywallPackageComponent.swift */; };
+ DA5265CB90A53B414716CF394DD60332 /* AdEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D9DD7E59B0917282E2931D14844DE58 /* AdEvent.swift */; };
+ DA75E9E46C62030FF02C65FD64436F1F /* TransactionMetadataSyncHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AE6C8B273904DBD8CF1DCAD8E07F42C /* TransactionMetadataSyncHelper.swift */; };
+ DB3C51563385F086DB26C27EBB3D5D7E /* ProductsFetcherSK2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F62083A4B0658AE77BFA307A544DBD2 /* ProductsFetcherSK2.swift */; };
+ DC047090760CE5550E9E06946441EFDD /* Purchases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FA5026DD91A2DED9B052E3E1198B3A6 /* Purchases.swift */; };
+ DCF7D0917F451C871DE8F3BF00E7A719 /* StoreKitStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94BCD2231C5EFE24C396F26F671628F4 /* StoreKitStrings.swift */; };
+ DD0FCF9D527DD230105686159BC701E6 /* VirtualCurrency+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F5DABF3AB2AFACD4C62AF610BCACD83 /* VirtualCurrency+HybridAdditions.swift */; };
+ DD1CC65A882933401221C4B69BEEB1E7 /* AttributionPoster.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07C76ACA0029FE791E430477CF5488BF /* AttributionPoster.swift */; };
+ DEFC0D6136E06F4C84440534FE74CB99 /* Codable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C09FB99B96B83ECDA4C9A114BF61B515 /* Codable+Extensions.swift */; };
+ E00E7FEC38BA0C560A4A1D7E8CD8E847 /* PostReceiptDataOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F49C2C260F2FB279A9C18BB6EB020510 /* PostReceiptDataOperation.swift */; };
+ E09CBD1852D8718B8A97CE089CC13162 /* BackendError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 240B1A0BC46B3F7DCC0B4F0A790AC972 /* BackendError.swift */; };
+ E106FBD688BB86B42FF7DA63820A2DB0 /* CustomerCenterConfigData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C729B739E6AE47DBF843097F81DEB596 /* CustomerCenterConfigData.swift */; };
+ E1210474FADC31DCB701CCF595BCB678 /* HTTPResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B5AA42CE08338CF0FC191DB815A38F /* HTTPResponse.swift */; };
+ E192696EF2F37D23D3A366595667D7F5 /* TransactionsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CBFB8711101557F06EE0748753997E /* TransactionsManager.swift */; };
+ E2295E3C99C8E9ED05E9CE2F0BF2DFD1 /* PaywallComponentsData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DADB2F738C652A10125B3D891E321E4 /* PaywallComponentsData.swift */; };
+ E245DB241936662149239F251BAF8F76 /* Operators+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE96A3D55B67224E00ED86E5867DD3C3 /* Operators+Extensions.swift */; };
+ E265123CB9C97B72F2CC272BC5D98737 /* DefaultDecodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C51AE102965B03FA08BD6F7BEC4950A /* DefaultDecodable.swift */; };
+ E2E63416874647E29FABFD5F4457703B /* TransactionNotifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B99AC8998CBD5E39EAF55D3A285403C /* TransactionNotifications.swift */; };
+ E38883BAA6278EAECB9299E1B38AC69C /* PreferredLocalesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 382B9CE21DD4DC115C8E591FCD6FD124 /* PreferredLocalesProvider.swift */; };
+ E5485009A0D5F2CDA6ED0177ECAFE746 /* PurchasedSK2Product.swift in Sources */ = {isa = PBXBuildFile; fileRef = C546CE2528372F2E3CE7F7FF44AA8B0C /* PurchasedSK2Product.swift */; };
+ E69CAD7E81C16443125E4DA3E4D96480 /* PaywallButtonComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6559E0AA4A21488E5AF0280AAA41E469 /* PaywallButtonComponent.swift */; };
+ E6DC692C7D87A5FCA6C447C51F583129 /* StoreProductDiscount+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FAB0193EAC1911F1FE8D3DE4E149552 /* StoreProductDiscount+HybridAdditions.swift */; };
+ E78F0CCC5F66A632EDC1CAE094657BDA /* Set+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B46B23738D8EAE9DD716F061861A47B2 /* Set+Extensions.swift */; };
+ E8C2B760491C92809D413D143B2A03D1 /* Date+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEB9F17B978BC7E226389FA816CC7123 /* Date+Extensions.swift */; };
+ E91DE9EA53A5C841C09CB76AA923F1CA /* HTTPRequestBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DA7A78EFA238D1D51ACA5C7A723974E /* HTTPRequestBody.swift */; };
+ E9247C0420E6655DD68EC62404FAE64C /* SK1Storefront.swift in Sources */ = {isa = PBXBuildFile; fileRef = 600CC8EB2F5188ABB89DEF7BB7838C86 /* SK1Storefront.swift */; };
+ E9447A299FD6DB996759DCE4B4B609F9 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25E25D4FBC2376DD3A5F3B4723A6669E /* Constants.swift */; };
+ E98EBDDB7D5A2D571E4A37E0AC218C68 /* KeyedDeferredValueStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 291662A72F8724CA0C2022AA2744585E /* KeyedDeferredValueStore.swift */; };
+ E999DEC784AE613847A2B4E3960A613D /* BackendConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A60B144B9CE8E6512A831EAC32E6089 /* BackendConfiguration.swift */; };
+ EB43921987558ADBB6654583453FC747 /* CallbackCacheStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBDABBB513EBF5A01231357F6511E84A /* CallbackCacheStatus.swift */; };
+ EB992F6DEC2F138549EF43B672E0C455 /* RefundRequestStatus+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761291AD85C6761A0D19DEDABFC56053 /* RefundRequestStatus+HybridAdditions.swift */; };
+ EEB95AE9933FF2BC0D559D7FEF448755 /* WebRedemptionStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A19C133F59B1808E6D3932D56DC8CEB /* WebRedemptionStrings.swift */; };
+ EF9BDB5B7D0AC3BFF6E78446CB8CDCBA /* ComponentOverrides.swift in Sources */ = {isa = PBXBuildFile; fileRef = 369C96C96A059C108C26F63EF4C096B2 /* ComponentOverrides.swift */; };
+ EFAD008F7E4995E7CE79291FC3FE4652 /* StoreTransaction+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A10F8EA83C029E9B6802BB90F1F9816 /* StoreTransaction+HybridAdditions.swift */; };
+ F0FA12C9742296F7418CF1A04C6FE48A /* FileReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB41E7346EFDE57E402723AE013355EF /* FileReader.swift */; };
+ F1497A9480B7D8A32541AF9A8D1944D5 /* ASN1ObjectIdentifierBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64CD77CEDC8C3185F1FE264816ADF9D8 /* ASN1ObjectIdentifierBuilder.swift */; };
+ F17C543C5A5BF7613D6EE05E5F7C2D39 /* AppleReceiptBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9D9683F758C52576E83A191DF57B0A /* AppleReceiptBuilder.swift */; };
+ F1ED2FFF6A85A43643AB68A99CE6DCC5 /* MacDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 299974220C820FA3089AE7228473EFB7 /* MacDevice.swift */; };
+ F545CEA115FD66C136DE436CFA9459BA /* SK1StoreTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 705AC44DA1E8E98E0B441DB0948BFF0B /* SK1StoreTransaction.swift */; };
+ F552CB4E0A203E85A72D0C1C9D42B38A /* Error+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4400C64812BBD064D273842F65A53DD /* Error+Extensions.swift */; };
+ F589F55B8508CD5B519CE739E4A3C6C0 /* ASN1Container.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA682E9FE7118CE9B9C8FF66FBCA9D3A /* ASN1Container.swift */; };
+ F695AA75AF3DEECCD9345CAD9DF7151E /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13FB5753CF3B322E6D6ED418E012E061 /* Package.swift */; };
+ F7D16DA69B13B1FE0142A981CC6E2677 /* Pods-App-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E75B29AE1472628C750F928572B5885 /* Pods-App-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F7E14028DA7AD0C0C71C5402B168185E /* MapAppStoreDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAF174732015CC1C1E5DDCBD5C1014D3 /* MapAppStoreDetector.swift */; };
+ F815DAEFCBA4D5597D9DF77055028858 /* SimulatedStorePurchaseUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BF2BB4EAD6110F50B678BEEA212AFFA /* SimulatedStorePurchaseUI.swift */; };
+ F8217905363A5DC8876064053E3042C1 /* CustomerInfoCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = E64A488F942CAB289E50838D99391CA8 /* CustomerInfoCallback.swift */; };
+ F973398F934D30C07E6092C82785F74F /* Offerings+HybridAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9934FEA0DF74CCE48B0639282EF2C87 /* Offerings+HybridAdditions.swift */; };
+ F9FFFA8CD4376820B19F4E6AC416955C /* DirectoryHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41B231852638AC98276D9882F5B8942F /* DirectoryHelper.swift */; };
+ FA015721ACEC320497D11EC381E6C83A /* SK2Storefront.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22D26B7714838694A449B7595D4FF67 /* SK2Storefront.swift */; };
+ FA74D8A2EAB60D6B069EA30E2DCD8872 /* FeatureEventsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D7638F462DE697A04D926423C8BFBE1 /* FeatureEventsRequest.swift */; };
+ FB44DCEBCA144D51E8C0879F09B194F3 /* StoreKit2TransactionFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F811A0E6D79CE9AE93569A1B189427 /* StoreKit2TransactionFetcher.swift */; };
+ FBF04E2554B6F5DD1830A1C8F8B41CF5 /* CustomerCenterConfigCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A75172A4413D9B31F18ACDB27F8365F /* CustomerCenterConfigCallback.swift */; };
+ FC6E16AF548205ED2D10E2B6A0B034A6 /* VirtualCurrencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E767D12636C059F2945360E3798A816 /* VirtualCurrencies.swift */; };
+ FDBB3A93EE41E43FF91E07FFD4DBD8C9 /* PaywallImageComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE17C82E7C2192C4C5E7AD92ABF19E6A /* PaywallImageComponent.swift */; };
+ FF0BF4F77972ED239E5A3262FBC85761 /* SubscriptionHistoryTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 481504BF7369B000939A050011E64363 /* SubscriptionHistoryTracker.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 1CE178B10C550E37F0749E7A5188F684 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = E3F5D7A4C3AB3CFEB8B1C429405FED63;
+ remoteInfo = "PurchasesHybridCommon-PurchasesHybridCommon";
+ };
+ 79B4B6C291361F77C5AE178A64078EE0 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = A9FD6F34305C03A1CC3A10B207522C48;
+ remoteInfo = RevenueCat;
+ };
+ 8BE5ABBF2AA986C8A26F97BDB17C2873 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = A9FD6F34305C03A1CC3A10B207522C48;
+ remoteInfo = RevenueCat;
+ };
+ BC049305D5A9B9D50C0F3961ECB7D8FB /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 58084B0686015596789324D0C42368C5;
+ remoteInfo = "RevenueCat-RevenueCat";
+ };
+ BC8C6F246651D6565B3363A0602268C4 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = D47CB7C8CD3E8F81E812E1BF4156FE15;
+ remoteInfo = PurchasesHybridCommon;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 01E1E4328DE00E9A112E7B280A00D700 /* Deprecations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecations.swift; path = Sources/Misc/Deprecations.swift; sourceTree = ""; };
+ 02E068784BF9CDD02905819DA9274C3E /* PostIsPurchaseAllowedByRestoreBehaviorOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostIsPurchaseAllowedByRestoreBehaviorOperation.swift; path = Sources/Networking/Operations/PostIsPurchaseAllowedByRestoreBehaviorOperation.swift; sourceTree = ""; };
+ 0399EA39C6ECD0B8E9FF2EAC45A595A1 /* PaywallData+Localization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PaywallData+Localization.swift"; path = "Sources/Paywalls/PaywallData+Localization.swift"; sourceTree = ""; };
+ 0406D4D0D251FD0240084DDDD47A2AAC /* SandboxEnvironmentDetector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SandboxEnvironmentDetector.swift; path = Sources/Misc/SandboxEnvironmentDetector.swift; sourceTree = ""; };
+ 042E2E05C8AAA27935046E9B1CC28EEE /* Array+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Array+Extensions.swift"; path = "Sources/FoundationExtensions/Array+Extensions.swift"; sourceTree = ""; };
+ 04640A438AEB80D9CDC05F4498C45246 /* EventsManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EventsManager.swift; path = Sources/Events/EventsManager.swift; sourceTree = ""; };
+ 050860AE16CF6518B71B90904CA8F627 /* EventsRequest+CustomerCenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "EventsRequest+CustomerCenter.swift"; path = "Sources/CustomerCenter/Events/Networking/EventsRequest+CustomerCenter.swift"; sourceTree = ""; };
+ 05373132568C97719C8133092E0A62CC /* PurchasesType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PurchasesType.swift; path = Sources/Purchasing/Purchases/PurchasesType.swift; sourceTree = ""; };
+ 05CE0A318507A1B03E71FC3AE3B8A616 /* RevenueCat-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RevenueCat-umbrella.h"; sourceTree = ""; };
+ 067849C6531AF8172F2B92E8C70E55AC /* SubscriptionPeriod.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionPeriod.swift; path = Sources/Purchasing/StoreKitAbstractions/SubscriptionPeriod.swift; sourceTree = ""; };
+ 07C76ACA0029FE791E430477CF5488BF /* AttributionPoster.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AttributionPoster.swift; path = Sources/Attribution/AttributionPoster.swift; sourceTree = ""; };
+ 08DEBD207C132DF1952C479926EF40A2 /* AttributionData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AttributionData.swift; path = Sources/Attribution/AttributionData.swift; sourceTree = ""; };
+ 09209143938B2386BB3906033655559D /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-App.debug.xcconfig"; sourceTree = ""; };
+ 093422977BA2834C3C9EE9B19661FF77 /* CommonFunctionality.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CommonFunctionality.swift; path = ios/PurchasesHybridCommon/PurchasesHybridCommon/CommonFunctionality.swift; sourceTree = ""; };
+ 09349528089AE3BF1C1ADA84D9101E55 /* DiagnosticsEventsRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiagnosticsEventsRequest.swift; path = Sources/Diagnostics/Networking/DiagnosticsEventsRequest.swift; sourceTree = ""; };
+ 09B5AA42CE08338CF0FC191DB815A38F /* HTTPResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HTTPResponse.swift; path = Sources/Networking/HTTPClient/HTTPResponse.swift; sourceTree = ""; };
+ 0A1C3EFF43297F918D2F35BA617C14C8 /* SimulatedStoreTransaction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SimulatedStoreTransaction.swift; path = Sources/Purchasing/SimulatedStore/SimulatedStoreTransaction.swift; sourceTree = ""; };
+ 0AC56A666004484EE48980FB66564EA4 /* ReceiptStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReceiptStrings.swift; path = Sources/LocalReceiptParsing/Helpers/ReceiptStrings.swift; sourceTree = ""; };
+ 0ACD1A5A68737844A45D1D0FCB388D9A /* HealthOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HealthOperation.swift; path = Sources/Networking/Operations/HealthOperation.swift; sourceTree = ""; };
+ 0ADC5CF5FB80DF59ABBB2AA88301A337 /* NetworkError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkError.swift; path = Sources/Networking/HTTPClient/NetworkError.swift; sourceTree = ""; };
+ 0BA54EC4A66CAF29728AD641B5EC7462 /* GetWebOfferingProductsOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GetWebOfferingProductsOperation.swift; path = Sources/Networking/Operations/GetWebOfferingProductsOperation.swift; sourceTree = ""; };
+ 0BE26AC956D611F452BF266415E186C7 /* Locale+Comparison.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Locale+Comparison.swift"; path = "Sources/Paywalls/Locale+Comparison.swift"; sourceTree = ""; };
+ 0C18D1196A56E0AFB6F74E4B0D3575CB /* SK2StoreTransaction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SK2StoreTransaction.swift; path = Sources/Purchasing/StoreKitAbstractions/SK2StoreTransaction.swift; sourceTree = ""; };
+ 0C51AE102965B03FA08BD6F7BEC4950A /* DefaultDecodable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultDecodable.swift; path = Sources/Misc/Codable/DefaultDecodable.swift; sourceTree = ""; };
+ 0C80098D91C52427263BECAB1F82D20F /* WinBackOfferEligibilityCalculatorType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WinBackOfferEligibilityCalculatorType.swift; path = "Sources/Purchasing/StoreKit2/Win-Back Offers/WinBackOfferEligibilityCalculatorType.swift"; sourceTree = ""; };
+ 0CCBBBCD0B4137EC4520A77CE9DB8616 /* Dictionary+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Dictionary+Extensions.swift"; path = "Sources/FoundationExtensions/Dictionary+Extensions.swift"; sourceTree = ""; };
+ 0D46CB95801AB522A4036DEC508DC5B6 /* SK1StoreProduct.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SK1StoreProduct.swift; path = Sources/Purchasing/StoreKitAbstractions/SK1StoreProduct.swift; sourceTree = ""; };
+ 0DFBA4B190EFE203B3F2586C1BD3D910 /* RevenueCat.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RevenueCat.release.xcconfig; sourceTree = ""; };
+ 0F4600CE4F86683888FA412DD3200ABE /* HTTPRequest+Signing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "HTTPRequest+Signing.swift"; path = "Sources/Security/HTTPRequest+Signing.swift"; sourceTree = ""; };
+ 10B1AA5292666C89BB23EAA215885DDF /* GetIntroEligibilityResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GetIntroEligibilityResponse.swift; path = Sources/Networking/Responses/GetIntroEligibilityResponse.swift; sourceTree = ""; };
+ 11DFE5F44BA4F88D8736526122B43005 /* ConfigureStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConfigureStrings.swift; path = Sources/Logging/Strings/ConfigureStrings.swift; sourceTree = ""; };
+ 12090462D9731132865898CF0C5FB3FD /* Backend.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Backend.swift; path = Sources/Networking/Backend.swift; sourceTree = ""; };
+ 125FD7AF9118CF5729AF7B557AF935A8 /* IsPurchaseAllowedByRestoreBehaviorCallback.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IsPurchaseAllowedByRestoreBehaviorCallback.swift; path = Sources/Networking/Caching/IsPurchaseAllowedByRestoreBehaviorCallback.swift; sourceTree = ""; };
+ 12CCC30F9D4787599E16E9D03D5AA781 /* LogInOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LogInOperation.swift; path = Sources/Networking/Operations/LogInOperation.swift; sourceTree = ""; };
+ 12DE160C6746F68C2CD64AC5F7170E14 /* Purchases+HybridAdditions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Purchases+HybridAdditions.swift"; path = "ios/PurchasesHybridCommon/PurchasesHybridCommon/Purchases+HybridAdditions.swift"; sourceTree = ""; };
+ 1309DABE4238A9917EB560A21A7DA63A /* DebugViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DebugViewModel.swift; path = Sources/Support/DebugUI/DebugViewModel.swift; sourceTree = ""; };
+ 1334C5F2A9F962CA1F7F2F47425A447F /* Result+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Result+Extensions.swift"; path = "Sources/FoundationExtensions/Result+Extensions.swift"; sourceTree = ""; };
+ 13771028F9A83D1381BAB98A92991E48 /* DNSChecker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DNSChecker.swift; path = Sources/Networking/HTTPClient/DNSChecker.swift; sourceTree = ""; };
+ 13FB5753CF3B322E6D6ED418E012E061 /* Package.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Package.swift; path = Sources/Purchasing/Package.swift; sourceTree = ""; };
+ 14073EAA11882BFEA66F9D5446A20C01 /* DiagnosticsTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiagnosticsTracker.swift; path = Sources/Diagnostics/DiagnosticsTracker.swift; sourceTree = ""; };
+ 153B8FA4E5198A2A285226070C62493D /* Offering+HybridAdditions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Offering+HybridAdditions.swift"; path = "ios/PurchasesHybridCommon/PurchasesHybridCommon/Offering+HybridAdditions.swift"; sourceTree = ""; };
+ 154AAA9A3B0432A54E8802E6C7AD0CAB /* WebPurchaseRedemptionHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebPurchaseRedemptionHelper.swift; path = Sources/WebPurchaseRedemption/WebPurchaseRedemptionHelper.swift; sourceTree = ""; };
+ 163559D4E96350598D8E7A1511432D47 /* NetworkStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStrings.swift; path = Sources/Logging/Strings/NetworkStrings.swift; sourceTree = ""; };
+ 167781201460DD988699AD9F132B8239 /* EventsRequest+Paywall.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "EventsRequest+Paywall.swift"; path = "Sources/Paywalls/Events/Networking/EventsRequest+Paywall.swift"; sourceTree = ""; };
+ 16DDEB9434DD6BAA4198327BE0524964 /* CustomerInfoManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomerInfoManager.swift; path = Sources/Identity/CustomerInfoManager.swift; sourceTree = ""; };
+ 171EF18DDC6787FAF20A5F9BF6D4BD8F /* PaywallExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PaywallExtensions.swift; path = Sources/Support/PaywallExtensions.swift; sourceTree = ""; };
+ 181E1EE6E30B8FC9E1493E8579F6148D /* ReceiptRefreshPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReceiptRefreshPolicy.swift; path = Sources/Purchasing/ReceiptRefreshPolicy.swift; sourceTree = ""; };
+ 1898596839397C9AD5DA180A888003F5 /* PurchasedProductsFetcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PurchasedProductsFetcher.swift; path = Sources/OfflineEntitlements/PurchasedProductsFetcher.swift; sourceTree = ""; };
+ 18BCDD139ADDE82AB46C6785541DFA6D /* TransactionReason.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionReason.swift; path = Sources/Purchasing/StoreKitAbstractions/TransactionReason.swift; sourceTree = ""; };
+ 190C1838CF4C354E2B7F9EC2FD60CCA0 /* Logger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logger.swift; path = Sources/Logging/Logger.swift; sourceTree = ""; };
+ 1A19C133F59B1808E6D3932D56DC8CEB /* WebRedemptionStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebRedemptionStrings.swift; path = Sources/Logging/Strings/WebRedemptionStrings.swift; sourceTree = ""; };
+ 1B27429EA2264D28F334AF7BA26B273E /* PurchaseOwnershipType+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PurchaseOwnershipType+Extensions.swift"; path = "Sources/CodableExtensions/PurchaseOwnershipType+Extensions.swift"; sourceTree = ""; };
+ 1B60F293050E52C352755F0B7DDBCDB2 /* OfferingsFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OfferingsFactory.swift; path = Sources/Purchasing/OfferingsFactory.swift; sourceTree = ""; };
+ 1B8724774D8EAA3D595E2AD2D6F0A2DA /* EventsHTTPRequestPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EventsHTTPRequestPath.swift; path = Sources/Events/Networking/EventsHTTPRequestPath.swift; sourceTree = ""; };
+ 1BF2BB4EAD6110F50B678BEEA212AFFA /* SimulatedStorePurchaseUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SimulatedStorePurchaseUI.swift; path = Sources/Purchasing/SimulatedStore/SimulatedStorePurchaseUI.swift; sourceTree = ""; };
+ 1CF759005470A151F5C92C1ABCF08A1C /* SystemInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SystemInfo.swift; path = Sources/Misc/SystemInfo.swift; sourceTree = ""; };
+ 1CFEAB3D036DEBADB4C70917B3971425 /* PaywallComponentBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PaywallComponentBase.swift; path = Sources/Paywalls/Components/Common/PaywallComponentBase.swift; sourceTree = ""; };
+ 1CFF995830964954DCE98FA86C0769AC /* FileRepository.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileRepository.swift; path = Sources/Caching/FileRepository.swift; sourceTree = ""; };
+ 1D57A0A13A7C4FE366352708CEC295C5 /* DiagnosticsEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiagnosticsEvent.swift; path = Sources/Diagnostics/DiagnosticsEvent.swift; sourceTree = ""; };
+ 1D758AE9F572BFC5F198EA01E9DF975E /* RedirectLoggerTaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RedirectLoggerTaskDelegate.swift; path = Sources/Networking/HTTPClient/RedirectLoggerTaskDelegate.swift; sourceTree = ""; };
+ 1DCDC2ECAE3A42D908B510F6E822DB23 /* GetOfferingsOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GetOfferingsOperation.swift; path = Sources/Networking/Operations/GetOfferingsOperation.swift; sourceTree = ""; };
+ 1ECE680BBFCE5A638EAF2E3100B14519 /* PostOfferResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostOfferResponse.swift; path = Sources/Networking/Responses/PostOfferResponse.swift; sourceTree = ""; };
+ 1EE0CE490CF7D279BCAC2D9008011A53 /* ErrorDetails.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorDetails.swift; path = "Sources/Error Handling/ErrorDetails.swift"; sourceTree = ""; };
+ 20084C04DD4D0456F699564398A40991 /* Background.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Background.swift; path = Sources/Paywalls/Components/Common/Background.swift; sourceTree = ""; };
+ 204CC1573F6C6826DCCCCADDFE4D2458 /* CustomerInfo+OfflineEntitlements.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CustomerInfo+OfflineEntitlements.swift"; path = "Sources/OfflineEntitlements/CustomerInfo+OfflineEntitlements.swift"; sourceTree = ""; };
+ 219AB6D5487157E08F7CE7DC21CBC1FF /* GetCustomerInfoOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GetCustomerInfoOperation.swift; path = Sources/Networking/Operations/GetCustomerInfoOperation.swift; sourceTree = ""; };
+ 2260E01F523D44DA02E6F1C279B3324B /* DeepLinkParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DeepLinkParser.swift; path = Sources/DeepLink/DeepLinkParser.swift; sourceTree = ""; };
+ 22CD3659713C78546E489A2A66815B86 /* HTTPClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HTTPClient.swift; path = Sources/Networking/HTTPClient/HTTPClient.swift; sourceTree = ""; };
+ 22F6DD5AE3228D84A03651163F045D95 /* CachingTrialOrIntroPriceEligibilityChecker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CachingTrialOrIntroPriceEligibilityChecker.swift; path = Sources/Purchasing/CachingTrialOrIntroPriceEligibilityChecker.swift; sourceTree = ""; };
+ 235323C5CE7B865F32673CFFCD7AABAF /* StoreKit2Receipt.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoreKit2Receipt.swift; path = Sources/Purchasing/StoreKit2/StoreKit2Receipt.swift; sourceTree = ""; };
+ 240B1A0BC46B3F7DCC0B4F0A790AC972 /* BackendError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BackendError.swift; path = "Sources/Error Handling/BackendError.swift"; sourceTree = ""; };
+ 244DB81E8FD0371C546E639D39A9F21A /* AdEventStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdEventStore.swift; path = Sources/Ads/Events/AdEventStore.swift; sourceTree = ""; };
+ 254D224EE53AC495F856B7B6FAFE64FA /* Border.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Border.swift; path = Sources/Paywalls/Components/Common/Border.swift; sourceTree = ""; };
+ 2582F971E65634F0CF024A3785204906 /* RevenueCat.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RevenueCat.modulemap; sourceTree = ""; };
+ 25E25D4FBC2376DD3A5F3B4723A6669E /* Constants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Constants.swift; path = ios/PurchasesHybridCommon/PurchasesHybridCommon/Constants.swift; sourceTree = ""; };
+ 267F75A0D2086BDC6DCC403A0CF82358 /* PaywallStickyFooterComponent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PaywallStickyFooterComponent.swift; path = Sources/Paywalls/Components/PaywallStickyFooterComponent.swift; sourceTree = ""; };
+ 276E2BC6FC3AF1829144103AC86A4FEC /* SK1StoreProductDiscount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SK1StoreProductDiscount.swift; path = Sources/Purchasing/StoreKitAbstractions/SK1StoreProductDiscount.swift; sourceTree = ""; };
+ 27B3A3294778ED9BEE5035B2AE722969 /* EntitlementVerificationMode+HybridAdditions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "EntitlementVerificationMode+HybridAdditions.swift"; path = "ios/PurchasesHybridCommon/PurchasesHybridCommon/EntitlementVerificationMode+HybridAdditions.swift"; sourceTree = ""; };
+ 28302208340DDFACF06CF1E952BCD375 /* PaywallAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PaywallAnimation.swift; path = Sources/Paywalls/Components/Transitions/PaywallAnimation.swift; sourceTree = ""; };
+ 28909F20999A48234075586D77F3D448 /* TrackingManagerProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackingManagerProxy.swift; path = Sources/Attribution/TrackingManagerProxy.swift; sourceTree = ""; };
+ 291662A72F8724CA0C2022AA2744585E /* KeyedDeferredValueStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KeyedDeferredValueStore.swift; path = Sources/Caching/KeyedDeferredValueStore.swift; sourceTree = ""; };
+ 299974220C820FA3089AE7228473EFB7 /* MacDevice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MacDevice.swift; path = Sources/Misc/MacDevice.swift; sourceTree = ""; };
+ 29F9D1208D1C4BB939FC2F38F8B5E866 /* InAppPurchaseBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InAppPurchaseBuilder.swift; path = Sources/LocalReceiptParsing/Builders/InAppPurchaseBuilder.swift; sourceTree = ""; };
+ 2A724FFF66F3706AF6B6F9F03DDCBD30 /* PaywallPurchaseButtonComponent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PaywallPurchaseButtonComponent.swift; path = Sources/Paywalls/Components/PaywallPurchaseButtonComponent.swift; sourceTree = ""; };
+ 2B3CED652BC3338C72625BF4EC37592C /* DateFormatter+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DateFormatter+Extensions.swift"; path = "Sources/LocalReceiptParsing/DataConverters/DateFormatter+Extensions.swift"; sourceTree = ""; };
+ 2B4C221F9E26239D362F074E8B3AB200 /* PostSubscriberAttributesOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostSubscriberAttributesOperation.swift; path = Sources/Networking/Operations/PostSubscriberAttributesOperation.swift; sourceTree = ""; };
+ 2BA2B0446F8676CF6AFB955BC90BCF40 /* HTTPStatusCode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HTTPStatusCode.swift; path = Sources/Networking/HTTPClient/HTTPStatusCode.swift; sourceTree = ""; };
+ 2CA4FE0D817A656D07A8BECEA1FA4048 /* PostAdEventsOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostAdEventsOperation.swift; path = Sources/Ads/Events/Networking/PostAdEventsOperation.swift; sourceTree = ""; };
+ 2CDB60101318931DC0BC33B504865A0B /* LogInCallback.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LogInCallback.swift; path = Sources/Networking/Caching/LogInCallback.swift; sourceTree = ""; };
+ 2CFCD5D3EF7A3B23BE90664F4C137688 /* StoreProduct+HybridAdditions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "StoreProduct+HybridAdditions.swift"; path = "ios/PurchasesHybridCommon/PurchasesHybridCommon/StoreProduct+HybridAdditions.swift"; sourceTree = ""; };
+ 2D7638F462DE697A04D926423C8BFBE1 /* FeatureEventsRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FeatureEventsRequest.swift; path = Sources/Events/FeatureEvents/Networking/FeatureEventsRequest.swift; sourceTree = ""; };
+ 2DE6D62CB5B0507D61F0943DC5B7803F /* DangerousSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DangerousSettings.swift; path = Sources/Misc/DangerousSettings.swift; sourceTree = ""; };
+ 2E9D9683F758C52576E83A191DF57B0A /* AppleReceiptBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AppleReceiptBuilder.swift; path = Sources/LocalReceiptParsing/Builders/AppleReceiptBuilder.swift; sourceTree = ""; };
+ 2F5CC5B8C02683C98E9A43443D3C0005 /* ErrorUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorUtils.swift; path = "Sources/Error Handling/ErrorUtils.swift"; sourceTree = ""; };
+ 2F957AC5C000E03E731AFBC2C95A1B32 /* RevenueCat-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "RevenueCat-Info.plist"; sourceTree = ""; };
+ 3091166AE010D315AFE23BA999429369 /* GetVirtualCurrenciesOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GetVirtualCurrenciesOperation.swift; path = Sources/Networking/Operations/GetVirtualCurrenciesOperation.swift; sourceTree = ""; };
+ 31E998A2F775507890CED89B91DA99CC /* TrialOrIntroPriceEligibilityChecker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrialOrIntroPriceEligibilityChecker.swift; path = Sources/Purchasing/TrialOrIntroPriceEligibilityChecker.swift; sourceTree = ""; };
+ 339746A8D84F4A4528121114106A6473 /* Clock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Clock.swift; path = Sources/Misc/DateAndTime/Clock.swift; sourceTree = ""; };
+ 3413C64E09BB73FF739C2F58A9CCB69B /* DateExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateExtensions.swift; path = Sources/Misc/DateAndTime/DateExtensions.swift; sourceTree = ""; };
+ 34416EDC539D29D5CF431CD65CEE0A3C /* PaywallV2CacheWarming.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PaywallV2CacheWarming.swift; path = Sources/Paywalls/Components/PaywallV2CacheWarming.swift; sourceTree = ""; };
+ 35158BFC494344C16B5ABBC1099786BF /* StoreKit2StorefrontListener.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoreKit2StorefrontListener.swift; path = Sources/Purchasing/StoreKit2/StoreKit2StorefrontListener.swift; sourceTree = ""; };
+ 369C96C96A059C108C26F63EF4C096B2 /* ComponentOverrides.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComponentOverrides.swift; path = Sources/Paywalls/Components/Common/ComponentOverrides.swift; sourceTree = ""; };
+ 36B3F59C973860A8269FBAC688EF48C8 /* PurchasesError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PurchasesError.swift; path = "Sources/Error Handling/PurchasesError.swift"; sourceTree = ""; };
+ 36C45E16C55EA2AE8F0D1E7CFF16B685 /* AttributionTypeFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AttributionTypeFactory.swift; path = Sources/Attribution/AttributionTypeFactory.swift; sourceTree = ""; };
+ 370718947692D51A24D4CE246D0158C9 /* IsPurchaseAllowedByRestoreBehaviorResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IsPurchaseAllowedByRestoreBehaviorResponse.swift; path = Sources/Networking/Responses/IsPurchaseAllowedByRestoreBehaviorResponse.swift; sourceTree = ""; };
+ 37F15050F581CBB4C04E20BB331FDA3A /* PaywallViewMode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PaywallViewMode.swift; path = Sources/Paywalls/PaywallViewMode.swift; sourceTree = ""; };
+ 38001264FD37589AF13374D1B55C3580 /* BackendErrorStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BackendErrorStrings.swift; path = Sources/Logging/Strings/BackendErrorStrings.swift; sourceTree = ""; };
+ 382B9CE21DD4DC115C8E591FCD6FD124 /* PreferredLocalesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PreferredLocalesProvider.swift; path = Sources/Misc/Locale/PreferredLocalesProvider.swift; sourceTree = ""; };
+ 38EDA47D097A5C9EB5899D446B2AB23B /* FileRepositoryStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FileRepositoryStrings.swift; path = Sources/Logging/Strings/FileRepositoryStrings.swift; sourceTree = ""; };
+ 39085DB222F7F991FA160FDD2EA404DD /* GetWebBillingProductsOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GetWebBillingProductsOperation.swift; path = Sources/Networking/Operations/GetWebBillingProductsOperation.swift; sourceTree = ""; };
+ 3A10F8EA83C029E9B6802BB90F1F9816 /* StoreTransaction+HybridAdditions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "StoreTransaction+HybridAdditions.swift"; path = "ios/PurchasesHybridCommon/PurchasesHybridCommon/StoreTransaction+HybridAdditions.swift"; sourceTree = ""; };
+ 3A79718881EF41876F0ACC9A8C44AB73 /* FrameworkDisambiguation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FrameworkDisambiguation.swift; path = Sources/Support/FrameworkDisambiguation.swift; sourceTree = ""; };
+ 3AA9124C018EA7BF6460091D86216692 /* PurchasesHybridCommon-PurchasesHybridCommon */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "PurchasesHybridCommon-PurchasesHybridCommon"; path = PurchasesHybridCommon.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3BDA3EC3179F2D6F9366E6B08F62428E /* ProductsFetcherSK1.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsFetcherSK1.swift; path = Sources/Purchasing/StoreKit1/ProductsFetcherSK1.swift; sourceTree = ""; };
+ 3CA34C54BB65ECDFACD48E340F35CFAD /* StoreMessageType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoreMessageType.swift; path = Sources/Support/StoreMessageType.swift; sourceTree = ""; };
+ 3D4E5CAC728FFED4E79837CA237069E2 /* CacheStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CacheStatus.swift; path = Sources/Caching/CacheStatus.swift; sourceTree = ""; };
+ 3DF1E3F994BD3D68530C7CA1F5172F71 /* CacheFetchPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CacheFetchPolicy.swift; path = Sources/Networking/Caching/CacheFetchPolicy.swift; sourceTree = ""; };
+ 3F3829F4F6709CEF1D465E1B090726BF /* StoreTransaction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoreTransaction.swift; path = Sources/Purchasing/StoreKitAbstractions/StoreTransaction.swift; sourceTree = ""; };
+ 3F929B4C2C5B3A0269A40D220994CFB9 /* HealthReportAvailabilityOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HealthReportAvailabilityOperation.swift; path = Sources/Networking/Operations/HealthReportAvailabilityOperation.swift; sourceTree = ""; };
+ 3FF3D640A2B8E39DDEB652E3C42552FE /* HTTPResponseBody.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HTTPResponseBody.swift; path = Sources/Networking/HTTPClient/HTTPResponseBody.swift; sourceTree = ""; };
+ 402596F229D0A94560681BDDA848E0B4 /* EnsureNonEmptyCollectionDecodable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnsureNonEmptyCollectionDecodable.swift; path = Sources/Misc/Codable/EnsureNonEmptyCollectionDecodable.swift; sourceTree = ""; };
+ 411B45CA57486D588D69BE38012EBC60 /* AsyncExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncExtensions.swift; path = Sources/FoundationExtensions/AsyncExtensions.swift; sourceTree = ""; };
+ 4146B5A85087D99E08A1A3BD37BD8606 /* EmptyFile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EmptyFile.swift; path = Sources/DocCDocumentation/EmptyFile.swift; sourceTree = ""; };
+ 416DB5A58251BC0BA7DA6C8F7BE5E68C /* WebBillingProduct+SimulatedStoreProduct.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "WebBillingProduct+SimulatedStoreProduct.swift"; path = "Sources/Purchasing/SimulatedStore/WebBillingProduct+SimulatedStoreProduct.swift"; sourceTree = ""; };
+ 419AFCB98F8B32E3B67CBE20C5AD78EE /* StoreKitWorkarounds.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoreKitWorkarounds.swift; path = Sources/Purchasing/StoreKitAbstractions/StoreKitWorkarounds.swift; sourceTree = ""; };
+ 41A835CD3320BF4219C95068A6A91A85 /* VirtualCurrencyStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualCurrencyStrings.swift; path = Sources/Logging/Strings/VirtualCurrencyStrings.swift; sourceTree = ""; };
+ 41B231852638AC98276D9882F5B8942F /* DirectoryHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DirectoryHelper.swift; path = Sources/Caching/DirectoryHelper.swift; sourceTree = ""; };
+ 421EAA5204753DA3639CE19B2FB2752D /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Sources/Purchasing/Configuration.swift; sourceTree = ""; };
+ 42A3AB7080B77B6F0334F03A9C8B2D84 /* InMemoryCachedObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InMemoryCachedObject.swift; path = Sources/Caching/InMemoryCachedObject.swift; sourceTree = ""; };
+ 42C2D7B43E931C1C9B757627A675B90B /* CustomerCenterConfigAPI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomerCenterConfigAPI.swift; path = Sources/Networking/CustomerCenterConfigAPI.swift; sourceTree = ""; };
+ 43982CC961296BCB9016F25DF5636068 /* ProductsManagerFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsManagerFactory.swift; path = Sources/Purchasing/ProductsManagerFactory.swift; sourceTree = ""; };
+ 43CC8A563BB74D631FDCBB5C81A713BD /* VerificationResult.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VerificationResult.swift; path = Sources/Security/VerificationResult.swift; sourceTree = ""; };
+ 43D73AAC4299967BF45F9FF01CB8787F /* Optional+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Optional+Extensions.swift"; path = "Sources/FoundationExtensions/Optional+Extensions.swift"; sourceTree = ""; };
+ 4429BAC03814B14CCA05FA621E7945B4 /* StoredAdEventSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoredAdEventSerializer.swift; path = Sources/Ads/Events/StoredAdEventSerializer.swift; sourceTree = ""; };
+ 4461612DEFB559B4AF58297EE6A4E5BF /* Checksum.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Checksum.swift; path = Sources/Caching/Checksum.swift; sourceTree = ""; };
+ 45B358AABC35CB2D00DF8167FA1693D9 /* OfflineEntitlementsStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OfflineEntitlementsStrings.swift; path = Sources/Logging/Strings/OfflineEntitlementsStrings.swift; sourceTree = ""; };
+ 46428AF439B212CAE8C44D1B2187C9E9 /* Lock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Lock.swift; path = Sources/Misc/Concurrency/Lock.swift; sourceTree = ""; };
+ 464B54FC3CD735207FE9083CB9904FED /* StoreKitErrorHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoreKitErrorHelper.swift; path = "Sources/Error Handling/StoreKitErrorHelper.swift"; sourceTree = ""; };
+ 4675D69D85060AD0CCF95F2F433C4CB6 /* DiagnosticsFileHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiagnosticsFileHandler.swift; path = Sources/Diagnostics/DiagnosticsFileHandler.swift; sourceTree = ""; };
+ 472FC5C89285A9712BEABCDDD91FAAF5 /* WebPurchaseRedemption.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebPurchaseRedemption.swift; path = Sources/WebPurchaseRedemption/WebPurchaseRedemption.swift; sourceTree = ""; };
+ 481504BF7369B000939A050011E64363 /* SubscriptionHistoryTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionHistoryTracker.swift; path = Sources/Paywalls/SubscriptionHistoryTracker.swift; sourceTree = ""; };
+ 48E7FA372B2126E960DD9345ACD310EC /* ErrorContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorContainer.swift; path = ios/PurchasesHybridCommon/PurchasesHybridCommon/ErrorContainer.swift; sourceTree = ""; };
+ 48ED6D60D075E6F7AEF9F00648E6578B /* TestStoreProduct.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TestStoreProduct.swift; path = "Sources/Purchasing/StoreKitAbstractions/Test Data/TestStoreProduct.swift"; sourceTree = ""; };
+ 492DC2973A8438B3FD8BC91EE2D1C3AF /* RawDataContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RawDataContainer.swift; path = Sources/Misc/Codable/RawDataContainer.swift; sourceTree = ""; };
+ 493EE7C69C52E3CE4E013AAD381662DB /* PaywallsStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PaywallsStrings.swift; path = Sources/Logging/Strings/PaywallsStrings.swift; sourceTree = ""; };
+ 49962DEFE7B07C16FBD2C37C37CBBE1F /* AdTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdTracker.swift; path = Sources/Ads/AdTracker.swift; sourceTree = ""; };
+ 4A355796FDA7429F6C3F8AEECF26D13B /* BeginRefundRequestHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeginRefundRequestHelper.swift; path = Sources/Support/BeginRefundRequestHelper.swift; sourceTree = ""; };
+ 4A53E1B1FF57A749F9042B85E80B999E /* PaymentAuthorizationProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PaymentAuthorizationProvider.swift; path = Sources/Support/PaymentAuthorizationProvider.swift; sourceTree = ""; };
+ 4AA483A3A60C364D45C2DC333D452445 /* DiagnosticsStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiagnosticsStrings.swift; path = Sources/Logging/Strings/DiagnosticsStrings.swift; sourceTree = ""; };
+ 4C0C17CB45538B27EDBE538A2174480E /* AdEventsRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdEventsRequest.swift; path = Sources/Ads/Events/Networking/AdEventsRequest.swift; sourceTree = ""; };
+ 4C826229AC0D01A9A1DCAFD3FA49D664 /* ASN1ObjectIdentifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ASN1ObjectIdentifier.swift; path = Sources/LocalReceiptParsing/BasicTypes/ASN1ObjectIdentifier.swift; sourceTree = ""; };
+ 4D9DD7E59B0917282E2931D14844DE58 /* AdEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdEvent.swift; path = Sources/Ads/Events/AdEvent.swift; sourceTree = ""; };
+ 4DA7A78EFA238D1D51ACA5C7A723974E /* HTTPRequestBody.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HTTPRequestBody.swift; path = Sources/Networking/HTTPClient/HTTPRequestBody.swift; sourceTree = ""; };
+ 4F62083A4B0658AE77BFA307A544DBD2 /* ProductsFetcherSK2.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsFetcherSK2.swift; path = Sources/Purchasing/StoreKit2/ProductsFetcherSK2.swift; sourceTree = ""; };
+ 4FAB0193EAC1911F1FE8D3DE4E149552 /* StoreProductDiscount+HybridAdditions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "StoreProductDiscount+HybridAdditions.swift"; path = "ios/PurchasesHybridCommon/PurchasesHybridCommon/StoreProductDiscount+HybridAdditions.swift"; sourceTree = ""; };
+ 50A6A3B1299C884DECA9398CA5434A53 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 51058E8152DEB2BF828A53F4AD450B01 /* DiagnosticsPostOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DiagnosticsPostOperation.swift; path = Sources/Diagnostics/Networking/DiagnosticsPostOperation.swift; sourceTree = ""; };
+ 515D62CFA3C38D397A27B63D5F56FB63 /* PaywallPackageComponent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PaywallPackageComponent.swift; path = Sources/Paywalls/Components/PaywallPackageComponent.swift; sourceTree = ""; };
+ 5259A4BCC0961A44A79FD7A37E3201F1 /* PurchasesDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PurchasesDelegate.swift; path = Sources/Purchasing/Purchases/PurchasesDelegate.swift; sourceTree = ""; };
+ 52A64F0DFB604EFF49C3D9E0B8E4237B /* CustomerAPI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomerAPI.swift; path = Sources/Networking/CustomerAPI.swift; sourceTree = ""; };
+ 5377D542CC6A8DEE15A5FF76640C8D0D /* EntitlementInfos+HybridAdditions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "EntitlementInfos+HybridAdditions.swift"; path = "ios/PurchasesHybridCommon/PurchasesHybridCommon/EntitlementInfos+HybridAdditions.swift"; sourceTree = ""; };
+ 5496A5BB6EFD4B1E2F477B637CB4E48D /* AnyEncodable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyEncodable.swift; path = Sources/Misc/Codable/AnyEncodable.swift; sourceTree = ""; };
+ 54C6E8D902D8921B25981F3137A22646 /* CustomerInfoResponseHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomerInfoResponseHandler.swift; path = Sources/Networking/Operations/Handling/CustomerInfoResponseHandler.swift; sourceTree = ""; };
+ 55FD547023F2A20FF4544B62F0E586CF /* Obsoletions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Obsoletions.swift; path = Sources/Misc/Obsoletions.swift; sourceTree = ""; };
+ 56A90A644DA1F65D4BABA53C91FB3839 /* PostAdServicesTokenOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostAdServicesTokenOperation.swift; path = Sources/Networking/Operations/PostAdServicesTokenOperation.swift; sourceTree = ""; };
+ 573585F29EDFC095922D625F0D3B18D8 /* FatalErrorUtil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FatalErrorUtil.swift; path = ios/PurchasesHybridCommon/PurchasesHybridCommon/FatalErrorUtil.swift; sourceTree = ""; };
+ 574D90A224BA283F29C96807AD089D4D /* OfferingsAPI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OfferingsAPI.swift; path = Sources/Networking/OfferingsAPI.swift; sourceTree = ""; };
+ 57A8AE57A74B292C1510B351C293C0CA /* StoreKitError+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "StoreKitError+Extensions.swift"; path = "Sources/Error Handling/StoreKitError+Extensions.swift"; sourceTree = ""; };
+ 57CF47D0307513EBACAECEEFE998F34D /* ProductEntitlementMapping.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductEntitlementMapping.swift; path = Sources/OfflineEntitlements/ProductEntitlementMapping.swift; sourceTree = ""; };
+ 581324E62C9B9C66F986C485D64EC0C6 /* TransactionPoster.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionPoster.swift; path = Sources/Purchasing/Purchases/TransactionPoster.swift; sourceTree = ""; };
+ 585A42B7A612959DAFDF99089F7076E2 /* CodableStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CodableStrings.swift; path = Sources/Logging/Strings/CodableStrings.swift; sourceTree = ""; };
+ 58E54FD6EBD1D6AF85E66D46923BEFDC /* CustomerCenterEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomerCenterEvent.swift; path = Sources/CustomerCenter/Events/CustomerCenterEvent.swift; sourceTree = ""; };
+ 59F0EFFF8F045F27D410C4438F766BD3 /* LoggerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoggerType.swift; path = Sources/LocalReceiptParsing/Helpers/LoggerType.swift; sourceTree = ""; };
+ 5AF8A07013B121F68476D9577FD026EC /* ProductEntitlementMappingCallback.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductEntitlementMappingCallback.swift; path = Sources/Networking/Caching/ProductEntitlementMappingCallback.swift; sourceTree = ""; };
+ 5B60220F8AF0AD933C4600331FFC21F1 /* ConnectionErrorReason.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectionErrorReason.swift; path = Sources/Networking/ConnectionErrorReason.swift; sourceTree = ""; };
+ 5BEF4602752E47C46E8C10FB8B4B57F2 /* Pods-App */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-App"; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 5C19E63EBCB8B1A3E5DC6B1417EC36C8 /* IntroEligibilityCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IntroEligibilityCalculator.swift; path = Sources/Purchasing/IntroEligibilityCalculator.swift; sourceTree = ""; };
+ 5CEC8A93A161ABEAA5C71216AAF12613 /* RevenueCat-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RevenueCat-dummy.m"; sourceTree = ""; };
+ 5E473F9E55BE0F0931A5F499C838EB5F /* PurchasesReceiptParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PurchasesReceiptParser.swift; path = Sources/LocalReceiptParsing/PurchasesReceiptParser.swift; sourceTree = ""; };
+ 5E636DE5DDB3B5BDF5FFC68F773CC609 /* PurchasesHybridCommon-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "PurchasesHybridCommon-dummy.m"; sourceTree = ""; };
+ 5EDEA4635193B221F9EE2E133BC48482 /* StoreProductDiscount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoreProductDiscount.swift; path = Sources/Purchasing/StoreKitAbstractions/StoreProductDiscount.swift; sourceTree = ""; };
+ 5FDBADD2C97E2A55FDF2261BA910C2D2 /* NonEmptyStringDecodable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NonEmptyStringDecodable.swift; path = Sources/Misc/Codable/NonEmptyStringDecodable.swift; sourceTree = ""; };
+ 600CC8EB2F5188ABB89DEF7BB7838C86 /* SK1Storefront.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SK1Storefront.swift; path = Sources/Purchasing/StoreKitAbstractions/SK1Storefront.swift; sourceTree = ""; };
+ 609D91E64EC4D4A6D042D33246E4A6AD /* EligibilityStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EligibilityStrings.swift; path = Sources/Logging/Strings/EligibilityStrings.swift; sourceTree = ""; };
+ 609E66457F5C58D8FDEDD2F9C08CE662 /* StoredAdEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoredAdEvent.swift; path = Sources/Ads/Events/StoredAdEvent.swift; sourceTree = ""; };
+ 611DF8B4F21CB669239775C22230859C /* PurchasesHybridCommon-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "PurchasesHybridCommon-Info.plist"; sourceTree = ""; };
+ 614A2D3670D47E6D1CA8428911162808 /* PaywallTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PaywallTransition.swift; path = Sources/Paywalls/Components/Transitions/PaywallTransition.swift; sourceTree = ""; };
+ 614C8BDF4EF615DC21C0252EC9C68B1A /* CustomerInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomerInfo.swift; path = Sources/Identity/CustomerInfo.swift; sourceTree = ""; };
+ 61B12281162B2669A9CD4FDB2800B3FF /* Pods-App-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-App-frameworks.sh"; sourceTree = ""; };
+ 620A422511B4CA19BF6E2009C98AE691 /* OfflineCustomerInfoCreator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OfflineCustomerInfoCreator.swift; path = Sources/OfflineEntitlements/OfflineCustomerInfoCreator.swift; sourceTree = ""; };
+ 6321C6CAE67AD0B90C77BDE9108FE3B2 /* InternalAPI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InternalAPI.swift; path = Sources/Networking/InternalAPI.swift; sourceTree = ""; };
+ 6324CE2644473AD9256FF61329E8E281 /* ResourceBundle-PurchasesHybridCommon-PurchasesHybridCommon-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-PurchasesHybridCommon-PurchasesHybridCommon-Info.plist"; sourceTree = ""; };
+ 640C6F5ADC38815FB221C4355EAC255C /* DebugContentViews.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DebugContentViews.swift; path = Sources/Support/DebugUI/DebugContentViews.swift; sourceTree = ""; };
+ 64CD77CEDC8C3185F1FE264816ADF9D8 /* ASN1ObjectIdentifierBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ASN1ObjectIdentifierBuilder.swift; path = Sources/LocalReceiptParsing/Builders/ASN1ObjectIdentifierBuilder.swift; sourceTree = ""; };
+ 64EFE56FF515BDDBC227CB67D1730EFF /* FakeSigning.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FakeSigning.swift; path = Sources/Security/FakeSigning.swift; sourceTree = ""; };
+ 6559E0AA4A21488E5AF0280AAA41E469 /* PaywallButtonComponent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PaywallButtonComponent.swift; path = Sources/Paywalls/Components/PaywallButtonComponent.swift; sourceTree = ""; };
+ 65CAC8117AD855E94F9AD43DE1CEE746 /* OfferingsManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OfferingsManager.swift; path = Sources/Purchasing/OfferingsManager.swift; sourceTree = ""; };
+ 66395F21F3D3732A876F3989EFDAACAB /* ISODurationFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ISODurationFormatter.swift; path = Sources/Misc/DateAndTime/ISODurationFormatter.swift; sourceTree = ""; };
+ 66616998505D0C66379137483045A4DF /* AttributionFetcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AttributionFetcher.swift; path = Sources/Attribution/AttributionFetcher.swift; sourceTree = ""; };
+ 669737EF3E7F2EBAFEF056A15A64F9BC /* Package+HybridAdditions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Package+HybridAdditions.swift"; path = "ios/PurchasesHybridCommon/PurchasesHybridCommon/Package+HybridAdditions.swift"; sourceTree = ""; };
+ 66FEA9280C5974DC10249711D910CB10 /* PostOfferForSigningOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostOfferForSigningOperation.swift; path = Sources/Networking/Operations/PostOfferForSigningOperation.swift; sourceTree = ""; };
+ 6722B0341B3AF578C8A665E4C784C884 /* Offering.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Offering.swift; path = Sources/Purchasing/Offering.swift; sourceTree = ""; };
+ 678FD19DD03283F7C4DE61D0D2AC2379 /* IdentityStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IdentityStrings.swift; path = Sources/Logging/Strings/IdentityStrings.swift; sourceTree = ""; };
+ 67DB6BB03C169A5A099A774B7A97BC20 /* Locale+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Locale+Extensions.swift"; path = "Sources/FoundationExtensions/Locale+Extensions.swift"; sourceTree = ""; };
+ 69AEABD735DE880752B3A57DA9663F93 /* WinBackOffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WinBackOffer.swift; path = Sources/Purchasing/StoreKitAbstractions/WinBackOffer.swift; sourceTree = ""; };
+ 6A5A36BE17EDC4996FA118995EFF95A3 /* ArraySlice_UInt8+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ArraySlice_UInt8+Extensions.swift"; path = "Sources/LocalReceiptParsing/DataConverters/ArraySlice_UInt8+Extensions.swift"; sourceTree = ""; };
+ 6B02F3C6E2F57EE78C8EF72930F25E8A /* CachingProductsManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CachingProductsManager.swift; path = Sources/Purchasing/CachingProductsManager.swift; sourceTree = ""; };
+ 6C107B155D13EA52F7FFE15268FC1567 /* AttributionStrings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AttributionStrings.swift; path = Sources/Logging/Strings/AttributionStrings.swift; sourceTree = ""; };
+ 6D748E1EB3CD22A59197E91481E3FBE9 /* Pods-App-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-App-dummy.m"; sourceTree = ""; };
+ 6D8C79631CF5388121CCCFAAD1C90129 /* WebOfferingProductsCallback.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebOfferingProductsCallback.swift; path = Sources/Networking/Caching/WebOfferingProductsCallback.swift; sourceTree = ""; };
+ 6E572374C713EAE0F6925B0C4177016B /* PurchasesDiagnostics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PurchasesDiagnostics.swift; path = Sources/Support/PurchasesDiagnostics.swift; sourceTree = ""; };
+ 6E767D12636C059F2945360E3798A816 /* VirtualCurrencies.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualCurrencies.swift; path = "Sources/Virtual Currencies/VirtualCurrencies.swift"; sourceTree = ""; };
+ 6FDDFFADA25052A655640C88A443EC44 /* PriceFormatterProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriceFormatterProvider.swift; path = Sources/Misc/PriceFormatterProvider.swift; sourceTree = ""; };
+ 705AC44DA1E8E98E0B441DB0948BFF0B /* SK1StoreTransaction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SK1StoreTransaction.swift; path = Sources/Purchasing/StoreKitAbstractions/SK1StoreTransaction.swift; sourceTree = ""; };
+ 7106C3714AC8B3947AAF7682205D64DC /* CustomerInfo+HybridAdditions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CustomerInfo+HybridAdditions.swift"; path = "ios/PurchasesHybridCommon/PurchasesHybridCommon/CustomerInfo+HybridAdditions.swift"; sourceTree = ""; };
+ 7117D2E3139747D4C0AF1A2007E49862 /* StoreKit2ObserverModePurchaseDetector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoreKit2ObserverModePurchaseDetector.swift; path = "Sources/Purchasing/StoreKit2/Observer Mode/StoreKit2ObserverModePurchaseDetector.swift"; sourceTree = ""; };
+ 724E4C9353C10489676F511523A082CA /* WebPurchaseRedemptionResult.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebPurchaseRedemptionResult.swift; path = Sources/WebPurchaseRedemption/WebPurchaseRedemptionResult.swift; sourceTree = ""; };
+ 72F24EE29B2E7AA79A16E34349BD4FE7 /* IntroEligibility+HybridExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IntroEligibility+HybridExtensions.swift"; path = "ios/PurchasesHybridCommon/PurchasesHybridCommon/IntroEligibility+HybridExtensions.swift"; sourceTree = "