diff --git a/.gitignore b/.gitignore
index b18d2f9..00eadd2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,7 +42,7 @@ CHANGELOG.md
.env.local
android/
HEATING_OPTIMIZATIONS.md
-ios
+
android
sliderreadme.md
.cursor/mcp.json
@@ -53,3 +53,4 @@ hackintosh-emulator-fix.sh
/ota-builds
src/screens/xavio.md
/nuvio-providers
+/KSPlayer
\ No newline at end of file
diff --git a/assets/bootsplash/ios/BootSplash.storyboard b/assets/bootsplash/ios/BootSplash.storyboard
new file mode 100644
index 0000000..80d0531
--- /dev/null
+++ b/assets/bootsplash/ios/BootSplash.storyboard
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/bootsplash/ios/Colors.xcassets/BootSplashBackground-7d142f.colorset/Contents.json b/assets/bootsplash/ios/Colors.xcassets/BootSplashBackground-7d142f.colorset/Contents.json
new file mode 100644
index 0000000..1f0a7dc
--- /dev/null
+++ b/assets/bootsplash/ios/Colors.xcassets/BootSplashBackground-7d142f.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors": [
+ {
+ "idiom": "universal",
+ "color": {
+ "color-space": "srgb",
+ "components": {
+ "blue": "0.0156862745098039",
+ "green": "0.0156862745098039",
+ "red": "0.00784313725490196",
+ "alpha": "1.000"
+ }
+ }
+ }
+ ],
+ "info": {
+ "author": "xcode",
+ "version": 1
+ }
+}
diff --git a/assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/Contents.json b/assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/Contents.json
new file mode 100644
index 0000000..b803d10
--- /dev/null
+++ b/assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images": [
+ {
+ "idiom": "universal",
+ "filename": "logo-7d142f.png",
+ "scale": "1x"
+ },
+ {
+ "idiom": "universal",
+ "filename": "logo-7d142f@2x.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "universal",
+ "filename": "logo-7d142f@3x.png",
+ "scale": "3x"
+ }
+ ],
+ "info": {
+ "author": "xcode",
+ "version": 1
+ }
+}
diff --git a/assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/logo-7d142f.png b/assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/logo-7d142f.png
new file mode 100644
index 0000000..19e5b3c
Binary files /dev/null and b/assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/logo-7d142f.png differ
diff --git a/assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/logo-7d142f@2x.png b/assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/logo-7d142f@2x.png
new file mode 100644
index 0000000..115594f
Binary files /dev/null and b/assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/logo-7d142f@2x.png differ
diff --git a/assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/logo-7d142f@3x.png b/assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/logo-7d142f@3x.png
new file mode 100644
index 0000000..061180d
Binary files /dev/null and b/assets/bootsplash/ios/Images.xcassets/BootSplashLogo-7d142f.imageset/logo-7d142f@3x.png differ
diff --git a/ios/.bundle/config b/ios/.bundle/config
new file mode 100644
index 0000000..2369228
--- /dev/null
+++ b/ios/.bundle/config
@@ -0,0 +1,2 @@
+---
+BUNDLE_PATH: "vendor/bundle"
diff --git a/ios/.gitignore b/ios/.gitignore
new file mode 100644
index 0000000..8beb344
--- /dev/null
+++ b/ios/.gitignore
@@ -0,0 +1,30 @@
+# OSX
+#
+.DS_Store
+
+# Xcode
+#
+build/
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+xcuserdata
+*.xccheckout
+*.moved-aside
+DerivedData
+*.hmap
+*.ipa
+*.xcuserstate
+project.xcworkspace
+.xcode.env.local
+
+# Bundle artifacts
+*.jsbundle
+
+# CocoaPods
+/Pods/
diff --git a/ios/.xcode.env b/ios/.xcode.env
new file mode 100644
index 0000000..3d5782c
--- /dev/null
+++ b/ios/.xcode.env
@@ -0,0 +1,11 @@
+# This `.xcode.env` file is versioned and is used to source the environment
+# used when running script phases inside Xcode.
+# To customize your local environment, you can create an `.xcode.env.local`
+# file that is not versioned.
+
+# NODE_BINARY variable contains the PATH to the node executable.
+#
+# Customize the NODE_BINARY variable here.
+# For example, to use nvm with brew, add the following line
+# . "$(brew --prefix nvm)/nvm.sh" --no-use
+export NODE_BINARY=$(command -v node)
diff --git a/ios/Gemfile b/ios/Gemfile
new file mode 100644
index 0000000..92b57a8
--- /dev/null
+++ b/ios/Gemfile
@@ -0,0 +1,3 @@
+source 'https://rubygems.org'
+
+gem 'xcodeproj', '~> 1.24'
diff --git a/ios/Gemfile.lock b/ios/Gemfile.lock
new file mode 100644
index 0000000..a274d61
--- /dev/null
+++ b/ios/Gemfile.lock
@@ -0,0 +1,30 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (3.0.7)
+ base64
+ nkf
+ rexml
+ atomos (0.1.3)
+ base64 (0.3.0)
+ claide (1.1.0)
+ colored2 (3.1.2)
+ nanaimo (0.4.0)
+ nkf (0.2.0)
+ rexml (3.4.4)
+ xcodeproj (1.27.0)
+ CFPropertyList (>= 2.3.3, < 4.0)
+ atomos (~> 0.1.3)
+ claide (>= 1.0.2, < 2.0)
+ colored2 (~> 3.1)
+ nanaimo (~> 0.4.0)
+ rexml (>= 3.3.6, < 4.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ xcodeproj (~> 1.24)
+
+BUNDLED WITH
+ 1.17.2
diff --git a/ios/Nuvio.xcodeproj/project.pbxproj b/ios/Nuvio.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..7001cc1
--- /dev/null
+++ b/ios/Nuvio.xcodeproj/project.pbxproj
@@ -0,0 +1,609 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
+ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
+ 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
+ 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; };
+ 4A452C8AF8F8464E8F6C4499 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02F4D4C2B75D490FA484DF2F /* noop-file.swift */; };
+ 53A1AFA19BDA4A9CEC2C0758 /* KSPlayerViewManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F3DC5D187506A1702CBDCE7 /* KSPlayerViewManager.swift */; };
+ 554BC3EE7AB3699FD2A5F6A6 /* KSPlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94E57CA110F3B584C9EB54FF /* KSPlayerView.swift */; };
+ 6A3072369CBE46F6A5531727 /* KSPlayerModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1859BB4D441C265493A728B0 /* KSPlayerModule.swift */; };
+ 96905EF65AED1B983A6B3ABC /* libPods-Nuvio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Nuvio.a */; };
+ B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; };
+ B1EEE41563DBC5313A090C06 /* KSPlayerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 677190A93C7E1E59AC68D165 /* KSPlayerManager.m */; };
+ BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; };
+ C7F40B0D74A68CE28765494D /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 88706B115BE5800B1B31F65D /* PrivacyInfo.xcprivacy */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 02F4D4C2B75D490FA484DF2F /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "Nuvio/noop-file.swift"; sourceTree = ""; };
+ 13B07F961A680F5B00A75B9A /* Nuvio.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Nuvio.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Nuvio/AppDelegate.h; sourceTree = ""; };
+ 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = Nuvio/AppDelegate.mm; sourceTree = ""; };
+ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Nuvio/Images.xcassets; sourceTree = ""; };
+ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Nuvio/Info.plist; sourceTree = ""; };
+ 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Nuvio/main.m; sourceTree = ""; };
+ 1859BB4D441C265493A728B0 /* KSPlayerModule.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KSPlayerModule.swift; path = Nuvio/KSPlayerModule.swift; sourceTree = ""; };
+ 1F3DC5D187506A1702CBDCE7 /* KSPlayerViewManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KSPlayerViewManager.swift; path = Nuvio/KSPlayerViewManager.swift; sourceTree = ""; };
+ 1F4096E3944543A28521AEEE /* Nuvio-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "Nuvio-Bridging-Header.h"; path = "Nuvio/Nuvio-Bridging-Header.h"; sourceTree = ""; };
+ 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Nuvio.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Nuvio.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 677190A93C7E1E59AC68D165 /* KSPlayerManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = KSPlayerManager.m; path = Nuvio/KSPlayerManager.m; sourceTree = ""; };
+ 6C2E3173556A471DD304B334 /* Pods-Nuvio.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Nuvio.debug.xcconfig"; path = "Target Support Files/Pods-Nuvio/Pods-Nuvio.debug.xcconfig"; sourceTree = ""; };
+ 7A4D352CD337FB3A3BF06240 /* Pods-Nuvio.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Nuvio.release.xcconfig"; path = "Target Support Files/Pods-Nuvio/Pods-Nuvio.release.xcconfig"; sourceTree = ""; };
+ 88706B115BE5800B1B31F65D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Nuvio/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 94E57CA110F3B584C9EB54FF /* KSPlayerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KSPlayerView.swift; path = Nuvio/KSPlayerView.swift; sourceTree = ""; };
+ AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = Nuvio/SplashScreen.storyboard; sourceTree = ""; };
+ BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; };
+ ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
+ FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Nuvio/ExpoModulesProvider.swift"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 96905EF65AED1B983A6B3ABC /* libPods-Nuvio.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 13B07FAE1A68108700A75B9A /* Nuvio */ = {
+ isa = PBXGroup;
+ children = (
+ BB2F792B24A3F905000567C9 /* Supporting */,
+ 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
+ 13B07FB01A68108700A75B9A /* AppDelegate.mm */,
+ 13B07FB51A68108700A75B9A /* Images.xcassets */,
+ 13B07FB61A68108700A75B9A /* Info.plist */,
+ 13B07FB71A68108700A75B9A /* main.m */,
+ AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */,
+ 02F4D4C2B75D490FA484DF2F /* noop-file.swift */,
+ 1F4096E3944543A28521AEEE /* Nuvio-Bridging-Header.h */,
+ 88706B115BE5800B1B31F65D /* PrivacyInfo.xcprivacy */,
+ 94E57CA110F3B584C9EB54FF /* KSPlayerView.swift */,
+ 1F3DC5D187506A1702CBDCE7 /* KSPlayerViewManager.swift */,
+ 677190A93C7E1E59AC68D165 /* KSPlayerManager.m */,
+ 1859BB4D441C265493A728B0 /* KSPlayerModule.swift */,
+ );
+ name = Nuvio;
+ sourceTree = "";
+ };
+ 2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
+ 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Nuvio.a */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Libraries;
+ sourceTree = "";
+ };
+ 83CBB9F61A601CBA00E9B192 = {
+ isa = PBXGroup;
+ children = (
+ 13B07FAE1A68108700A75B9A /* Nuvio */,
+ 832341AE1AAA6A7D00B99B32 /* Libraries */,
+ 83CBBA001A601CBA00E9B192 /* Products */,
+ 2D16E6871FA4F8E400B85C8A /* Frameworks */,
+ D65327D7A22EEC0BE12398D9 /* Pods */,
+ D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */,
+ );
+ indentWidth = 2;
+ sourceTree = "";
+ tabWidth = 2;
+ usesTabs = 0;
+ };
+ 83CBBA001A601CBA00E9B192 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 13B07F961A680F5B00A75B9A /* Nuvio.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 92DBD88DE9BF7D494EA9DA96 /* Nuvio */ = {
+ isa = PBXGroup;
+ children = (
+ FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */,
+ );
+ name = Nuvio;
+ sourceTree = "";
+ };
+ BB2F792B24A3F905000567C9 /* Supporting */ = {
+ isa = PBXGroup;
+ children = (
+ BB2F792C24A3F905000567C9 /* Expo.plist */,
+ );
+ name = Supporting;
+ path = Nuvio/Supporting;
+ sourceTree = "";
+ };
+ D65327D7A22EEC0BE12398D9 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 6C2E3173556A471DD304B334 /* Pods-Nuvio.debug.xcconfig */,
+ 7A4D352CD337FB3A3BF06240 /* Pods-Nuvio.release.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+ D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = {
+ isa = PBXGroup;
+ children = (
+ 92DBD88DE9BF7D494EA9DA96 /* Nuvio */,
+ );
+ name = ExpoModulesProviders;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 13B07F861A680F5B00A75B9A /* Nuvio */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Nuvio" */;
+ buildPhases = (
+ 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */,
+ 1AF4057A2E2F0FE927F61E3C /* [Expo] Configure project */,
+ 13B07F871A680F5B00A75B9A /* Sources */,
+ 13B07F8C1A680F5B00A75B9A /* Frameworks */,
+ 13B07F8E1A680F5B00A75B9A /* Resources */,
+ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
+ 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */,
+ 3F8163D8C03947BCA4B429B4 /* Upload Debug Symbols to Sentry */,
+ 183E75605458C347967551DC /* [CP] Embed Pods Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Nuvio;
+ productName = Nuvio;
+ productReference = 13B07F961A680F5B00A75B9A /* Nuvio.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 83CBB9F71A601CBA00E9B192 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 1130;
+ TargetAttributes = {
+ 13B07F861A680F5B00A75B9A = {
+ DevelopmentTeam = NLXTHANK2N;
+ LastSwiftMigration = 1250;
+ ProvisioningStyle = Automatic;
+ };
+ };
+ };
+ buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Nuvio" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 83CBB9F61A601CBA00E9B192;
+ productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 13B07F861A680F5B00A75B9A /* Nuvio */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 13B07F8E1A680F5B00A75B9A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ BB2F792D24A3F905000567C9 /* Expo.plist in Resources */,
+ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
+ 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */,
+ C7F40B0D74A68CE28765494D /* PrivacyInfo.xcprivacy in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Bundle React Native code and images";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n/bin/sh `\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('@sentry/react-native/package.json')) + '/scripts/sentry-xcode.sh'\"` `\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n";
+ };
+ 08A4A3CD28434E44B6B9DE2E /* [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-Nuvio-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;
+ };
+ 183E75605458C347967551DC /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Nuvio/Pods-Nuvio-frameworks.sh",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/MobileVLCKit/MobileVLCKit.framework/MobileVLCKit",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputPaths = (
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MobileVLCKit.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Nuvio/Pods-Nuvio-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 1AF4057A2E2F0FE927F61E3C /* [Expo] Configure project */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ );
+ name = "[Expo] Configure project";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-Nuvio/expo-configure-project.sh\"\n";
+ };
+ 3F8163D8C03947BCA4B429B4 /* Upload Debug Symbols to Sentry */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Upload Debug Symbols to Sentry";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh `${NODE_BINARY:-node} --print \"require('path').dirname(require.resolve('@sentry/react-native/package.json')) + '/scripts/sentry-xcode-debug-files.sh'\"`";
+ };
+ 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Nuvio/Pods-Nuvio-resources.sh",
+ "${PODS_CONFIGURATION_BUILD_DIR}/EXApplication/ExpoApplication_privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/ExpoConstants_privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/EXNotifications/ExpoNotifications_privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/EXUpdates/EXUpdates.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/ExpoDevice/ExpoDevice_privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/ExpoLocalization/ExpoLocalization_privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/ExpoSystemUI/ExpoSystemUI_privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/KSPlayer/KSPlayer_KSPlayer.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/RCT-Folly/RCT-Folly_privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/RNCAsyncStorage/RNCAsyncStorage_resources.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/ReachabilitySwift.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/Sentry/Sentry.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-launcher/EXDevLauncher.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-menu/EXDevMenu.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/LottiePrivacyInfo.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/lottie-react-native/Lottie_React_Native_Privacy.bundle",
+ );
+ name = "[CP] Copy Pods Resources";
+ outputPaths = (
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoApplication_privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoConstants_privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoNotifications_privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXUpdates.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoDevice_privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoLocalization_privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoSystemUI_privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/KSPlayer_KSPlayer.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCT-Folly_privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCAsyncStorage_resources.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ReachabilitySwift.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Sentry.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevLauncher.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevMenu.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/LottiePrivacyInfo.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Lottie_React_Native_Privacy.bundle",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Nuvio/Pods-Nuvio-resources.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 13B07F871A680F5B00A75B9A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */,
+ 13B07FC11A68108700A75B9A /* main.m in Sources */,
+ B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */,
+ 4A452C8AF8F8464E8F6C4499 /* noop-file.swift in Sources */,
+ 554BC3EE7AB3699FD2A5F6A6 /* KSPlayerView.swift in Sources */,
+ 53A1AFA19BDA4A9CEC2C0758 /* KSPlayerViewManager.swift in Sources */,
+ B1EEE41563DBC5313A090C06 /* KSPlayerManager.m in Sources */,
+ 6A3072369CBE46F6A5531727 /* KSPlayerModule.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 13B07F941A680F5B00A75B9A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-Nuvio.debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Nuvio/Nuvio.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = NLXTHANK2N;
+ ENABLE_BITCODE = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "$(inherited)",
+ "FB_SONARKIT_ENABLED=1",
+ );
+ INFOPLIST_FILE = Nuvio/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.1;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ MARKETING_VERSION = 1.0;
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ "-ObjC",
+ "-lc++",
+ );
+ OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
+ PRODUCT_BUNDLE_IDENTIFIER = com.nuvio.app;
+ PRODUCT_NAME = Nuvio;
+ SWIFT_OBJC_BRIDGING_HEADER = "Nuvio/Nuvio-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 13B07F951A680F5B00A75B9A /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-Nuvio.release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Nuvio/Nuvio.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = NLXTHANK2N;
+ INFOPLIST_FILE = Nuvio/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.1;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ MARKETING_VERSION = 1.0;
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ "-ObjC",
+ "-lc++",
+ );
+ OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
+ PRODUCT_BUNDLE_IDENTIFIER = com.nuvio.app;
+ PRODUCT_NAME = Nuvio;
+ SWIFT_OBJC_BRIDGING_HEADER = "Nuvio/Nuvio-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+ 83CBBA201A601CBA00E9B192 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "c++20";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = 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_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_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ 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;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.1;
+ LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
+ LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ " ",
+ );
+ REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
+ USE_HERMES = true;
+ };
+ name = Debug;
+ };
+ 83CBBA211A601CBA00E9B192 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "c++20";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = 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_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_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = YES;
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ 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;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.1;
+ LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
+ LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
+ MTL_ENABLE_DEBUG_INFO = NO;
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ " ",
+ );
+ REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
+ SDKROOT = iphoneos;
+ USE_HERMES = true;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Nuvio" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 13B07F941A680F5B00A75B9A /* Debug */,
+ 13B07F951A680F5B00A75B9A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Nuvio" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 83CBBA201A601CBA00E9B192 /* Debug */,
+ 83CBBA211A601CBA00E9B192 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
+}
diff --git a/ios/Nuvio.xcodeproj/xcshareddata/xcschemes/Nuvio.xcscheme b/ios/Nuvio.xcodeproj/xcshareddata/xcschemes/Nuvio.xcscheme
new file mode 100644
index 0000000..d56adf8
--- /dev/null
+++ b/ios/Nuvio.xcodeproj/xcshareddata/xcschemes/Nuvio.xcscheme
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Nuvio.xcworkspace/contents.xcworkspacedata b/ios/Nuvio.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..5249d92
--- /dev/null
+++ b/ios/Nuvio.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/ios/Nuvio/AppDelegate.h b/ios/Nuvio/AppDelegate.h
new file mode 100644
index 0000000..1658a43
--- /dev/null
+++ b/ios/Nuvio/AppDelegate.h
@@ -0,0 +1,7 @@
+#import
+#import
+#import
+
+@interface AppDelegate : EXAppDelegateWrapper
+
+@end
diff --git a/ios/Nuvio/AppDelegate.mm b/ios/Nuvio/AppDelegate.mm
new file mode 100644
index 0000000..b27f832
--- /dev/null
+++ b/ios/Nuvio/AppDelegate.mm
@@ -0,0 +1,62 @@
+#import "AppDelegate.h"
+
+#import
+#import
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ self.moduleName = @"main";
+
+ // You can add your custom initial props in the dictionary below.
+ // They will be passed down to the ViewController used by React Native.
+ self.initialProps = @{};
+
+ return [super application:application didFinishLaunchingWithOptions:launchOptions];
+}
+
+- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
+{
+ return [self bundleURL];
+}
+
+- (NSURL *)bundleURL
+{
+#if DEBUG
+ return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"];
+#else
+ return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
+#endif
+}
+
+// Linking API
+- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options {
+ return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options];
+}
+
+// Universal Links
+- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler {
+ BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
+ return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result;
+}
+
+// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
+- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
+{
+ return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
+}
+
+// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
+- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
+{
+ return [super application:application didFailToRegisterForRemoteNotificationsWithError:error];
+}
+
+// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
+- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
+{
+ return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
+}
+
+@end
diff --git a/ios/Nuvio/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png b/ios/Nuvio/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png
new file mode 100644
index 0000000..e9a189f
Binary files /dev/null and b/ios/Nuvio/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png differ
diff --git a/ios/Nuvio/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/Nuvio/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..90d8d4c
--- /dev/null
+++ b/ios/Nuvio/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,14 @@
+{
+ "images": [
+ {
+ "filename": "App-Icon-1024x1024@1x.png",
+ "idiom": "universal",
+ "platform": "ios",
+ "size": "1024x1024"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "expo"
+ }
+}
\ No newline at end of file
diff --git a/ios/Nuvio/Images.xcassets/Contents.json b/ios/Nuvio/Images.xcassets/Contents.json
new file mode 100644
index 0000000..ed285c2
--- /dev/null
+++ b/ios/Nuvio/Images.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "expo"
+ }
+}
diff --git a/ios/Nuvio/Images.xcassets/SplashScreenBackground.colorset/Contents.json b/ios/Nuvio/Images.xcassets/SplashScreenBackground.colorset/Contents.json
new file mode 100644
index 0000000..dba1090
--- /dev/null
+++ b/ios/Nuvio/Images.xcassets/SplashScreenBackground.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors": [
+ {
+ "color": {
+ "components": {
+ "alpha": "1.000",
+ "blue": "0.0156862745098039",
+ "green": "0.0156862745098039",
+ "red": "0.00784313725490196"
+ },
+ "color-space": "srgb"
+ },
+ "idiom": "universal"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "expo"
+ }
+}
\ No newline at end of file
diff --git a/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/Contents.json b/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/Contents.json
new file mode 100644
index 0000000..f65c008
--- /dev/null
+++ b/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images": [
+ {
+ "idiom": "universal",
+ "filename": "image.png",
+ "scale": "1x"
+ },
+ {
+ "idiom": "universal",
+ "filename": "image@2x.png",
+ "scale": "2x"
+ },
+ {
+ "idiom": "universal",
+ "filename": "image@3x.png",
+ "scale": "3x"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "expo"
+ }
+}
\ No newline at end of file
diff --git a/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image.png b/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image.png
new file mode 100644
index 0000000..efcdf22
Binary files /dev/null and b/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image.png differ
diff --git a/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@2x.png b/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@2x.png
new file mode 100644
index 0000000..efcdf22
Binary files /dev/null and b/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@2x.png differ
diff --git a/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@3x.png b/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@3x.png
new file mode 100644
index 0000000..efcdf22
Binary files /dev/null and b/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@3x.png differ
diff --git a/ios/Nuvio/Info.plist b/ios/Nuvio/Info.plist
new file mode 100644
index 0000000..c625589
--- /dev/null
+++ b/ios/Nuvio/Info.plist
@@ -0,0 +1,99 @@
+
+
+
+
+ CADisableMinimumFrameDurationOnPhone
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Nuvio
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0.0
+ CFBundleSignature
+ ????
+ CFBundleURLTypes
+
+
+ CFBundleURLSchemes
+
+ stremioexpo
+ com.nuvio.app
+
+
+
+ CFBundleURLSchemes
+
+ exp+nuvio
+
+
+
+ CFBundleVersion
+ 12
+ LSMinimumSystemVersion
+ 12.0
+ LSRequiresIPhoneOS
+
+ LSSupportsOpeningDocumentsInPlace
+
+ NSAppTransportSecurity
+
+ NSAllowsArbitraryLoads
+
+
+ NSBonjourServices
+
+ _http._tcp
+
+ NSLocalNetworkUsageDescription
+ App uses the local network to discover and connect to devices.
+ NSMicrophoneUsageDescription
+ This app does not require microphone access.
+ RCTRootViewBackgroundColor
+ 4278322180
+ UIBackgroundModes
+
+ audio
+
+ UIFileSharingEnabled
+
+ UILaunchStoryboardName
+ SplashScreen
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UIRequiresFullScreen
+
+ UIStatusBarStyle
+ UIStatusBarStyleDefault
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIUserInterfaceStyle
+ Dark
+ UIViewControllerBasedStatusBarAppearance
+
+
+
\ No newline at end of file
diff --git a/ios/Nuvio/KSPlayerManager.m b/ios/Nuvio/KSPlayerManager.m
new file mode 100644
index 0000000..a4c8c05
--- /dev/null
+++ b/ios/Nuvio/KSPlayerManager.m
@@ -0,0 +1,41 @@
+//
+// KSPlayerManager.m
+// Nuvio
+//
+// Created by KSPlayer integration
+//
+
+#import
+#import
+#import
+
+@interface RCT_EXTERN_MODULE(KSPlayerViewManager, RCTViewManager)
+
+RCT_EXPORT_VIEW_PROPERTY(source, NSDictionary)
+RCT_EXPORT_VIEW_PROPERTY(paused, BOOL)
+RCT_EXPORT_VIEW_PROPERTY(volume, NSNumber)
+RCT_EXPORT_VIEW_PROPERTY(audioTrack, NSNumber)
+RCT_EXPORT_VIEW_PROPERTY(textTrack, NSNumber)
+
+// Event properties
+RCT_EXPORT_VIEW_PROPERTY(onLoad, RCTDirectEventBlock)
+RCT_EXPORT_VIEW_PROPERTY(onProgress, RCTDirectEventBlock)
+RCT_EXPORT_VIEW_PROPERTY(onBuffering, RCTDirectEventBlock)
+RCT_EXPORT_VIEW_PROPERTY(onEnd, RCTDirectEventBlock)
+RCT_EXPORT_VIEW_PROPERTY(onError, RCTDirectEventBlock)
+RCT_EXPORT_VIEW_PROPERTY(onBufferingProgress, RCTDirectEventBlock)
+
+RCT_EXTERN_METHOD(seek:(nonnull NSNumber *)node toTime:(nonnull NSNumber *)time)
+RCT_EXTERN_METHOD(setSource:(nonnull NSNumber *)node source:(nonnull NSDictionary *)source)
+RCT_EXTERN_METHOD(setPaused:(nonnull NSNumber *)node paused:(BOOL)paused)
+RCT_EXTERN_METHOD(setVolume:(nonnull NSNumber *)node volume:(nonnull NSNumber *)volume)
+RCT_EXTERN_METHOD(setAudioTrack:(nonnull NSNumber *)node trackId:(nonnull NSNumber *)trackId)
+RCT_EXTERN_METHOD(setTextTrack:(nonnull NSNumber *)node trackId:(nonnull NSNumber *)trackId)
+
+@end
+
+@interface RCT_EXTERN_MODULE(KSPlayerModule, RCTEventEmitter)
+
+RCT_EXTERN_METHOD(getTracks:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
+
+@end
diff --git a/ios/Nuvio/KSPlayerModule.swift b/ios/Nuvio/KSPlayerModule.swift
new file mode 100644
index 0000000..f056a7d
--- /dev/null
+++ b/ios/Nuvio/KSPlayerModule.swift
@@ -0,0 +1,36 @@
+//
+// KSPlayerModule.swift
+// Nuvio
+//
+// Created by KSPlayer integration
+//
+
+import Foundation
+import KSPlayer
+import React
+
+@objc(KSPlayerModule)
+class KSPlayerModule: RCTEventEmitter {
+ override static func requiresMainQueueSetup() -> Bool {
+ return true
+ }
+
+ override func supportedEvents() -> [String]! {
+ return [
+ "KSPlayer-onLoad",
+ "KSPlayer-onProgress",
+ "KSPlayer-onBuffering",
+ "KSPlayer-onEnd",
+ "KSPlayer-onError"
+ ]
+ }
+
+ @objc func getTracks(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
+ // This method can be expanded to get track information
+ // For now, return empty tracks
+ resolve([
+ "audioTracks": [],
+ "textTracks": []
+ ])
+ }
+}
diff --git a/ios/Nuvio/KSPlayerView.swift b/ios/Nuvio/KSPlayerView.swift
new file mode 100644
index 0000000..02390c6
--- /dev/null
+++ b/ios/Nuvio/KSPlayerView.swift
@@ -0,0 +1,281 @@
+//
+// KSPlayerView.swift
+// Nuvio
+//
+// Created by KSPlayer integration
+//
+
+import Foundation
+import KSPlayer
+import React
+
+@objc(KSPlayerView)
+class KSPlayerView: UIView {
+ private var playerView: IOSVideoPlayerView!
+ private var currentSource: NSDictionary?
+ private var isPaused = false
+ private var currentVolume: Float = 1.0
+ weak var viewManager: KSPlayerViewManager?
+
+ // Event blocks for Fabric
+ @objc var onLoad: RCTDirectEventBlock?
+ @objc var onProgress: RCTDirectEventBlock?
+ @objc var onBuffering: RCTDirectEventBlock?
+ @objc var onEnd: RCTDirectEventBlock?
+ @objc var onError: RCTDirectEventBlock?
+ @objc var onBufferingProgress: RCTDirectEventBlock?
+
+ // Property setters that React Native will call
+ @objc var source: NSDictionary? {
+ didSet {
+ if let source = source {
+ setSource(source)
+ }
+ }
+ }
+
+ @objc var paused: Bool = false {
+ didSet {
+ setPaused(paused)
+ }
+ }
+
+ @objc var volume: NSNumber = 1.0 {
+ didSet {
+ setVolume(volume.floatValue)
+ }
+ }
+
+ @objc var audioTrack: NSNumber = -1 {
+ didSet {
+ setAudioTrack(audioTrack.intValue)
+ }
+ }
+
+ @objc var textTrack: NSNumber = -1 {
+ didSet {
+ setTextTrack(textTrack.intValue)
+ }
+ }
+
+ override init(frame: CGRect) {
+ super.init(frame: frame)
+ setupPlayerView()
+ }
+
+ required init?(coder: NSCoder) {
+ super.init(coder: coder)
+ setupPlayerView()
+ }
+
+ private func setupPlayerView() {
+ playerView = IOSVideoPlayerView()
+ playerView.translatesAutoresizingMaskIntoConstraints = false
+ addSubview(playerView)
+
+ NSLayoutConstraint.activate([
+ playerView.topAnchor.constraint(equalTo: topAnchor),
+ playerView.leadingAnchor.constraint(equalTo: leadingAnchor),
+ playerView.trailingAnchor.constraint(equalTo: trailingAnchor),
+ playerView.bottomAnchor.constraint(equalTo: bottomAnchor)
+ ])
+
+ // Set up player delegates and callbacks
+ setupPlayerCallbacks()
+ }
+
+ private func setupPlayerCallbacks() {
+ // Set up the player layer delegate
+ playerView.playerLayer?.delegate = self
+
+ // Configure KSOptions (use static defaults where required)
+ KSOptions.isAutoPlay = false
+ }
+
+ func setSource(_ source: NSDictionary) {
+ currentSource = source
+
+ guard let uri = source["uri"] as? String else {
+ print("KSPlayerView: No URI provided")
+ return
+ }
+
+ var headers: [String: String] = [:]
+ if let headersDict = source["headers"] as? [String: String] {
+ headers = headersDict
+ }
+
+ // Create KSPlayerResource
+ let url = URL(string: uri)!
+ let resource = KSPlayerResource(url: url, options: createOptions(with: headers), name: "Video")
+
+ print("KSPlayerView: Setting source: \(uri)")
+ playerView.set(resource: resource)
+
+ // Apply current state
+ if isPaused {
+ playerView.pause()
+ } else {
+ playerView.play()
+ }
+
+ setVolume(currentVolume)
+ }
+
+ private func createOptions(with headers: [String: String]) -> KSOptions {
+ let options = KSOptions()
+ options.hardwareDecode = KSOptions.hardwareDecode
+ if !headers.isEmpty {
+ options.appendHeader(headers)
+ if let referer = headers["Referer"] ?? headers["referer"] {
+ options.referer = referer
+ }
+ }
+ return options
+ }
+
+ func setPaused(_ paused: Bool) {
+ isPaused = paused
+ if paused {
+ playerView.pause()
+ } else {
+ playerView.play()
+ }
+ }
+
+ func setVolume(_ volume: Float) {
+ currentVolume = volume
+ playerView.playerLayer?.player.playbackVolume = volume
+ }
+
+ func seek(to time: TimeInterval) {
+ playerView.seek(time: time) { _ in }
+ }
+
+ func setAudioTrack(_ trackId: Int) {
+ if let player = playerView.playerLayer?.player {
+ let audioTracks = player.tracks(mediaType: .audio)
+ if trackId >= 0 && trackId < audioTracks.count {
+ // Enable only the selected track
+ for (index, track) in audioTracks.enumerated() {
+ track.isEnabled = (index == trackId)
+ }
+ }
+ }
+ }
+
+ func setTextTrack(_ trackId: Int) {
+ if let player = playerView.playerLayer?.player {
+ let textTracks = player.tracks(mediaType: .subtitle)
+ if trackId >= 0 && trackId < textTracks.count {
+ for (index, track) in textTracks.enumerated() {
+ track.isEnabled = (index == trackId)
+ }
+ } else if trackId == -1 {
+ // Disable all subtitles
+ for track in textTracks { track.isEnabled = false }
+ }
+ }
+ }
+
+ // Get current player state for React Native
+ func getCurrentState() -> [String: Any] {
+ guard let player = playerView.playerLayer?.player else {
+ return [:]
+ }
+
+ return [
+ "currentTime": player.currentPlaybackTime,
+ "duration": player.duration,
+ "buffered": player.playableTime,
+ "isPlaying": !isPaused,
+ "volume": currentVolume
+ ]
+ }
+}
+
+extension KSPlayerView: KSPlayerLayerDelegate {
+ func player(layer: KSPlayerLayer, state: KSPlayerState) {
+ switch state {
+ case .readyToPlay:
+ // Send onLoad event to React Native
+ let p = layer.player
+ sendEvent("onLoad", [
+ "duration": p.duration,
+ "currentTime": p.currentPlaybackTime,
+ "naturalSize": [
+ "width": p.naturalSize.width,
+ "height": p.naturalSize.height
+ ]
+ ])
+ case .buffering:
+ sendEvent("onBuffering", ["isBuffering": true])
+ case .bufferFinished:
+ sendEvent("onBuffering", ["isBuffering": false])
+ case .playedToTheEnd:
+ sendEvent("onEnd", [:])
+ case .error:
+ // Error will be handled by the finish delegate method
+ break
+ default:
+ break
+ }
+ }
+
+ func player(layer: KSPlayerLayer, currentTime: TimeInterval, totalTime: TimeInterval) {
+ let p = layer.player
+ sendEvent("onProgress", [
+ "currentTime": currentTime,
+ "duration": totalTime,
+ "bufferTime": p.playableTime
+ ])
+ }
+
+ func player(layer: KSPlayerLayer, finish error: Error?) {
+ if let error = error {
+ sendEvent("onError", ["error": error.localizedDescription])
+ }
+ }
+
+ func player(layer: KSPlayerLayer, bufferedCount: Int, consumeTime: TimeInterval) {
+ // Handle buffering progress if needed
+ sendEvent("onBufferingProgress", [
+ "bufferedCount": bufferedCount,
+ "consumeTime": consumeTime
+ ])
+ }
+}
+
+extension KSPlayerView {
+ private func sendEvent(_ eventName: String, _ body: [String: Any]) {
+ DispatchQueue.main.async {
+ switch eventName {
+ case "onLoad":
+ self.onLoad?(body)
+ case "onProgress":
+ self.onProgress?(body)
+ case "onBuffering":
+ self.onBuffering?(body)
+ case "onEnd":
+ self.onEnd?([:])
+ case "onError":
+ self.onError?(body)
+ case "onBufferingProgress":
+ self.onBufferingProgress?(body)
+ default:
+ break
+ }
+ }
+ }
+ // Renamed to avoid clashing with React's UIView category method
+ private func findHostViewController() -> UIViewController? {
+ var responder: UIResponder? = self
+ while let nextResponder = responder?.next {
+ if let viewController = nextResponder as? UIViewController {
+ return viewController
+ }
+ responder = nextResponder
+ }
+ return nil
+ }
+}
diff --git a/ios/Nuvio/KSPlayerViewManager.swift b/ios/Nuvio/KSPlayerViewManager.swift
new file mode 100644
index 0000000..dad2c71
--- /dev/null
+++ b/ios/Nuvio/KSPlayerViewManager.swift
@@ -0,0 +1,88 @@
+//
+// KSPlayerViewManager.swift
+// Nuvio
+//
+// Created by KSPlayer integration
+//
+
+import Foundation
+import KSPlayer
+import React
+
+@objc(KSPlayerViewManager)
+class KSPlayerViewManager: RCTViewManager {
+
+ // Not needed for RCTViewManager-based views; events are exported via RCT_EXPORT_VIEW_PROPERTY
+ override func view() -> UIView! {
+ let view = KSPlayerView()
+ view.viewManager = self
+ return view
+ }
+
+ override static func requiresMainQueueSetup() -> Bool {
+ return true
+ }
+
+ override func constantsToExport() -> [AnyHashable : Any]! {
+ return [
+ "EventTypes": [
+ "onLoad": "onLoad",
+ "onProgress": "onProgress",
+ "onBuffering": "onBuffering",
+ "onEnd": "onEnd",
+ "onError": "onError",
+ "onBufferingProgress": "onBufferingProgress"
+ ]
+ ]
+ }
+
+ // No-op: events are sent via direct event blocks on the view
+
+ @objc func seek(_ node: NSNumber, toTime time: NSNumber) {
+ DispatchQueue.main.async {
+ if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView {
+ view.seek(to: TimeInterval(truncating: time))
+ }
+ }
+ }
+
+ @objc func setSource(_ node: NSNumber, source: NSDictionary) {
+ DispatchQueue.main.async {
+ if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView {
+ view.setSource(source)
+ }
+ }
+ }
+
+ @objc func setPaused(_ node: NSNumber, paused: Bool) {
+ DispatchQueue.main.async {
+ if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView {
+ view.setPaused(paused)
+ }
+ }
+ }
+
+ @objc func setVolume(_ node: NSNumber, volume: NSNumber) {
+ DispatchQueue.main.async {
+ if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView {
+ view.setVolume(Float(truncating: volume))
+ }
+ }
+ }
+
+ @objc func setAudioTrack(_ node: NSNumber, trackId: NSNumber) {
+ DispatchQueue.main.async {
+ if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView {
+ view.setAudioTrack(Int(truncating: trackId))
+ }
+ }
+ }
+
+ @objc func setTextTrack(_ node: NSNumber, trackId: NSNumber) {
+ DispatchQueue.main.async {
+ if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView {
+ view.setTextTrack(Int(truncating: trackId))
+ }
+ }
+ }
+}
diff --git a/ios/Nuvio/Nuvio-Bridging-Header.h b/ios/Nuvio/Nuvio-Bridging-Header.h
new file mode 100644
index 0000000..5f6de5e
--- /dev/null
+++ b/ios/Nuvio/Nuvio-Bridging-Header.h
@@ -0,0 +1,11 @@
+//
+// Use this file to import your target's public headers that you would like to expose to Swift.
+//
+
+// React Native imports for bridge
+#import
+#import
+#import
+#import
+#import
+// Avoid importing deprecated/private headers that can break module maps
diff --git a/ios/Nuvio/Nuvio.entitlements b/ios/Nuvio/Nuvio.entitlements
new file mode 100644
index 0000000..a0bc443
--- /dev/null
+++ b/ios/Nuvio/Nuvio.entitlements
@@ -0,0 +1,10 @@
+
+
+
+
+ aps-environment
+ development
+ com.apple.developer.associated-domains
+
+
+
\ No newline at end of file
diff --git a/ios/Nuvio/PrivacyInfo.xcprivacy b/ios/Nuvio/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..c6b452e
--- /dev/null
+++ b/ios/Nuvio/PrivacyInfo.xcprivacy
@@ -0,0 +1,48 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryFileTimestamp
+ NSPrivacyAccessedAPITypeReasons
+
+ C617.1
+ 0A2A.1
+ 3B52.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryUserDefaults
+ NSPrivacyAccessedAPITypeReasons
+
+ CA92.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategorySystemBootTime
+ NSPrivacyAccessedAPITypeReasons
+
+ 35F9.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryDiskSpace
+ NSPrivacyAccessedAPITypeReasons
+
+ E174.1
+ 85F4.1
+
+
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/ios/Nuvio/SplashScreen.storyboard b/ios/Nuvio/SplashScreen.storyboard
new file mode 100644
index 0000000..1ff6f24
--- /dev/null
+++ b/ios/Nuvio/SplashScreen.storyboard
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ios/Nuvio/Supporting/Expo.plist b/ios/Nuvio/Supporting/Expo.plist
new file mode 100644
index 0000000..397287a
--- /dev/null
+++ b/ios/Nuvio/Supporting/Expo.plist
@@ -0,0 +1,16 @@
+
+
+
+
+ EXUpdatesCheckOnLaunch
+ ERROR_RECOVERY_ONLY
+ EXUpdatesEnabled
+
+ EXUpdatesLaunchWaitMs
+ 30000
+ EXUpdatesRuntimeVersion
+ 1.0.0
+ EXUpdatesURL
+ https://grim-reyna-tapframe-69970143.koyeb.app/api/manifest
+
+
\ No newline at end of file
diff --git a/ios/Nuvio/main.m b/ios/Nuvio/main.m
new file mode 100644
index 0000000..25181b6
--- /dev/null
+++ b/ios/Nuvio/main.m
@@ -0,0 +1,10 @@
+#import
+
+#import "AppDelegate.h"
+
+int main(int argc, char * argv[]) {
+ @autoreleasepool {
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+ }
+}
+
diff --git a/ios/Nuvio/noop-file.swift b/ios/Nuvio/noop-file.swift
new file mode 100644
index 0000000..b2ffafb
--- /dev/null
+++ b/ios/Nuvio/noop-file.swift
@@ -0,0 +1,4 @@
+//
+// @generated
+// A blank Swift file must be created for native modules with Swift files to work correctly.
+//
diff --git a/ios/Podfile b/ios/Podfile
new file mode 100644
index 0000000..4516ea1
--- /dev/null
+++ b/ios/Podfile
@@ -0,0 +1,72 @@
+require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking")
+require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods")
+
+require 'json'
+podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {}
+
+ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0'
+ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR']
+
+platform :ios, podfile_properties['ios.deploymentTarget'] || '15.1'
+install! 'cocoapods',
+ :deterministic_uuids => false
+
+prepare_react_native_project!
+
+target 'Nuvio' do
+ use_expo_modules!
+
+ if ENV['EXPO_USE_COMMUNITY_AUTOLINKING'] == '1'
+ config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"];
+ else
+ config_command = [
+ 'node',
+ '--no-warnings',
+ '--eval',
+ 'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))',
+ 'react-native-config',
+ '--json',
+ '--platform',
+ 'ios'
+ ]
+ end
+
+ config = use_native_modules!(config_command)
+
+ use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks']
+ use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS']
+
+ use_react_native!(
+ :path => config[:reactNativePath],
+ :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes',
+ # An absolute path to your application root.
+ :app_path => "#{Pod::Config.instance.installation_root}/..",
+ :privacy_file_aggregation_enabled => podfile_properties['apple.privacyManifestAggregationEnabled'] != 'false',
+ )
+
+ # KSPlayer dependencies
+ pod 'KSPlayer',:git => 'https://github.com/kingslay/KSPlayer.git', :branch => 'main', :modular_headers => true
+ pod 'DisplayCriteria',:git => 'https://github.com/kingslay/KSPlayer.git', :branch => 'main', :modular_headers => true
+ pod 'FFmpegKit',:git => 'https://github.com/kingslay/FFmpegKit.git', :branch => 'main', :modular_headers => true
+ pod 'Libass',:git => 'https://github.com/kingslay/FFmpegKit.git', :branch => 'main', :modular_headers => true
+
+ post_install do |installer|
+ react_native_post_install(
+ installer,
+ config[:reactNativePath],
+ :mac_catalyst_enabled => false,
+ :ccache_enabled => podfile_properties['apple.ccacheEnabled'] == 'true',
+ )
+
+ # This is necessary for Xcode 14, because it signs resource bundles by default
+ # when building for devices.
+ installer.target_installation_results.pod_target_installation_results
+ .each do |pod_name, target_installation_result|
+ target_installation_result.resource_bundle_targets.each do |resource_bundle_target|
+ resource_bundle_target.build_configurations.each do |config|
+ config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
+ end
+ end
+ end
+ end
+end
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
new file mode 100644
index 0000000..aa01f07
--- /dev/null
+++ b/ios/Podfile.lock
@@ -0,0 +1,2957 @@
+PODS:
+ - boost (1.84.0)
+ - DisplayCriteria (1.1.0)
+ - DoubleConversion (1.1.6)
+ - EASClient (0.13.3):
+ - ExpoModulesCore
+ - EXApplication (6.0.2):
+ - ExpoModulesCore
+ - EXConstants (17.0.8):
+ - ExpoModulesCore
+ - EXJSONUtils (0.14.0)
+ - EXManifests (0.15.8):
+ - ExpoModulesCore
+ - EXNotifications (0.29.14):
+ - ExpoModulesCore
+ - Expo (52.0.47):
+ - ExpoModulesCore
+ - expo-dev-client (5.0.20):
+ - EXManifests
+ - expo-dev-launcher
+ - expo-dev-menu
+ - expo-dev-menu-interface
+ - EXUpdatesInterface
+ - expo-dev-launcher (5.0.35):
+ - DoubleConversion
+ - EXManifests
+ - expo-dev-launcher/Main (= 5.0.35)
+ - expo-dev-menu
+ - expo-dev-menu-interface
+ - ExpoModulesCore
+ - EXUpdatesInterface
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-jsinspector
+ - React-NativeModulesApple
+ - React-RCTAppDelegate
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - expo-dev-launcher/Main (5.0.35):
+ - DoubleConversion
+ - EXManifests
+ - expo-dev-launcher/Unsafe
+ - expo-dev-menu
+ - expo-dev-menu-interface
+ - ExpoModulesCore
+ - EXUpdatesInterface
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-jsinspector
+ - React-NativeModulesApple
+ - React-RCTAppDelegate
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - expo-dev-launcher/Unsafe (5.0.35):
+ - DoubleConversion
+ - EXManifests
+ - expo-dev-menu
+ - expo-dev-menu-interface
+ - ExpoModulesCore
+ - EXUpdatesInterface
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-jsinspector
+ - React-NativeModulesApple
+ - React-RCTAppDelegate
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - expo-dev-menu (6.0.25):
+ - DoubleConversion
+ - expo-dev-menu/Main (= 6.0.25)
+ - expo-dev-menu/ReactNativeCompatibles (= 6.0.25)
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - expo-dev-menu-interface (1.9.3)
+ - expo-dev-menu/Main (6.0.25):
+ - DoubleConversion
+ - EXManifests
+ - expo-dev-menu-interface
+ - expo-dev-menu/Vendored
+ - ExpoModulesCore
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-jsinspector
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - expo-dev-menu/ReactNativeCompatibles (6.0.25):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - expo-dev-menu/SafeAreaView (6.0.25):
+ - DoubleConversion
+ - ExpoModulesCore
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - expo-dev-menu/Vendored (6.0.25):
+ - DoubleConversion
+ - expo-dev-menu/SafeAreaView
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - ExpoAsset (11.0.5):
+ - ExpoModulesCore
+ - ExpoBlur (14.0.3):
+ - ExpoModulesCore
+ - ExpoBrightness (13.0.3):
+ - ExpoModulesCore
+ - ExpoCrypto (14.0.2):
+ - ExpoModulesCore
+ - ExpoDevice (7.0.3):
+ - ExpoModulesCore
+ - ExpoFileSystem (18.0.12):
+ - ExpoModulesCore
+ - ExpoFont (13.0.4):
+ - ExpoModulesCore
+ - ExpoHaptics (14.0.1):
+ - ExpoModulesCore
+ - ExpoImage (2.0.7):
+ - ExpoModulesCore
+ - libavif/libdav1d
+ - SDWebImage (~> 5.19.1)
+ - SDWebImageAVIFCoder (~> 0.11.0)
+ - SDWebImageSVGCoder (~> 1.7.0)
+ - ExpoKeepAwake (14.0.3):
+ - ExpoModulesCore
+ - ExpoLinearGradient (14.0.2):
+ - ExpoModulesCore
+ - ExpoLinking (7.0.5):
+ - ExpoModulesCore
+ - ExpoLocalization (16.0.1):
+ - ExpoModulesCore
+ - ExpoModulesCore (2.2.3):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-jsinspector
+ - React-NativeModulesApple
+ - React-RCTAppDelegate
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - ExpoRandom (14.0.1):
+ - ExpoModulesCore
+ - ExpoScreenOrientation (8.0.4):
+ - DoubleConversion
+ - ExpoModulesCore
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - ExpoSystemUI (4.0.9):
+ - ExpoModulesCore
+ - ExpoWebBrowser (14.0.2):
+ - ExpoModulesCore
+ - EXStructuredHeaders (4.0.0)
+ - EXUpdates (0.27.4):
+ - DoubleConversion
+ - EASClient
+ - EXManifests
+ - ExpoModulesCore
+ - EXStructuredHeaders
+ - EXUpdatesInterface
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - ReachabilitySwift
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - EXUpdatesInterface (1.0.0):
+ - ExpoModulesCore
+ - fast_float (6.1.4)
+ - FBLazyVector (0.76.9)
+ - FFmpegKit (6.1.0):
+ - FFmpegKit/FFmpegKit (= 6.1.0)
+ - FFmpegKit/FFmpegKit (6.1.0):
+ - Libass
+ - fmt (11.0.2)
+ - glog (0.3.5)
+ - hermes-engine (0.76.9):
+ - hermes-engine/Pre-built (= 0.76.9)
+ - hermes-engine/Pre-built (0.76.9)
+ - ImageColors (2.5.0):
+ - ExpoModulesCore
+ - KSPlayer (1.1.0):
+ - KSPlayer/Audio (= 1.1.0)
+ - KSPlayer/AVPlayer (= 1.1.0)
+ - KSPlayer/Core (= 1.1.0)
+ - KSPlayer/MEPlayer (= 1.1.0)
+ - KSPlayer/Metal (= 1.1.0)
+ - KSPlayer/Subtitle (= 1.1.0)
+ - KSPlayer/SwiftUI (= 1.1.0)
+ - KSPlayer/Video (= 1.1.0)
+ - KSPlayer/Audio (1.1.0):
+ - KSPlayer/Core
+ - KSPlayer/AVPlayer (1.1.0):
+ - DisplayCriteria
+ - KSPlayer/Core (1.1.0):
+ - KSPlayer/AVPlayer
+ - KSPlayer/MEPlayer (1.1.0):
+ - FFmpegKit
+ - KSPlayer/AVPlayer
+ - KSPlayer/Metal
+ - KSPlayer/Subtitle
+ - KSPlayer/Metal (1.1.0)
+ - KSPlayer/Subtitle (1.1.0)
+ - KSPlayer/SwiftUI (1.1.0):
+ - KSPlayer/AVPlayer
+ - KSPlayer/Video (1.1.0):
+ - KSPlayer/Core
+ - KSPlayer/Subtitle
+ - Libass (0.17.1):
+ - Libass/Libass (= 0.17.1)
+ - Libass/Libass (0.17.1)
+ - libavif/core (0.11.1)
+ - libavif/libdav1d (0.11.1):
+ - libavif/core
+ - libdav1d (>= 0.6.0)
+ - libdav1d (1.2.0)
+ - lottie-ios (4.5.0)
+ - lottie-react-native (7.1.0):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - lottie-ios (= 4.5.0)
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - MobileVLCKit (3.5.1)
+ - RCT-Folly (2024.10.14.00):
+ - boost
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - RCT-Folly/Default (= 2024.10.14.00)
+ - RCT-Folly/Default (2024.10.14.00):
+ - boost
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - RCT-Folly/Fabric (2024.10.14.00):
+ - boost
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - RCTDeprecation (0.76.9)
+ - RCTRequired (0.76.9)
+ - RCTTypeSafety (0.76.9):
+ - FBLazyVector (= 0.76.9)
+ - RCTRequired (= 0.76.9)
+ - React-Core (= 0.76.9)
+ - ReachabilitySwift (5.2.4)
+ - React (0.76.9):
+ - React-Core (= 0.76.9)
+ - React-Core/DevSupport (= 0.76.9)
+ - React-Core/RCTWebSocket (= 0.76.9)
+ - React-RCTActionSheet (= 0.76.9)
+ - React-RCTAnimation (= 0.76.9)
+ - React-RCTBlob (= 0.76.9)
+ - React-RCTImage (= 0.76.9)
+ - React-RCTLinking (= 0.76.9)
+ - React-RCTNetwork (= 0.76.9)
+ - React-RCTSettings (= 0.76.9)
+ - React-RCTText (= 0.76.9)
+ - React-RCTVibration (= 0.76.9)
+ - React-callinvoker (0.76.9)
+ - React-Core (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default (= 0.76.9)
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/CoreModulesHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/Default (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/DevSupport (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default (= 0.76.9)
+ - React-Core/RCTWebSocket (= 0.76.9)
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/RCTActionSheetHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/RCTAnimationHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/RCTBlobHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/RCTImageHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/RCTLinkingHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/RCTNetworkHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/RCTSettingsHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/RCTTextHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/RCTVibrationHeaders (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-Core/RCTWebSocket (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTDeprecation
+ - React-Core/Default (= 0.76.9)
+ - React-cxxreact
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimescheduler
+ - React-utils
+ - SocketRocket (= 0.7.1)
+ - Yoga
+ - React-CoreModules (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - RCT-Folly
+ - RCTTypeSafety
+ - React-Core/CoreModulesHeaders
+ - React-jsi
+ - React-jsinspector
+ - React-NativeModulesApple
+ - React-RCTBlob
+ - React-RCTImage
+ - ReactCodegen
+ - ReactCommon
+ - SocketRocket
+ - React-cxxreact (0.76.9):
+ - boost
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-callinvoker
+ - React-debug
+ - React-jsi
+ - React-jsinspector
+ - React-logger
+ - React-perflogger
+ - React-runtimeexecutor
+ - React-timing
+ - React-debug (0.76.9)
+ - React-defaultsnativemodule (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-domnativemodule
+ - React-Fabric
+ - React-featureflags
+ - React-featureflagsnativemodule
+ - React-graphics
+ - React-idlecallbacksnativemodule
+ - React-ImageManager
+ - React-microtasksnativemodule
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-domnativemodule (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-FabricComponents
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-Fabric (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric/animations (= 0.76.9)
+ - React-Fabric/attributedstring (= 0.76.9)
+ - React-Fabric/componentregistry (= 0.76.9)
+ - React-Fabric/componentregistrynative (= 0.76.9)
+ - React-Fabric/components (= 0.76.9)
+ - React-Fabric/core (= 0.76.9)
+ - React-Fabric/dom (= 0.76.9)
+ - React-Fabric/imagemanager (= 0.76.9)
+ - React-Fabric/leakchecker (= 0.76.9)
+ - React-Fabric/mounting (= 0.76.9)
+ - React-Fabric/observers (= 0.76.9)
+ - React-Fabric/scheduler (= 0.76.9)
+ - React-Fabric/telemetry (= 0.76.9)
+ - React-Fabric/templateprocessor (= 0.76.9)
+ - React-Fabric/uimanager (= 0.76.9)
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/animations (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/attributedstring (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/componentregistry (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/componentregistrynative (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/components (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric/components/legacyviewmanagerinterop (= 0.76.9)
+ - React-Fabric/components/root (= 0.76.9)
+ - React-Fabric/components/view (= 0.76.9)
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/components/legacyviewmanagerinterop (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/components/root (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/components/view (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-Fabric/core (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/dom (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/imagemanager (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/leakchecker (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/mounting (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/observers (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric/observers/events (= 0.76.9)
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/observers/events (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/scheduler (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric/observers/events
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-performancetimeline
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/telemetry (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/templateprocessor (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/uimanager (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric/uimanager/consistency (= 0.76.9)
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererconsistency
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-Fabric/uimanager/consistency (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererconsistency
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCommon/turbomodule/core
+ - React-FabricComponents (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-FabricComponents/components (= 0.76.9)
+ - React-FabricComponents/textlayoutmanager (= 0.76.9)
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-FabricComponents/components/inputaccessory (= 0.76.9)
+ - React-FabricComponents/components/iostextinput (= 0.76.9)
+ - React-FabricComponents/components/modal (= 0.76.9)
+ - React-FabricComponents/components/rncore (= 0.76.9)
+ - React-FabricComponents/components/safeareaview (= 0.76.9)
+ - React-FabricComponents/components/scrollview (= 0.76.9)
+ - React-FabricComponents/components/text (= 0.76.9)
+ - React-FabricComponents/components/textinput (= 0.76.9)
+ - React-FabricComponents/components/unimplementedview (= 0.76.9)
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/inputaccessory (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/iostextinput (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/modal (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/rncore (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/safeareaview (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/scrollview (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/text (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/textinput (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/components/unimplementedview (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricComponents/textlayoutmanager (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-cxxreact
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-FabricImage (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Fabric
+ - React-graphics
+ - React-ImageManager
+ - React-jsi
+ - React-jsiexecutor
+ - React-logger
+ - React-rendererdebug
+ - React-utils
+ - ReactCommon
+ - Yoga
+ - React-featureflags (0.76.9)
+ - React-featureflagsnativemodule (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-graphics (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - RCT-Folly/Fabric
+ - React-jsi
+ - React-jsiexecutor
+ - React-utils
+ - React-hermes (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-cxxreact
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-perflogger
+ - React-runtimeexecutor
+ - React-idlecallbacksnativemodule (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - React-ImageManager (0.76.9):
+ - glog
+ - RCT-Folly/Fabric
+ - React-Core/Default
+ - React-debug
+ - React-Fabric
+ - React-graphics
+ - React-rendererdebug
+ - React-utils
+ - React-jserrorhandler (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - React-cxxreact
+ - React-debug
+ - React-jsi
+ - React-jsi (0.76.9):
+ - boost
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-jsiexecutor (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-cxxreact
+ - React-jsi
+ - React-jsinspector
+ - React-perflogger
+ - React-jsinspector (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-featureflags
+ - React-jsi
+ - React-perflogger
+ - React-runtimeexecutor
+ - React-jsitracing (0.76.9):
+ - React-jsi
+ - React-logger (0.76.9):
+ - glog
+ - React-Mapbuffer (0.76.9):
+ - glog
+ - React-debug
+ - React-microtasksnativemodule (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - react-native-blur (4.4.1):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - react-native-device-brightness (1.2.7):
+ - React
+ - react-native-get-random-values (1.11.0):
+ - React-Core
+ - react-native-netinfo (11.4.1):
+ - React-Core
+ - react-native-safe-area-context (4.12.0):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - react-native-safe-area-context/common (= 4.12.0)
+ - react-native-safe-area-context/fabric (= 4.12.0)
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - react-native-safe-area-context/common (4.12.0):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - react-native-safe-area-context/fabric (4.12.0):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - react-native-safe-area-context/common
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - react-native-slider (4.5.5):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - react-native-slider/common (= 4.5.5)
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - react-native-slider/common (4.5.5):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - react-native-video (6.16.1):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - react-native-video/Video (= 6.16.1)
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - react-native-video/Fabric (6.16.1):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - react-native-video/Video (6.16.1):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - react-native-video/Fabric
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - react-native-vlc-media-player (1.0.38):
+ - MobileVLCKit (= 3.5.1)
+ - React
+ - TVVLCKit (= 3.5.1)
+ - React-nativeconfig (0.76.9)
+ - React-NativeModulesApple (0.76.9):
+ - glog
+ - hermes-engine
+ - React-callinvoker
+ - React-Core
+ - React-cxxreact
+ - React-jsi
+ - React-jsinspector
+ - React-runtimeexecutor
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - React-perflogger (0.76.9):
+ - DoubleConversion
+ - RCT-Folly (= 2024.10.14.00)
+ - React-performancetimeline (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - React-cxxreact
+ - React-timing
+ - React-RCTActionSheet (0.76.9):
+ - React-Core/RCTActionSheetHeaders (= 0.76.9)
+ - React-RCTAnimation (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTTypeSafety
+ - React-Core/RCTAnimationHeaders
+ - React-jsi
+ - React-NativeModulesApple
+ - ReactCodegen
+ - ReactCommon
+ - React-RCTAppDelegate (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-CoreModules
+ - React-debug
+ - React-defaultsnativemodule
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-hermes
+ - React-nativeconfig
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-RCTImage
+ - React-RCTNetwork
+ - React-rendererdebug
+ - React-RuntimeApple
+ - React-RuntimeCore
+ - React-RuntimeHermes
+ - React-runtimescheduler
+ - React-utils
+ - ReactCodegen
+ - ReactCommon
+ - React-RCTBlob (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - React-Core/RCTBlobHeaders
+ - React-Core/RCTWebSocket
+ - React-jsi
+ - React-jsinspector
+ - React-NativeModulesApple
+ - React-RCTNetwork
+ - ReactCodegen
+ - ReactCommon
+ - React-RCTFabric (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-FabricComponents
+ - React-FabricImage
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-jsi
+ - React-jsinspector
+ - React-nativeconfig
+ - React-performancetimeline
+ - React-RCTImage
+ - React-RCTText
+ - React-rendererconsistency
+ - React-rendererdebug
+ - React-runtimescheduler
+ - React-utils
+ - Yoga
+ - React-RCTImage (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTTypeSafety
+ - React-Core/RCTImageHeaders
+ - React-jsi
+ - React-NativeModulesApple
+ - React-RCTNetwork
+ - ReactCodegen
+ - ReactCommon
+ - React-RCTLinking (0.76.9):
+ - React-Core/RCTLinkingHeaders (= 0.76.9)
+ - React-jsi (= 0.76.9)
+ - React-NativeModulesApple
+ - ReactCodegen
+ - ReactCommon
+ - ReactCommon/turbomodule/core (= 0.76.9)
+ - React-RCTNetwork (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTTypeSafety
+ - React-Core/RCTNetworkHeaders
+ - React-jsi
+ - React-NativeModulesApple
+ - ReactCodegen
+ - ReactCommon
+ - React-RCTSettings (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTTypeSafety
+ - React-Core/RCTSettingsHeaders
+ - React-jsi
+ - React-NativeModulesApple
+ - ReactCodegen
+ - ReactCommon
+ - React-RCTText (0.76.9):
+ - React-Core/RCTTextHeaders (= 0.76.9)
+ - Yoga
+ - React-RCTVibration (0.76.9):
+ - RCT-Folly (= 2024.10.14.00)
+ - React-Core/RCTVibrationHeaders
+ - React-jsi
+ - React-NativeModulesApple
+ - ReactCodegen
+ - ReactCommon
+ - React-rendererconsistency (0.76.9)
+ - React-rendererdebug (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - RCT-Folly
+ - React-debug
+ - React-rncore (0.76.9)
+ - React-RuntimeApple (0.76.9):
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - React-callinvoker
+ - React-Core/Default
+ - React-CoreModules
+ - React-cxxreact
+ - React-jserrorhandler
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-Mapbuffer
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-RuntimeCore
+ - React-runtimeexecutor
+ - React-RuntimeHermes
+ - React-runtimescheduler
+ - React-utils
+ - React-RuntimeCore (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - React-cxxreact
+ - React-featureflags
+ - React-jserrorhandler
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-performancetimeline
+ - React-runtimeexecutor
+ - React-runtimescheduler
+ - React-utils
+ - React-runtimeexecutor (0.76.9):
+ - React-jsi (= 0.76.9)
+ - React-RuntimeHermes (0.76.9):
+ - hermes-engine
+ - RCT-Folly/Fabric (= 2024.10.14.00)
+ - React-featureflags
+ - React-hermes
+ - React-jsi
+ - React-jsinspector
+ - React-jsitracing
+ - React-nativeconfig
+ - React-RuntimeCore
+ - React-utils
+ - React-runtimescheduler (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - React-callinvoker
+ - React-cxxreact
+ - React-debug
+ - React-featureflags
+ - React-jsi
+ - React-performancetimeline
+ - React-rendererconsistency
+ - React-rendererdebug
+ - React-runtimeexecutor
+ - React-timing
+ - React-utils
+ - React-timing (0.76.9)
+ - React-utils (0.76.9):
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - React-debug
+ - React-jsi (= 0.76.9)
+ - ReactCodegen (0.76.9):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-FabricImage
+ - React-featureflags
+ - React-graphics
+ - React-jsi
+ - React-jsiexecutor
+ - React-NativeModulesApple
+ - React-rendererdebug
+ - React-utils
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - ReactCommon (0.76.9):
+ - ReactCommon/turbomodule (= 0.76.9)
+ - ReactCommon/turbomodule (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-callinvoker
+ - React-cxxreact
+ - React-jsi
+ - React-logger
+ - React-perflogger
+ - ReactCommon/turbomodule/bridging (= 0.76.9)
+ - ReactCommon/turbomodule/core (= 0.76.9)
+ - ReactCommon/turbomodule/bridging (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-callinvoker
+ - React-cxxreact
+ - React-jsi (= 0.76.9)
+ - React-logger
+ - React-perflogger
+ - ReactCommon/turbomodule/core (0.76.9):
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - RCT-Folly
+ - React-callinvoker
+ - React-cxxreact
+ - React-debug (= 0.76.9)
+ - React-featureflags (= 0.76.9)
+ - React-jsi
+ - React-logger
+ - React-perflogger
+ - React-utils (= 0.76.9)
+ - RNCAsyncStorage (1.23.1):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - RNCPicker (2.9.0):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - RNGestureHandler (2.20.2):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - RNReanimated (3.16.7):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - RNReanimated/reanimated (= 3.16.7)
+ - RNReanimated/worklets (= 3.16.7)
+ - Yoga
+ - RNReanimated/reanimated (3.16.7):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - RNReanimated/reanimated/apple (= 3.16.7)
+ - Yoga
+ - RNReanimated/reanimated/apple (3.16.7):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - RNReanimated/worklets (3.16.7):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - RNScreens (4.4.0):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-RCTImage
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - RNScreens/common (= 4.4.0)
+ - Yoga
+ - RNScreens/common (4.4.0):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-RCTImage
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - RNSentry (6.10.0):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-hermes
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Sentry/HybridSDK (= 8.48.0)
+ - Yoga
+ - RNSVG (15.8.0):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - RNSVG/common (= 15.8.0)
+ - Yoga
+ - RNSVG/common (15.8.0):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2024.10.14.00)
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - SDWebImage (5.19.7):
+ - SDWebImage/Core (= 5.19.7)
+ - SDWebImage/Core (5.19.7)
+ - SDWebImageAVIFCoder (0.11.0):
+ - libavif/core (>= 0.11.0)
+ - SDWebImage (~> 5.10)
+ - SDWebImageSVGCoder (1.7.0):
+ - SDWebImage/Core (~> 5.6)
+ - Sentry/HybridSDK (8.48.0)
+ - SocketRocket (0.7.1)
+ - Yoga (0.0.0)
+
+DEPENDENCIES:
+ - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`)
+ - DisplayCriteria (from `https://github.com/kingslay/KSPlayer.git`, branch `main`)
+ - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
+ - EASClient (from `../node_modules/expo-eas-client/ios`)
+ - EXApplication (from `../node_modules/expo-application/ios`)
+ - EXConstants (from `../node_modules/expo-constants/ios`)
+ - EXJSONUtils (from `../node_modules/expo-json-utils/ios`)
+ - EXManifests (from `../node_modules/expo-manifests/ios`)
+ - EXNotifications (from `../node_modules/expo-notifications/ios`)
+ - Expo (from `../node_modules/expo`)
+ - expo-dev-client (from `../node_modules/expo-dev-client/ios`)
+ - expo-dev-launcher (from `../node_modules/expo-dev-launcher`)
+ - expo-dev-menu (from `../node_modules/expo-dev-menu`)
+ - expo-dev-menu-interface (from `../node_modules/expo-dev-menu-interface/ios`)
+ - ExpoAsset (from `../node_modules/expo-asset/ios`)
+ - ExpoBlur (from `../node_modules/expo-blur/ios`)
+ - ExpoBrightness (from `../node_modules/expo-brightness/ios`)
+ - ExpoCrypto (from `../node_modules/expo-crypto/ios`)
+ - ExpoDevice (from `../node_modules/expo-device/ios`)
+ - ExpoFileSystem (from `../node_modules/expo-file-system/ios`)
+ - ExpoFont (from `../node_modules/expo-font/ios`)
+ - ExpoHaptics (from `../node_modules/expo-haptics/ios`)
+ - ExpoImage (from `../node_modules/expo-image/ios`)
+ - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`)
+ - ExpoLinearGradient (from `../node_modules/expo-linear-gradient/ios`)
+ - ExpoLinking (from `../node_modules/expo-linking/ios`)
+ - ExpoLocalization (from `../node_modules/expo-localization/ios`)
+ - ExpoModulesCore (from `../node_modules/expo-modules-core`)
+ - ExpoRandom (from `../node_modules/expo-random/ios`)
+ - ExpoScreenOrientation (from `../node_modules/expo-screen-orientation/ios`)
+ - ExpoSystemUI (from `../node_modules/expo-system-ui/ios`)
+ - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`)
+ - EXStructuredHeaders (from `../node_modules/expo-structured-headers/ios`)
+ - EXUpdates (from `../node_modules/expo-updates/ios`)
+ - EXUpdatesInterface (from `../node_modules/expo-updates-interface/ios`)
+ - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`)
+ - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
+ - FFmpegKit (from `https://github.com/kingslay/FFmpegKit.git`, branch `main`)
+ - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`)
+ - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
+ - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)
+ - ImageColors (from `../node_modules/react-native-image-colors/ios`)
+ - KSPlayer (from `https://github.com/kingslay/KSPlayer.git`, branch `main`)
+ - Libass (from `https://github.com/kingslay/FFmpegKit.git`, branch `main`)
+ - lottie-react-native (from `../node_modules/lottie-react-native`)
+ - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
+ - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
+ - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`)
+ - RCTRequired (from `../node_modules/react-native/Libraries/Required`)
+ - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
+ - React (from `../node_modules/react-native/`)
+ - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
+ - React-Core (from `../node_modules/react-native/`)
+ - React-Core/RCTWebSocket (from `../node_modules/react-native/`)
+ - React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
+ - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
+ - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`)
+ - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`)
+ - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`)
+ - React-Fabric (from `../node_modules/react-native/ReactCommon`)
+ - React-FabricComponents (from `../node_modules/react-native/ReactCommon`)
+ - React-FabricImage (from `../node_modules/react-native/ReactCommon`)
+ - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`)
+ - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`)
+ - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`)
+ - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`)
+ - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`)
+ - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`)
+ - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`)
+ - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
+ - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
+ - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`)
+ - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`)
+ - React-logger (from `../node_modules/react-native/ReactCommon/logger`)
+ - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`)
+ - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`)
+ - "react-native-blur (from `../node_modules/@react-native-community/blur`)"
+ - "react-native-device-brightness (from `../node_modules/@adrianso/react-native-device-brightness`)"
+ - react-native-get-random-values (from `../node_modules/react-native-get-random-values`)
+ - "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
+ - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
+ - "react-native-slider (from `../node_modules/@react-native-community/slider`)"
+ - react-native-video (from `../node_modules/react-native-video`)
+ - react-native-vlc-media-player (from `../node_modules/react-native-vlc-media-player`)
+ - React-nativeconfig (from `../node_modules/react-native/ReactCommon`)
+ - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`)
+ - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`)
+ - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`)
+ - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
+ - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
+ - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`)
+ - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
+ - React-RCTFabric (from `../node_modules/react-native/React`)
+ - React-RCTImage (from `../node_modules/react-native/Libraries/Image`)
+ - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`)
+ - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`)
+ - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`)
+ - React-RCTText (from `../node_modules/react-native/Libraries/Text`)
+ - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
+ - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`)
+ - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`)
+ - React-rncore (from `../node_modules/react-native/ReactCommon`)
+ - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`)
+ - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`)
+ - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`)
+ - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`)
+ - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`)
+ - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`)
+ - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`)
+ - ReactCodegen (from `build/generated/ios`)
+ - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
+ - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
+ - "RNCPicker (from `../node_modules/@react-native-picker/picker`)"
+ - RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
+ - RNReanimated (from `../node_modules/react-native-reanimated`)
+ - RNScreens (from `../node_modules/react-native-screens`)
+ - "RNSentry (from `../node_modules/@sentry/react-native`)"
+ - RNSVG (from `../node_modules/react-native-svg`)
+ - Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
+
+SPEC REPOS:
+ trunk:
+ - libavif
+ - libdav1d
+ - lottie-ios
+ - MobileVLCKit
+ - ReachabilitySwift
+ - SDWebImage
+ - SDWebImageAVIFCoder
+ - SDWebImageSVGCoder
+ - Sentry
+ - SocketRocket
+
+EXTERNAL SOURCES:
+ boost:
+ :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec"
+ DisplayCriteria:
+ :branch: main
+ :git: https://github.com/kingslay/KSPlayer.git
+ DoubleConversion:
+ :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
+ EASClient:
+ :path: "../node_modules/expo-eas-client/ios"
+ EXApplication:
+ :path: "../node_modules/expo-application/ios"
+ EXConstants:
+ :path: "../node_modules/expo-constants/ios"
+ EXJSONUtils:
+ :path: "../node_modules/expo-json-utils/ios"
+ EXManifests:
+ :path: "../node_modules/expo-manifests/ios"
+ EXNotifications:
+ :path: "../node_modules/expo-notifications/ios"
+ Expo:
+ :path: "../node_modules/expo"
+ expo-dev-client:
+ :path: "../node_modules/expo-dev-client/ios"
+ expo-dev-launcher:
+ :path: "../node_modules/expo-dev-launcher"
+ expo-dev-menu:
+ :path: "../node_modules/expo-dev-menu"
+ expo-dev-menu-interface:
+ :path: "../node_modules/expo-dev-menu-interface/ios"
+ ExpoAsset:
+ :path: "../node_modules/expo-asset/ios"
+ ExpoBlur:
+ :path: "../node_modules/expo-blur/ios"
+ ExpoBrightness:
+ :path: "../node_modules/expo-brightness/ios"
+ ExpoCrypto:
+ :path: "../node_modules/expo-crypto/ios"
+ ExpoDevice:
+ :path: "../node_modules/expo-device/ios"
+ ExpoFileSystem:
+ :path: "../node_modules/expo-file-system/ios"
+ ExpoFont:
+ :path: "../node_modules/expo-font/ios"
+ ExpoHaptics:
+ :path: "../node_modules/expo-haptics/ios"
+ ExpoImage:
+ :path: "../node_modules/expo-image/ios"
+ ExpoKeepAwake:
+ :path: "../node_modules/expo-keep-awake/ios"
+ ExpoLinearGradient:
+ :path: "../node_modules/expo-linear-gradient/ios"
+ ExpoLinking:
+ :path: "../node_modules/expo-linking/ios"
+ ExpoLocalization:
+ :path: "../node_modules/expo-localization/ios"
+ ExpoModulesCore:
+ :path: "../node_modules/expo-modules-core"
+ ExpoRandom:
+ :path: "../node_modules/expo-random/ios"
+ ExpoScreenOrientation:
+ :path: "../node_modules/expo-screen-orientation/ios"
+ ExpoSystemUI:
+ :path: "../node_modules/expo-system-ui/ios"
+ ExpoWebBrowser:
+ :path: "../node_modules/expo-web-browser/ios"
+ EXStructuredHeaders:
+ :path: "../node_modules/expo-structured-headers/ios"
+ EXUpdates:
+ :path: "../node_modules/expo-updates/ios"
+ EXUpdatesInterface:
+ :path: "../node_modules/expo-updates-interface/ios"
+ fast_float:
+ :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec"
+ FBLazyVector:
+ :path: "../node_modules/react-native/Libraries/FBLazyVector"
+ FFmpegKit:
+ :branch: main
+ :git: https://github.com/kingslay/FFmpegKit.git
+ fmt:
+ :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec"
+ glog:
+ :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec"
+ hermes-engine:
+ :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec"
+ :tag: hermes-2024-11-12-RNv0.76.2-5b4aa20c719830dcf5684832b89a6edb95ac3d64
+ ImageColors:
+ :path: "../node_modules/react-native-image-colors/ios"
+ KSPlayer:
+ :branch: main
+ :git: https://github.com/kingslay/KSPlayer.git
+ Libass:
+ :branch: main
+ :git: https://github.com/kingslay/FFmpegKit.git
+ lottie-react-native:
+ :path: "../node_modules/lottie-react-native"
+ RCT-Folly:
+ :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
+ RCTDeprecation:
+ :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation"
+ RCTRequired:
+ :path: "../node_modules/react-native/Libraries/Required"
+ RCTTypeSafety:
+ :path: "../node_modules/react-native/Libraries/TypeSafety"
+ React:
+ :path: "../node_modules/react-native/"
+ React-callinvoker:
+ :path: "../node_modules/react-native/ReactCommon/callinvoker"
+ React-Core:
+ :path: "../node_modules/react-native/"
+ React-CoreModules:
+ :path: "../node_modules/react-native/React/CoreModules"
+ React-cxxreact:
+ :path: "../node_modules/react-native/ReactCommon/cxxreact"
+ React-debug:
+ :path: "../node_modules/react-native/ReactCommon/react/debug"
+ React-defaultsnativemodule:
+ :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults"
+ React-domnativemodule:
+ :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom"
+ React-Fabric:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-FabricComponents:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-FabricImage:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-featureflags:
+ :path: "../node_modules/react-native/ReactCommon/react/featureflags"
+ React-featureflagsnativemodule:
+ :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags"
+ React-graphics:
+ :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics"
+ React-hermes:
+ :path: "../node_modules/react-native/ReactCommon/hermes"
+ React-idlecallbacksnativemodule:
+ :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks"
+ React-ImageManager:
+ :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios"
+ React-jserrorhandler:
+ :path: "../node_modules/react-native/ReactCommon/jserrorhandler"
+ React-jsi:
+ :path: "../node_modules/react-native/ReactCommon/jsi"
+ React-jsiexecutor:
+ :path: "../node_modules/react-native/ReactCommon/jsiexecutor"
+ React-jsinspector:
+ :path: "../node_modules/react-native/ReactCommon/jsinspector-modern"
+ React-jsitracing:
+ :path: "../node_modules/react-native/ReactCommon/hermes/executor/"
+ React-logger:
+ :path: "../node_modules/react-native/ReactCommon/logger"
+ React-Mapbuffer:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-microtasksnativemodule:
+ :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks"
+ react-native-blur:
+ :path: "../node_modules/@react-native-community/blur"
+ react-native-device-brightness:
+ :path: "../node_modules/@adrianso/react-native-device-brightness"
+ react-native-get-random-values:
+ :path: "../node_modules/react-native-get-random-values"
+ react-native-netinfo:
+ :path: "../node_modules/@react-native-community/netinfo"
+ react-native-safe-area-context:
+ :path: "../node_modules/react-native-safe-area-context"
+ react-native-slider:
+ :path: "../node_modules/@react-native-community/slider"
+ react-native-video:
+ :path: "../node_modules/react-native-video"
+ react-native-vlc-media-player:
+ :path: "../node_modules/react-native-vlc-media-player"
+ React-nativeconfig:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-NativeModulesApple:
+ :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios"
+ React-perflogger:
+ :path: "../node_modules/react-native/ReactCommon/reactperflogger"
+ React-performancetimeline:
+ :path: "../node_modules/react-native/ReactCommon/react/performance/timeline"
+ React-RCTActionSheet:
+ :path: "../node_modules/react-native/Libraries/ActionSheetIOS"
+ React-RCTAnimation:
+ :path: "../node_modules/react-native/Libraries/NativeAnimation"
+ React-RCTAppDelegate:
+ :path: "../node_modules/react-native/Libraries/AppDelegate"
+ React-RCTBlob:
+ :path: "../node_modules/react-native/Libraries/Blob"
+ React-RCTFabric:
+ :path: "../node_modules/react-native/React"
+ React-RCTImage:
+ :path: "../node_modules/react-native/Libraries/Image"
+ React-RCTLinking:
+ :path: "../node_modules/react-native/Libraries/LinkingIOS"
+ React-RCTNetwork:
+ :path: "../node_modules/react-native/Libraries/Network"
+ React-RCTSettings:
+ :path: "../node_modules/react-native/Libraries/Settings"
+ React-RCTText:
+ :path: "../node_modules/react-native/Libraries/Text"
+ React-RCTVibration:
+ :path: "../node_modules/react-native/Libraries/Vibration"
+ React-rendererconsistency:
+ :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency"
+ React-rendererdebug:
+ :path: "../node_modules/react-native/ReactCommon/react/renderer/debug"
+ React-rncore:
+ :path: "../node_modules/react-native/ReactCommon"
+ React-RuntimeApple:
+ :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios"
+ React-RuntimeCore:
+ :path: "../node_modules/react-native/ReactCommon/react/runtime"
+ React-runtimeexecutor:
+ :path: "../node_modules/react-native/ReactCommon/runtimeexecutor"
+ React-RuntimeHermes:
+ :path: "../node_modules/react-native/ReactCommon/react/runtime"
+ React-runtimescheduler:
+ :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler"
+ React-timing:
+ :path: "../node_modules/react-native/ReactCommon/react/timing"
+ React-utils:
+ :path: "../node_modules/react-native/ReactCommon/react/utils"
+ ReactCodegen:
+ :path: build/generated/ios
+ ReactCommon:
+ :path: "../node_modules/react-native/ReactCommon"
+ RNCAsyncStorage:
+ :path: "../node_modules/@react-native-async-storage/async-storage"
+ RNCPicker:
+ :path: "../node_modules/@react-native-picker/picker"
+ RNGestureHandler:
+ :path: "../node_modules/react-native-gesture-handler"
+ RNReanimated:
+ :path: "../node_modules/react-native-reanimated"
+ RNScreens:
+ :path: "../node_modules/react-native-screens"
+ RNSentry:
+ :path: "../node_modules/@sentry/react-native"
+ RNSVG:
+ :path: "../node_modules/react-native-svg"
+ Yoga:
+ :path: "../node_modules/react-native/ReactCommon/yoga"
+
+CHECKOUT OPTIONS:
+ DisplayCriteria:
+ :commit: 8fe5feb73ca3ee5092d2ed1dd8fcb692c10e3c11
+ :git: https://github.com/kingslay/KSPlayer.git
+ FFmpegKit:
+ :commit: d7048037a2eb94a3b08113fbf43aa92bdcb332d9
+ :git: https://github.com/kingslay/FFmpegKit.git
+ KSPlayer:
+ :commit: 8fe5feb73ca3ee5092d2ed1dd8fcb692c10e3c11
+ :git: https://github.com/kingslay/KSPlayer.git
+ Libass:
+ :commit: d7048037a2eb94a3b08113fbf43aa92bdcb332d9
+ :git: https://github.com/kingslay/FFmpegKit.git
+
+SPEC CHECKSUMS:
+ boost: 1dca942403ed9342f98334bf4c3621f011aa7946
+ DisplayCriteria: bb0a90faf14b30848bc50ac0516340ce50164187
+ DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385
+ EASClient: 88b5fd19d0787186a0c7e6ba76deb2d4f96395ce
+ EXApplication: 4c72f6017a14a65e338c5e74fca418f35141e819
+ EXConstants: fcfc75800824ac2d5c592b5bc74130bad17b146b
+ EXJSONUtils: 01fc7492b66c234e395dcffdd5f53439c5c29c93
+ EXManifests: a19d50504b8826546a4782770317bc83fffec87d
+ EXNotifications: 9d3d17e52c95f377750d4a2ae553a716313dd4aa
+ Expo: 1687edb10c76b0c0f135306d6ae245379f50ed54
+ expo-dev-client: db44302cdbe0ec55b0ef1849c9a23a76dec6dbac
+ expo-dev-launcher: 792cd1c83fbec4a1a66fe91a0c283368dbad851c
+ expo-dev-menu: dd3197d2b0107ee036ffd85f95e75a950ab52ada
+ expo-dev-menu-interface: 00dc42302a72722fdecec3fa048de84a9133bcc4
+ ExpoAsset: 48386d40d53a8c1738929b3ed509bcad595b5516
+ ExpoBlur: 392c1207f71d0ecf22371621c1fbd44ba84d9742
+ ExpoBrightness: c0011699a3225c869666e266326774a6fb6a9075
+ ExpoCrypto: e97e864c8d7b9ce4a000bca45dddb93544a1b2b4
+ ExpoDevice: d36ab4186b6799a28fd449bb9a1c77455f23fd1a
+ ExpoFileSystem: 42d363d3b96f9afab980dcef60d5657a4443c655
+ ExpoFont: f354e926f8feae5e831ec8087f36652b44a0b188
+ ExpoHaptics: 8d199b2f33245ea85289ff6c954c7ee7c00a5b5d
+ ExpoImage: d840b256050f4428d2942bc2b6e9251f9e0d7021
+ ExpoKeepAwake: b0171a73665bfcefcfcc311742a72a956e6aa680
+ ExpoLinearGradient: 35ebd83b16f80b3add053a2fd68cc328ed927f60
+ ExpoLinking: 8d12bee174ba0cdf31239706578e29e74a417402
+ ExpoLocalization: 7776ea3bdb112125390745bbaf919b734b2ad1c7
+ ExpoModulesCore: c25d77625038b1968ea1afefc719862c0d8dd993
+ ExpoRandom: d1444df65007bdd4070009efd5dab18e20bf0f00
+ ExpoScreenOrientation: af8b31d3164239a4ef3ea0b32bd63fb65df70d58
+ ExpoSystemUI: b82a45cf0f6a4fa18d07c46deba8725dd27688b4
+ ExpoWebBrowser: a212e6b480d8857d3e441fba51e0c968333803b3
+ EXStructuredHeaders: 09c70347b282e3d2507e25fb4c747b1b885f87f6
+ EXUpdates: 4fc73950af0af03388063823e75eb2f7566a48c9
+ EXUpdatesInterface: 7c977640bdd8b85833c19e3959ba46145c5719db
+ fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6
+ FBLazyVector: 7605ea4810e0e10ae4815292433c09bf4324ba45
+ FFmpegKit: 3885085fbbc320745838ee4c8a1f9c5e5953dab2
+ fmt: 01b82d4ca6470831d1cc0852a1af644be019e8f6
+ glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a
+ hermes-engine: 9e868dc7be781364296d6ee2f56d0c1a9ef0bb11
+ ImageColors: 51cd79f7a9d2524b7a681c660b0a50574085563b
+ KSPlayer: f163ac6195f240b6fa5b8225aeb39ec811a70c62
+ Libass: e88af2324e1217e3a4c8bdc675f6f23a9dfc7677
+ libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7
+ libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f
+ lottie-ios: a881093fab623c467d3bce374367755c272bdd59
+ lottie-react-native: 4ba06e2e4985c53dda6595a880f780e7ff551df1
+ MobileVLCKit: 144d5f565512d1147d63b0fa1379231b3fd66535
+ RCT-Folly: ea9d9256ba7f9322ef911169a9f696e5857b9e17
+ RCTDeprecation: ebe712bb05077934b16c6bf25228bdec34b64f83
+ RCTRequired: ca91e5dd26b64f577b528044c962baf171c6b716
+ RCTTypeSafety: e7678bd60850ca5a41df9b8dc7154638cb66871f
+ ReachabilitySwift: 32793e867593cfc1177f5d16491e3a197d2fccda
+ React: 4641770499c39f45d4e7cde1eba30e081f9d8a3d
+ React-callinvoker: 4bef67b5c7f3f68db5929ab6a4d44b8a002998ea
+ React-Core: a68cea3e762814e60ecc3fa521c7f14c36c99245
+ React-CoreModules: d81b1eaf8066add66299bab9d23c9f00c9484c7c
+ React-cxxreact: 984f8b1feeca37181d4e95301fcd6f5f6501c6ab
+ React-debug: 817160c07dc8d24d020fbd1eac7b3558ffc08964
+ React-defaultsnativemodule: 18a684542f82ce1897552a1c4b847be414c9566e
+ React-domnativemodule: 90bdd4ec3ab38c47cfc3461c1e9283a8507d613f
+ React-Fabric: f6dade7007533daeb785ba5925039d83f343be4b
+ React-FabricComponents: b0655cc3e1b5ae12a4a1119aa7d8308f0ad33520
+ React-FabricImage: 9b157c4c01ac2bf433f834f0e1e5fe234113a576
+ React-featureflags: f2792b067a351d86fdc7bec23db3b9a2f2c8d26c
+ React-featureflagsnativemodule: 742a8325b3c821d2a1ca13a6d2a0fc72d04555e0
+ React-graphics: 68969e4e49d73f89da7abef4116c9b5f466aa121
+ React-hermes: ac0bcba26a5d288ebc99b500e1097da2d0297ddf
+ React-idlecallbacksnativemodule: d61d9c9816131bf70d3d80cd04889fc625ee523f
+ React-ImageManager: e906eec93a9eb6102a06576b89d48d80a4683020
+ React-jserrorhandler: ac5dde01104ff444e043cad8f574ca02756e20d6
+ React-jsi: 496fa2b9d63b726aeb07d0ac800064617d71211d
+ React-jsiexecutor: dd22ab48371b80f37a0a30d0e8915b6d0f43a893
+ React-jsinspector: 4629ac376f5765e684d19064f2093e55c97fd086
+ React-jsitracing: 7a1c9cd484248870cf660733cd3b8114d54c035f
+ React-logger: c4052eb941cca9a097ef01b59543a656dc088559
+ React-Mapbuffer: 33546a3ebefbccb8770c33a1f8a5554fa96a54de
+ React-microtasksnativemodule: d80ff86c8902872d397d9622f1a97aadcc12cead
+ react-native-blur: 535f5810fceb751b25db90c925ffa42ed007def7
+ react-native-device-brightness: 1a997350d060c3df9f303b1df84a4f7c5cbeb924
+ react-native-get-random-values: d16467cf726c618e9c7a8c3c39c31faa2244bbba
+ react-native-netinfo: cec9c4e86083cb5b6aba0e0711f563e2fbbff187
+ react-native-safe-area-context: cd916088cac5300c3266876218377518987b995e
+ react-native-slider: d8c35cc0162af73c9448f4b18c34d09e841cc1ab
+ react-native-video: bc6104529a6fde35127a1625b30d557412fdb70d
+ react-native-vlc-media-player: da3308dda896d4ff7abfacadb8f981752bf9b425
+ React-nativeconfig: 8efdb1ef1e9158c77098a93085438f7e7b463678
+ React-NativeModulesApple: cebca2e5320a3d66e123cade23bd90a167ffce5e
+ React-perflogger: 72e653eb3aba9122f9e57cf012d22d2486f33358
+ React-performancetimeline: cd6a9374a72001165995d2ab632f672df04076dc
+ React-RCTActionSheet: aacf2375084dea6e7c221f4a727e579f732ff342
+ React-RCTAnimation: 395ab53fd064dff81507c15efb781c8684d9a585
+ React-RCTAppDelegate: 345a6f1b82abc578437df0ce7e9c48740eca827c
+ React-RCTBlob: 13311e554c1a367de063c10ee7c5e6573b2dd1d6
+ React-RCTFabric: 007b1a98201cc49b5bc6e1417d7fe3f6fc6e2b78
+ React-RCTImage: 1b1f914bcc12187c49ba5d949dac38c2eb9f5cc8
+ React-RCTLinking: 4ac7c42beb65e36fba0376f3498f3cd8dd0be7fa
+ React-RCTNetwork: 938902773add4381e84426a7aa17a2414f5f94f7
+ React-RCTSettings: e848f1ba17a7a18479cf5a31d28145f567da8223
+ React-RCTText: 7e98fafdde7d29e888b80f0b35544e0cb07913cf
+ React-RCTVibration: cd7d80affd97dc7afa62f9acd491419558b64b78
+ React-rendererconsistency: b4917053ecbaa91469c67a4319701c9dc0d40be6
+ React-rendererdebug: aa181c36dd6cf5b35511d1ed875d6638fd38f0ec
+ React-rncore: 120d21715c9b4ba8f798bffe986cb769b988dd74
+ React-RuntimeApple: d033becbbd1eba6f9f6e3af6f1893030ce203edd
+ React-RuntimeCore: 38af280bb678e66ba000a3c3d42920b2a138eebb
+ React-runtimeexecutor: 877596f82f5632d073e121cba2d2084b76a76899
+ React-RuntimeHermes: 37aad735ff21ca6de2d8450a96de1afe9f86c385
+ React-runtimescheduler: 8ec34cc885281a34696ea16c4fd86892d631f38d
+ React-timing: 331cbf9f2668c67faddfd2e46bb7f41cbd9320b9
+ React-utils: ed818f19ab445000d6b5c4efa9d462449326cc9f
+ ReactCodegen: f853a20cc9125c5521c8766b4b49375fec20648b
+ ReactCommon: 300d8d9c5cb1a6cd79a67cf5d8f91e4d477195f9
+ RNCAsyncStorage: 66991bb6672ed988a8c56289a08bf4fc3a29d4b3
+ RNCPicker: 4995c384c0a33966352c70cc800012a4ee658a37
+ RNGestureHandler: fffddeb8af59709c6d8de11b6461a6af63cad532
+ RNReanimated: 2e5069649cbab2c946652d3b97589b2ae0526220
+ RNScreens: 362f4c861dd155f898908d5035d97b07a3f1a9d1
+ RNSentry: ac7beae04304d95491a512b5abf6926d4501c73c
+ RNSVG: b889dc9c1948eeea0576a16cc405c91c37a12c19
+ SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3
+ SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90
+ SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c
+ Sentry: 1ca8405451040482877dcd344dfa3ef80b646631
+ SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
+ Yoga: feb4910aba9742cfedc059e2b2902e22ffe9954a
+
+PODFILE CHECKSUM: 2743ffad4c68da0945d48cdefa62202d726c27d2
+
+COCOAPODS: 1.16.2
diff --git a/ios/Podfile.properties.json b/ios/Podfile.properties.json
new file mode 100644
index 0000000..417e2e5
--- /dev/null
+++ b/ios/Podfile.properties.json
@@ -0,0 +1,5 @@
+{
+ "expo.jsEngine": "hermes",
+ "EX_DEV_CLIENT_NETWORK_INSPECTOR": "true",
+ "newArchEnabled": "true"
+}
diff --git a/ios/scripts/add_ksplayer_bridge.rb b/ios/scripts/add_ksplayer_bridge.rb
new file mode 100644
index 0000000..96344f8
--- /dev/null
+++ b/ios/scripts/add_ksplayer_bridge.rb
@@ -0,0 +1,43 @@
+require 'xcodeproj'
+require 'fileutils'
+
+project_path = File.expand_path('../Nuvio.xcodeproj', __dir__)
+project = Xcodeproj::Project.open(project_path)
+
+app_dir = File.expand_path('..', __dir__)
+
+target_name = 'Nuvio'
+bridge_files = [
+ File.expand_path('Nuvio/KSPlayerView.swift', app_dir),
+ File.expand_path('Nuvio/KSPlayerViewManager.swift', app_dir),
+ File.expand_path('Nuvio/KSPlayerManager.m', app_dir),
+ File.expand_path('Nuvio/KSPlayerModule.swift', app_dir),
+]
+
+missing = bridge_files.reject { |p| File.exist?(p) }
+if missing.any?
+ abort "Missing files: \n#{missing.join("\n")}"
+end
+
+target = project.targets.find { |t| t.name == target_name }
+abort "Target '#{target_name}' not found" unless target
+
+# Ensure group exists at the correct relative path
+root_group = project.main_group
+app_group = root_group['Nuvio'] || root_group.new_group('Nuvio', 'Nuvio')
+
+added_files = []
+bridge_files.each do |file_path|
+ relative_path = Pathname.new(file_path).relative_path_from(Pathname.new(project_path).dirname).to_s
+ ref = project.files.find { |f| f.path == relative_path }
+ unless ref
+ ref = app_group.new_file(relative_path)
+ added_files << relative_path
+ end
+ unless target.source_build_phase.files_references.include?(ref)
+ target.add_file_references([ref])
+ end
+end
+
+project.save
+puts "Ensured bridge files are added to target '#{target_name}':\n - #{(added_files.empty? ? '(no new files)' : added_files.join("\n - "))}"
diff --git a/ios/sentry.properties b/ios/sentry.properties
new file mode 100644
index 0000000..5581e03
--- /dev/null
+++ b/ios/sentry.properties
@@ -0,0 +1,4 @@
+defaults.url=https://sentry.io/
+defaults.org=tapframe
+defaults.project=react-native
+# Using SENTRY_AUTH_TOKEN environment variable
\ No newline at end of file
diff --git a/ios/vendor/bundle/ruby/2.6.0/bin/xcodeproj b/ios/vendor/bundle/ruby/2.6.0/bin/xcodeproj
new file mode 100644
index 0000000..8358e7d
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/bin/xcodeproj
@@ -0,0 +1,27 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'xcodeproj' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0.a"
+
+str = ARGV.first
+if str
+ str = str.b[/\A_(.*)_\z/, 1]
+ if str and Gem::Version.correct?(str)
+ version = str
+ ARGV.shift
+ end
+end
+
+if Gem.respond_to?(:activate_bin_path)
+load Gem.activate_bin_path('xcodeproj', 'xcodeproj', version)
+else
+gem "xcodeproj", version
+load Gem.bin_path("xcodeproj", "xcodeproj", version)
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/CFPropertyList-3.0.7.gem b/ios/vendor/bundle/ruby/2.6.0/cache/CFPropertyList-3.0.7.gem
new file mode 100644
index 0000000..de3dd7d
Binary files /dev/null and b/ios/vendor/bundle/ruby/2.6.0/cache/CFPropertyList-3.0.7.gem differ
diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/atomos-0.1.3.gem b/ios/vendor/bundle/ruby/2.6.0/cache/atomos-0.1.3.gem
new file mode 100644
index 0000000..c12e2f0
Binary files /dev/null and b/ios/vendor/bundle/ruby/2.6.0/cache/atomos-0.1.3.gem differ
diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/base64-0.3.0.gem b/ios/vendor/bundle/ruby/2.6.0/cache/base64-0.3.0.gem
new file mode 100644
index 0000000..12f53f1
Binary files /dev/null and b/ios/vendor/bundle/ruby/2.6.0/cache/base64-0.3.0.gem differ
diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/claide-1.1.0.gem b/ios/vendor/bundle/ruby/2.6.0/cache/claide-1.1.0.gem
new file mode 100644
index 0000000..6b0fb2d
Binary files /dev/null and b/ios/vendor/bundle/ruby/2.6.0/cache/claide-1.1.0.gem differ
diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/colored2-3.1.2.gem b/ios/vendor/bundle/ruby/2.6.0/cache/colored2-3.1.2.gem
new file mode 100644
index 0000000..9757ae3
Binary files /dev/null and b/ios/vendor/bundle/ruby/2.6.0/cache/colored2-3.1.2.gem differ
diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/nanaimo-0.4.0.gem b/ios/vendor/bundle/ruby/2.6.0/cache/nanaimo-0.4.0.gem
new file mode 100644
index 0000000..9f5ff7f
Binary files /dev/null and b/ios/vendor/bundle/ruby/2.6.0/cache/nanaimo-0.4.0.gem differ
diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/nkf-0.2.0.gem b/ios/vendor/bundle/ruby/2.6.0/cache/nkf-0.2.0.gem
new file mode 100644
index 0000000..4485f24
Binary files /dev/null and b/ios/vendor/bundle/ruby/2.6.0/cache/nkf-0.2.0.gem differ
diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/rexml-3.4.4.gem b/ios/vendor/bundle/ruby/2.6.0/cache/rexml-3.4.4.gem
new file mode 100644
index 0000000..46cc01a
Binary files /dev/null and b/ios/vendor/bundle/ruby/2.6.0/cache/rexml-3.4.4.gem differ
diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/xcodeproj-1.27.0.gem b/ios/vendor/bundle/ruby/2.6.0/cache/xcodeproj-1.27.0.gem
new file mode 100644
index 0000000..29e64e0
Binary files /dev/null and b/ios/vendor/bundle/ruby/2.6.0/cache/xcodeproj-1.27.0.gem differ
diff --git a/ios/vendor/bundle/ruby/2.6.0/extensions/universal-darwin-24/2.6.0/nkf-0.2.0/gem.build_complete b/ios/vendor/bundle/ruby/2.6.0/extensions/universal-darwin-24/2.6.0/nkf-0.2.0/gem.build_complete
new file mode 100644
index 0000000..e69de29
diff --git a/ios/vendor/bundle/ruby/2.6.0/extensions/universal-darwin-24/2.6.0/nkf-0.2.0/gem_make.out b/ios/vendor/bundle/ruby/2.6.0/extensions/universal-darwin-24/2.6.0/nkf-0.2.0/gem_make.out
new file mode 100644
index 0000000..24554a7
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/extensions/universal-darwin-24/2.6.0/nkf-0.2.0/gem_make.out
@@ -0,0 +1,16 @@
+current directory: /Users/tapframe/Desktop/Project/Nuvio/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/ext/nkf
+/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby -I /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0 -r ./siteconf20250917-1505-1tafywa.rb extconf.rb
+creating Makefile
+
+current directory: /Users/tapframe/Desktop/Project/Nuvio/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/ext/nkf
+make "DESTDIR=" clean
+
+current directory: /Users/tapframe/Desktop/Project/Nuvio/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/ext/nkf
+make "DESTDIR="
+compiling nkf.c
+linking shared-object nkf.bundle
+ld: warning: search path '/AppleInternal/Library/BuildRoots/1c8f7852-1ca9-11f0-b28b-226177e5bb69/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.5.Internal.sdk/usr/local/lib' not found
+
+current directory: /Users/tapframe/Desktop/Project/Nuvio/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/ext/nkf
+make "DESTDIR=" install
+/usr/bin/install -c -m 0755 nkf.bundle ./.gem.20250917-1505-18va8d4
diff --git a/ios/vendor/bundle/ruby/2.6.0/extensions/universal-darwin-24/2.6.0/nkf-0.2.0/nkf.bundle b/ios/vendor/bundle/ruby/2.6.0/extensions/universal-darwin-24/2.6.0/nkf-0.2.0/nkf.bundle
new file mode 100644
index 0000000..0d1f46a
Binary files /dev/null and b/ios/vendor/bundle/ruby/2.6.0/extensions/universal-darwin-24/2.6.0/nkf-0.2.0/nkf.bundle differ
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/LICENSE b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/LICENSE
new file mode 100644
index 0000000..ba6ffb2
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2010 Christian Kruse,
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/README.md b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/README.md
new file mode 100644
index 0000000..49f0c07
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/README.md
@@ -0,0 +1,79 @@
+CFPropertyList implementation
+class to read, manipulate and write both XML and binary property list
+files (plist(5)) as defined by Apple. Have a look at CFPropertyList::List
+for more documentation.
+
+# Caution!
+
+In version 3.0.0 we dropped Ruby 1.8 compatibility. If you are using
+Ruby 1.8 consider to update Ruby; if you can't upgrade, don't upgrade
+CFPropertyList.
+
+# Installation
+
+You could either use ruby gems and install it via
+
+```bash
+gem install CFPropertyList
+```
+
+or you could clone this repository and place it somewhere in your load path.
+
+Example:
+```ruby
+require 'cfpropertylist'
+```
+
+If you're using Rails, you can add it into your Gemfile
+
+```ruby
+gem 'CFPropertyList'
+```
+
+# Usage
+
+ ## create a arbitrary data structure of basic data types
+
+```ruby
+data = {
+ 'name' => 'John Doe',
+ 'missing' => true,
+ 'last_seen' => Time.now,
+ 'friends' => ['Jane Doe','Julian Doe'],
+ 'likes' => {
+ 'me' => false
+ }
+}
+```
+
+## create CFPropertyList::List object
+
+```ruby
+plist = CFPropertyList::List.new
+```
+
+## call CFPropertyList.guess() to create corresponding CFType values
+
+```ruby
+plist.value = CFPropertyList.guess(data)
+```
+
+## write plist to file
+```ruby
+plist.save("example.plist", CFPropertyList::List::FORMAT_BINARY)
+```
+
+## … later, read it again
+```ruby
+plist = CFPropertyList::List.new(:file => "example.plist")
+data = CFPropertyList.native_types(plist.value)
+```
+
+# Author and license
+
+**Author:** Christian Kruse (mailto:cjk@wwwtech.de)
+
+**Copyright:** Copyright (c) 2010
+
+**License:** MIT License
+
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/README.rdoc b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/README.rdoc
new file mode 100644
index 0000000..a71005c
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/README.rdoc
@@ -0,0 +1,43 @@
+CFPropertyList implementation
+class to read, manipulate and write both XML and binary property list
+files (plist(5)) as defined by Apple. Have a look at CFPropertyList::List
+for more documentation.
+
+== Installation
+
+You could either use ruby gems and install it via
+
+ gem install CFPropertyList
+
+or you could clone this repository and place it somewhere in your load path.
+
+== Example
+ require 'cfpropertylist'
+
+ # create a arbitrary data structure of basic data types
+ data = {
+ 'name' => 'John Doe',
+ 'missing' => true,
+ 'last_seen' => Time.now,
+ 'friends' => ['Jane Doe','Julian Doe'],
+ 'likes' => {
+ 'me' => false
+ }
+ }
+
+ # create CFPropertyList::List object
+ plist = CFPropertyList::List.new
+
+ # call CFPropertyList.guess() to create corresponding CFType values
+ plist.value = CFPropertyList.guess(data)
+
+ # write plist to file
+ plist.save("example.plist", CFPropertyList::List::FORMAT_BINARY)
+
+ # … later, read it again
+ plist = CFPropertyList::List.new(:file => "example.plist")
+ data = CFPropertyList.native_types(plist.value)
+
+Author:: Christian Kruse (mailto:cjk@wwwtech.de)
+Copyright:: Copyright (c) 2010
+License:: MIT License
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/THANKS b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/THANKS
new file mode 100644
index 0000000..c981a51
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/THANKS
@@ -0,0 +1,7 @@
+Special thanks to:
+
+Steve Madsen for providing a lot of performance patches and bugfixes!
+Have a look at his Github account:
+
+
+
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist.rb b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist.rb
new file mode 100644
index 0000000..f83fef7
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist.rb
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+
+require 'cfpropertylist/rbCFPropertyList'
+
+
+# eof
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbBinaryCFPropertyList.rb b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbBinaryCFPropertyList.rb
new file mode 100644
index 0000000..da84b63
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbBinaryCFPropertyList.rb
@@ -0,0 +1,594 @@
+# -*- coding: utf-8 -*-
+
+require 'stringio'
+
+module CFPropertyList
+ # Binary PList parser class
+ class Binary
+ # Read a binary plist file
+ def load(opts)
+ @unique_table = {}
+ @count_objects = 0
+ @object_refs = 0
+
+ @written_object_count = 0
+ @object_table = []
+ @object_ref_size = 0
+
+ @offsets = []
+
+ fd = nil
+ if(opts.has_key?(:file))
+ fd = File.open(opts[:file],"rb")
+ file = opts[:file]
+ else
+ fd = StringIO.new(opts[:data],"rb")
+ file = ""
+ end
+
+ # first, we read the trailer: 32 byte from the end
+ fd.seek(-32,IO::SEEK_END)
+ buff = fd.read(32)
+
+ offset_size, object_ref_size, number_of_objects, top_object, table_offset = buff.unpack "x6CCx4Nx4Nx4N"
+
+ # after that, get the offset table
+ fd.seek(table_offset, IO::SEEK_SET)
+ coded_offset_table = fd.read(number_of_objects * offset_size)
+ raise CFFormatError.new("#{file}: Format error!") unless coded_offset_table.bytesize == number_of_objects * offset_size
+
+ @count_objects = number_of_objects
+
+ # decode offset table
+ if(offset_size != 3)
+ formats = ["","C*","n*","","N*"]
+ @offsets = coded_offset_table.unpack(formats[offset_size])
+ else
+ @offsets = coded_offset_table.unpack("C*").each_slice(3).map {
+ |x,y,z| (x << 16) | (y << 8) | z
+ }
+ end
+
+ @object_ref_size = object_ref_size
+ val = read_binary_object_at(file,fd,top_object)
+
+ fd.close
+ val
+ end
+
+
+ # Convert CFPropertyList to binary format; since we have to count our objects we simply unique CFDictionary and CFArray
+ def to_str(opts={})
+ @unique_table = {}
+ @count_objects = 0
+ @object_refs = 0
+
+ @written_object_count = 0
+ @object_table = []
+
+ @offsets = []
+
+ binary_str = "bplist00"
+
+ @object_refs = count_object_refs(opts[:root])
+
+ opts[:root].to_binary(self)
+
+ next_offset = 8
+ offsets = @object_table.map do |object|
+ offset = next_offset
+ next_offset += object.bytesize
+ offset
+ end
+ binary_str << @object_table.join
+
+ table_offset = next_offset
+ offset_size = Binary.bytes_needed(table_offset)
+
+ if offset_size < 8
+ # Fast path: encode the entire offset array at once.
+ binary_str << offsets.pack((%w(C n N N)[offset_size - 1]) + '*')
+ else
+ # Slow path: host may be little or big endian, must pack each offset
+ # separately.
+ offsets.each do |offset|
+ binary_str << "#{Binary.pack_it_with_size(offset_size,offset)}"
+ end
+ end
+
+ binary_str << [offset_size, object_ref_size(@object_refs)].pack("x6CC")
+ binary_str << [@object_table.size].pack("x4N")
+ binary_str << [0].pack("x4N")
+ binary_str << [table_offset].pack("x4N")
+
+ binary_str
+ end
+
+ def object_ref_size object_refs
+ Binary.bytes_needed(object_refs)
+ end
+
+ # read a „null” type (i.e. null byte, marker byte, bool value)
+ def read_binary_null_type(length)
+ case length
+ when 0 then 0 # null byte
+ when 8 then CFBoolean.new(false)
+ when 9 then CFBoolean.new(true)
+ when 15 then 15 # fill type
+ else
+ raise CFFormatError.new("unknown null type: #{length}")
+ end
+ end
+ protected :read_binary_null_type
+
+ # read a binary int value
+ def read_binary_int(fname,fd,length)
+ if length > 4
+ raise CFFormatError.new("Integer greater than 16 bytes: #{length}")
+ end
+
+ nbytes = 1 << length
+
+ buff = fd.read(nbytes)
+
+ CFInteger.new(
+ case length
+ when 0 then buff.unpack("C")[0]
+ when 1 then buff.unpack("n")[0]
+ when 2 then buff.unpack("N")[0]
+ # 8 byte integers are always signed
+ when 3 then buff.unpack("q>")[0]
+ # 16 byte integers are used to represent unsigned 8 byte integers
+ # where the unsigned value is stored in the lower 8 bytes and the
+ # upper 8 bytes are unused.
+ when 4 then buff.unpack("Q>Q>")[1]
+ end
+ )
+ end
+ protected :read_binary_int
+
+ # read a binary real value
+ def read_binary_real(fname,fd,length)
+ raise CFFormatError.new("Real greater than 8 bytes: #{length}") if length > 3
+
+ nbytes = 1 << length
+ buff = fd.read(nbytes)
+
+ CFReal.new(
+ case length
+ when 0 # 1 byte float? must be an error
+ raise CFFormatError.new("got #{length+1} byte float, must be an error!")
+ when 1 # 2 byte float? must be an error
+ raise CFFormatError.new("got #{length+1} byte float, must be an error!")
+ when 2 then
+ buff.reverse.unpack("e")[0]
+ when 3 then
+ buff.reverse.unpack("E")[0]
+ else
+ fail "unexpected length: #{length}"
+ end
+ )
+ end
+ protected :read_binary_real
+
+ # read a binary date value
+ def read_binary_date(fname,fd,length)
+ raise CFFormatError.new("Date greater than 8 bytes: #{length}") if length > 3
+
+ nbytes = 1 << length
+ buff = fd.read(nbytes)
+
+ CFDate.new(
+ case length
+ when 0 then # 1 byte CFDate is an error
+ raise CFFormatError.new("#{length+1} byte CFDate, error")
+ when 1 then # 2 byte CFDate is an error
+ raise CFFormatError.new("#{length+1} byte CFDate, error")
+ when 2 then
+ buff.reverse.unpack("e")[0]
+ when 3 then
+ buff.reverse.unpack("E")[0]
+ end,
+ CFDate::TIMESTAMP_APPLE
+ )
+ end
+ protected :read_binary_date
+
+ # Read a binary data value
+ def read_binary_data(fname,fd,length)
+ CFData.new(read_fd(fd, length), CFData::DATA_RAW)
+ end
+ protected :read_binary_data
+
+ def read_fd fd, length
+ length > 0 ? fd.read(length) : ""
+ end
+
+ # Read a binary string value
+ def read_binary_string(fname,fd,length)
+ buff = read_fd fd, length
+ @unique_table[buff] = true unless @unique_table.has_key?(buff)
+ CFString.new(buff)
+ end
+ protected :read_binary_string
+
+ # Convert the given string from one charset to another
+ def Binary.charset_convert(str,from,to="UTF-8")
+ return str.dup.force_encoding(from).encode(to) if str.respond_to?("encode")
+ Iconv.conv(to,from,str)
+ end
+
+ # Count characters considering character set
+ def Binary.charset_strlen(str,charset="UTF-8")
+ if str.respond_to?(:encode)
+ size = str.length
+ else
+ utf8_str = Iconv.conv("UTF-8",charset,str)
+ size = utf8_str.scan(/./mu).size
+ end
+
+ # UTF-16 code units in the range D800-DBFF are the beginning of
+ # a surrogate pair, and count as one additional character for
+ # length calculation.
+ if charset =~ /^UTF-16/
+ if str.respond_to?(:encode)
+ str.bytes.to_a.each_slice(2) { |pair| size += 1 if (0xd8..0xdb).include?(pair[0]) }
+ else
+ str.split('').each_slice(2) { |pair| size += 1 if ("\xd8".."\xdb").include?(pair[0]) }
+ end
+ end
+
+ size
+ end
+
+ # Read a unicode string value, coded as UTF-16BE
+ def read_binary_unicode_string(fname,fd,length)
+ # The problem is: we get the length of the string IN CHARACTERS;
+ # since a char in UTF-16 can be 16 or 32 bit long, we don't really know
+ # how long the string is in bytes
+ buff = fd.read(2*length)
+
+ @unique_table[buff] = true unless @unique_table.has_key?(buff)
+ CFString.new(Binary.charset_convert(buff,"UTF-16BE","UTF-8"))
+ end
+ protected :read_binary_unicode_string
+
+ def unpack_with_size(nbytes, buff)
+ format = ["C*", "n*", "N*", "N*"][nbytes - 1];
+
+ if nbytes == 3
+ buff = "\0" + buff.scan(/.{1,3}/).join("\0")
+ end
+
+ return buff.unpack(format)
+ end
+
+ # Read an binary array value, including contained objects
+ def read_binary_array(fname,fd,length)
+ ary = []
+
+ # first: read object refs
+ if(length != 0)
+ buff = fd.read(length * @object_ref_size)
+ objects = unpack_with_size(@object_ref_size, buff) #buff.unpack(@object_ref_size == 1 ? "C*" : "n*")
+
+ # now: read objects
+ 0.upto(length-1) do |i|
+ object = read_binary_object_at(fname,fd,objects[i])
+ ary.push object
+ end
+ end
+
+ CFArray.new(ary)
+ end
+ protected :read_binary_array
+
+ # Read a dictionary value, including contained objects
+ def read_binary_dict(fname,fd,length)
+ dict = {}
+
+ # first: read keys
+ if(length != 0) then
+ buff = fd.read(length * @object_ref_size)
+ keys = unpack_with_size(@object_ref_size, buff)
+
+ # second: read object refs
+ buff = fd.read(length * @object_ref_size)
+ objects = unpack_with_size(@object_ref_size, buff)
+
+ # read real keys and objects
+ 0.upto(length-1) do |i|
+ key = read_binary_object_at(fname,fd,keys[i])
+ object = read_binary_object_at(fname,fd,objects[i])
+ dict[key.value] = object
+ end
+ end
+
+ CFDictionary.new(dict)
+ end
+ protected :read_binary_dict
+
+ # Read an object type byte, decode it and delegate to the correct
+ # reader function
+ def read_binary_object(fname,fd)
+ # first: read the marker byte
+ buff = fd.read(1)
+
+ object_length = buff.unpack("C*")
+ object_length = object_length[0] & 0xF
+
+ buff = buff.unpack("H*")
+ object_type = buff[0][0].chr
+
+ if(object_type != "0" && object_length == 15) then
+ object_length = read_binary_object(fname,fd)
+ object_length = object_length.value
+ end
+
+ case object_type
+ when '0' # null, false, true, fillbyte
+ read_binary_null_type(object_length)
+ when '1' # integer
+ read_binary_int(fname,fd,object_length)
+ when '2' # real
+ read_binary_real(fname,fd,object_length)
+ when '3' # date
+ read_binary_date(fname,fd,object_length)
+ when '4' # data
+ read_binary_data(fname,fd,object_length)
+ when '5' # byte string, usually utf8 encoded
+ read_binary_string(fname,fd,object_length)
+ when '6' # unicode string (utf16be)
+ read_binary_unicode_string(fname,fd,object_length)
+ when '8'
+ CFUid.new(read_binary_int(fname, fd, object_length).value)
+ when 'a' # array
+ read_binary_array(fname,fd,object_length)
+ when 'd' # dictionary
+ read_binary_dict(fname,fd,object_length)
+ end
+ end
+ protected :read_binary_object
+
+ # Read an object type byte at position $pos, decode it and delegate to the correct reader function
+ def read_binary_object_at(fname,fd,pos)
+ position = @offsets[pos]
+ fd.seek(position,IO::SEEK_SET)
+ read_binary_object(fname,fd)
+ end
+ protected :read_binary_object_at
+
+ # pack an +int+ of +nbytes+ with size
+ def Binary.pack_it_with_size(nbytes,int)
+ case nbytes
+ when 1 then [int].pack('c')
+ when 2 then [int].pack('n')
+ when 4 then [int].pack('N')
+ when 8
+ [int >> 32, int & 0xFFFFFFFF].pack('NN')
+ else
+ raise CFFormatError.new("Don't know how to pack #{nbytes} byte integer")
+ end
+ end
+
+ def Binary.pack_int_array_with_size(nbytes, array)
+ case nbytes
+ when 1 then array.pack('C*')
+ when 2 then array.pack('n*')
+ when 4 then array.pack('N*')
+ when 8
+ array.map { |int| [int >> 32, int & 0xFFFFFFFF].pack('NN') }.join
+ else
+ raise CFFormatError.new("Don't know how to pack #{nbytes} byte integer")
+ end
+ end
+
+ # calculate how many bytes are needed to save +count+
+ def Binary.bytes_needed(count)
+ case
+ when count < 2**8 then 1
+ when count < 2**16 then 2
+ when count < 2**32 then 4
+ when count < 2**64 then 8
+ else
+ raise CFFormatError.new("Data size too large: #{count}")
+ end
+ end
+
+ # Create a type byte for binary format as defined by apple
+ def Binary.type_bytes(type, length)
+ if length < 15
+ [(type << 4) | length].pack('C')
+ else
+ bytes = [(type << 4) | 0xF]
+ if length <= 0xFF
+ bytes.push(0x10, length).pack('CCC') # 1 byte length
+ elsif length <= 0xFFFF
+ bytes.push(0x11, length).pack('CCn') # 2 byte length
+ elsif length <= 0xFFFFFFFF
+ bytes.push(0x12, length).pack('CCN') # 4 byte length
+ elsif length <= 0x7FFFFFFFFFFFFFFF
+ bytes.push(0x13, length >> 32, length & 0xFFFFFFFF).pack('CCNN') # 8 byte length
+ else
+ raise CFFormatError.new("Integer too large: #{int}")
+ end
+ end
+ end
+
+ def count_object_refs(object)
+ case object
+ when CFArray
+ contained_refs = 0
+ object.value.each do |element|
+ if CFArray === element || CFDictionary === element
+ contained_refs += count_object_refs(element)
+ end
+ end
+ return object.value.size + contained_refs
+ when CFDictionary
+ contained_refs = 0
+ object.value.each_value do |value|
+ if CFArray === value || CFDictionary === value
+ contained_refs += count_object_refs(value)
+ end
+ end
+ return object.value.keys.size * 2 + contained_refs
+ else
+ return 0
+ end
+ end
+
+ def Binary.ascii_string?(str)
+ if str.respond_to?(:ascii_only?)
+ str.ascii_only?
+ else
+ str !~ /[\x80-\xFF]/mn
+ end
+ end
+
+ # Uniques and transforms a string value to binary format and adds it to the object table
+ def string_to_binary(val)
+ val = val.to_s
+
+ @unique_table[val] ||= begin
+ if !Binary.ascii_string?(val)
+ val = Binary.charset_convert(val,"UTF-8","UTF-16BE")
+ bdata = Binary.type_bytes(0b0110, Binary.charset_strlen(val,"UTF-16BE"))
+
+ val.force_encoding("ASCII-8BIT") if val.respond_to?("encode")
+ @object_table[@written_object_count] = bdata << val
+ else
+ bdata = Binary.type_bytes(0b0101,val.bytesize)
+ @object_table[@written_object_count] = bdata << val
+ end
+
+ @written_object_count += 1
+ @written_object_count - 1
+ end
+ end
+
+ # Codes an integer to binary format
+ def int_to_binary(value)
+ # Note: nbytes is actually an exponent. number of bytes = 2**nbytes.
+ nbytes = 0
+ nbytes = 1 if value > 0xFF # 1 byte unsigned integer
+ nbytes += 1 if value > 0xFFFF # 4 byte unsigned integer
+ nbytes += 1 if value > 0xFFFFFFFF # 8 byte unsigned integer
+ nbytes += 1 if value > 0x7FFFFFFFFFFFFFFF # 8 byte unsigned integer, stored in lower half of 16 bytes
+ nbytes = 3 if value < 0 # signed integers always stored in 8 bytes
+
+ Binary.type_bytes(0b0001, nbytes) <<
+ if nbytes < 4
+ [value].pack(["C", "n", "N", "q>"][nbytes])
+ else # nbytes == 4
+ [0,value].pack("Q>Q>")
+ end
+ end
+
+ # Codes a real value to binary format
+ def real_to_binary(val)
+ Binary.type_bytes(0b0010,3) << [val].pack("E").reverse
+ end
+
+ # Converts a numeric value to binary and adds it to the object table
+ def num_to_binary(value)
+ @object_table[@written_object_count] =
+ if value.is_a?(CFInteger)
+ int_to_binary(value.value)
+ else
+ real_to_binary(value.value)
+ end
+
+ @written_object_count += 1
+ @written_object_count - 1
+ end
+
+ def uid_to_binary(value)
+ nbytes = 0
+ nbytes = 1 if value > 0xFF # 1 byte integer
+ nbytes += 1 if value > 0xFFFF # 4 byte integer
+ nbytes += 1 if value > 0xFFFFFFFF # 8 byte integer
+ nbytes = 3 if value < 0 # 8 byte integer, since signed
+
+ @object_table[@written_object_count] = Binary.type_bytes(0b1000, nbytes) <<
+ if nbytes < 3
+ [value].pack(
+ if nbytes == 0 then "C"
+ elsif nbytes == 1 then "n"
+ else "N"
+ end
+ )
+ else
+ # 64 bit signed integer; we need the higher and the lower 32 bit of the value
+ high_word = value >> 32
+ low_word = value & 0xFFFFFFFF
+ [high_word,low_word].pack("NN")
+ end
+
+ @written_object_count += 1
+ @written_object_count - 1
+ end
+
+ # Convert date value (apple format) to binary and adds it to the object table
+ def date_to_binary(val)
+ val = val.getutc.to_f - CFDate::DATE_DIFF_APPLE_UNIX # CFDate is a real, number of seconds since 01/01/2001 00:00:00 GMT
+
+ @object_table[@written_object_count] =
+ (Binary.type_bytes(0b0011, 3) << [val].pack("E").reverse)
+
+ @written_object_count += 1
+ @written_object_count - 1
+ end
+
+ # Convert a bool value to binary and add it to the object table
+ def bool_to_binary(val)
+
+ @object_table[@written_object_count] = val ? "\x9" : "\x8" # 0x9 is 1001, type indicator for true; 0x8 is 1000, type indicator for false
+ @written_object_count += 1
+ @written_object_count - 1
+ end
+
+ # Convert data value to binary format and add it to the object table
+ def data_to_binary(val)
+ @object_table[@written_object_count] =
+ (Binary.type_bytes(0b0100, val.bytesize) << val)
+
+ @written_object_count += 1
+ @written_object_count - 1
+ end
+
+ # Convert array to binary format and add it to the object table
+ def array_to_binary(val)
+ saved_object_count = @written_object_count
+ @written_object_count += 1
+ #@object_refs += val.value.size
+
+ values = val.value.map { |v| v.to_binary(self) }
+ bdata = Binary.type_bytes(0b1010, val.value.size) <<
+ Binary.pack_int_array_with_size(object_ref_size(@object_refs),
+ values)
+
+ @object_table[saved_object_count] = bdata
+ saved_object_count
+ end
+
+ # Convert dictionary to binary format and add it to the object table
+ def dict_to_binary(val)
+ saved_object_count = @written_object_count
+ @written_object_count += 1
+
+ #@object_refs += val.value.keys.size * 2
+
+ keys_and_values = val.value.keys.map { |k| CFString.new(k).to_binary(self) }
+ keys_and_values.concat(val.value.values.map { |v| v.to_binary(self) })
+
+ bdata = Binary.type_bytes(0b1101,val.value.size) <<
+ Binary.pack_int_array_with_size(object_ref_size(@object_refs), keys_and_values)
+
+ @object_table[saved_object_count] = bdata
+ return saved_object_count
+ end
+ end
+end
+
+# eof
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPlistError.rb b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPlistError.rb
new file mode 100644
index 0000000..e276565
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPlistError.rb
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+#
+# Exceptions used:
+# CFPlistError:: General base exception
+# CFFormatError:: Format error
+# CFTypeError:: Type error
+#
+# Easy and simple :-)
+#
+# Author:: Christian Kruse (mailto:cjk@wwwtech.de)
+# Copyright:: Copyright (c) 2010
+# License:: MIT License
+
+# general plist error. All exceptions thrown are derived from this class.
+class CFPlistError < StandardError
+end
+
+# Exception thrown when format errors occur
+class CFFormatError < CFPlistError
+end
+
+# Exception thrown when type errors occur
+class CFTypeError < CFPlistError
+end
+
+# eof
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPropertyList.rb b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPropertyList.rb
new file mode 100644
index 0000000..d31ba51
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPropertyList.rb
@@ -0,0 +1,449 @@
+# -*- coding: utf-8 -*-
+
+require 'kconv'
+require 'date'
+require 'time'
+
+#
+# CFPropertyList implementation
+#
+# class to read, manipulate and write both XML and binary property list
+# files (plist(5)) as defined by Apple. Have a look at CFPropertyList::List
+# for more documentation.
+#
+# == Example
+# require 'cfpropertylist'
+#
+# # create a arbitrary data structure of basic data types
+# data = {
+# 'name' => 'John Doe',
+# 'missing' => true,
+# 'last_seen' => Time.now,
+# 'friends' => ['Jane Doe','Julian Doe'],
+# 'likes' => {
+# 'me' => false
+# }
+# }
+#
+# # create CFPropertyList::List object
+# plist = CFPropertyList::List.new
+#
+# # call CFPropertyList.guess() to create corresponding CFType values
+# # pass in optional :convert_unknown_to_string => true to convert things like symbols into strings.
+# plist.value = CFPropertyList.guess(data)
+#
+# # write plist to file
+# plist.save("example.plist", CFPropertyList::List::FORMAT_BINARY)
+#
+# # … later, read it again
+# plist = CFPropertyList::List.new(:file => "example.plist")
+# data = CFPropertyList.native_types(plist.value)
+#
+# Author:: Christian Kruse (mailto:cjk@wwwtech.de)
+# Copyright:: Copyright (c) 2010
+# License:: MIT License
+module CFPropertyList
+ class << self
+ attr_accessor :xml_parser_interface
+ end
+
+ # interface class for PList parsers
+ class ParserInterface
+ # load a plist
+ def load(opts={})
+ return ""
+ end
+
+ # convert a plist to string
+ def to_str(opts={})
+ return true
+ end
+ end
+
+ class XMLParserInterface < ParserInterface
+ def new_node(name)
+ end
+
+ def new_text(val)
+ end
+
+ def append_node(parent, child)
+ end
+ end
+end
+
+dirname = File.dirname(__FILE__)
+require dirname + '/rbCFPlistError.rb'
+require dirname + '/rbCFTypes.rb'
+require dirname + '/rbBinaryCFPropertyList.rb'
+require dirname + '/rbPlainCFPropertyList.rb'
+
+begin
+ require dirname + '/rbLibXMLParser.rb'
+ temp = LibXML::XML::Parser::Options::NOBLANKS # check if we have a version with parser options
+ temp = false # avoid a warning
+ try_nokogiri = false
+ CFPropertyList.xml_parser_interface = CFPropertyList::LibXMLParser
+rescue LoadError, NameError
+ try_nokogiri = true
+end
+
+if try_nokogiri then
+ begin
+ require dirname + '/rbNokogiriParser.rb'
+ CFPropertyList.xml_parser_interface = CFPropertyList::NokogiriXMLParser
+ rescue LoadError
+ require dirname + '/rbREXMLParser.rb'
+ CFPropertyList.xml_parser_interface = CFPropertyList::ReXMLParser
+ end
+end
+
+
+module CFPropertyList
+ # Create CFType hierarchy by guessing the correct CFType, e.g.
+ #
+ # x = {
+ # 'a' => ['b','c','d']
+ # }
+ # cftypes = CFPropertyList.guess(x)
+ #
+ # pass optional options hash. Only possible value actually:
+ # +convert_unknown_to_string+:: Convert unknown objects to string calling to_str()
+ # +converter_method+:: Convert unknown objects to known objects calling +method_name+
+ #
+ # cftypes = CFPropertyList.guess(x,:convert_unknown_to_string => true,:converter_method => :to_hash, :converter_with_opts => true)
+ def guess(object, options = {})
+ case object
+ when Integer then CFInteger.new(object)
+ when UidFixnum then CFUid.new(object)
+ when Float then CFReal.new(object)
+ when TrueClass, FalseClass then CFBoolean.new(object)
+
+ when Blob
+ CFData.new(object, CFData::DATA_RAW)
+
+ when String, Symbol
+ CFString.new(object.to_s)
+
+ when Time, DateTime, Date
+ CFDate.new(object)
+
+ when Array, Enumerator
+ ary = Array.new
+ object.each do |o|
+ ary.push CFPropertyList.guess(o, options)
+ end
+ CFArray.new(ary)
+
+ when Hash
+ hsh = Hash.new
+ object.each_pair do |k,v|
+ k = k.to_s if k.is_a?(Symbol)
+ hsh[k] = CFPropertyList.guess(v, options)
+ end
+ CFDictionary.new(hsh)
+ else
+ case
+ when Object.const_defined?('BigDecimal') && object.is_a?(BigDecimal)
+ CFReal.new(object)
+ when object.respond_to?(:read)
+ raw_data = object.read
+ # treat the data as a bytestring (ASCII-8BIT) if Ruby supports it. Do this by forcing
+ # the encoding, on the assumption that the bytes were read correctly, and just tagged with
+ # an inappropriate encoding, rather than transcoding.
+ raw_data.force_encoding(Encoding::ASCII_8BIT) if raw_data.respond_to?(:force_encoding)
+ CFData.new(raw_data, CFData::DATA_RAW)
+ when options[:converter_method] && object.respond_to?(options[:converter_method])
+ if options[:converter_with_opts]
+ CFPropertyList.guess(object.send(options[:converter_method],options),options)
+ else
+ CFPropertyList.guess(object.send(options[:converter_method]),options)
+ end
+ when options[:convert_unknown_to_string]
+ CFString.new(object.to_s)
+ else
+ raise CFTypeError.new("Unknown class #{object.class.to_s}. Try using :convert_unknown_to_string if you want to use unknown object types!")
+ end
+ end
+ end
+
+ # Converts a CFType hiercharchy to native Ruby types
+ def native_types(object,keys_as_symbols=false)
+ return if object.nil?
+
+ if(object.is_a?(CFDate) || object.is_a?(CFString) || object.is_a?(CFInteger) || object.is_a?(CFReal) || object.is_a?(CFBoolean)) || object.is_a?(CFUid) then
+ return object.value
+ elsif(object.is_a?(CFData)) then
+ return CFPropertyList::Blob.new(object.decoded_value)
+ elsif(object.is_a?(CFArray)) then
+ ary = []
+ object.value.each do
+ |v|
+ ary.push CFPropertyList.native_types(v)
+ end
+
+ return ary
+ elsif(object.is_a?(CFDictionary)) then
+ hsh = {}
+ object.value.each_pair do
+ |k,v|
+ k = k.to_sym if keys_as_symbols
+ hsh[k] = CFPropertyList.native_types(v)
+ end
+
+ return hsh
+ end
+ end
+
+ module_function :guess, :native_types
+
+ # Class representing a CFPropertyList. Instantiate with #new
+ class List
+ # Format constant for binary format
+ FORMAT_BINARY = 1
+
+ # Format constant for XML format
+ FORMAT_XML = 2
+
+ # Format constant for the old plain format
+ FORMAT_PLAIN = 3
+
+ # Format constant for automatic format recognizing
+ FORMAT_AUTO = 0
+
+ @@parsers = [Binary, CFPropertyList.xml_parser_interface, PlainParser]
+
+ # Path of PropertyList
+ attr_accessor :filename
+ # the original format of the PropertyList
+ attr_accessor :format
+ # the root value in the plist file
+ attr_accessor :value
+ # default value for XML generation; if true generate formatted XML
+ attr_accessor :formatted
+
+ # initialize a new CFPropertyList, arguments are:
+ #
+ # :file:: Parse a file
+ # :format:: Format is one of FORMAT_BINARY or FORMAT_XML. Defaults to FORMAT_AUTO
+ # :data:: Parse a string
+ #
+ # All arguments are optional
+ def initialize(opts={})
+ @filename = opts[:file]
+ @format = opts[:format] || FORMAT_AUTO
+ @data = opts[:data]
+ @formatted = opts[:formatted]
+
+ load(@filename) unless @filename.nil?
+ load_str(@data) unless @data.nil?
+ end
+
+ # returns a list of registered parsers
+ def self.parsers
+ @@parsers
+ end
+
+ # set a list of parsers
+ def self.parsers=(val)
+ @@parsers = val
+ end
+
+ # Load an XML PropertyList
+ # filename = nil:: The filename to read from; if nil, read from the file defined by instance variable +filename+
+ def load_xml(filename=nil)
+ load(filename,List::FORMAT_XML)
+ end
+
+ # read a binary plist file
+ # filename = nil:: The filename to read from; if nil, read from the file defined by instance variable +filename+
+ def load_binary(filename=nil)
+ load(filename,List::FORMAT_BINARY)
+ end
+
+ # read a plain plist file
+ # filename = nil:: The filename to read from; if nil, read from the file defined by instance variable +filename+
+ def load_plain(filename=nil)
+ load(filename,List::FORMAT_PLAIN)
+ end
+
+ # load a plist from a XML string
+ # str:: The string containing the plist
+ def load_xml_str(str=nil)
+ load_str(str,List::FORMAT_XML)
+ end
+
+ # load a plist from a binary string
+ # str:: The string containing the plist
+ def load_binary_str(str=nil)
+ load_str(str,List::FORMAT_BINARY)
+ end
+
+ # load a plist from a plain string
+ # str:: The string containing the plist
+ def load_plain_str(str=nil)
+ load_str(str,List::FORMAT_PLAIN)
+ end
+
+ # load a plist from a string
+ # str = nil:: The string containing the plist
+ # format = nil:: The format of the plist
+ def load_str(str=nil,format=nil)
+ str = @data if str.nil?
+ format = @format if format.nil?
+
+ @value = {}
+ case format
+ when List::FORMAT_BINARY, List::FORMAT_XML, List::FORMAT_PLAIN then
+ prsr = @@parsers[format-1].new
+ @value = prsr.load({:data => str})
+
+ when List::FORMAT_AUTO then # what we now do is ugly, but neccessary to recognize the file format
+ filetype = str[0..5]
+ version = str[6..7]
+
+ prsr = nil
+
+ if filetype == "bplist" then
+ raise CFFormatError.new("Wrong file version #{version}") unless version == "00"
+ prsr = Binary.new
+ @format = List::FORMAT_BINARY
+ else
+ if str =~ /^<(\?xml|!DOCTYPE|plist)/
+ prsr = CFPropertyList.xml_parser_interface.new
+ @format = List::FORMAT_XML
+ else
+ prsr = PlainParser.new
+ @format = List::FORMAT_PLAIN
+ end
+ end
+
+ @value = prsr.load({:data => str})
+ end
+ end
+
+ # Read a plist file
+ # file = nil:: The filename of the file to read. If nil, use +filename+ instance variable
+ # format = nil:: The format of the plist file. Auto-detect if nil
+ def load(file=nil,format=nil)
+ file = @filename if file.nil?
+ format = @format if format.nil?
+ @value = {}
+
+ raise IOError.new("File #{file} not readable!") unless File.readable? file
+
+ case format
+ when List::FORMAT_BINARY, List::FORMAT_XML, List::FORMAT_PLAIN then
+ prsr = @@parsers[format-1].new
+ @value = prsr.load({:file => file})
+
+ when List::FORMAT_AUTO then # what we now do is ugly, but neccessary to recognize the file format
+ magic_number = IO.read(file,12)
+ raise IOError.new("File #{file} is empty.") unless magic_number
+ filetype = magic_number[0..5]
+ version = magic_number[6..7]
+
+ prsr = nil
+ if filetype == "bplist" then
+ raise CFFormatError.new("Wrong file version #{version}") unless version == "00"
+ prsr = Binary.new
+ @format = List::FORMAT_BINARY
+ else
+ if magic_number =~ /^<(\?xml|!DOCTYPE|plist)/
+ prsr = CFPropertyList.xml_parser_interface.new
+ @format = List::FORMAT_XML
+ else
+ prsr = PlainParser.new
+ @format = List::FORMAT_PLAIN
+ end
+ end
+
+ @value = prsr.load({:file => file})
+ end
+
+ raise CFFormatError.new("Invalid format or parser error!") if @value.nil?
+ end
+
+ # Serialize CFPropertyList object to specified format and write it to file
+ # file = nil:: The filename of the file to write to. Uses +filename+ instance variable if nil
+ # format = nil:: The format to save in. Uses +format+ instance variable if nil
+ def save(file=nil,format=nil,opts={})
+ format = @format if format.nil?
+ file = @filename if file.nil?
+
+ if format != FORMAT_BINARY && format != FORMAT_XML && format != FORMAT_PLAIN
+ raise CFFormatError.new("Format #{format} not supported, use List::FORMAT_BINARY or List::FORMAT_XML")
+ end
+
+ if(!File.exist?(file)) then
+ raise IOError.new("File #{file} not writable!") unless File.writable?(File.dirname(file))
+ elsif(!File.writable?(file)) then
+ raise IOError.new("File #{file} not writable!")
+ end
+
+ opts[:root] = @value
+ opts[:formatted] = @formatted unless opts.has_key?(:formatted)
+
+ prsr = @@parsers[format-1].new
+
+ content = prsr.to_str(opts)
+
+ File.open(file, 'wb') {
+ |fd|
+ fd.write content
+ }
+ end
+
+ # convert plist to string
+ # format = List::FORMAT_BINARY:: The format to save the plist
+ # opts={}:: Pass parser options
+ def to_str(format=List::FORMAT_BINARY,opts={})
+ if format != FORMAT_BINARY && format != FORMAT_XML && format != FORMAT_PLAIN
+ raise CFFormatError.new("Format #{format} not supported, use List::FORMAT_BINARY or List::FORMAT_XML")
+ end
+
+ prsr = @@parsers[format-1].new
+
+ opts[:root] = @value
+ opts[:formatted] = @formatted unless opts.has_key?(:formatted)
+
+ return prsr.to_str(opts)
+ end
+ end
+end
+
+
+class Array
+ # convert an array to plist format
+ def to_plist(options={})
+ options[:plist_format] ||= CFPropertyList::List::FORMAT_BINARY
+
+ plist = CFPropertyList::List.new
+ plist.value = CFPropertyList.guess(self, options)
+ plist.to_str(options[:plist_format], options)
+ end
+end
+
+class Enumerator
+ # convert an array to plist format
+ def to_plist(options={})
+ options[:plist_format] ||= CFPropertyList::List::FORMAT_BINARY
+
+ plist = CFPropertyList::List.new
+ plist.value = CFPropertyList.guess(self, options)
+ plist.to_str(options[:plist_format], options)
+ end
+end
+
+class Hash
+ # convert a hash to plist format
+ def to_plist(options={})
+ options[:plist_format] ||= CFPropertyList::List::FORMAT_BINARY
+
+ plist = CFPropertyList::List.new
+ plist.value = CFPropertyList.guess(self, options)
+ plist.to_str(options[:plist_format], options)
+ end
+end
+
+# eof
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFTypes.rb b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFTypes.rb
new file mode 100644
index 0000000..8563721
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFTypes.rb
@@ -0,0 +1,349 @@
+# -*- coding: utf-8 -*-
+#
+# CFTypes, e.g. CFString, CFInteger
+# needed to create unambiguous plists
+#
+# Author:: Christian Kruse (mailto:cjk@wwwtech.de)
+# Copyright:: Copyright (c) 2009
+# License:: MIT License
+
+require 'base64'
+
+module CFPropertyList
+ ##
+ # Blob is intended to distinguish between a Ruby String instance that should
+ # be converted to a CFString type and a Ruby String instance that should be
+ # converted to a CFData type
+ class Blob < String
+ end
+
+ ##
+ # UidFixnum is intended to distinguish between a Ruby Integer
+ # instance that should be converted to a CFInteger/CFReal type and a
+ # Ruby Integer instance that should be converted to a CFUid type.
+ class UidFixnum < Integer
+ end
+
+ # This class defines the base class for all CFType classes
+ #
+ class CFType
+ # value of the type
+ attr_accessor :value
+
+ def initialize(value=nil)
+ @value = value
+ end
+
+ def to_xml(parser)
+ end
+
+ def to_binary(bplist)
+ end
+
+ def to_plain(plist)
+ end
+ end
+
+ # This class holds string values, both, UTF-8 and UTF-16BE
+ # It will convert the value to UTF-16BE if necessary (i.e. if non-ascii char contained)
+ class CFString < CFType
+ # convert to XML
+ def to_xml(parser)
+ n = parser.new_node('string')
+ n = parser.append_node(n, parser.new_text(@value)) unless @value.nil?
+ n
+ end
+
+ # convert to binary
+ def to_binary(bplist)
+ bplist.string_to_binary(@value);
+ end
+
+ def to_plain(plist)
+ if @value =~ /^\w+$/
+ @value
+ else
+ quoted
+ end
+ end
+
+ def quoted
+ str = '"'
+ @value.each_char do |c|
+ str << case c
+ when '"'
+ '\\"'
+ when '\\'
+ '\\'
+ when "\a"
+ "\\a"
+ when "\b"
+ "\\b"
+ when "\f"
+ "\\f"
+ when "\n"
+ "\n"
+ when "\v"
+ "\\v"
+ when "\r"
+ "\\r"
+ when "\t"
+ "\\t"
+ else
+ c
+ end
+ end
+
+ str << '"'
+ end
+ end
+
+ # This class holds integer/fixnum values
+ class CFInteger < CFType
+ # convert to XML
+ def to_xml(parser)
+ n = parser.new_node('integer')
+ n = parser.append_node(n, parser.new_text(@value.to_s))
+ n
+ end
+
+ # convert to binary
+ def to_binary(bplist)
+ bplist.num_to_binary(self)
+ end
+
+ def to_plain(plist)
+ @value.to_s
+ end
+ end
+
+ # This class holds float values
+ class CFReal < CFType
+ # convert to XML
+ def to_xml(parser)
+ n = parser.new_node('real')
+ n = parser.append_node(n, parser.new_text(@value.to_s))
+ n
+ end
+
+ # convert to binary
+ def to_binary(bplist)
+ bplist.num_to_binary(self)
+ end
+
+ def to_plain(plist)
+ @value.to_s
+ end
+ end
+
+ # This class holds Time values. While Apple uses seconds since 2001,
+ # the rest of the world uses seconds since 1970. So if you access value
+ # directly, you get the Time class. If you access via get_value you either
+ # geht the timestamp or the Apple timestamp
+ class CFDate < CFType
+ TIMESTAMP_APPLE = 0
+ TIMESTAMP_UNIX = 1
+ DATE_DIFF_APPLE_UNIX = 978307200
+
+ # create a XML date strimg from a time object
+ def CFDate.date_string(val)
+ # 2009-05-13T20:23:43Z
+ val.getutc.strftime("%Y-%m-%dT%H:%M:%SZ")
+ end
+
+ # parse a XML date string
+ def CFDate.parse_date(val)
+ # 2009-05-13T20:23:43Z
+ val =~ %r{^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$}
+ year,month,day,hour,min,sec = $1, $2, $3, $4, $5, $6
+ return Time.utc(year,month,day,hour,min,sec).getlocal
+ end
+
+ # set value to defined state
+ def initialize(value = nil,format=CFDate::TIMESTAMP_UNIX)
+ if(value.is_a?(Time) || value.nil?) then
+ @value = value.nil? ? Time.now : value
+ elsif value.instance_of? Date
+ @value = Time.utc(value.year, value.month, value.day, 0, 0, 0)
+ elsif value.instance_of? DateTime
+ @value = value.to_time.utc
+ else
+ set_value(value,format)
+ end
+ end
+
+ # set value with timestamp, either Apple or UNIX
+ def set_value(value,format=CFDate::TIMESTAMP_UNIX)
+ if(format == CFDate::TIMESTAMP_UNIX) then
+ @value = Time.at(value)
+ else
+ @value = Time.at(value + CFDate::DATE_DIFF_APPLE_UNIX)
+ end
+ end
+
+ # get timestamp, either UNIX or Apple timestamp
+ def get_value(format=CFDate::TIMESTAMP_UNIX)
+ if(format == CFDate::TIMESTAMP_UNIX) then
+ @value.to_i
+ else
+ @value.to_f - CFDate::DATE_DIFF_APPLE_UNIX
+ end
+ end
+
+ # convert to XML
+ def to_xml(parser)
+ n = parser.new_node('date')
+ n = parser.append_node(n, parser.new_text(CFDate::date_string(@value)))
+ n
+ end
+
+ # convert to binary
+ def to_binary(bplist)
+ bplist.date_to_binary(@value)
+ end
+
+ def to_plain(plist)
+ @value.strftime("%Y-%m-%d %H:%M:%S %z")
+ end
+ end
+
+ # This class contains a boolean value
+ class CFBoolean < CFType
+ # convert to XML
+ def to_xml(parser)
+ parser.new_node(@value ? 'true' : 'false')
+ end
+
+ # convert to binary
+ def to_binary(bplist)
+ bplist.bool_to_binary(@value);
+ end
+
+ def to_plain(plist)
+ @value ? "true" : "false"
+ end
+ end
+
+ # This class contains binary data values
+ class CFData < CFType
+ # Base64 encoded data
+ DATA_BASE64 = 0
+ # Raw data
+ DATA_RAW = 1
+
+ # set value to defined state, either base64 encoded or raw
+ def initialize(value=nil,format=DATA_BASE64)
+ if(format == DATA_RAW)
+ @raw_value = value
+ else
+ @value = value
+ end
+ end
+
+ # get base64 encoded value
+ def encoded_value
+ @value ||= "\n#{Base64.encode64(@raw_value).gsub("\n", '').scan(/.{1,76}/).join("\n")}\n"
+ end
+
+ # get base64 decoded value
+ def decoded_value
+ @raw_value ||= Blob.new(Base64.decode64(@value))
+ end
+
+ # convert to XML
+ def to_xml(parser)
+ n = parser.new_node('data')
+ n = parser.append_node(n, parser.new_text(encoded_value()))
+ n
+ end
+
+ # convert to binary
+ def to_binary(bplist)
+ bplist.data_to_binary(decoded_value())
+ end
+
+ def to_plain(plist)
+ "<" + decoded_value.unpack("H*").join("") + ">"
+ end
+ end
+
+ # This class contains an array of values
+ class CFArray < CFType
+ # create a new array CFType
+ def initialize(val=[])
+ @value = val
+ end
+
+ # convert to XML
+ def to_xml(parser)
+ n = parser.new_node('array')
+ @value.each do |v|
+ n = parser.append_node(n, v.to_xml(parser))
+ end
+ n
+ end
+
+ # convert to binary
+ def to_binary(bplist)
+ bplist.array_to_binary(self)
+ end
+
+ def to_plain(plist)
+ ary = @value.map { |v| v.to_plain(plist) }
+ "( " + ary.join(", ") + " )"
+ end
+ end
+
+ # this class contains a hash of values
+ class CFDictionary < CFType
+ # Create new CFDictonary type.
+ def initialize(value={})
+ @value = value
+ end
+
+ # convert to XML
+ def to_xml(parser)
+ n = parser.new_node('dict')
+ @value.each_pair do |key, value|
+ k = parser.append_node(parser.new_node('key'), parser.new_text(key.to_s))
+ n = parser.append_node(n, k)
+ n = parser.append_node(n, value.to_xml(parser))
+ end
+ n
+ end
+
+ # convert to binary
+ def to_binary(bplist)
+ bplist.dict_to_binary(self)
+ end
+
+ def to_plain(plist)
+ str = "{ "
+ cfstr = CFString.new()
+
+ @value.each do |k,v|
+ cfstr.value = k
+ str << cfstr.to_plain(plist) + " = " + v.to_plain(plist) + "; "
+ end
+
+ str << "}"
+ end
+ end
+
+ class CFUid < CFType
+ def to_xml(parser)
+ CFDictionary.new({'CF$UID' => CFInteger.new(@value)}).to_xml(parser)
+ end
+
+ # convert to binary
+ def to_binary(bplist)
+ bplist.uid_to_binary(@value)
+ end
+
+ def to_plain(plist)
+ CFDictionary.new({'CF$UID' => CFInteger.new(@value)}).to_plain(plist)
+ end
+ end
+end
+
+# eof
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbLibXMLParser.rb b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbLibXMLParser.rb
new file mode 100644
index 0000000..3642016
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbLibXMLParser.rb
@@ -0,0 +1,149 @@
+# -*- coding: utf-8 -*-
+
+require 'libxml'
+
+module CFPropertyList
+ # XML parser
+ class LibXMLParser < XMLParserInterface
+ LibXML::XML::Error.set_handler(&LibXML::XML::Error::QUIET_HANDLER)
+ PARSER_OPTIONS = LibXML::XML::Parser::Options::NOBLANKS|LibXML::XML::Parser::Options::NONET
+ # read a XML file
+ # opts::
+ # * :file - The filename of the file to load
+ # * :data - The data to parse
+ def load(opts)
+ doc = nil
+
+ if(opts.has_key?(:file)) then
+ doc = LibXML::XML::Document.file(opts[:file],:options => PARSER_OPTIONS)
+ else
+ doc = LibXML::XML::Document.string(opts[:data],:options => PARSER_OPTIONS)
+ end
+
+ if doc
+ root = doc.root.first
+ return import_xml(root)
+ end
+ rescue LibXML::XML::Error => e
+ raise CFFormatError.new('invalid XML: ' + e.message)
+ end
+
+ # serialize CFPropertyList object to XML
+ # opts = {}:: Specify options: :formatted - Use indention and line breaks
+ def to_str(opts={})
+ doc = LibXML::XML::Document.new
+
+ doc.root = LibXML::XML::Node.new('plist')
+ doc.encoding = LibXML::XML::Encoding::UTF_8
+
+ doc.root['version'] = '1.0'
+ doc.root << opts[:root].to_xml(self)
+
+ # ugly hack, but there's no other possibility I know
+ str = doc.to_s(:indent => opts[:formatted])
+ str1 = String.new
+ first = false
+ str.each_line do |line|
+ str1 << line
+ unless(first) then
+ str1 << "\n" if line =~ /^\s*<\?xml/
+ end
+
+ first = true
+ end
+
+ str1.force_encoding('UTF-8') if str1.respond_to?(:force_encoding)
+ return str1
+ end
+
+ def new_node(name)
+ LibXML::XML::Node.new(name)
+ end
+
+ def new_text(val)
+ LibXML::XML::Node.new_text(val)
+ end
+
+ def append_node(parent, child)
+ parent << child
+ end
+
+ protected
+
+ # get the value of a DOM node
+ def get_value(n)
+ content = if n.children?
+ n.first.content
+ else
+ n.content
+ end
+
+ content.force_encoding('UTF-8') if content.respond_to?(:force_encoding)
+ content
+ end
+
+ # import the XML values
+ def import_xml(node)
+ ret = nil
+
+ case node.name
+ when 'dict'
+ hsh = Hash.new
+ key = nil
+
+ if node.children? then
+ node.children.each do |n|
+ next if n.text? # avoid a bug of libxml
+ next if n.comment?
+
+ if n.name == "key" then
+ key = get_value(n)
+ else
+ raise CFFormatError.new("Format error!") if key.nil?
+ hsh[key] = import_xml(n)
+ key = nil
+ end
+ end
+ end
+
+ if hsh['CF$UID'] and hsh.keys.length == 1
+ ret = CFUid.new(hsh['CF$UID'].value)
+ else
+ ret = CFDictionary.new(hsh)
+ end
+
+ when 'array'
+ ary = Array.new
+
+ if node.children? then
+ node.children.each do |n|
+ next if n.text? # avoid a bug of libxml
+ next if n.comment?
+ ary.push import_xml(n)
+ end
+ end
+
+ ret = CFArray.new(ary)
+
+ when 'true'
+ ret = CFBoolean.new(true)
+ when 'false'
+ ret = CFBoolean.new(false)
+ when 'real'
+ ret = CFReal.new(get_value(node).to_f)
+ when 'integer'
+ ret = CFInteger.new(get_value(node).to_i)
+ when 'string'
+ ret = CFString.new(get_value(node))
+ when 'data'
+ ret = CFData.new(get_value(node))
+ when 'date'
+ ret = CFDate.new(CFDate.parse_date(get_value(node)))
+ end
+
+ return ret
+ end
+ end
+end
+
+# eof
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbNokogiriParser.rb b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbNokogiriParser.rb
new file mode 100644
index 0000000..e2de688
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbNokogiriParser.rb
@@ -0,0 +1,152 @@
+# -*- coding: utf-8 -*-
+
+require 'nokogiri'
+
+module CFPropertyList
+ # XML parser
+ class NokogiriXMLParser < ParserInterface
+ PARSER_OPTIONS = Nokogiri::XML::ParseOptions::NOBLANKS|Nokogiri::XML::ParseOptions::NONET
+ # read a XML file
+ # opts::
+ # * :file - The filename of the file to load
+ # * :data - The data to parse
+ def load(opts)
+ doc = nil
+ if(opts.has_key?(:file)) then
+ File.open(opts[:file], "rb") { |fd| doc = Nokogiri::XML::Document.parse(fd, nil, nil, PARSER_OPTIONS) }
+ else
+ doc = Nokogiri::XML::Document.parse(opts[:data], nil, nil, PARSER_OPTIONS)
+ end
+
+ if doc
+ root = doc.root.children.first
+ return import_xml(root)
+ end
+ rescue Nokogiri::XML::SyntaxError => e
+ raise CFFormatError.new('invalid XML: ' + e.message)
+ end
+
+ # serialize CFPropertyList object to XML
+ # opts = {}:: Specify options: :formatted - Use indention and line breaks
+ def to_str(opts={})
+ doc = Nokogiri::XML::Document.new
+ @doc = doc
+
+ doc.root = doc.create_element 'plist', :version => '1.0'
+ doc.encoding = 'UTF-8'
+
+ doc.root << opts[:root].to_xml(self)
+
+ # ugly hack, but there's no other possibility I know
+ s_opts = Nokogiri::XML::Node::SaveOptions::AS_XML
+ s_opts |= Nokogiri::XML::Node::SaveOptions::FORMAT if opts[:formatted]
+
+ str = doc.serialize(:save_with => s_opts)
+ str1 = String.new
+ first = false
+ str.each_line do |line|
+ str1 << line
+ unless(first) then
+ str1 << "\n" if line =~ /^\s*<\?xml/
+ end
+
+ first = true
+ end
+
+ str1.force_encoding('UTF-8') if str1.respond_to?(:force_encoding)
+ return str1
+ end
+
+ def new_node(name)
+ @doc.create_element name
+ end
+
+ def new_text(val)
+ @doc.create_text_node val
+ end
+
+ def append_node(parent, child)
+ parent << child
+ end
+
+ protected
+
+ # get the value of a DOM node
+ def get_value(n)
+ content = if n.children.empty?
+ n.content
+ else
+ n.children.first.content
+ end
+
+ content.force_encoding('UTF-8') if content.respond_to?(:force_encoding)
+ content
+ end
+
+ # import the XML values
+ def import_xml(node)
+ ret = nil
+
+ case node.name
+ when 'dict'
+ hsh = Hash.new
+ key = nil
+ children = node.children
+
+ unless children.empty? then
+ children.each do |n|
+ next if n.text? # avoid a bug of libxml
+ next if n.comment?
+
+ if n.name == "key" then
+ key = get_value(n)
+ else
+ raise CFFormatError.new("Format error!") if key.nil?
+ hsh[key] = import_xml(n)
+ key = nil
+ end
+ end
+ end
+
+ if hsh['CF$UID'] and hsh.keys.length == 1
+ ret = CFUid.new(hsh['CF$UID'].value)
+ else
+ ret = CFDictionary.new(hsh)
+ end
+
+ when 'array'
+ ary = Array.new
+ children = node.children
+
+ unless children.empty? then
+ children.each do |n|
+ next if n.text? # avoid a bug of libxml
+ next if n.comment?
+ ary.push import_xml(n)
+ end
+ end
+
+ ret = CFArray.new(ary)
+
+ when 'true'
+ ret = CFBoolean.new(true)
+ when 'false'
+ ret = CFBoolean.new(false)
+ when 'real'
+ ret = CFReal.new(get_value(node).to_f)
+ when 'integer'
+ ret = CFInteger.new(get_value(node).to_i)
+ when 'string'
+ ret = CFString.new(get_value(node))
+ when 'data'
+ ret = CFData.new(get_value(node))
+ when 'date'
+ ret = CFDate.new(CFDate.parse_date(get_value(node)))
+ end
+
+ return ret
+ end
+ end
+end
+
+# eof
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbPlainCFPropertyList.rb b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbPlainCFPropertyList.rb
new file mode 100644
index 0000000..fa698ce
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbPlainCFPropertyList.rb
@@ -0,0 +1,199 @@
+# -*- coding: utf-8 -*-
+
+require 'strscan'
+
+module CFPropertyList
+ # XML parser
+ class PlainParser < XMLParserInterface
+ # read a XML file
+ # opts::
+ # * :file - The filename of the file to load
+ # * :data - The data to parse
+ def load(opts)
+ @doc = nil
+
+ if(opts.has_key?(:file)) then
+ File.open(opts[:file], :external_encoding => "ASCII") do |fd|
+ @doc = StringScanner.new(fd.read)
+ end
+ else
+ @doc = StringScanner.new(opts[:data])
+ end
+
+ if @doc
+ root = import_plain
+ raise CFFormatError.new('content after root object') unless @doc.eos?
+
+ return root
+ end
+
+ raise CFFormatError.new('invalid plist string or file not found')
+ end
+
+ SPACES_AND_COMMENTS = %r{((?:/\*.*?\*/)|(?://.*?$\n?)|(?:\s*))+}x
+
+ # serialize CFPropertyList object to XML
+ # opts = {}:: Specify options: :formatted - Use indention and line breaks
+ def to_str(opts={})
+ opts[:root].to_plain(self)
+ end
+
+ protected
+ def skip_whitespaces
+ @doc.skip SPACES_AND_COMMENTS
+ end
+
+ def read_dict
+ skip_whitespaces
+ hsh = {}
+
+ while not @doc.scan(/\}/)
+ key = import_plain
+ raise CFFormatError.new("invalid dictionary format") if !key
+
+ if key.is_a?(CFString)
+ key = key.value
+ elsif key.is_a?(CFInteger) or key.is_a?(CFReal)
+ key = key.value.to_s
+ else
+ raise CFFormatError.new("invalid key format")
+ end
+
+ skip_whitespaces
+
+ raise CFFormatError.new("invalid dictionary format") unless @doc.scan(/=/)
+
+ skip_whitespaces
+ val = import_plain
+
+ skip_whitespaces
+ raise CFFormatError.new("invalid dictionary format") unless @doc.scan(/;/)
+ skip_whitespaces
+
+ hsh[key] = val
+ raise CFFormatError.new("invalid dictionary format") if @doc.eos?
+ end
+
+ CFDictionary.new(hsh)
+ end
+
+ def read_array
+ skip_whitespaces
+ ary = []
+
+ while not @doc.scan(/\)/)
+ val = import_plain
+
+ return nil if not val or not val.value
+ skip_whitespaces
+
+ if not @doc.skip(/,\s*/)
+ if @doc.scan(/\)/)
+ ary << val
+ return CFArray.new(ary)
+ end
+
+ raise CFFormatError.new("invalid array format")
+ end
+
+ ary << val
+ raise CFFormatError.new("invalid array format") if @doc.eos?
+ end
+
+ CFArray.new(ary)
+ end
+
+ def escape_char
+ case @doc.matched
+ when '"'
+ '"'
+ when '\\'
+ '\\'
+ when 'a'
+ "\a"
+ when 'b'
+ "\b"
+ when 'f'
+ "\f"
+ when 'n'
+ "\n"
+ when 'v'
+ "\v"
+ when 'r'
+ "\r"
+ when 't'
+ "\t"
+ when 'U'
+ @doc.scan(/.{4}/).hex.chr('utf-8')
+ end
+ end
+
+ def read_quoted
+ str = ''
+
+ while not @doc.scan(/"/)
+ if @doc.scan(/\\/)
+ @doc.scan(/./)
+ str << escape_char
+
+ elsif @doc.eos?
+ raise CFFormatError.new("unterminated string")
+
+ else @doc.scan(/./)
+ str << @doc.matched
+ end
+ end
+
+ CFString.new(str)
+ end
+
+ def read_unquoted
+ raise CFFormatError.new("unexpected end of file") if @doc.eos?
+
+ if @doc.scan(/(\d\d\d\d)-(\d\d)-(\d\d)\s+(\d\d):(\d\d):(\d\d)(?:\s+(\+|-)(\d\d)(\d\d))?/)
+ year,month,day,hour,min,sec,pl_min,tz_hour, tz_min = @doc[1], @doc[2], @doc[3], @doc[4], @doc[5], @doc[6], @doc[7], @doc[8], @doc[9]
+ CFDate.new(Time.new(year, month, day, hour, min, sec, pl_min ? sprintf("%s%s:%s", pl_min, tz_hour, tz_min) : nil))
+
+ elsif @doc.scan(/-?\d+?\.\d+\b/)
+ CFReal.new(@doc.matched.to_f)
+
+ elsif @doc.scan(/-?\d+\b/)
+ CFInteger.new(@doc.matched.to_i)
+
+ elsif @doc.scan(/\b(true|false)\b/)
+ CFBoolean.new(@doc.matched == 'true')
+ else
+ CFString.new(@doc.scan(/\w+/))
+ end
+ end
+
+ def read_binary
+ @doc.scan(/(.*?)>/)
+
+ hex_str = @doc[1].gsub(/ /, '')
+ CFData.new([hex_str].pack("H*"), CFData::DATA_RAW)
+ end
+
+ # import the XML values
+ def import_plain
+ skip_whitespaces
+ ret = nil
+
+ if @doc.scan(/\{/) # dict
+ ret = read_dict
+ elsif @doc.scan(/\(/) # array
+ ret = read_array
+ elsif @doc.scan(/"/) # string
+ ret = read_quoted
+ elsif @doc.scan(/) # binary
+ ret = read_binary
+ else # string w/o quotes
+ ret = read_unquoted
+ end
+
+ return ret
+ end
+ end
+end
+
+# eof
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbREXMLParser.rb b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbREXMLParser.rb
new file mode 100644
index 0000000..225b168
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbREXMLParser.rb
@@ -0,0 +1,148 @@
+# -*- coding: utf-8 -*-
+
+require 'rexml/document'
+
+module CFPropertyList
+ # XML parser
+ class ReXMLParser < ParserInterface
+ # read a XML file
+ # opts::
+ # * :file - The filename of the file to load
+ # * :data - The data to parse
+ def load(opts)
+
+ doc = nil
+ if(opts.has_key?(:file)) then
+ File.open(opts[:file], "rb") { |fd| doc = REXML::Document.new(fd) }
+ else
+ doc = REXML::Document.new(opts[:data])
+ end
+
+ if doc
+ root = doc.root.elements[1]
+ return import_xml(root)
+ end
+ rescue REXML::ParseException => e
+ raise CFFormatError.new('invalid XML: ' + e.message)
+ end
+
+ # serialize CFPropertyList object to XML
+ # opts = {}:: Specify options: :formatted - Use indention and line breaks
+ def to_str(opts={})
+ doc = REXML::Document.new
+ @doc = doc
+
+ doc.context[:attribute_quote] = :quote
+
+ doc.add_element 'plist', {'version' => '1.0'}
+ doc.root << opts[:root].to_xml(self)
+
+ formatter = if opts[:formatted] then
+ f = REXML::Formatters::Pretty.new(2)
+ f.compact = true
+ f.width = Float::INFINITY
+ f
+ else
+ REXML::Formatters::Default.new
+ end
+
+ str = formatter.write(doc.root, "")
+ str1 = "\n\n" + str + "\n"
+ str1.force_encoding('UTF-8') if str1.respond_to?(:force_encoding)
+
+ return str1
+ end
+
+ def new_node(name)
+ REXML::Element.new(name)
+ end
+
+ def new_text(val)
+ val
+ end
+
+ def append_node(parent, child)
+ if child.is_a?(String) then
+ parent.add_text child
+ else
+ parent.elements << child
+ end
+ parent
+ end
+
+ protected
+
+ # get the value of a DOM node
+ def get_value(n)
+ content = n.text
+
+ content.force_encoding('UTF-8') if content.respond_to?(:force_encoding)
+ content
+ end
+
+ # import the XML values
+ def import_xml(node)
+ ret = nil
+
+ case node.name
+ when 'dict'
+ hsh = Hash.new
+ key = nil
+
+ if node.has_elements? then
+ node.elements.each do |n|
+ next if n.name == '#text' # avoid a bug of libxml
+ next if n.name == '#comment'
+
+ if n.name == "key" then
+ key = get_value(n)
+ key = '' if key.nil? # REXML returns nil if key is empty
+ else
+ raise CFFormatError.new("Format error!") if key.nil?
+ hsh[key] = import_xml(n)
+ key = nil
+ end
+ end
+ end
+
+ if hsh['CF$UID'] and hsh.keys.length == 1
+ ret = CFUid.new(hsh['CF$UID'].value)
+ else
+ ret = CFDictionary.new(hsh)
+ end
+
+ when 'array'
+ ary = Array.new
+
+ if node.has_elements? then
+ node.elements.each do |n|
+ next if n.name == '#text' # avoid a bug of libxml
+ ary.push import_xml(n)
+ end
+ end
+
+ ret = CFArray.new(ary)
+
+ when 'true'
+ ret = CFBoolean.new(true)
+ when 'false'
+ ret = CFBoolean.new(false)
+ when 'real'
+ ret = CFReal.new(get_value(node).to_f)
+ when 'integer'
+ ret = CFInteger.new(get_value(node).to_i)
+ when 'string'
+ ret = CFString.new(get_value(node))
+ ret.value = '' if ret.value.nil? # REXML returns nil for empty elements' .text attribute
+ when 'data'
+ ret = CFData.new(get_value(node))
+ when 'date'
+ ret = CFDate.new(CFDate.parse_date(get_value(node)))
+ end
+
+ return ret
+ end
+ end
+end
+
+# eof
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.gitignore b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.gitignore
new file mode 100644
index 0000000..b04a8c8
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.gitignore
@@ -0,0 +1,11 @@
+/.bundle/
+/.yardoc
+/_yardoc/
+/coverage/
+/doc/
+/pkg/
+/spec/reports/
+/tmp/
+
+# rspec failure tracking
+.rspec_status
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rspec b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rspec
new file mode 100644
index 0000000..34c5164
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rspec
@@ -0,0 +1,3 @@
+--format documentation
+--color
+--require spec_helper
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rubocop.yml b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rubocop.yml
new file mode 100644
index 0000000..3ffe2b0
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rubocop.yml
@@ -0,0 +1,2 @@
+inherit_from: .rubocop_todo.yml
+
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rubocop_todo.yml b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rubocop_todo.yml
new file mode 100644
index 0000000..826a7a2
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rubocop_todo.yml
@@ -0,0 +1,32 @@
+# This configuration was generated by
+# `rubocop --auto-gen-config`
+# on 2018-02-02 08:32:23 -0800 using RuboCop version 0.52.1.
+# The point is for the user to remove these configuration records
+# one by one as the offenses are removed from the code base.
+# Note that changes in the inspected code, or installation of new
+# versions of RuboCop, may require this file to be generated again.
+
+# Offense count: 1
+# Configuration parameters: Include.
+# Include: **/*.gemspec
+Gemspec/RequiredRubyVersion:
+ Exclude:
+ - 'atomos.gemspec'
+
+# Offense count: 1
+# Configuration parameters: CountComments.
+Metrics/MethodLength:
+ Max: 14
+
+# Offense count: 1
+Style/Documentation:
+ Exclude:
+ - 'spec/**/*'
+ - 'test/**/*'
+ - 'lib/atomos.rb'
+
+# Offense count: 7
+# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
+# URISchemes: http, https
+Metrics/LineLength:
+ Max: 97
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.travis.yml b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.travis.yml
new file mode 100644
index 0000000..6a8e36f
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.travis.yml
@@ -0,0 +1,5 @@
+sudo: false
+language: ruby
+rvm:
+ - 2.5.0
+before_install: gem install bundler -v 1.16.1
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/CODE_OF_CONDUCT.md b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..3399e24
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/CODE_OF_CONDUCT.md
@@ -0,0 +1,74 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, gender identity and expression, level of experience,
+nationality, personal appearance, race, religion, or sexual identity and
+orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at segiddins@squareup.com. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Gemfile b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Gemfile
new file mode 100644
index 0000000..2d1d7e6
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Gemfile
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+source 'https://rubygems.org'
+
+git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
+
+# Specify your gem's dependencies in atomos.gemspec
+gemspec
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Gemfile.lock b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Gemfile.lock
new file mode 100644
index 0000000..edfb2e5
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Gemfile.lock
@@ -0,0 +1,51 @@
+PATH
+ remote: .
+ specs:
+ atomos (0.1.3)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ ast (2.3.0)
+ diff-lcs (1.3)
+ parallel (1.12.1)
+ parser (2.4.0.2)
+ ast (~> 2.3)
+ powerpack (0.1.1)
+ rainbow (3.0.0)
+ rake (10.5.0)
+ rspec (3.7.0)
+ rspec-core (~> 3.7.0)
+ rspec-expectations (~> 3.7.0)
+ rspec-mocks (~> 3.7.0)
+ rspec-core (3.7.1)
+ rspec-support (~> 3.7.0)
+ rspec-expectations (3.7.0)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.7.0)
+ rspec-mocks (3.7.0)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.7.0)
+ rspec-support (3.7.0)
+ rubocop (0.52.1)
+ parallel (~> 1.10)
+ parser (>= 2.4.0.2, < 3.0)
+ powerpack (~> 0.1)
+ rainbow (>= 2.2.2, < 4.0)
+ ruby-progressbar (~> 1.7)
+ unicode-display_width (~> 1.0, >= 1.0.1)
+ ruby-progressbar (1.9.0)
+ unicode-display_width (1.3.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ atomos!
+ bundler (~> 1.16)
+ rake (~> 10.0)
+ rspec (~> 3.0)
+ rubocop
+
+BUNDLED WITH
+ 1.16.3
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/LICENSE.txt b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/LICENSE.txt
new file mode 100644
index 0000000..7a54c62
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/LICENSE.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 Samuel Giddins
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/README.md b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/README.md
new file mode 100644
index 0000000..de832a5
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/README.md
@@ -0,0 +1,43 @@
+# Atomos
+
+Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/atomos`. To experiment with that code, run `bin/console` for an interactive prompt.
+
+TODO: Delete this and the text above, and describe your gem
+
+## Installation
+
+Add this line to your application's Gemfile:
+
+```ruby
+gem 'atomos'
+```
+
+And then execute:
+
+ $ bundle
+
+Or install it yourself as:
+
+ $ gem install atomos
+
+## Usage
+
+TODO: Write usage instructions here
+
+## Development
+
+After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
+
+To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
+
+## Contributing
+
+Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/atomos. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
+
+## License
+
+The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
+
+## Code of Conduct
+
+Everyone interacting in the Atomos project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/atomos/blob/master/CODE_OF_CONDUCT.md).
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Rakefile b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Rakefile
new file mode 100644
index 0000000..8ce173e
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Rakefile
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'bundler/gem_tasks'
+
+require 'rspec/core/rake_task'
+require 'rubocop/rake_task'
+
+RSpec::Core::RakeTask.new
+RuboCop::RakeTask.new
+
+task default: %i[rubocop spec]
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/VERSION b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/VERSION
new file mode 100644
index 0000000..b1e80bb
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/VERSION
@@ -0,0 +1 @@
+0.1.3
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/atomos.gemspec b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/atomos.gemspec
new file mode 100644
index 0000000..7ad4922
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/atomos.gemspec
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+Gem::Specification.new do |spec|
+ spec.name = 'atomos'
+ spec.version = File.read(File.expand_path('../VERSION', __FILE__))
+ spec.authors = ['Samuel Giddins']
+ spec.email = ['segiddins@segiddins.me']
+
+ spec.summary = 'A simple gem to atomically write files'
+ spec.homepage = 'https://github.com/segiddins/atomos'
+ spec.license = 'MIT'
+
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
+ f.match(%r{^(test|spec|features)/})
+ end
+ spec.bindir = 'exe'
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
+ spec.require_paths = ['lib']
+
+ spec.required_ruby_version = '>= 2.0'
+
+ spec.add_development_dependency 'bundler', '~> 1.16'
+ spec.add_development_dependency 'rake', '~> 10.0'
+ spec.add_development_dependency 'rspec', '~> 3.0'
+ spec.add_development_dependency 'rubocop'
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/console b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/console
new file mode 100644
index 0000000..535613d
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/console
@@ -0,0 +1,15 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require 'bundler/setup'
+require 'atomos'
+
+# You can add fixtures and/or initialization code here to make experimenting
+# with your gem easier. You can also use a different console, if you like.
+
+# (If you use this, don't forget to add pry to your Gemfile!)
+# require "pry"
+# Pry.start
+
+require 'irb'
+IRB.start(__FILE__)
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rake b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rake
new file mode 100644
index 0000000..8226b57
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rake
@@ -0,0 +1,29 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+#
+# This file was generated by Bundler.
+#
+# The application 'rake' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'pathname'
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
+ Pathname.new(__FILE__).realpath)
+
+bundle_binstub = File.expand_path('../bundle', __FILE__)
+
+if File.file?(bundle_binstub)
+ if File.read(bundle_binstub, 150).match?(/This file was generated by Bundler/)
+ load(bundle_binstub)
+ else
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
+Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
+ end
+end
+
+require 'rubygems'
+require 'bundler/setup'
+
+load Gem.bin_path('rake', 'rake')
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rspec b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rspec
new file mode 100644
index 0000000..d086973
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rspec
@@ -0,0 +1,29 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+#
+# This file was generated by Bundler.
+#
+# The application 'rspec' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'pathname'
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
+ Pathname.new(__FILE__).realpath)
+
+bundle_binstub = File.expand_path('../bundle', __FILE__)
+
+if File.file?(bundle_binstub)
+ if File.read(bundle_binstub, 150).match?(/This file was generated by Bundler/)
+ load(bundle_binstub)
+ else
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
+Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
+ end
+end
+
+require 'rubygems'
+require 'bundler/setup'
+
+load Gem.bin_path('rspec-core', 'rspec')
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rubocop b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rubocop
new file mode 100644
index 0000000..8424d87
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rubocop
@@ -0,0 +1,29 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+#
+# This file was generated by Bundler.
+#
+# The application 'rubocop' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'pathname'
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
+ Pathname.new(__FILE__).realpath)
+
+bundle_binstub = File.expand_path('../bundle', __FILE__)
+
+if File.file?(bundle_binstub)
+ if File.read(bundle_binstub, 150).match?(/This file was generated by Bundler/)
+ load(bundle_binstub)
+ else
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
+Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
+ end
+end
+
+require 'rubygems'
+require 'bundler/setup'
+
+load Gem.bin_path('rubocop', 'rubocop')
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/setup b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/setup
new file mode 100644
index 0000000..dce67d8
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/setup
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+set -euo pipefail
+IFS=$'\n\t'
+set -vx
+
+bundle install
+
+# Do any other automated setup that you need to do here
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/lib/atomos.rb b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/lib/atomos.rb
new file mode 100644
index 0000000..4b56d05
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/lib/atomos.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'atomos/version'
+
+module Atomos
+ module_function
+
+ # rubocop:disable Metrics/MethodLength
+ def atomic_write(dest, contents = nil, tmpdir: nil, &block)
+ unless contents.nil? ^ block.nil?
+ raise ArgumentError, 'must provide either contents or a block'
+ end
+
+ tmpdir = Atomos.default_tmpdir_for_file(dest, tmpdir)
+
+ require 'tempfile'
+ Tempfile.open(".atomos.#{File.basename(dest)}", tmpdir) do |tmpfile|
+ if contents
+ tmpfile << contents
+ else
+ retval = yield tmpfile
+ end
+
+ tmpfile.close
+
+ File.rename(tmpfile.path, dest)
+
+ retval
+ end
+ end
+ # rubocop:enable Metrics/MethodLength
+
+ def self.default_tmpdir_for_file(dest, tmpdir)
+ tmpdir ||= begin
+ require 'tmpdir'
+ Dir.tmpdir
+ end
+
+ # Ensure the destination is on the same device as tmpdir
+ if File.stat(tmpdir).dev != File.stat(File.dirname(dest)).dev
+ # If not, use the directory of the destination as the tmpdir.
+ tmpdir = File.dirname(dest)
+ end
+
+ tmpdir
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/lib/atomos/version.rb b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/lib/atomos/version.rb
new file mode 100644
index 0000000..f52f703
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/lib/atomos/version.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+module Atomos
+ VERSION = File.read(File.expand_path('../../../VERSION', __FILE__))
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/BSDL b/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/BSDL
new file mode 100644
index 0000000..66d9359
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/BSDL
@@ -0,0 +1,22 @@
+Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/COPYING b/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/COPYING
new file mode 100644
index 0000000..48e5a96
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/COPYING
@@ -0,0 +1,56 @@
+Ruby is copyrighted free software by Yukihiro Matsumoto .
+You can redistribute it and/or modify it under either the terms of the
+2-clause BSDL (see the file BSDL), or the conditions below:
+
+1. You may make and give away verbatim copies of the source form of the
+ software without restriction, provided that you duplicate all of the
+ original copyright notices and associated disclaimers.
+
+2. You may modify your copy of the software in any way, provided that
+ you do at least ONE of the following:
+
+ a. place your modifications in the Public Domain or otherwise
+ make them Freely Available, such as by posting said
+ modifications to Usenet or an equivalent medium, or by allowing
+ the author to include your modifications in the software.
+
+ b. use the modified software only within your corporation or
+ organization.
+
+ c. give non-standard binaries non-standard names, with
+ instructions on where to get the original software distribution.
+
+ d. make other distribution arrangements with the author.
+
+3. You may distribute the software in object code or binary form,
+ provided that you do at least ONE of the following:
+
+ a. distribute the binaries and library files of the software,
+ together with instructions (in the manual page or equivalent)
+ on where to get the original distribution.
+
+ b. accompany the distribution with the machine-readable source of
+ the software.
+
+ c. give non-standard binaries non-standard names, with
+ instructions on where to get the original software distribution.
+
+ d. make other distribution arrangements with the author.
+
+4. You may modify and include the part of the software into any other
+ software (possibly commercial). But some files in the distribution
+ are not written by the author, so that they are not under these terms.
+
+ For the list of those files and their copying conditions, see the
+ file LEGAL.
+
+5. The scripts and library files supplied as input to or produced as
+ output from the software do not automatically fall under the
+ copyright of the software, but belong to whomever generated them,
+ and may be sold commercially, and may be aggregated with this
+ software.
+
+6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE.
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/LEGAL b/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/LEGAL
new file mode 100644
index 0000000..f2d8014
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/LEGAL
@@ -0,0 +1,60 @@
+# -*- rdoc -*-
+
+= LEGAL NOTICE INFORMATION
+--------------------------
+
+All the files in this distribution are covered under either the Ruby's
+license (see the file COPYING) or public-domain except some files
+mentioned below.
+
+== MIT License
+>>>
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+== Old-style BSD license
+>>>
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ IMPORTANT NOTE::
+
+ From ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
+ paragraph 3 above is now null and void.
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/README.md b/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/README.md
new file mode 100644
index 0000000..a29c58e
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/README.md
@@ -0,0 +1,48 @@
+# Base64
+
+The Base64 module provides for the encoding (`#encode64`, `#strict_encode64`,
+`#urlsafe_encode64`) and decoding (`#decode64`, `#strict_decode64`,
+`#urlsafe_decode64`) of binary data using a Base64 representation.
+
+## Installation
+
+Add this line to your application's Gemfile:
+
+```ruby
+gem 'base64'
+```
+
+And then execute:
+
+ $ bundle install
+
+Or install it yourself as:
+
+ $ gem install base64
+
+## Usage
+
+A simple encoding and decoding.
+
+```ruby
+require "base64"
+
+enc = Base64.encode64('Send reinforcements')
+ # -> "U2VuZCByZWluZm9yY2VtZW50cw==\n"
+plain = Base64.decode64(enc)
+ # -> "Send reinforcements"
+```
+
+The purpose of using base64 to encode data is that it translates any
+binary data into purely printable characters.
+
+## Development
+
+After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
+
+To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
+
+## Contributing
+
+Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/base64.
+
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/lib/base64.rb b/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/lib/base64.rb
new file mode 100644
index 0000000..8c0145d
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/lib/base64.rb
@@ -0,0 +1,381 @@
+# frozen_string_literal: true
+#
+# \Module \Base64 provides methods for:
+#
+# - \Encoding a binary string (containing non-ASCII characters)
+# as a string of printable ASCII characters.
+# - Decoding such an encoded string.
+#
+# \Base64 is commonly used in contexts where binary data
+# is not allowed or supported:
+#
+# - Images in HTML or CSS files, or in URLs.
+# - Email attachments.
+#
+# A \Base64-encoded string is about one-third larger that its source.
+# See the {Wikipedia article}[https://en.wikipedia.org/wiki/Base64]
+# for more information.
+#
+# This module provides three pairs of encode/decode methods.
+# Your choices among these methods should depend on:
+#
+# - Which character set is to be used for encoding and decoding.
+# - Whether "padding" is to be used.
+# - Whether encoded strings are to contain newlines.
+#
+# Note: Examples on this page assume that the including program has executed:
+#
+# require 'base64'
+#
+# == \Encoding Character Sets
+#
+# A \Base64-encoded string consists only of characters from a 64-character set:
+#
+# - ('A'..'Z').
+# - ('a'..'z').
+# - ('0'..'9').
+# - =, the 'padding' character.
+# - Either:
+# - %w[+ /]:
+# {RFC-2045-compliant}[https://datatracker.ietf.org/doc/html/rfc2045];
+# _not_ safe for URLs.
+# - %w[- _]:
+# {RFC-4648-compliant}[https://datatracker.ietf.org/doc/html/rfc4648];
+# safe for URLs.
+#
+# If you are working with \Base64-encoded strings that will come from
+# or be put into URLs, you should choose this encoder-decoder pair
+# of RFC-4648-compliant methods:
+#
+# - Base64.urlsafe_encode64 and Base64.urlsafe_decode64.
+#
+# Otherwise, you may choose any of the pairs in this module,
+# including the pair above, or the RFC-2045-compliant pairs:
+#
+# - Base64.encode64 and Base64.decode64.
+# - Base64.strict_encode64 and Base64.strict_decode64.
+#
+# == Padding
+#
+# \Base64-encoding changes a triplet of input bytes
+# into a quartet of output characters.
+#
+# Padding in Encode Methods
+#
+# Padding -- extending an encoded string with zero, one, or two trailing
+# = characters -- is performed by methods Base64.encode64,
+# Base64.strict_encode64, and, by default, Base64.urlsafe_encode64:
+#
+# Base64.encode64('s') # => "cw==\n"
+# Base64.strict_encode64('s') # => "cw=="
+# Base64.urlsafe_encode64('s') # => "cw=="
+# Base64.urlsafe_encode64('s', padding: false) # => "cw"
+#
+# When padding is performed, the encoded string is always of length 4n,
+# where +n+ is a non-negative integer:
+#
+# - Input bytes of length 3n generate unpadded output characters
+# of length 4n:
+#
+# # n = 1: 3 bytes => 4 characters.
+# Base64.strict_encode64('123') # => "MDEy"
+# # n = 2: 6 bytes => 8 characters.
+# Base64.strict_encode64('123456') # => "MDEyMzQ1"
+#
+# - Input bytes of length 3n+1 generate padded output characters
+# of length 4(n+1), with two padding characters at the end:
+#
+# # n = 1: 4 bytes => 8 characters.
+# Base64.strict_encode64('1234') # => "MDEyMw=="
+# # n = 2: 7 bytes => 12 characters.
+# Base64.strict_encode64('1234567') # => "MDEyMzQ1Ng=="
+#
+# - Input bytes of length 3n+2 generate padded output characters
+# of length 4(n+1), with one padding character at the end:
+#
+# # n = 1: 5 bytes => 8 characters.
+# Base64.strict_encode64('12345') # => "MDEyMzQ="
+# # n = 2: 8 bytes => 12 characters.
+# Base64.strict_encode64('12345678') # => "MDEyMzQ1Njc="
+#
+# When padding is suppressed, for a positive integer n:
+#
+# - Input bytes of length 3n generate unpadded output characters
+# of length 4n:
+#
+# # n = 1: 3 bytes => 4 characters.
+# Base64.urlsafe_encode64('123', padding: false) # => "MDEy"
+# # n = 2: 6 bytes => 8 characters.
+# Base64.urlsafe_encode64('123456', padding: false) # => "MDEyMzQ1"
+#
+# - Input bytes of length 3n+1 generate unpadded output characters
+# of length 4n+2, with two padding characters at the end:
+#
+# # n = 1: 4 bytes => 6 characters.
+# Base64.urlsafe_encode64('1234', padding: false) # => "MDEyMw"
+# # n = 2: 7 bytes => 10 characters.
+# Base64.urlsafe_encode64('1234567', padding: false) # => "MDEyMzQ1Ng"
+#
+# - Input bytes of length 3n+2 generate unpadded output characters
+# of length 4n+3, with one padding character at the end:
+#
+# # n = 1: 5 bytes => 7 characters.
+# Base64.urlsafe_encode64('12345', padding: false) # => "MDEyMzQ"
+# # m = 2: 8 bytes => 11 characters.
+# Base64.urlsafe_encode64('12345678', padding: false) # => "MDEyMzQ1Njc"
+#
+# Padding in Decode Methods
+#
+# All of the \Base64 decode methods support (but do not require) padding.
+#
+# \Method Base64.decode64 does not check the size of the padding:
+#
+# Base64.decode64("MDEyMzQ1Njc") # => "01234567"
+# Base64.decode64("MDEyMzQ1Njc=") # => "01234567"
+# Base64.decode64("MDEyMzQ1Njc==") # => "01234567"
+#
+# \Method Base64.strict_decode64 strictly enforces padding size:
+#
+# Base64.strict_decode64("MDEyMzQ1Njc") # Raises ArgumentError
+# Base64.strict_decode64("MDEyMzQ1Njc=") # => "01234567"
+# Base64.strict_decode64("MDEyMzQ1Njc==") # Raises ArgumentError
+#
+# \Method Base64.urlsafe_decode64 allows padding in the encoded string,
+# which if present, must be correct:
+# see {Padding}[Base64.html#module-Base64-label-Padding], above:
+#
+# Base64.urlsafe_decode64("MDEyMzQ1Njc") # => "01234567"
+# Base64.urlsafe_decode64("MDEyMzQ1Njc=") # => "01234567"
+# Base64.urlsafe_decode64("MDEyMzQ1Njc==") # Raises ArgumentError.
+#
+# == Newlines
+#
+# An encoded string returned by Base64.encode64 or Base64.urlsafe_encode64
+# has an embedded newline character
+# after each 60-character sequence, and, if non-empty, at the end:
+#
+# # No newline if empty.
+# encoded = Base64.encode64("\x00" * 0)
+# encoded.index("\n") # => nil
+#
+# # Newline at end of short output.
+# encoded = Base64.encode64("\x00" * 1)
+# encoded.size # => 4
+# encoded.index("\n") # => 4
+#
+# # Newline at end of longer output.
+# encoded = Base64.encode64("\x00" * 45)
+# encoded.size # => 60
+# encoded.index("\n") # => 60
+#
+# # Newlines embedded and at end of still longer output.
+# encoded = Base64.encode64("\x00" * 46)
+# encoded.size # => 65
+# encoded.rindex("\n") # => 65
+# encoded.split("\n").map {|s| s.size } # => [60, 4]
+#
+# The string to be encoded may itself contain newlines,
+# which are encoded as \Base64:
+#
+# # Base64.encode64("\n\n\n") # => "CgoK\n"
+# s = "This is line 1\nThis is line 2\n"
+# Base64.encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
+#
+module Base64
+
+ VERSION = "0.3.0"
+
+ module_function
+
+ # :call-seq:
+ # Base64.encode64(string) -> encoded_string
+ #
+ # Returns a string containing the RFC-2045-compliant \Base64-encoding of +string+.
+ #
+ # Per RFC 2045, the returned string may contain the URL-unsafe characters
+ # + or /;
+ # see {Encoding Character Set}[Base64.html#module-Base64-label-Encoding+Character+Sets] above:
+ #
+ # Base64.encode64("\xFB\xEF\xBE") # => "++++\n"
+ # Base64.encode64("\xFF\xFF\xFF") # => "////\n"
+ #
+ # The returned string may include padding;
+ # see {Padding}[Base64.html#module-Base64-label-Padding] above.
+ #
+ # Base64.encode64('*') # => "Kg==\n"
+ #
+ # The returned string ends with a newline character, and if sufficiently long
+ # will have one or more embedded newline characters;
+ # see {Newlines}[Base64.html#module-Base64-label-Newlines] above:
+ #
+ # Base64.encode64('*') # => "Kg==\n"
+ # Base64.encode64('*' * 46)
+ # # => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq\nKg==\n"
+ #
+ # The string to be encoded may itself contain newlines,
+ # which will be encoded as ordinary \Base64:
+ #
+ # Base64.encode64("\n\n\n") # => "CgoK\n"
+ # s = "This is line 1\nThis is line 2\n"
+ # Base64.encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
+ #
+ def encode64(bin)
+ [bin].pack("m")
+ end
+
+ # :call-seq:
+ # Base64.decode(encoded_string) -> decoded_string
+ #
+ # Returns a string containing the decoding of an RFC-2045-compliant
+ # \Base64-encoded string +encoded_string+:
+ #
+ # s = "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
+ # Base64.decode64(s) # => "This is line 1\nThis is line 2\n"
+ #
+ # Non-\Base64 characters in +encoded_string+ are ignored;
+ # see {Encoding Character Set}[Base64.html#module-Base64-label-Encoding+Character+Sets] above:
+ # these include newline characters and characters - and /:
+ #
+ # Base64.decode64("\x00\n-_") # => ""
+ #
+ # Padding in +encoded_string+ (even if incorrect) is ignored:
+ #
+ # Base64.decode64("MDEyMzQ1Njc") # => "01234567"
+ # Base64.decode64("MDEyMzQ1Njc=") # => "01234567"
+ # Base64.decode64("MDEyMzQ1Njc==") # => "01234567"
+ #
+ def decode64(str)
+ str.unpack1("m")
+ end
+
+ # :call-seq:
+ # Base64.strict_encode64(string) -> encoded_string
+ #
+ # Returns a string containing the RFC-2045-compliant \Base64-encoding of +string+.
+ #
+ # Per RFC 2045, the returned string may contain the URL-unsafe characters
+ # + or /;
+ # see {Encoding Character Set}[Base64.html#module-Base64-label-Encoding+Character+Sets] above:
+ #
+ # Base64.strict_encode64("\xFB\xEF\xBE") # => "++++\n"
+ # Base64.strict_encode64("\xFF\xFF\xFF") # => "////\n"
+ #
+ # The returned string may include padding;
+ # see {Padding}[Base64.html#module-Base64-label-Padding] above.
+ #
+ # Base64.strict_encode64('*') # => "Kg==\n"
+ #
+ # The returned string will have no newline characters, regardless of its length;
+ # see {Newlines}[Base64.html#module-Base64-label-Newlines] above:
+ #
+ # Base64.strict_encode64('*') # => "Kg=="
+ # Base64.strict_encode64('*' * 46)
+ # # => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg=="
+ #
+ # The string to be encoded may itself contain newlines,
+ # which will be encoded as ordinary \Base64:
+ #
+ # Base64.strict_encode64("\n\n\n") # => "CgoK"
+ # s = "This is line 1\nThis is line 2\n"
+ # Base64.strict_encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK"
+ #
+ def strict_encode64(bin)
+ [bin].pack("m0")
+ end
+
+ # :call-seq:
+ # Base64.strict_decode64(encoded_string) -> decoded_string
+ #
+ # Returns a string containing the decoding of an RFC-2045-compliant
+ # \Base64-encoded string +encoded_string+:
+ #
+ # s = "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK"
+ # Base64.strict_decode64(s) # => "This is line 1\nThis is line 2\n"
+ #
+ # Non-\Base64 characters in +encoded_string+ are not allowed;
+ # see {Encoding Character Set}[Base64.html#module-Base64-label-Encoding+Character+Sets] above:
+ # these include newline characters and characters - and /:
+ #
+ # Base64.strict_decode64("\n") # Raises ArgumentError
+ # Base64.strict_decode64('-') # Raises ArgumentError
+ # Base64.strict_decode64('_') # Raises ArgumentError
+ #
+ # Padding in +encoded_string+, if present, must be correct:
+ #
+ # Base64.strict_decode64("MDEyMzQ1Njc") # Raises ArgumentError
+ # Base64.strict_decode64("MDEyMzQ1Njc=") # => "01234567"
+ # Base64.strict_decode64("MDEyMzQ1Njc==") # Raises ArgumentError
+ #
+ def strict_decode64(str)
+ str.unpack1("m0")
+ end
+
+ # :call-seq:
+ # Base64.urlsafe_encode64(string) -> encoded_string
+ #
+ # Returns the RFC-4648-compliant \Base64-encoding of +string+.
+ #
+ # Per RFC 4648, the returned string will not contain the URL-unsafe characters
+ # + or /,
+ # but instead may contain the URL-safe characters
+ # - and _;
+ # see {Encoding Character Set}[Base64.html#module-Base64-label-Encoding+Character+Sets] above:
+ #
+ # Base64.urlsafe_encode64("\xFB\xEF\xBE") # => "----"
+ # Base64.urlsafe_encode64("\xFF\xFF\xFF") # => "____"
+ #
+ # By default, the returned string may have padding;
+ # see {Padding}[Base64.html#module-Base64-label-Padding], above:
+ #
+ # Base64.urlsafe_encode64('*') # => "Kg=="
+ #
+ # Optionally, you can suppress padding:
+ #
+ # Base64.urlsafe_encode64('*', padding: false) # => "Kg"
+ #
+ # The returned string will have no newline characters, regardless of its length;
+ # see {Newlines}[Base64.html#module-Base64-label-Newlines] above:
+ #
+ # Base64.urlsafe_encode64('*') # => "Kg=="
+ # Base64.urlsafe_encode64('*' * 46)
+ # # => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg=="
+ #
+ def urlsafe_encode64(bin, padding: true)
+ str = strict_encode64(bin)
+ str.chomp!("==") or str.chomp!("=") unless padding
+ str.tr!("+/", "-_")
+ str
+ end
+
+ # :call-seq:
+ # Base64.urlsafe_decode64(encoded_string) -> decoded_string
+ #
+ # Returns the decoding of an RFC-4648-compliant \Base64-encoded string +encoded_string+:
+ #
+ # +encoded_string+ may not contain non-Base64 characters;
+ # see {Encoding Character Set}[Base64.html#module-Base64-label-Encoding+Character+Sets] above:
+ #
+ # Base64.urlsafe_decode64('+') # Raises ArgumentError.
+ # Base64.urlsafe_decode64('/') # Raises ArgumentError.
+ # Base64.urlsafe_decode64("\n") # Raises ArgumentError.
+ #
+ # Padding in +encoded_string+, if present, must be correct:
+ # see {Padding}[Base64.html#module-Base64-label-Padding], above:
+ #
+ # Base64.urlsafe_decode64("MDEyMzQ1Njc") # => "01234567"
+ # Base64.urlsafe_decode64("MDEyMzQ1Njc=") # => "01234567"
+ # Base64.urlsafe_decode64("MDEyMzQ1Njc==") # Raises ArgumentError.
+ #
+ def urlsafe_decode64(str)
+ # NOTE: RFC 4648 does say nothing about unpadded input, but says that
+ # "the excess pad characters MAY also be ignored", so it is inferred that
+ # unpadded input is also acceptable.
+ if !str.end_with?("=") && str.length % 4 != 0
+ str = str.ljust((str.length + 3) & ~3, "=")
+ str.tr!("-_", "+/")
+ else
+ str = str.tr("-_", "+/")
+ end
+ strict_decode64(str)
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/sig/base64.rbs b/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/sig/base64.rbs
new file mode 100644
index 0000000..147e874
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/sig/base64.rbs
@@ -0,0 +1,355 @@
+#
+# Module Base64 provides methods for:
+#
+# * Encoding a binary string (containing non-ASCII characters) as a string of
+# printable ASCII characters.
+# * Decoding such an encoded string.
+#
+# Base64 is commonly used in contexts where binary data is not allowed or
+# supported:
+#
+# * Images in HTML or CSS files, or in URLs.
+# * Email attachments.
+#
+# A Base64-encoded string is about one-third larger that its source. See the
+# [Wikipedia article](https://en.wikipedia.org/wiki/Base64) for more
+# information.
+#
+# This module provides three pairs of encode/decode methods. Your choices among
+# these methods should depend on:
+#
+# * Which character set is to be used for encoding and decoding.
+# * Whether "padding" is to be used.
+# * Whether encoded strings are to contain newlines.
+#
+# Note: Examples on this page assume that the including program has executed:
+#
+# require 'base64'
+#
+# ## Encoding Character Sets
+#
+# A Base64-encoded string consists only of characters from a 64-character set:
+#
+# * `('A'..'Z')`.
+# * `('a'..'z')`.
+# * `('0'..'9')`.
+# * `=`, the 'padding' character.
+# * Either:
+# * `%w[+ /]`:
+# [RFC-2045-compliant](https://datatracker.ietf.org/doc/html/rfc2045);
+# *not* safe for URLs.
+# * `%w[- _]`:
+# [RFC-4648-compliant](https://datatracker.ietf.org/doc/html/rfc4648);
+# safe for URLs.
+#
+# If you are working with Base64-encoded strings that will come from or be put
+# into URLs, you should choose this encoder-decoder pair of RFC-4648-compliant
+# methods:
+#
+# * Base64.urlsafe_encode64 and Base64.urlsafe_decode64.
+#
+# Otherwise, you may choose any of the pairs in this module, including the pair
+# above, or the RFC-2045-compliant pairs:
+#
+# * Base64.encode64 and Base64.decode64.
+# * Base64.strict_encode64 and Base64.strict_decode64.
+#
+# ## Padding
+#
+# Base64-encoding changes a triplet of input bytes into a quartet of output
+# characters.
+#
+# **Padding in Encode Methods**
+#
+# Padding -- extending an encoded string with zero, one, or two trailing `=`
+# characters -- is performed by methods Base64.encode64, Base64.strict_encode64,
+# and, by default, Base64.urlsafe_encode64:
+#
+# Base64.encode64('s') # => "cw==\n"
+# Base64.strict_encode64('s') # => "cw=="
+# Base64.urlsafe_encode64('s') # => "cw=="
+# Base64.urlsafe_encode64('s', padding: false) # => "cw"
+#
+# When padding is performed, the encoded string is always of length *4n*, where
+# `n` is a non-negative integer:
+#
+# * Input bytes of length *3n* generate unpadded output characters of length
+# *4n*:
+#
+# # n = 1: 3 bytes => 4 characters.
+# Base64.strict_encode64('123') # => "MDEy"
+# # n = 2: 6 bytes => 8 characters.
+# Base64.strict_encode64('123456') # => "MDEyMzQ1"
+#
+# * Input bytes of length *3n+1* generate padded output characters of length
+# *4(n+1)*, with two padding characters at the end:
+#
+# # n = 1: 4 bytes => 8 characters.
+# Base64.strict_encode64('1234') # => "MDEyMw=="
+# # n = 2: 7 bytes => 12 characters.
+# Base64.strict_encode64('1234567') # => "MDEyMzQ1Ng=="
+#
+# * Input bytes of length *3n+2* generate padded output characters of length
+# *4(n+1)*, with one padding character at the end:
+#
+# # n = 1: 5 bytes => 8 characters.
+# Base64.strict_encode64('12345') # => "MDEyMzQ="
+# # n = 2: 8 bytes => 12 characters.
+# Base64.strict_encode64('12345678') # => "MDEyMzQ1Njc="
+#
+# When padding is suppressed, for a positive integer *n*:
+#
+# * Input bytes of length *3n* generate unpadded output characters of length
+# *4n*:
+#
+# # n = 1: 3 bytes => 4 characters.
+# Base64.urlsafe_encode64('123', padding: false) # => "MDEy"
+# # n = 2: 6 bytes => 8 characters.
+# Base64.urlsafe_encode64('123456', padding: false) # => "MDEyMzQ1"
+#
+# * Input bytes of length *3n+1* generate unpadded output characters of length
+# *4n+2*, with two padding characters at the end:
+#
+# # n = 1: 4 bytes => 6 characters.
+# Base64.urlsafe_encode64('1234', padding: false) # => "MDEyMw"
+# # n = 2: 7 bytes => 10 characters.
+# Base64.urlsafe_encode64('1234567', padding: false) # => "MDEyMzQ1Ng"
+#
+# * Input bytes of length *3n+2* generate unpadded output characters of length
+# *4n+3*, with one padding character at the end:
+#
+# # n = 1: 5 bytes => 7 characters.
+# Base64.urlsafe_encode64('12345', padding: false) # => "MDEyMzQ"
+# # m = 2: 8 bytes => 11 characters.
+# Base64.urlsafe_encode64('12345678', padding: false) # => "MDEyMzQ1Njc"
+#
+# **Padding in Decode Methods**
+#
+# All of the Base64 decode methods support (but do not require) padding.
+#
+# Method Base64.decode64 does not check the size of the padding:
+#
+# Base64.decode64("MDEyMzQ1Njc") # => "01234567"
+# Base64.decode64("MDEyMzQ1Njc=") # => "01234567"
+# Base64.decode64("MDEyMzQ1Njc==") # => "01234567"
+#
+# Method Base64.strict_decode64 strictly enforces padding size:
+#
+# Base64.strict_decode64("MDEyMzQ1Njc") # Raises ArgumentError
+# Base64.strict_decode64("MDEyMzQ1Njc=") # => "01234567"
+# Base64.strict_decode64("MDEyMzQ1Njc==") # Raises ArgumentError
+#
+# Method Base64.urlsafe_decode64 allows padding in `str`, which if present, must
+# be correct: see [Padding](Base64.html#module-Base64-label-Padding), above:
+#
+# Base64.urlsafe_decode64("MDEyMzQ1Njc") # => "01234567"
+# Base64.urlsafe_decode64("MDEyMzQ1Njc=") # => "01234567"
+# Base64.urlsafe_decode64("MDEyMzQ1Njc==") # Raises ArgumentError.
+#
+# ## Newlines
+#
+# An encoded string returned by Base64.encode64 or Base64.urlsafe_encode64 has
+# an embedded newline character after each 60-character sequence, and, if
+# non-empty, at the end:
+#
+# # No newline if empty.
+# encoded = Base64.encode64("\x00" * 0)
+# encoded.index("\n") # => nil
+#
+# # Newline at end of short output.
+# encoded = Base64.encode64("\x00" * 1)
+# encoded.size # => 4
+# encoded.index("\n") # => 4
+#
+# # Newline at end of longer output.
+# encoded = Base64.encode64("\x00" * 45)
+# encoded.size # => 60
+# encoded.index("\n") # => 60
+#
+# # Newlines embedded and at end of still longer output.
+# encoded = Base64.encode64("\x00" * 46)
+# encoded.size # => 65
+# encoded.rindex("\n") # => 65
+# encoded.split("\n").map {|s| s.size } # => [60, 4]
+#
+# The string to be encoded may itself contain newlines, which are encoded as
+# Base64:
+#
+# # Base64.encode64("\n\n\n") # => "CgoK\n"
+# s = "This is line 1\nThis is line 2\n"
+# Base64.encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
+#
+module Base64
+ #
+ # Returns a string containing the decoding of an RFC-2045-compliant
+ # Base64-encoded string `str`:
+ #
+ # s = "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
+ # Base64.decode64(s) # => "This is line 1\nThis is line 2\n"
+ #
+ # Non-Base64 characters in `str` are ignored; see [Encoding Character
+ # Set](Base64.html#module-Base64-label-Encoding+Character+Sets) above: these
+ # include newline characters and characters `-` and `/`:
+ #
+ # Base64.decode64("\x00\n-_") # => ""
+ #
+ # Padding in `str` (even if incorrect) is ignored:
+ #
+ # Base64.decode64("MDEyMzQ1Njc") # => "01234567"
+ # Base64.decode64("MDEyMzQ1Njc=") # => "01234567"
+ # Base64.decode64("MDEyMzQ1Njc==") # => "01234567"
+ #
+ def self?.decode64: (String str) -> String
+
+ #
+ # Returns a string containing the RFC-2045-compliant Base64-encoding of `bin`.
+ #
+ # Per RFC 2045, the returned string may contain the URL-unsafe characters `+` or
+ # `/`; see [Encoding Character
+ # Set](Base64.html#module-Base64-label-Encoding+Character+Sets) above:
+ #
+ # Base64.encode64("\xFB\xEF\xBE") # => "++++\n"
+ # Base64.encode64("\xFF\xFF\xFF") # => "////\n"
+ #
+ # The returned string may include padding; see
+ # [Padding](Base64.html#module-Base64-label-Padding) above.
+ #
+ # Base64.encode64('*') # => "Kg==\n"
+ #
+ # The returned string ends with a newline character, and if sufficiently long
+ # will have one or more embedded newline characters; see
+ # [Newlines](Base64.html#module-Base64-label-Newlines) above:
+ #
+ # Base64.encode64('*') # => "Kg==\n"
+ # Base64.encode64('*' * 46)
+ # # => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq\nKg==\n"
+ #
+ # The string to be encoded may itself contain newlines, which will be encoded as
+ # ordinary Base64:
+ #
+ # Base64.encode64("\n\n\n") # => "CgoK\n"
+ # s = "This is line 1\nThis is line 2\n"
+ # Base64.encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
+ #
+ def self?.encode64: (String bin) -> String
+
+ #
+ # Returns a string containing the decoding of an RFC-2045-compliant
+ # Base64-encoded string `str`:
+ #
+ # s = "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK"
+ # Base64.strict_decode64(s) # => "This is line 1\nThis is line 2\n"
+ #
+ # Non-Base64 characters in `str` not allowed; see [Encoding Character
+ # Set](Base64.html#module-Base64-label-Encoding+Character+Sets) above: these
+ # include newline characters and characters `-` and `/`:
+ #
+ # Base64.strict_decode64("\n") # Raises ArgumentError
+ # Base64.strict_decode64('-') # Raises ArgumentError
+ # Base64.strict_decode64('_') # Raises ArgumentError
+ #
+ # Padding in `str`, if present, must be correct:
+ #
+ # Base64.strict_decode64("MDEyMzQ1Njc") # Raises ArgumentError
+ # Base64.strict_decode64("MDEyMzQ1Njc=") # => "01234567"
+ # Base64.strict_decode64("MDEyMzQ1Njc==") # Raises ArgumentError
+ #
+ def self?.strict_decode64: (String str) -> String
+
+ #
+ # Returns a string containing the RFC-2045-compliant Base64-encoding of `bin`.
+ #
+ # Per RFC 2045, the returned string may contain the URL-unsafe characters `+` or
+ # `/`; see [Encoding Character
+ # Set](Base64.html#module-Base64-label-Encoding+Character+Sets) above:
+ #
+ # Base64.strict_encode64("\xFB\xEF\xBE") # => "++++\n"
+ # Base64.strict_encode64("\xFF\xFF\xFF") # => "////\n"
+ #
+ # The returned string may include padding; see
+ # [Padding](Base64.html#module-Base64-label-Padding) above.
+ #
+ # Base64.strict_encode64('*') # => "Kg==\n"
+ #
+ # The returned string will have no newline characters, regardless of its length;
+ # see [Newlines](Base64.html#module-Base64-label-Newlines) above:
+ #
+ # Base64.strict_encode64('*') # => "Kg=="
+ # Base64.strict_encode64('*' * 46)
+ # # => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg=="
+ #
+ # The string to be encoded may itself contain newlines, which will be encoded as
+ # ordinary Base64:
+ #
+ # Base64.strict_encode64("\n\n\n") # => "CgoK"
+ # s = "This is line 1\nThis is line 2\n"
+ # Base64.strict_encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK"
+ #
+ def self?.strict_encode64: (String bin) -> String
+
+ #
+ # Returns the decoding of an RFC-4648-compliant Base64-encoded string `str`:
+ #
+ # `str` may not contain non-Base64 characters; see [Encoding Character
+ # Set](Base64.html#module-Base64-label-Encoding+Character+Sets) above:
+ #
+ # Base64.urlsafe_decode64('+') # Raises ArgumentError.
+ # Base64.urlsafe_decode64('/') # Raises ArgumentError.
+ # Base64.urlsafe_decode64("\n") # Raises ArgumentError.
+ #
+ # Padding in `str`, if present, must be correct: see
+ # [Padding](Base64.html#module-Base64-label-Padding), above:
+ #
+ # Base64.urlsafe_decode64("MDEyMzQ1Njc") # => "01234567"
+ # Base64.urlsafe_decode64("MDEyMzQ1Njc=") # => "01234567"
+ # Base64.urlsafe_decode64("MDEyMzQ1Njc==") # Raises ArgumentError.
+ #
+ def self?.urlsafe_decode64: (String str) -> String
+
+ #
+ # Returns the RFC-4648-compliant Base64-encoding of `bin`.
+ #
+ # Per RFC 4648, the returned string will not contain the URL-unsafe characters
+ # `+` or `/`, but instead may contain the URL-safe characters `-` and `_`; see
+ # [Encoding Character
+ # Set](Base64.html#module-Base64-label-Encoding+Character+Sets) above:
+ #
+ # Base64.urlsafe_encode64("\xFB\xEF\xBE") # => "----"
+ # Base64.urlsafe_encode64("\xFF\xFF\xFF") # => "____"
+ #
+ # By default, the returned string may have padding; see
+ # [Padding](Base64.html#module-Base64-label-Padding), above:
+ #
+ # Base64.urlsafe_encode64('*') # => "Kg=="
+ #
+ # Optionally, you can suppress padding:
+ #
+ # Base64.urlsafe_encode64('*', padding: false) # => "Kg"
+ #
+ # The returned string will have no newline characters, regardless of its length;
+ # see [Newlines](Base64.html#module-Base64-label-Newlines) above:
+ #
+ # Base64.urlsafe_encode64('*') # => "Kg=="
+ # Base64.urlsafe_encode64('*' * 46)
+ # # => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg=="
+ #
+ def self?.urlsafe_encode64: (String bin, ?padding: boolish) -> String
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.github/workflows/ci.yml b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.github/workflows/ci.yml
new file mode 100644
index 0000000..54e1f05
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.github/workflows/ci.yml
@@ -0,0 +1,45 @@
+name: ci
+
+on:
+ pull_request:
+
+ push:
+ branches:
+ - master
+ - '*-stable'
+
+jobs:
+ ci:
+ name: Ruby ${{ matrix.ruby.name }}
+
+ runs-on: ubuntu-20.04
+
+ strategy:
+ fail-fast: false
+
+ matrix:
+ ruby:
+ - { name: "2.3", value: 2.3.8 }
+ - { name: "2.4", value: 2.4.10 }
+ - { name: "2.5", value: 2.5.9 }
+ - { name: "2.6", value: 2.6.9 }
+ - { name: "2.7", value: 2.7.5 }
+ - { name: "3.0", value: 3.0.3 }
+ - { name: "3.1", value: 3.1.0 }
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Setup ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: ${{ matrix.ruby.value }}
+ bundler-cache: true
+
+ - name: Run Test
+ run: bundle exec rake spec
+
+ - name: Test & publish code coverage
+ uses: paambaati/codeclimate-action@v3.0.0
+ env:
+ CC_TEST_REPORTER_ID: 46c8b29dd6711f35704e7c5a541486cbbf2cff8b2df8ce755bfc09917d3c1cbb
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.gitignore b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.gitignore
new file mode 100644
index 0000000..001d28f
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.gitignore
@@ -0,0 +1,17 @@
+*.gem
+*.rbc
+.bundle
+.config
+.yardoc
+InstalledFiles
+_yardoc
+coverage
+doc/
+lib/bundler/man
+pkg
+rdoc
+spec/reports
+test/tmp
+test/version_tmp
+tmp
+.idea
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.kick b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.kick
new file mode 100644
index 0000000..0686cce
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.kick
@@ -0,0 +1,30 @@
+recipe :ruby
+
+Kicker::Recipes::Ruby.runner_bin = 'bundle exec bacon --quiet'
+
+process do |files|
+ specs = files.take_and_map do |file|
+ if file =~ %r{lib/[^/]*/(.+?)\.rb$}
+ s = Dir.glob("spec/**/#{File.basename(file, '.rb')}_spec.rb")
+ s.uniq unless s.empty?
+ end
+ end
+ Kicker::Recipes::Ruby.run_tests(specs)
+end
+
+# Have written this so many times, probably should make a recipe out of it.
+process do |files|
+ files.each do |file|
+ case file
+ when 'Gemfile'
+ files.delete(file)
+ execute 'bundle install'
+ end
+ end
+end
+
+recipe :ignore
+ignore(/.*\/?tags/)
+ignore(/.*\/?\.git/)
+ignore(/^tmp/)
+
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop.yml b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop.yml
new file mode 100644
index 0000000..3ef9f69
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop.yml
@@ -0,0 +1,6 @@
+require:
+ - rubocop-performance
+
+inherit_from:
+ - .rubocop_todo.yml
+ - .rubocop_cocoapods.yml
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop_cocoapods.yml b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop_cocoapods.yml
new file mode 100644
index 0000000..4702a3e
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop_cocoapods.yml
@@ -0,0 +1,151 @@
+AllCops:
+ Include:
+ - ./Rakefile
+ - ./Gemfile
+ - ./*.gemspec
+ Exclude:
+ - ./spec/fixtures/**/*
+ - ./vendor/bundle/**/*
+
+# At the moment not ready to be used
+# https://github.com/bbatsov/rubocop/issues/947
+Style/Documentation:
+ Enabled: false
+
+#- CocoaPods -----------------------------------------------------------------#
+
+# We adopted raise instead of fail.
+Style/SignalException:
+ EnforcedStyle: only_raise
+
+# They are idiomatic
+Lint/AssignmentInCondition:
+ Enabled: false
+
+# Allow backticks
+Style/AsciiComments:
+ Enabled: false
+
+# Indentation clarifies logic branches in implementations
+Style/IfUnlessModifier:
+ Enabled: false
+
+# No enforced convention here.
+Style/SingleLineBlockParams:
+ Enabled: false
+
+# We only add the comment when needed.
+Style/Encoding:
+ Enabled: false
+
+# Having these make it easier to *not* forget to add one when adding a new
+# value and you can simply copy the previous line.
+Style/TrailingCommaInArguments:
+ EnforcedStyleForMultiline: comma
+
+Style/TrailingCommaInArrayLiteral:
+ EnforcedStyleForMultiline: comma
+
+Style/TrailingCommaInHashLiteral:
+ EnforcedStyleForMultiline: comma
+
+Layout/MultilineOperationIndentation:
+ EnforcedStyle: indented
+
+# Clashes with CLAide Command#validate!
+Style/GuardClause:
+ Enabled: false
+
+# Not always desirable: lib/claide/command/plugins_helper.rb:12:15
+Style/Next:
+ Enabled: false
+
+# Arbitrary max lengths for classes simply do not work and enabling this will
+# lead to a never ending stream of annoyance and changes.
+Metrics/ClassLength:
+ Enabled: false
+
+# Arbitrary max lengths for modules simply do not work and enabling this will
+# lead to a never ending stream of annoyance and changes.
+Metrics/ModuleLength:
+ Enabled: false
+
+# Arbitrary max lengths for methods simply do not work and enabling this will
+# lead to a never ending stream of annoyance and changes.
+Metrics/MethodLength:
+ Enabled: false
+
+# No enforced convention here.
+Metrics/BlockNesting:
+ Enabled: false
+
+# It will be obvious which code is complex, Rubocop should only lint simple
+# rules for us.
+Metrics/AbcSize:
+ Enabled: false
+
+# It will be obvious which code is complex, Rubocop should only lint simple
+# rules for us.
+Metrics/CyclomaticComplexity:
+ Enabled: false
+
+# It will be obvious which code is complex, Rubocop should only lint simple
+# rules for us.
+Metrics/PerceivedComplexity:
+ Enabled: false
+
+#- CocoaPods support for Ruby 1.8.7 ------------------------------------------#
+
+Style/HashSyntax:
+ EnforcedStyle: hash_rockets
+
+Style/Lambda:
+ Enabled: false
+
+Layout/DotPosition:
+ EnforcedStyle: trailing
+
+Style/EachWithObject:
+ Enabled: false
+
+Style/SpecialGlobalVars:
+ Enabled: false
+
+#- CocoaPods specs -----------------------------------------------------------#
+
+# Allow for `should.match /regexp/`.
+Lint/AmbiguousRegexpLiteral:
+ Exclude:
+ - spec/**/*
+
+Performance/RedundantMatch:
+ Exclude:
+ - spec/**/*
+
+# Allow `object.should == object` syntax.
+Lint/Void:
+ Exclude:
+ - spec/**/*
+
+Style/ClassAndModuleChildren:
+ Exclude:
+ - spec/**/*
+
+Lint/UselessComparison:
+ Exclude:
+ - spec/**/*
+
+Lint/RaiseException:
+ Enabled: false
+
+Lint/StructNewOverride:
+ Enabled: false
+
+Style/HashEachMethods:
+ Enabled: false
+
+Style/HashTransformKeys:
+ Enabled: false
+
+Style/HashTransformValues:
+ Enabled: false
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop_todo.yml b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop_todo.yml
new file mode 100644
index 0000000..926b32c
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop_todo.yml
@@ -0,0 +1,70 @@
+# This configuration was generated by
+# `rubocop --auto-gen-config`
+# on 2016-03-09 18:40:14 -0600 using RuboCop version 0.38.0.
+# The point is for the user to remove these configuration records
+# one by one as the offenses are removed from the code base.
+# Note that changes in the inspected code, or installation of new
+# versions of RuboCop, may require this file to be generated again.
+
+# Offense count: 3
+Lint/IneffectiveAccessModifier:
+ Exclude:
+ - 'lib/claide/command.rb'
+
+# Offense count: 1
+# Cop supports --auto-correct.
+Lint/RedundantCopDisableDirective:
+ Exclude:
+ - 'spec/command/banner_spec.rb'
+
+# Offense count: 1
+Performance/FixedSize:
+ Exclude:
+ - 'lib/claide/command/banner.rb'
+
+# Offense count: 1
+# Cop supports --auto-correct.
+Performance/StringReplacement:
+ Exclude:
+ - 'lib/claide/command/banner.rb'
+
+# Offense count: 8
+# Cop supports --auto-correct.
+# Configuration parameters: EnforcedStyle, SupportedStyles.
+# SupportedStyles: prefer_alias, prefer_alias_method
+Style/Alias:
+ Exclude:
+ - 'lib/claide/argument.rb'
+ - 'lib/claide/command.rb'
+
+# Offense count: 1
+# Cop supports --auto-correct.
+# Configuration parameters: SingleLineConditionsOnly.
+Style/ConditionalAssignment:
+ Exclude:
+ - 'lib/claide/command/banner.rb'
+
+# Offense count: 1
+Style/IfInsideElse:
+ Exclude:
+ - 'lib/claide/command.rb'
+
+# Offense count: 9
+# Cop supports --auto-correct.
+Style/MutableConstant:
+ Exclude:
+ - 'lib/claide/ansi.rb'
+ - 'lib/claide/argument.rb'
+ - 'lib/claide/command.rb'
+
+# Offense count: 1
+# Cop supports --auto-correct.
+Style/ParallelAssignment:
+ Exclude:
+ - 'lib/claide/command/argument_suggester.rb'
+
+# Offense count: 1
+# Cop supports --auto-correct.
+Style/RedundantInterpolation:
+ Exclude:
+ - 'lib/claide/command/argument_suggester.rb'
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.yardopts b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.yardopts
new file mode 100644
index 0000000..a647564
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.yardopts
@@ -0,0 +1 @@
+--markup markdown --protected --charset=utf-8 lib
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/Gemfile b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/Gemfile
new file mode 100644
index 0000000..c33e9bc
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/Gemfile
@@ -0,0 +1,22 @@
+source 'https://rubygems.org'
+
+gemspec
+
+gem 'rake'
+
+group :development do
+ gem 'kicker'
+ gem 'colored' # for examples
+end
+
+group :spec do
+ gem 'bacon'
+ gem 'json', '< 3'
+ gem 'mocha-on-bacon'
+ gem 'prettybacon'
+
+ gem 'parallel', '<= 1.19.2'
+ gem 'rubocop', '<= 0.81.0'
+ gem 'rubocop-performance', '<= 1.5.2', :require => nil
+ gem 'simplecov'
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/Gemfile.lock b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/Gemfile.lock
new file mode 100644
index 0000000..22fe1a9
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/Gemfile.lock
@@ -0,0 +1,79 @@
+PATH
+ remote: .
+ specs:
+ claide (1.1.0)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ ast (2.4.2)
+ bacon (1.2.0)
+ colored (1.2)
+ docile (1.1.5)
+ ffi (1.14.2)
+ jaro_winkler (1.5.4)
+ json (2.5.1)
+ kicker (3.0.0)
+ listen (~> 1.3.0)
+ notify (~> 0.5.2)
+ listen (1.3.1)
+ rb-fsevent (>= 0.9.3)
+ rb-inotify (>= 0.9)
+ rb-kqueue (>= 0.2)
+ metaclass (0.0.4)
+ mocha (1.1.0)
+ metaclass (~> 0.0.1)
+ mocha-on-bacon (0.2.2)
+ mocha (>= 0.13.0)
+ multi_json (1.10.1)
+ notify (0.5.2)
+ parallel (1.19.2)
+ parser (3.1.0.0)
+ ast (~> 2.4.1)
+ prettybacon (0.0.2)
+ bacon (~> 1.2)
+ rainbow (3.0.0)
+ rake (10.3.2)
+ rb-fsevent (0.9.4)
+ rb-inotify (0.9.5)
+ ffi (>= 0.5.0)
+ rb-kqueue (0.2.3)
+ ffi (>= 0.5.0)
+ rexml (3.2.5)
+ rubocop (0.81.0)
+ jaro_winkler (~> 1.5.1)
+ parallel (~> 1.10)
+ parser (>= 2.7.0.1)
+ rainbow (>= 2.2.2, < 4.0)
+ rexml
+ ruby-progressbar (~> 1.7)
+ unicode-display_width (>= 1.4.0, < 2.0)
+ rubocop-performance (1.5.2)
+ rubocop (>= 0.71.0)
+ ruby-progressbar (1.11.0)
+ simplecov (0.9.1)
+ docile (~> 1.1.0)
+ multi_json (~> 1.0)
+ simplecov-html (~> 0.8.0)
+ simplecov-html (0.8.0)
+ unicode-display_width (1.8.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ bacon
+ claide!
+ colored
+ json (< 3)
+ kicker
+ mocha-on-bacon
+ parallel (<= 1.19.2)
+ prettybacon
+ rake
+ rubocop (<= 0.81.0)
+ rubocop-performance (<= 1.5.2)
+ simplecov
+
+BUNDLED WITH
+ 2.3.4
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/LICENSE b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/LICENSE
new file mode 100644
index 0000000..7c1df53
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/LICENSE
@@ -0,0 +1,21 @@
+Copyright (c) 2011 - 2012 Eloy Durán
+Copyright (c) 2012 Fabio Pelosin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/README.md b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/README.md
new file mode 100644
index 0000000..f4ed63d
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/README.md
@@ -0,0 +1,115 @@
+# Hi, I’m Claide, your command-line tool aide.
+
+[](https://github.com/CocoaPods/claide/actions)
+[](https://rubygems.org/gems/claide)
+
+I was born out of a need for a _simple_ option and command parser, while still
+providing an API that allows you to quickly create a full featured command-line
+interface.
+
+## Install
+
+```
+$ [sudo] gem install claide
+```
+
+
+## Usage
+
+For full documentation, on the API of CLAide, visit [rubydoc.info][docs].
+
+
+### Argument handling
+
+At its core, a library, such as myself, needs to parse the parameters specified
+by the user.
+
+Working with parameters is done through the `CLAide::ARGV` class. It takes an
+array of parameters and parses them as either flags, options, or arguments.
+
+| Parameter | Description |
+| :---: | :---: |
+| `--milk`, `--no-milk` | A boolean ‘flag’, which may be negated. |
+| `--sweetener=honey` | An ‘option’ consists of a key, a ‘=’, and a value. |
+| `tea` | An ‘argument’ is just a value. |
+
+
+Accessing flags, options, and arguments, with the following methods, will also
+remove the parameter from the remaining unprocessed parameters.
+
+```ruby
+argv = CLAide::ARGV.new(['tea', '--no-milk', '--sweetener=honey'])
+argv.shift_argument # => 'tea'
+argv.shift_argument # => nil
+argv.flag?('milk') # => false
+argv.flag?('milk') # => nil
+argv.option('sweetener') # => 'honey'
+argv.option('sweetener') # => nil
+```
+
+
+In case the requested flag or option is not present, `nil` is returned. You can
+specify a default value to be used as the optional second method parameter:
+
+```ruby
+argv = CLAide::ARGV.new(['tea'])
+argv.flag?('milk', true) # => true
+argv.option('sweetener', 'sugar') # => 'sugar'
+```
+
+
+Unlike flags and options, accessing all of the arguments can be done in either
+a preserving or mutating way:
+
+```ruby
+argv = CLAide::ARGV.new(['tea', 'coffee'])
+argv.arguments # => ['tea', 'coffee']
+argv.arguments! # => ['tea', 'coffee']
+argv.arguments # => []
+```
+
+
+### Command handling
+
+Commands are actions that a tool can perform. Every command is represented by
+its own command class.
+
+Commands may be nested, in which case they inherit from the ‘super command’
+class. Some of these nested commands may not actually perform any work
+themselves, but are rather used as ‘super commands’ _only_, in which case they
+are ‘abtract commands’.
+
+Running commands is typically done through the `CLAide::Command.run(argv)`
+method, which performs the following three steps:
+
+1. Parses the given parameters, finds the command class matching the parameters,
+ and instantiates it with the remaining parameters. It’s each nested command
+ class’ responsibility to remove the parameters it handles from the remaining
+ parameters, _before_ calling the `super` implementation.
+
+2. Asks the command instance to validate its parameters, but only _after_
+ calling the `super` implementation. The `super` implementation will show a
+ help banner in case the `--help` flag is specified, not all parameters were
+ removed from the parameter list, or the command is an abstract command.
+
+3. Calls the `run` method on the command instance, where it may do its work.
+
+4. Catches _any_ uncaught exception and shows it to user in a meaningful way.
+ * A `Help` exception triggers a help banner to be shown for the command.
+ * A exception that includes the `InformativeError` module will show _only_
+ the message, unless disabled with the `--verbose` flag; and in red,
+ depending on the color configuration.
+ * Any other type of exception will be passed to `Command.report_error(error)`
+ for custom error reporting (such as the one in [CocoaPods][report-error]).
+
+In case you want to call commands from _inside_ other commands, you should use
+the `CLAide::Command.parse(argv)` method to retrieve an instance of the command
+and call `run` on it. Unless you are using user-supplied parameters, there
+should not be a need to validate the parameters.
+
+See the [example][example] for a illustration of how to define commands.
+
+
+[docs]: http://www.rubydoc.info/github/CocoaPods/CLAide/index
+[example]: https://github.com/CocoaPods/CLAide/blob/master/examples/make.rb
+[report-error]: https://github.com/CocoaPods/CocoaPods/blob/054fe5c861d932219ec40a91c0439a7cfc3a420c/lib/cocoapods/command.rb#L36
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/Rakefile b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/Rakefile
new file mode 100644
index 0000000..dc22070
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/Rakefile
@@ -0,0 +1,57 @@
+# encoding: utf-8
+
+#-- Bootstrap --------------------------------------------------------------#
+
+desc 'Initializes your working copy to run the specs'
+task :bootstrap do
+ if system('which bundle')
+ title 'Installing gems'
+ sh 'bundle install'
+ else
+ $stderr.puts "\033[0;31m" \
+ "[!] Please install the bundler gem manually:\n" \
+ ' $ [sudo] gem install bundler' \
+ "\e[0m"
+ exit 1
+ end
+end
+
+begin
+ require 'bundler/gem_tasks'
+ task :default => :spec
+
+ #-- Specs ------------------------------------------------------------------#
+
+ desc 'Run specs'
+ task :spec do
+ title 'Running Unit Tests'
+ files = FileList['spec/**/*_spec.rb'].shuffle.join(' ')
+ sh "bundle exec bacon #{files}"
+
+ Rake::Task['rubocop'].invoke
+ end
+
+ #-- Rubocop ----------------------------------------------------------------#
+
+ desc 'Check code against RuboCop rules'
+ task :rubocop do
+ sh 'bundle exec rubocop'
+ end
+
+rescue LoadError
+ $stderr.puts "\033[0;31m" \
+ '[!] Some Rake tasks haven been disabled because the environment' \
+ ' couldn’t be loaded. Be sure to run `rake bootstrap` first.' \
+ "\e[0m"
+end
+
+#-- Helpers ------------------------------------------------------------------#
+
+def title(title)
+ cyan_title = "\033[0;36m#{title}\033[0m"
+ puts
+ puts '-' * 80
+ puts cyan_title
+ puts '-' * 80
+ puts
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/claide.gemspec b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/claide.gemspec
new file mode 100644
index 0000000..1f298d3
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/claide.gemspec
@@ -0,0 +1,23 @@
+# -*- encoding: utf-8 -*-
+$:.unshift File.expand_path('../lib', __FILE__)
+require File.expand_path('../lib/claide/gem_version', __FILE__)
+
+Gem::Specification.new do |s|
+ s.name = "claide"
+ s.version = CLAide::VERSION
+ s.license = "MIT"
+ s.email = ["eloy.de.enige@gmail.com", "fabiopelosin@gmail.com"]
+ s.homepage = "https://github.com/CocoaPods/CLAide"
+ s.authors = ["Eloy Duran", "Fabio Pelosin"]
+
+ s.summary = "A small command-line interface framework."
+
+ s.files = `git ls-files -z`.split("\0").reject { |f| f =~ /\A(spec|examples)/i }
+
+ ## Make sure you can build the gem on older versions of RubyGems too:
+ s.rubygems_version = "1.6.2"
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+ s.specification_version = 3 if s.respond_to? :specification_version
+
+ s.required_ruby_version = ">= 2.3.0"
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide.rb
new file mode 100644
index 0000000..25d2c75
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide.rb
@@ -0,0 +1,13 @@
+# encoding: utf-8
+
+# The mods of interest are {CLAide::ARGV}, {CLAide::Command}, and
+# {CLAide::InformativeError}
+#
+module CLAide
+ require 'claide/ansi'
+ require 'claide/argument'
+ require 'claide/argv'
+ require 'claide/command'
+ require 'claide/help'
+ require 'claide/informative_error'
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi.rb
new file mode 100644
index 0000000..0839ed6
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi.rb
@@ -0,0 +1,126 @@
+# encoding: utf-8
+
+require 'claide/ansi/cursor'
+require 'claide/ansi/graphics'
+
+module CLAide
+ # Provides support for ANSI Escape sequences
+ #
+ # For more information see:
+ #
+ # - http://ascii-table.com/ansi-escape-sequences.php
+ # - http://en.wikipedia.org/wiki/ANSI_escape_code
+ #
+ # This functionality has been inspired and derived from the following gems:
+ #
+ # - colored
+ # - colorize
+ #
+ class ANSI
+ extend Cursor
+ extend Graphics
+
+ class << self
+ # @return [Bool] Wether the string mixin should be disabled to return the
+ # original string. This method is intended to offer a central location
+ # where to disable ANSI logic without needed to implement conditionals
+ # across the code base of clients.
+ #
+ # @example
+ #
+ # "example".ansi.yellow #=> "\e[33mexample\e[39m"
+ # ANSI.disabled = true
+ # "example".ansi.yellow #=> "example"
+ #
+ attr_accessor :disabled
+ end
+
+ # @return [Hash{Symbol => Fixnum}] The text attributes codes by their
+ # English name.
+ #
+ TEXT_ATTRIBUTES = {
+ :bold => 1,
+ :underline => 4,
+ :blink => 5,
+ :reverse => 7,
+ :hidden => 8,
+ }
+
+ # @return [Hash{Symbol => Fixnum}] The codes to disable a text attribute by
+ # their name.
+ #
+ TEXT_DISABLE_ATTRIBUTES = {
+ :bold => 21,
+ :underline => 24,
+ :blink => 25,
+ :reverse => 27,
+ :hidden => 28,
+ }
+
+ # Return [String] The escape sequence to reset the graphics.
+ #
+ RESET_SEQUENCE = "\e[0m"
+
+ # @return [Hash{Symbol => Fixnum}] The colors codes by their English name.
+ #
+ COLORS = {
+ :black => 0,
+ :red => 1,
+ :green => 2,
+ :yellow => 3,
+ :blue => 4,
+ :magenta => 5,
+ :cyan => 6,
+ :white => 7,
+ }
+
+ # Return [String] The escape sequence for the default foreground color.
+ #
+ DEFAULT_FOREGROUND_COLOR = "\e[39m"
+
+ # Return [String] The escape sequence for the default background color.
+ #
+ DEFAULT_BACKGROUND_COLOR = "\e[49m"
+
+ # @return [Fixnum] The code of a key given the map.
+ #
+ # @param [Symbol] key
+ # The key for which the code is needed.
+ #
+ # @param [Hash{Symbol => Fixnum}] map
+ # A hash which associates each code to each key.
+ #
+ # @raise If the key is not provided.
+ # @raise If the key is not present in the map.
+ #
+ def self.code_for_key(key, map)
+ unless key
+ raise ArgumentError, 'A key must be provided'
+ end
+ code = map[key]
+ unless code
+ raise ArgumentError, "Unsupported key: `#{key}`"
+ end
+ code
+ end
+ end
+end
+
+#-- String mixin -------------------------------------------------------------#
+
+require 'claide/ansi/string_escaper'
+
+class String
+ # @return [StringEscaper] An object which provides convenience methods to
+ # wrap the receiver in ANSI sequences.
+ #
+ # @example
+ #
+ # "example".ansi.yellow #=> "\e[33mexample\e[39m"
+ # "example".ansi.on_red #=> "\e[41mexample\e[49m"
+ # "example".ansi.bold #=> "\e[1mexample\e[21m"
+ #
+ def ansi
+ CLAide::ANSI::StringEscaper.new(self)
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi/cursor.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi/cursor.rb
new file mode 100644
index 0000000..acfd5b6
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi/cursor.rb
@@ -0,0 +1,69 @@
+# encoding: utf-8
+
+module CLAide
+ class ANSI
+ # Provides support for generating escape sequences relative to the position
+ # of the cursor and to erase parts of text.
+ #
+ module Cursor
+ # @return [String] The escape sequence to set the cursor at the
+ # given line.
+ #
+ # @param [Fixnum] line
+ # The line where to place the cursor.
+ #
+ # @param [Fixnum] column
+ # The column where to place the cursor.
+ #
+ def self.set_cursor_position(line = 0, column = 0)
+ "\e[#{line};#{column}H"
+ end
+
+ # @return [String] The escape sequence to set the cursor at the
+ # given line.
+ #
+ # @param [Fixnum] lines
+ # The amount of lines the cursor should be moved to.
+ # Negative values indicate up direction and positive ones
+ # down direction.
+ #
+ # @param [Fixnum] columns
+ # The amount of columns the cursor should be moved to.
+ # Negative values indicate left direction and positive ones
+ # right direction.
+ #
+ def self.move_cursor(lines, columns = 0)
+ lines_code = lines < 0 ? 'A' : 'B'
+ columns_code = columns > 0 ? 'C' : 'D'
+ "\e[#{lines.abs}#{lines_code};#{columns.abs}#{columns_code}"
+ end
+
+ # @return [String] The escape sequence to save the cursor position.
+ #
+ def self.save_cursor_position
+ "\e[s"
+ end
+
+ # @return [String] The escape sequence to restore the cursor to the
+ # previously saved position. This sequence also clears all the
+ # output after the position.
+ #
+ def self.restore_cursor_position
+ "\e[u"
+ end
+
+ # @return [String] The escape sequence to erase the display.
+ #
+ def self.erase_display
+ "\e[2J"
+ end
+
+ # @return [String] The escape sequence to erase a line form the
+ # cursor position to then end.
+ #
+ def self.erase_line
+ "\e[K"
+ end
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi/graphics.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi/graphics.rb
new file mode 100644
index 0000000..e5c2d15
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi/graphics.rb
@@ -0,0 +1,72 @@
+# encoding: utf-8
+
+module CLAide
+ class ANSI
+ # Provides support for generating escape sequences relative to the graphic
+ # mode.
+ #
+ module Graphics
+ # @return [String] The escape sequence for a text attribute.
+ #
+ # @param [Symbol] key
+ # The name of the text attribute.
+ #
+ def self.text_attribute(key)
+ code = ANSI.code_for_key(key, TEXT_ATTRIBUTES)
+ graphics_mode(code)
+ end
+
+ # @return [String] The escape sequence for a foreground color.
+ #
+ # @param [Symbol] key
+ # The name of the color.
+ #
+ def self.foreground_color(key)
+ code = ANSI.code_for_key(key, COLORS) + 30
+ graphics_mode(code)
+ end
+
+ # @return [String] The escape sequence for a background color.
+ #
+ # @param [Symbol] key
+ # The name of the color.
+ #
+ def self.background_color(key)
+ code = ANSI.code_for_key(key, COLORS) + 40
+ graphics_mode(code)
+ end
+
+ # @return [String] The escape sequence for a foreground color using the
+ # xterm-256 format.
+ #
+ # @param [Fixnum] color
+ # The value of the color.
+ #
+ def self.foreground_color_256(color)
+ code = [38, 5, color]
+ graphics_mode(code)
+ end
+
+ # @return [String] The escape sequence for a background color using the
+ # xterm-256 format.
+ #
+ # @param [Fixnum] color
+ # The value of the color.
+ #
+ def self.background_color_256(color)
+ code = [48, 5, color]
+ graphics_mode(code)
+ end
+
+ # @return [String] The escape sequence for a single or a list of codes.
+ #
+ # @param [Fixnum, Array] codes
+ # The code(s).
+ #
+ def self.graphics_mode(codes)
+ codes = Array(codes)
+ "\e[#{codes.join(';')}m"
+ end
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi/string_escaper.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi/string_escaper.rb
new file mode 100644
index 0000000..b6f461c
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi/string_escaper.rb
@@ -0,0 +1,79 @@
+module CLAide
+ class ANSI
+ # Provides support to wrap strings in ANSI sequences according to the
+ # `ANSI.disabled` setting.
+ #
+ class StringEscaper < String
+ # @param [String] string The string to wrap.
+ #
+ def initialize(string)
+ super
+ end
+
+ # @return [StringEscaper] Wraps a string in the given ANSI sequences,
+ # taking care of handling existing sequences for the same
+ # family of attributes (i.e. attributes terminated by the
+ # same sequence).
+ #
+ def wrap_in_ansi_sequence(open, close)
+ if ANSI.disabled
+ self
+ else
+ gsub!(close, open)
+ insert(0, open).insert(-1, close)
+ end
+ end
+
+ # @return [StringEscaper]
+ #
+ # @param [Array] keys
+ # One or more keys corresponding to ANSI codes to apply to the
+ # string.
+ #
+ def apply(*keys)
+ keys.flatten.each do |key|
+ send(key)
+ end
+ self
+ end
+
+ ANSI::COLORS.each_key do |key|
+ # Defines a method returns a copy of the receiver wrapped in an ANSI
+ # sequence for each foreground color (e.g. #blue).
+ #
+ # The methods handle nesting of ANSI sequences.
+ #
+ define_method key do
+ open = Graphics.foreground_color(key)
+ close = ANSI::DEFAULT_FOREGROUND_COLOR
+ wrap_in_ansi_sequence(open, close)
+ end
+
+ # Defines a method returns a copy of the receiver wrapped in an ANSI
+ # sequence for each background color (e.g. #on_blue).
+ #
+ # The methods handle nesting of ANSI sequences.
+ #
+ define_method "on_#{key}" do
+ open = Graphics.background_color(key)
+ close = ANSI::DEFAULT_BACKGROUND_COLOR
+ wrap_in_ansi_sequence(open, close)
+ end
+ end
+
+ ANSI::TEXT_ATTRIBUTES.each_key do |key|
+ # Defines a method returns a copy of the receiver wrapped in an ANSI
+ # sequence for each text attribute (e.g. #bold).
+ #
+ # The methods handle nesting of ANSI sequences.
+ #
+ define_method key do
+ open = Graphics.text_attribute(key)
+ close_code = TEXT_DISABLE_ATTRIBUTES[key]
+ close = Graphics.graphics_mode(close_code)
+ wrap_in_ansi_sequence(open, close)
+ end
+ end
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/argument.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/argument.rb
new file mode 100644
index 0000000..4d54f29
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/argument.rb
@@ -0,0 +1,62 @@
+# encoding: utf-8
+
+module CLAide
+ # This class is used to represent individual arguments to present to
+ # the command help banner
+ #
+ class Argument
+ # The string used for ellipsis / repeatable arguments in the banner
+ #
+ ELLIPSIS = '...'
+
+ # @return [Array]
+ # List of alternate names for the parameters
+ attr_reader :names
+
+ # @return [Boolean]
+ # Indicates if the argument is required (not optional)
+ #
+ attr_accessor :required
+ alias_method :required?, :required
+
+ # @return [Boolean]
+ # Indicates if the argument is repeatable (= can appear multiple
+ # times in the command, which is indicated by '...' in the banner)
+ #
+ attr_accessor :repeatable
+ alias_method :repeatable?, :repeatable
+
+ # @param [String,Array] names
+ # List of the names of each parameter alternatives.
+ # For convenience, if there is only one alternative for that
+ # parameter, we can use a String instead of a 1-item Array
+ #
+ # @param [Boolean] required
+ # true if the parameter is required, false if it is optional
+ #
+ # @param [Boolean] repeatable
+ # If true, the argument can appear multiple times in the command.
+ # In that case, an ellipsis will be appended after the argument
+ # in the help banner.
+ #
+ # @example
+ #
+ # # A required parameter that can be either a NAME or URL
+ # Argument.new(%(NAME URL), true)
+ #
+ def initialize(names, required, repeatable = false)
+ @names = Array(names)
+ @required = required
+ @repeatable = repeatable
+ end
+
+ # @return [Boolean] true on equality
+ #
+ # @param [Argument] other the Argument compared against
+ #
+ def ==(other)
+ other.is_a?(Argument) &&
+ names == other.names && required == other.required
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/argv.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/argv.rb
new file mode 100644
index 0000000..ecadfaf
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/argv.rb
@@ -0,0 +1,329 @@
+# encoding: utf-8
+
+module CLAide
+ # This class is responsible for parsing the parameters specified by the user,
+ # accessing individual parameters, and keep state by removing handled
+ # parameters.
+ #
+ class ARGV
+ # @return [ARGV] Coerces an object to the ARGV class if needed.
+ #
+ # @param [Object] argv
+ # The object which should be converted to the ARGV class.
+ #
+ def self.coerce(argv)
+ if argv.is_a?(ARGV)
+ argv
+ else
+ ARGV.new(argv)
+ end
+ end
+
+ # @param [Array<#to_s>] argv
+ # A list of parameters.
+ #
+ def initialize(argv)
+ @entries = Parser.parse(argv)
+ end
+
+ # @return [Boolean] Whether or not there are any remaining unhandled
+ # parameters.
+ #
+ def empty?
+ @entries.empty?
+ end
+
+ # @return [Array] A list of the remaining unhandled parameters, in
+ # the same format a user specifies it in.
+ #
+ # @example
+ #
+ # argv = CLAide::ARGV.new(['tea', '--no-milk', '--sweetener=honey'])
+ # argv.shift_argument # => 'tea'
+ # argv.remainder # => ['--no-milk', '--sweetener=honey']
+ #
+ def remainder
+ @entries.map do |type, (key, value)|
+ case type
+ when :arg
+ key
+ when :flag
+ "--#{'no-' if value == false}#{key}"
+ when :option
+ "--#{key}=#{value}"
+ end
+ end
+ end
+
+ # @return [Array] A list of the remaining unhandled parameters, in
+ # the same format the user specified them.
+ #
+ # @example
+ #
+ # argv = CLAide::ARGV.new(['tea', '--no-milk', '--sweetener=honey'])
+ # argv.shift_argument # => 'tea'
+ # argv.remainder! # => ['--no-milk', '--sweetener=honey']
+ # argv.remainder # => []
+ #
+ def remainder!
+ remainder.tap { @entries.clear }
+ end
+
+ # @return [Hash] A hash that consists of the remaining flags and options
+ # and their values.
+ #
+ # @example
+ #
+ # argv = CLAide::ARGV.new(['tea', '--no-milk', '--sweetener=honey'])
+ # argv.options # => { 'milk' => false, 'sweetener' => 'honey' }
+ #
+ def options
+ options = {}
+ @entries.each do |type, (key, value)|
+ options[key] = value unless type == :arg
+ end
+ options
+ end
+
+ # @return [Array] A list of the remaining arguments.
+ #
+ # @example
+ #
+ # argv = CLAide::ARGV.new(['tea', 'white', '--no-milk', 'biscuit'])
+ # argv.shift_argument # => 'tea'
+ # argv.arguments # => ['white', 'biscuit']
+ #
+ def arguments
+ @entries.map { |type, value| value if type == :arg }.compact
+ end
+
+ # @return [Array] A list of the remaining arguments.
+ #
+ # @note This version also removes the arguments from the remaining
+ # parameters.
+ #
+ # @example
+ #
+ # argv = CLAide::ARGV.new(['tea', 'white', '--no-milk', 'biscuit'])
+ # argv.arguments # => ['tea', 'white', 'biscuit']
+ # argv.arguments! # => ['tea', 'white', 'biscuit']
+ # argv.arguments # => []
+ #
+ def arguments!
+ arguments = []
+ while arg = shift_argument
+ arguments << arg
+ end
+ arguments
+ end
+
+ # @return [String] The first argument in the remaining parameters.
+ #
+ # @note This will remove the argument from the remaining parameters.
+ #
+ # @example
+ #
+ # argv = CLAide::ARGV.new(['tea', 'white'])
+ # argv.shift_argument # => 'tea'
+ # argv.arguments # => ['white']
+ #
+ def shift_argument
+ if index = @entries.find_index { |type, _| type == :arg }
+ entry = @entries[index]
+ @entries.delete_at(index)
+ entry.last
+ end
+ end
+
+ # @return [Boolean, nil] Returns `true` if the flag by the specified `name`
+ # is among the remaining parameters and is not negated.
+ #
+ # @param [String] name
+ # The name of the flag to look for among the remaining parameters.
+ #
+ # @param [Boolean] default
+ # The value that is returned in case the flag is not among the
+ # remaining parameters.
+ #
+ # @note This will remove the flag from the remaining parameters.
+ #
+ # @example
+ #
+ # argv = CLAide::ARGV.new(['tea', '--no-milk', '--sweetener=honey'])
+ # argv.flag?('milk') # => false
+ # argv.flag?('milk') # => nil
+ # argv.flag?('milk', true) # => true
+ # argv.remainder # => ['tea', '--sweetener=honey']
+ #
+ def flag?(name, default = nil)
+ delete_entry(:flag, name, default, true)
+ end
+
+ # @return [String, nil] Returns the value of the option by the specified
+ # `name` is among the remaining parameters.
+ #
+ # @param [String] name
+ # The name of the option to look for among the remaining
+ # parameters.
+ #
+ # @param [String] default
+ # The value that is returned in case the option is not among the
+ # remaining parameters.
+ #
+ # @note This will remove the option from the remaining parameters.
+ #
+ # @example
+ #
+ # argv = CLAide::ARGV.new(['tea', '--no-milk', '--sweetener=honey'])
+ # argv.option('sweetener') # => 'honey'
+ # argv.option('sweetener') # => nil
+ # argv.option('sweetener', 'sugar') # => 'sugar'
+ # argv.remainder # => ['tea', '--no-milk']
+ #
+ def option(name, default = nil)
+ delete_entry(:option, name, default)
+ end
+
+ # @return [Array] Returns an array of all the values of the option
+ # with the specified `name` among the remaining
+ # parameters.
+ #
+ # @param [String] name
+ # The name of the option to look for among the remaining
+ # parameters.
+ #
+ # @note This will remove the option from the remaining parameters.
+ #
+ # @example
+ #
+ # argv = CLAide::ARGV.new(['--ignore=foo', '--ignore=bar'])
+ # argv.all_options('include') # => []
+ # argv.all_options('ignore') # => ['bar', 'foo']
+ # argv.remainder # => []
+ #
+ def all_options(name)
+ options = []
+ while entry = option(name)
+ options << entry
+ end
+ options
+ end
+
+ private
+
+ # @return [Array>] A list of tuples for each
+ # non consumed parameter, where the first entry is the `type` and
+ # the second entry the actual parsed parameter.
+ #
+ attr_reader :entries
+
+ # @return [Bool, String, Nil] Removes an entry from the entries list and
+ # returns its value or the default value if the entry was not
+ # present.
+ #
+ # @param [Symbol] requested_type
+ # The type of the entry.
+ #
+ # @param [String] requested_key
+ # The key of the entry.
+ #
+ # @param [Bool, String, Nil] default
+ # The value which should be returned if the entry is not present.
+ #
+ # @param [Bool] delete_all
+ # Whether all values matching `requested_type` and `requested_key`
+ # should be deleted.
+ #
+ def delete_entry(requested_type, requested_key, default, delete_all = false)
+ pred = proc do |type, (key, _value)|
+ requested_key == key && requested_type == type
+ end
+ entry = entries.reverse_each.find(&pred)
+ delete_all ? entries.delete_if(&pred) : entries.delete(entry)
+
+ entry.nil? ? default : entry.last.last
+ end
+
+ module Parser
+ # @return [Array>] A list of tuples for each
+ # parameter, where the first entry is the `type` and the second
+ # entry the actual parsed parameter.
+ #
+ # @example
+ #
+ # list = parse(['tea', '--no-milk', '--sweetener=honey'])
+ # list # => [[:arg, "tea"],
+ # [:flag, ["milk", false]],
+ # [:option, ["sweetener", "honey"]]]
+ #
+ def self.parse(argv)
+ entries = []
+ copy = argv.map(&:to_s)
+ double_dash = false
+ while argument = copy.shift
+ next if !double_dash && double_dash = (argument == '--')
+ type = double_dash ? :arg : argument_type(argument)
+ parsed_argument = parse_argument(type, argument)
+ entries << [type, parsed_argument]
+ end
+ entries
+ end
+
+ # @return [Symbol] Returns the type of an argument. The types can be
+ # either: `:arg`, `:flag`, `:option`.
+ #
+ # @param [String] argument
+ # The argument to check.
+ #
+ def self.argument_type(argument)
+ if argument.start_with?('--')
+ if argument.include?('=')
+ :option
+ else
+ :flag
+ end
+ else
+ :arg
+ end
+ end
+
+ # @return [String, Array] Returns the argument itself for
+ # normal arguments (like commands) and a tuple with the key and
+ # the value for options and flags.
+ #
+ # @param [Symbol] type
+ # The type of the argument.
+ #
+ # @param [String] argument
+ # The argument to check.
+ #
+ def self.parse_argument(type, argument)
+ case type
+ when :arg
+ return argument
+ when :flag
+ return parse_flag(argument)
+ when :option
+ return argument[2..-1].split('=', 2)
+ end
+ end
+
+ # @return [String, Array] Returns the parameter
+ # describing a flag arguments.
+ #
+ # @param [String] argument
+ # The flag argument to check.
+ #
+ def self.parse_flag(argument)
+ if argument.start_with?('--no-')
+ key = argument[5..-1]
+ value = false
+ else
+ key = argument[2..-1]
+ value = true
+ end
+ [key, value]
+ end
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command.rb
new file mode 100644
index 0000000..6414b5c
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command.rb
@@ -0,0 +1,669 @@
+# encoding: utf-8
+
+require 'claide/command/banner'
+require 'claide/command/plugin_manager'
+require 'claide/command/argument_suggester'
+
+module CLAide
+ # This class is used to build a command-line interface
+ #
+ # Each command is represented by a subclass of this class, which may be
+ # nested to create more granular commands.
+ #
+ # Following is an overview of the types of commands and what they should do.
+ #
+ # ### Any command type
+ #
+ # * Inherit from the command class under which the command should be nested.
+ # * Set {Command.summary} to a brief description of the command.
+ # * Override {Command.options} to return the options it handles and their
+ # descriptions and prepending them to the results of calling `super`.
+ # * Override {Command#initialize} if it handles any parameters.
+ # * Override {Command#validate!} to check if the required parameters the
+ # command handles are valid, or call {Command#help!} in case they’re not.
+ #
+ # ### Abstract command
+ #
+ # The following is needed for an abstract command:
+ #
+ # * Set {Command.abstract_command} to `true`.
+ # * Subclass the command.
+ #
+ # When the optional {Command.description} is specified, it will be shown at
+ # the top of the command’s help banner.
+ #
+ # ### Normal command
+ #
+ # The following is needed for a normal command:
+ #
+ # * Set {Command.arguments} to the description of the arguments this command
+ # handles.
+ # * Override {Command#run} to perform the actual work.
+ #
+ # When the optional {Command.description} is specified, it will be shown
+ # underneath the usage section of the command’s help banner. Otherwise this
+ # defaults to {Command.summary}.
+ #
+ class Command
+ class << self
+ # @return [Boolean] Indicates whether or not this command can actually
+ # perform work of itself, or that it only contains subcommands.
+ #
+ attr_accessor :abstract_command
+ alias_method :abstract_command?, :abstract_command
+
+ # @return [Boolean] Indicates whether or not this command is used during
+ # command parsing and whether or not it should be shown in the
+ # help banner or to show its subcommands instead.
+ #
+ # Setting this to `true` implies it’s an abstract command.
+ #
+ attr_reader :ignore_in_command_lookup
+ alias_method :ignore_in_command_lookup?, :ignore_in_command_lookup
+ def ignore_in_command_lookup=(flag)
+ @ignore_in_command_lookup = self.abstract_command = flag
+ end
+
+ # @return [String] The subcommand which an abstract command should invoke
+ # by default.
+ #
+ attr_accessor :default_subcommand
+
+ # @return [String] A brief description of the command, which is shown
+ # next to the command in the help banner of a parent command.
+ #
+ attr_accessor :summary
+
+ # @return [String] A longer description of the command, which is shown
+ # underneath the usage section of the command’s help banner. Any
+ # indentation in this value will be ignored.
+ #
+ attr_accessor :description
+
+ # @return [Array] The prefixes used to search for CLAide plugins.
+ # Plugins are loaded via their `_plugin.rb` file.
+ # Defaults to search for `claide` plugins.
+ #
+ def plugin_prefixes
+ @plugin_prefixes ||= ['claide']
+ end
+ attr_writer :plugin_prefixes
+
+ # @return [Array]
+ # A list of arguments the command handles. This is shown
+ # in the usage section of the command’s help banner.
+ # Each Argument in the array represents an argument by its name
+ # (or list of alternatives) and whether it's required or optional
+ #
+ def arguments
+ @arguments ||= []
+ end
+
+ # @param [Array] arguments
+ # An array listing the command arguments.
+ # Each Argument object describe the argument by its name
+ # (or list of alternatives) and whether it's required or optional
+ #
+ # @todo Remove deprecation
+ #
+ def arguments=(arguments)
+ if arguments.is_a?(Array)
+ if arguments.empty? || arguments[0].is_a?(Argument)
+ @arguments = arguments
+ else
+ self.arguments_array = arguments
+ end
+ else
+ self.arguments_string = arguments
+ end
+ end
+
+ # @return [Boolean] The default value for {Command#ansi_output}. This
+ # defaults to `true` if `STDOUT` is connected to a TTY and
+ # `String` has the instance methods `#red`, `#green`, and
+ # `#yellow` (which are defined by, for instance, the
+ # [colored](https://github.com/defunkt/colored) gem).
+ #
+ def ansi_output
+ if @ansi_output.nil?
+ @ansi_output = STDOUT.tty?
+ end
+ @ansi_output
+ end
+ attr_writer :ansi_output
+ alias_method :ansi_output?, :ansi_output
+
+ # @return [String] The name of the command. Defaults to a snake-cased
+ # version of the class’ name.
+ #
+ def command
+ @command ||= name.split('::').last.gsub(/[A-Z]+[a-z]*/) do |part|
+ part.downcase << '-'
+ end[0..-2]
+ end
+ attr_writer :command
+
+ # @return [String] The version of the command. This value will be printed
+ # by the `--version` flag if used for the root command.
+ #
+ attr_accessor :version
+ end
+
+ #-------------------------------------------------------------------------#
+
+ # @return [String] The full command up-to this command, as it would be
+ # looked up during parsing.
+ #
+ # @note (see #ignore_in_command_lookup)
+ #
+ # @example
+ #
+ # BevarageMaker::Tea.full_command # => "beverage-maker tea"
+ #
+ def self.full_command
+ if superclass == Command
+ ignore_in_command_lookup? ? '' : command
+ else
+ if ignore_in_command_lookup?
+ superclass.full_command
+ else
+ "#{superclass.full_command} #{command}"
+ end
+ end
+ end
+
+ # @return [Bool] Whether this is the root command class
+ #
+ def self.root_command?
+ superclass == CLAide::Command
+ end
+
+ # @return [Array] A list of all command classes that are nested
+ # under this command.
+ #
+ def self.subcommands
+ @subcommands ||= []
+ end
+
+ # @return [Array] A list of command classes that are nested under
+ # this command _or_ the subcommands of those command classes in
+ # case the command class should be ignored in command lookup.
+ #
+ def self.subcommands_for_command_lookup
+ subcommands.map do |subcommand|
+ if subcommand.ignore_in_command_lookup?
+ subcommand.subcommands_for_command_lookup
+ else
+ subcommand
+ end
+ end.flatten
+ end
+
+ # Searches the list of subcommands that should not be ignored for command
+ # lookup for a subcommand with the given `name`.
+ #
+ # @param [String] name
+ # The name of the subcommand to be found.
+ #
+ # @return [CLAide::Command, nil] The subcommand, if found.
+ #
+ def self.find_subcommand(name)
+ subcommands_for_command_lookup.find { |sc| sc.command == name }
+ end
+
+ # @visibility private
+ #
+ # Automatically registers a subclass as a subcommand.
+ #
+ def self.inherited(subcommand)
+ subcommands << subcommand
+ end
+
+ DEFAULT_ROOT_OPTIONS = [
+ ['--version', 'Show the version of the tool'],
+ ]
+
+ DEFAULT_OPTIONS = [
+ ['--verbose', 'Show more debugging information'],
+ ['--no-ansi', 'Show output without ANSI codes'],
+ ['--help', 'Show help banner of specified command'],
+ ]
+
+ # Should be overridden by a subclass if it handles any options.
+ #
+ # The subclass has to combine the result of calling `super` and its own
+ # list of options. The recommended way of doing this is by concatenating
+ # to this classes’ own options.
+ #
+ # @return [Array]
+ #
+ # A list of option name and description tuples.
+ #
+ # @example
+ #
+ # def self.options
+ # [
+ # ['--verbose', 'Print more info'],
+ # ['--help', 'Print help banner'],
+ # ].concat(super)
+ # end
+ #
+ def self.options
+ if root_command?
+ DEFAULT_ROOT_OPTIONS + DEFAULT_OPTIONS
+ else
+ DEFAULT_OPTIONS
+ end
+ end
+
+ # Adds a new option for the current command.
+ #
+ # This method can be used in conjunction with overriding `options`.
+ #
+ # @return [void]
+ #
+ # @example
+ #
+ # option '--help', 'Print help banner '
+ #
+ def self.option(name, description)
+ mod = Module.new do
+ define_method(:options) do
+ [
+ [name, description],
+ ].concat(super())
+ end
+ end
+ extend(mod)
+ end
+ private_class_method :option
+
+ # Handles root commands options if appropriate.
+ #
+ # @param [ARGV] argv
+ # The parameters of the command.
+ #
+ # @return [Bool] Whether any root command option was handled.
+ #
+ def handle_root_options(argv)
+ return false unless self.class.root_command?
+ if argv.flag?('version')
+ print_version
+ return true
+ end
+ false
+ end
+
+ # Prints the version of the command optionally including plugins.
+ #
+ def print_version
+ puts self.class.version
+ if verbose?
+ PluginManager.specifications.each do |spec|
+ puts "#{spec.name}: #{spec.version}"
+ end
+ end
+ end
+
+ # Instantiates the command class matching the parameters through
+ # {Command.parse}, validates it through {Command#validate!}, and runs it
+ # through {Command#run}.
+ #
+ # @note The ANSI support is configured before running a command to allow
+ # the same process to run multiple commands with different
+ # settings. For example a process with ANSI output enabled might
+ # want to programmatically invoke another command with the output
+ # enabled.
+ #
+ # @param [Array, ARGV] argv
+ # A list of parameters. For instance, the standard `ARGV` constant,
+ # which contains the parameters passed to the program.
+ #
+ # @return [void]
+ #
+ def self.run(argv = [])
+ plugin_prefixes.each do |plugin_prefix|
+ PluginManager.load_plugins(plugin_prefix)
+ end
+
+ argv = ARGV.coerce(argv)
+ command = parse(argv)
+ ANSI.disabled = !command.ansi_output?
+ unless command.handle_root_options(argv)
+ command.validate!
+ command.run
+ end
+ rescue Object => exception
+ handle_exception(command, exception)
+ end
+
+ # @param [Array, ARGV] argv
+ # A list of (remaining) parameters.
+ #
+ # @return [Command] An instance of the command class that was matched by
+ # going through the arguments in the parameters and drilling down
+ # command classes.
+ #
+ def self.parse(argv)
+ argv = ARGV.coerce(argv)
+ cmd = argv.arguments.first
+ if cmd && subcommand = find_subcommand(cmd)
+ argv.shift_argument
+ subcommand.parse(argv)
+ elsif abstract_command? && default_subcommand
+ load_default_subcommand(argv)
+ else
+ new(argv)
+ end
+ end
+
+ # @param [Array, ARGV] argv
+ # A list of (remaining) parameters.
+ #
+ # @return [Command] Returns the default subcommand initialized with the
+ # given arguments.
+ #
+ def self.load_default_subcommand(argv)
+ unless subcommand = find_subcommand(default_subcommand)
+ raise 'Unable to find the default subcommand ' \
+ "`#{default_subcommand}` for command `#{self}`."
+ end
+ result = subcommand.parse(argv)
+ result.invoked_as_default = true
+ result
+ end
+
+ # Presents an exception to the user in a short manner in case of an
+ # `InformativeError` or in long form in other cases,
+ #
+ # @param [Command, nil] command
+ # The command from where the exception originated.
+ #
+ # @param [Object] exception
+ # The exception to present.
+ #
+ # @return [void]
+ #
+ def self.handle_exception(command, exception)
+ if exception.is_a?(InformativeError)
+ puts exception.message
+ if command.nil? || command.verbose?
+ puts
+ puts(*exception.backtrace)
+ end
+ exit exception.exit_status
+ else
+ report_error(exception)
+ end
+ end
+
+ # Allows the application to perform custom error reporting, by overriding
+ # this method.
+ #
+ # @param [Exception] exception
+ #
+ # An exception that occurred while running a command through
+ # {Command.run}.
+ #
+ # @raise
+ #
+ # By default re-raises the specified exception.
+ #
+ # @return [void]
+ #
+ def self.report_error(exception)
+ plugins = PluginManager.plugins_involved_in_exception(exception)
+ unless plugins.empty?
+ puts '[!] The exception involves the following plugins:' \
+ "\n - #{plugins.join("\n - ")}\n".ansi.yellow
+ end
+ raise exception
+ end
+
+ # @visibility private
+ #
+ # @param [String] error_message
+ # The error message to show to the user.
+ #
+ # @param [Class] help_class
+ # The class to use to raise a ‘help’ error.
+ #
+ # @raise [Help]
+ #
+ # Signals CLAide that a help banner for this command should be shown,
+ # with an optional error message.
+ #
+ # @return [void]
+ #
+ def self.help!(error_message = nil, help_class = Help)
+ raise help_class.new(banner, error_message)
+ end
+
+ # @visibility private
+ #
+ # Returns the banner for the command.
+ #
+ # @param [Class] banner_class
+ # The class to use to format help banners.
+ #
+ # @return [String] The banner for the command.
+ #
+ def self.banner(banner_class = Banner)
+ banner_class.new(self).formatted_banner
+ end
+
+ # @visibility private
+ #
+ # Print banner and exit
+ #
+ # @note Calling this method exits the current process.
+ #
+ # @return [void]
+ #
+ def self.banner!
+ puts banner
+ exit 0
+ end
+
+ #-------------------------------------------------------------------------#
+
+ # Set to `true` if the user specifies the `--verbose` option.
+ #
+ # @note
+ #
+ # If you want to make use of this value for your own configuration, you
+ # should check the value _after_ calling the `super` {Command#initialize}
+ # implementation.
+ #
+ # @return [Boolean]
+ #
+ # Wether or not backtraces should be included when presenting the user an
+ # exception that includes the {InformativeError} module.
+ #
+ attr_accessor :verbose
+ alias_method :verbose?, :verbose
+
+ # Set to `true` if {Command.ansi_output} returns `true` and the user
+ # did **not** specify the `--no-ansi` option.
+ #
+ # @note (see #verbose)
+ #
+ # @return [Boolean]
+ #
+ # Whether or not to use ANSI codes to prettify output. For instance, by
+ # default {InformativeError} exception messages will be colored red and
+ # subcommands in help banners green.
+ #
+ attr_accessor :ansi_output
+ alias_method :ansi_output?, :ansi_output
+
+ # Set to `true` if initialized with a `--help` flag
+ #
+ # @return [Boolean]
+ #
+ # Whether the command was initialized with argv containing --help
+ #
+ attr_accessor :help_arg
+ alias_method :help?, :help_arg
+
+ # Subclasses should override this method to remove the arguments/options
+ # they support from `argv` _before_ calling `super`.
+ #
+ # The `super` implementation sets the {#verbose} attribute based on whether
+ # or not the `--verbose` option is specified; and the {#ansi_output}
+ # attribute to `false` if {Command.ansi_output} returns `true`, but the
+ # user specified the `--no-ansi` option.
+ #
+ # @param [ARGV, Array] argv
+ #
+ # A list of (user-supplied) params that should be handled.
+ #
+ def initialize(argv)
+ argv = ARGV.coerce(argv)
+ @verbose = argv.flag?('verbose')
+ @ansi_output = argv.flag?('ansi', Command.ansi_output?)
+ @argv = argv
+ @help_arg = argv.flag?('help')
+ end
+
+ # Convenience method.
+ # Instantiate the command and run it with the provided arguments at once.
+ #
+ # @note This method validate! the command before running it, but contrary to
+ # CLAide::Command::run, it does not load plugins nor exit on failure.
+ # It is up to the caller to rescue any possible exception raised.
+ #
+ # @param [String..., Array] args
+ # The arguments to initialize the command with
+ #
+ # @raise [Help] If validate! fails
+ #
+ def self.invoke(*args)
+ command = new(ARGV.new(args.flatten))
+ command.validate!
+ command.run
+ end
+
+ # @return [Bool] Whether the command was invoked by an abstract command by
+ # default.
+ #
+ attr_accessor :invoked_as_default
+ alias_method :invoked_as_default?, :invoked_as_default
+
+ # Raises a Help exception if the `--help` option is specified, if `argv`
+ # still contains remaining arguments/options by the time it reaches this
+ # implementation, or when called on an ‘abstract command’.
+ #
+ # Subclasses should call `super` _before_ doing their own validation. This
+ # way when the user specifies the `--help` flag a help banner is shown,
+ # instead of possible actual validation errors.
+ #
+ # @raise [Help]
+ #
+ # @return [void]
+ #
+ def validate!
+ banner! if help?
+ unless @argv.empty?
+ argument = @argv.remainder.first
+ help! ArgumentSuggester.new(argument, self.class).suggestion
+ end
+ help! if self.class.abstract_command?
+ end
+
+ # This method should be overridden by the command class to perform its
+ # work.
+ #
+ # @return [void]
+ #
+ def run
+ raise 'A subclass should override the `CLAide::Command#run` method to ' \
+ 'actually perform some work.'
+ end
+
+ protected
+
+ # Returns the class of the invoked command
+ #
+ # @return [Command]
+ #
+ def invoked_command_class
+ if invoked_as_default?
+ self.class.superclass
+ else
+ self.class
+ end
+ end
+
+ # @param [String] error_message
+ # A custom optional error message
+ #
+ # @raise [Help]
+ #
+ # Signals CLAide that a help banner for this command should be shown,
+ # with an optional error message.
+ #
+ # @return [void]
+ #
+ def help!(error_message = nil)
+ invoked_command_class.help!(error_message)
+ end
+
+ # Print banner and exit
+ #
+ # @note Calling this method exits the current process.
+ #
+ # @return [void]
+ #
+ def banner!
+ invoked_command_class.banner!
+ end
+
+ #-------------------------------------------------------------------------#
+
+ # Handle deprecated form of self.arguments as an
+ # Array> like in:
+ #
+ # self.arguments = [ ['NAME', :required], ['QUERY', :optional] ]
+ #
+ # @todo Remove deprecated format support
+ #
+ def self.arguments_array=(arguments)
+ warn '[!] The signature of CLAide#arguments has changed. ' \
+ "Use CLAide::Argument (#{self}: `#{arguments}`)".ansi.yellow
+ @arguments = arguments.map do |(name_str, type)|
+ names = name_str.split('|')
+ required = (type == :required)
+ Argument.new(names, required)
+ end
+ end
+
+ # Handle deprecated form of self.arguments as a String, like in:
+ #
+ # self.arguments = 'NAME [QUERY]'
+ #
+ # @todo Remove deprecated format support
+ #
+ def self.arguments_string=(arguments)
+ warn '[!] The specification of arguments as a string has been' \
+ " deprecated #{self}: `#{arguments}`".ansi.yellow
+ @arguments = arguments.split(' ').map do |argument|
+ if argument.start_with?('[')
+ Argument.new(argument.sub(/\[(.*)\]/, '\1').split('|'), false)
+ else
+ Argument.new(argument.split('|'), true)
+ end
+ end
+ end
+
+ # Handle depracted form of assigning a plugin prefix.
+ #
+ # @todo Remove deprecated form.
+ #
+ def self.plugin_prefix=(prefix)
+ warn '[!] The specification of a singular plugin prefix has been ' \
+ "deprecated. Use `#{self}::plugin_prefixes` instead."
+ plugin_prefixes << prefix
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command/argument_suggester.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command/argument_suggester.rb
new file mode 100644
index 0000000..a13575c
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command/argument_suggester.rb
@@ -0,0 +1,99 @@
+# encoding: utf-8
+
+module CLAide
+ class Command
+ class ArgumentSuggester
+ # @param [String] argument
+ # The unrecognized argument for which to make a suggestion.
+ #
+ # @param [Class] command_class
+ # The class of the command which encountered the unrecognized
+ # arguments.
+ #
+ def initialize(argument, command_class)
+ @argument, @command_class = argument, command_class
+ @argument_type = ARGV::Parser.argument_type(@argument)
+ end
+
+ # @return [Array] The list of the valid arguments for a command
+ # according to the type of the argument.
+ #
+ def possibilities
+ case @argument_type
+ when :option, :flag
+ @command_class.options.map(&:first)
+ when :arg
+ @command_class.subcommands_for_command_lookup.map(&:command)
+ end
+ end
+
+ # @return [String] Returns a suggested argument from `possibilities` based
+ # on the `levenshtein_distance` score.
+ #
+ def suggested_argument
+ possibilities.sort_by do |element|
+ self.class.levenshtein_distance(@argument, element)
+ end.first
+ end
+
+ # @return [String] Returns a message including a suggestion for the given
+ # suggestion.
+ #
+ def suggestion
+ argument_description = @argument_type == :arg ? 'command' : 'option'
+ if suggestion = suggested_argument
+ pretty_suggestion = self.class.prettify_suggestion(suggestion,
+ @argument_type)
+ "Unknown #{argument_description}: `#{@argument}`\n" \
+ "Did you mean: #{pretty_suggestion}?"
+ else
+ "Unknown #{argument_description}: `#{@argument}`"
+ end
+ end
+
+ # Prettifies the given validation suggestion according to the type.
+ #
+ # @param [String] suggestion
+ # The suggestion to prettify.
+ #
+ # @param [Type] argument_type
+ # The type of the suggestion: either `:command` or `:option`.
+ #
+ # @return [String] A handsome suggestion.
+ #
+ def self.prettify_suggestion(suggestion, argument_type)
+ case argument_type
+ when :option, :flag
+ suggestion = suggestion.to_s
+ suggestion.ansi.blue
+ when :arg
+ suggestion.ansi.green
+ end
+ end
+
+ # Returns the Levenshtein distance between the given strings.
+ # From: http://rosettacode.org/wiki/Levenshtein_distance#Ruby
+ #
+ # @param [String] a
+ # The first string to compare.
+ #
+ # @param [String] b
+ # The second string to compare.
+ #
+ # @return [Fixnum] The distance between the strings.
+ def self.levenshtein_distance(a, b)
+ a, b = a.downcase, b.downcase
+ costs = Array(0..b.length)
+ (1..a.length).each do |i|
+ costs[0], nw = i, i - 1
+ (1..b.length).each do |j|
+ costs[j], nw = [
+ costs[j] + 1, costs[j - 1] + 1, a[i - 1] == b[j - 1] ? nw : nw + 1
+ ].min, costs[j]
+ end
+ end
+ costs[b.length]
+ end
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command/banner.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command/banner.rb
new file mode 100644
index 0000000..d87c699
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command/banner.rb
@@ -0,0 +1,307 @@
+# encoding: utf-8
+
+module CLAide
+ class Command
+ # Creates the formatted banner to present as help of the provided command
+ # class.
+ #
+ class Banner
+ # @return [Class] The command for which the banner should be created.
+ #
+ attr_accessor :command
+
+ # @param [Class] command @see command
+ #
+ def initialize(command)
+ @command = command
+ end
+
+ # @return [String] The banner for the command.
+ #
+ def formatted_banner
+ sections = [
+ ['Usage', formatted_usage_description],
+ ['Commands', formatted_subcommand_summaries],
+ ['Options', formatted_options_description],
+ ]
+ banner = sections.map do |(title, body)|
+ [prettify_title("#{title}:"), body] unless body.empty?
+ end.compact.join("\n\n")
+ banner
+ end
+
+ private
+
+ # @!group Banner sections
+ #-----------------------------------------------------------------------#
+
+ # @return [String] The indentation of the text.
+ #
+ TEXT_INDENT = 6
+
+ # @return [Fixnum] The maximum width of the text.
+ #
+ MAX_WIDTH = TEXT_INDENT + 80
+
+ # @return [Fixnum] The minimum between a name and its description.
+ #
+ DESCRIPTION_SPACES = 3
+
+ # @return [Fixnum] The minimum between a name and its description.
+ #
+ SUBCOMMAND_BULLET_SIZE = 2
+
+ # @return [String] The section describing the usage of the command.
+ #
+ def formatted_usage_description
+ message = command.description || command.summary || ''
+ message = TextWrapper.wrap_formatted_text(message,
+ TEXT_INDENT,
+ MAX_WIDTH)
+ message = prettify_message(command, message)
+ "#{signature}\n\n#{message}"
+ end
+
+ # @return [String] The signature of the command.
+ #
+ def signature
+ full_command = command.full_command
+ sub_command = signature_sub_command
+ arguments = signature_arguments
+ result = prettify_signature(full_command, sub_command, arguments)
+ result.insert(0, '$ ')
+ result.insert(0, ' ' * (TEXT_INDENT - '$ '.size))
+ end
+
+ # @return [String] The subcommand indicator of the signature.
+ #
+ def signature_sub_command
+ return '[COMMAND]' if command.default_subcommand
+ return 'COMMAND' if command.subcommands.any?
+ end
+
+ # @return [String] The arguments of the signature.
+ #
+ def signature_arguments
+ command.arguments.map do |arg|
+ names = arg.names.join('|')
+ names.concat(' ' + Argument::ELLIPSIS) if arg.repeatable?
+ arg.required? ? names : "[#{names}]"
+ end.join(' ')
+ end
+
+ # @return [String] The section describing the subcommands of the command.
+ #
+ # @note The plus sign emphasizes the that the subcommands are added to
+ # the command. The square brackets conveys a sense of direction
+ # and indicates the gravitational force towards the default
+ # command.
+ #
+ def formatted_subcommand_summaries
+ subcommands = subcommands_for_banner
+ subcommands.map do |subcommand|
+ name = subcommand.command
+ bullet = (name == command.default_subcommand) ? '>' : '+'
+ name = "#{bullet} #{name}"
+ pretty_name = prettify_subcommand(name)
+ entry_description(pretty_name, subcommand.summary, name.size)
+ end.join("\n")
+ end
+
+ # @return [String] The section describing the options of the command.
+ #
+ def formatted_options_description
+ options = command.options
+ options.map do |name, description|
+ pretty_name = prettify_option_name(name)
+ entry_description(pretty_name, description, name.size)
+ end.join("\n")
+ end
+
+ # @return [String] The line describing a single entry (subcommand or
+ # option).
+ #
+ def entry_description(name, description, name_width)
+ max_name_width = compute_max_name_width
+ desc_start = max_name_width + (TEXT_INDENT - 2) + DESCRIPTION_SPACES
+ result = ' ' * (TEXT_INDENT - 2)
+ result << name
+ result << ' ' * DESCRIPTION_SPACES
+ result << ' ' * (max_name_width - name_width)
+ result << TextWrapper.wrap_with_indent(description,
+ desc_start,
+ MAX_WIDTH)
+ end
+
+ # @!group Overrides
+ #-----------------------------------------------------------------------#
+
+ # @return [String] A decorated title.
+ #
+ def prettify_title(title)
+ title.ansi.underline
+ end
+
+ # @return [String] A decorated textual representation of the subcommand
+ # name.
+ #
+ def prettify_subcommand(name)
+ name.chomp.ansi.green
+ end
+
+ # @return [String] A decorated textual representation of the option name.
+ #
+ #
+ def prettify_option_name(name)
+ name.chomp.ansi.blue
+ end
+
+ # @return [String] A decorated textual representation of the command.
+ #
+ def prettify_signature(command, subcommand, argument)
+ components = [
+ [command, :green],
+ [subcommand, :green],
+ [argument, :magenta],
+ ]
+ components.reduce('') do |memo, (string, ansi_key)|
+ next memo if !string || string.empty?
+ memo << ' ' << string.ansi.apply(ansi_key)
+ end.lstrip
+ end
+
+ # @return [String] A decorated command description.
+ #
+ def prettify_message(command, message)
+ message = message.dup
+ command.arguments.each do |arg|
+ arg.names.each do |name|
+ message.gsub!("`#{name.gsub(/\.{3}$/, '')}`", '\0'.ansi.magenta)
+ end
+ end
+ command.options.each do |(name, _description)|
+ message.gsub!("`#{name}`", '\0'.ansi.blue)
+ end
+ message
+ end
+
+ # @!group Private helpers
+ #-----------------------------------------------------------------------#
+
+ # @return [Array] The list of the subcommands to use in the
+ # banner.
+ #
+ def subcommands_for_banner
+ command.subcommands_for_command_lookup.reject do |subcommand|
+ subcommand.summary.nil?
+ end.sort_by(&:command)
+ end
+
+ # @return [Fixnum] The width of the largest command name or of the
+ # largest option name. Used to align all the descriptions.
+ #
+ def compute_max_name_width
+ widths = []
+ widths << command.options.map { |option| option.first.size }
+ widths << subcommands_for_banner.map do |cmd|
+ cmd.command.size + SUBCOMMAND_BULLET_SIZE
+ end.max
+ widths.flatten.compact.max || 1
+ end
+
+ module TextWrapper
+ # @return [String] Wraps a formatted string (e.g. markdown) by stripping
+ # heredoc indentation and wrapping by word to the terminal width
+ # taking into account a maximum one, and indenting the string.
+ # Code lines (i.e. indented by four spaces) are not wrapped.
+ #
+ # @param [String] string
+ # The string to format.
+ #
+ # @param [Fixnum] indent
+ # The number of spaces to insert before the string.
+ #
+ # @param [Fixnum] max_width
+ # The maximum width to use to format the string if the terminal
+ # is too wide.
+ #
+ def self.wrap_formatted_text(string, indent = 0, max_width = 80)
+ paragraphs = strip_heredoc(string).split("\n\n")
+ paragraphs = paragraphs.map do |paragraph|
+ if paragraph.start_with?(' ' * 4)
+ paragraph.gsub!(/\n/, "\n#{' ' * indent}")
+ else
+ paragraph = wrap_with_indent(paragraph, indent, max_width)
+ end
+ paragraph.insert(0, ' ' * indent).rstrip
+ end
+ paragraphs.join("\n\n")
+ end
+
+ # @return [String] Wraps a string to the terminal width taking into
+ # account the given indentation.
+ #
+ # @param [String] string
+ # The string to indent.
+ #
+ # @param [Fixnum] indent
+ # The number of spaces to insert before the string.
+ #
+ # @param [Fixnum] max_width
+ # The maximum width to use to format the string if the terminal
+ # is too wide.
+ #
+ def self.wrap_with_indent(string, indent = 0, max_width = 80)
+ if terminal_width == 0
+ width = max_width
+ else
+ width = [terminal_width, max_width].min
+ end
+
+ full_line = string.gsub("\n", ' ')
+ available_width = width - indent
+ space = ' ' * indent
+ word_wrap(full_line, available_width).split("\n").join("\n#{space}")
+ end
+
+ # @return [String] Lifted straight from ActionView. Thanks guys!
+ #
+ def self.word_wrap(line, line_width)
+ line.gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip
+ end
+
+ # @return [String] Lifted straight from ActiveSupport. Thanks guys!
+ #
+ def self.strip_heredoc(string)
+ if min = string.scan(/^[ \t]*(?=\S)/).min
+ string.gsub(/^[ \t]{#{min.size}}/, '')
+ else
+ string
+ end
+ end
+
+ # @!group Private helpers
+ #---------------------------------------------------------------------#
+
+ # @return [Fixnum] The width of the current terminal unless being piped.
+ #
+ def self.terminal_width
+ @terminal_width ||=
+ (!ENV['CLAIDE_DISABLE_AUTO_WRAP'] &&
+ STDOUT.tty? &&
+ calculate_terminal_width) || 0
+ end
+
+ def self.calculate_terminal_width
+ require 'io/console'
+ STDOUT.winsize.last
+ rescue LoadError
+ (system('which tput > /dev/null 2>&1') && `tput cols`.to_i) || 0
+ rescue
+ 0
+ end
+ private_class_method :calculate_terminal_width
+ end
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command/plugin_manager.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command/plugin_manager.rb
new file mode 100644
index 0000000..184a5ea
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command/plugin_manager.rb
@@ -0,0 +1,124 @@
+# encoding: utf-8
+
+module CLAide
+ class Command
+ # Handles plugin related logic logic for the `Command` class.
+ #
+ # Plugins are loaded the first time a command run and are identified by the
+ # prefix specified in the command class. Plugins must adopt the following
+ # conventions:
+ #
+ # - Support being loaded by a file located under the
+ # `lib/#{plugin_prefix}_plugin` relative path.
+ # - Be stored in a folder named after the plugin.
+ #
+ class PluginManager
+ # @return [Hash] The loaded plugins,
+ # grouped by plugin prefix.
+ #
+ def self.loaded_plugins
+ @loaded_plugins ||= {}
+ end
+
+ # @return [Array] Loads plugins via RubyGems looking
+ # for files named after the `PLUGIN_PREFIX_plugin` and returns the
+ # specifications of the gems loaded successfully.
+ # Plugins are required safely.
+ #
+ def self.load_plugins(plugin_prefix)
+ loaded_plugins[plugin_prefix] ||=
+ plugin_gems_for_prefix(plugin_prefix).map do |spec, paths|
+ spec if safe_require(paths)
+ end.compact
+ end
+
+ # @return [Array] The RubyGems specifications for the
+ # loaded plugins.
+ #
+ def self.specifications
+ loaded_plugins.values.flatten.uniq
+ end
+
+ # @return [Array] The RubyGems specifications for the
+ # installed plugins that match the given `plugin_prefix`.
+ #
+ def self.installed_specifications_for_prefix(plugin_prefix)
+ loaded_plugins[plugin_prefix] ||
+ plugin_gems_for_prefix(plugin_prefix).map(&:first)
+ end
+
+ # @return [Array] The list of the plugins whose root path appears
+ # in the backtrace of an exception.
+ #
+ # @param [Exception] exception
+ # The exception to analyze.
+ #
+ def self.plugins_involved_in_exception(exception)
+ specifications.select do |gemspec|
+ exception.backtrace.any? do |line|
+ full_require_paths_for(gemspec).any? do |plugin_path|
+ line.include?(plugin_path)
+ end
+ end
+ end.map(&:name)
+ end
+
+ # @group Helper Methods
+
+ # @return [Array<[Gem::Specification, Array]>]
+ # Returns an array of tuples containing the specifications and
+ # plugin files to require for a given plugin prefix.
+ #
+ def self.plugin_gems_for_prefix(prefix)
+ glob = "#{prefix}_plugin#{Gem.suffix_pattern}"
+ Gem::Specification.latest_specs(true).map do |spec|
+ matches = spec.matches_for_glob(glob)
+ [spec, matches] unless matches.empty?
+ end.compact
+ end
+
+ # Requires the given paths.
+ # If any exception occurs it is caught and an
+ # informative message is printed.
+ #
+ # @param [String] paths
+ # The paths to require.
+ #
+ # @return [Bool] Whether requiring succeeded.
+ #
+ def self.safe_require(paths)
+ paths.each do |path|
+ begin
+ require(path)
+ rescue Exception => exception # rubocop:disable RescueException
+ message = "\n---------------------------------------------"
+ message << "\nError loading plugin file `#{path}`.\n"
+ message << "\n#{exception.class} - #{exception.message}"
+ message << "\n#{exception.backtrace.join("\n")}"
+ message << "\n---------------------------------------------\n"
+ warn message.ansi.yellow
+ return false
+ end
+ end
+
+ true
+ end
+
+ def self.full_require_paths_for(gemspec)
+ if gemspec.respond_to?(:full_require_paths)
+ return gemspec.full_require_paths
+ end
+
+ # RubyGems < 2.2
+ gemspec.require_paths.map do |require_path|
+ if require_path.include?(gemspec.full_gem_path)
+ require_path
+ else
+ File.join(gemspec.full_gem_path, require_path)
+ end
+ end
+ end
+ private_class_method :full_require_paths_for
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/gem_version.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/gem_version.rb
new file mode 100644
index 0000000..cdb020c
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/gem_version.rb
@@ -0,0 +1,7 @@
+module CLAide
+ # @return [String]
+ #
+ # CLAide’s version, following [semver](http://semver.org).
+ #
+ VERSION = '1.1.0'.freeze
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/help.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/help.rb
new file mode 100644
index 0000000..7d3b183
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/help.rb
@@ -0,0 +1,58 @@
+# encoding: utf-8
+
+module CLAide
+ require 'claide/informative_error'
+
+ # The exception class that is raised to indicate a help banner should be
+ # shown while running {Command.run}.
+ #
+ class Help < StandardError
+ include InformativeError
+
+ # @return [String] The banner containing the usage instructions of the
+ # command to show in the help.
+ #
+ attr_reader :banner
+
+ # @return [String] An optional error message that will be shown before the
+ # help banner.
+ #
+ attr_reader :error_message
+
+ # @param [String] banner @see banner
+ # @param [String] error_message @see error_message
+ #
+ # @note If an error message is provided, the exit status, used to
+ # terminate the program with, will be set to `1`, otherwise a {Help}
+ # exception is treated as not being a real error and exits with `0`.
+ #
+ def initialize(banner, error_message = nil)
+ @banner = banner
+ @error_message = error_message
+ @exit_status = @error_message.nil? ? 0 : 1
+ end
+
+ # @return [String] The optional error message, colored in red if
+ # {Command.ansi_output} is set to `true`.
+ #
+ def formatted_error_message
+ if error_message
+ message = "[!] #{error_message}"
+ prettify_error_message(message)
+ end
+ end
+
+ # @return [String]
+ #
+ def prettify_error_message(message)
+ message.ansi.red
+ end
+
+ # @return [String] The optional error message, combined with the help
+ # banner of the command.
+ #
+ def message
+ [formatted_error_message, banner].compact.join("\n\n")
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/informative_error.rb b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/informative_error.rb
new file mode 100644
index 0000000..8a92bd0
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/informative_error.rb
@@ -0,0 +1,21 @@
+# encoding: utf-8
+
+module CLAide
+ # Including this module into an exception class will ensure that when raised,
+ # while running {Command.run}, only the message of the exception will be
+ # shown to the user. Unless disabled with the `--verbose` flag.
+ #
+ # In addition, the message will be colored red, if {Command.ansi_output}
+ # is set to `true`.
+ #
+ module InformativeError
+ # @return [Numeric] The exist status code that should be used to terminate
+ # the program with. Defaults to `1`.
+ #
+ attr_writer :exit_status
+
+ def exit_status
+ @exit_status ||= 1
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/LICENSE b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/LICENSE
new file mode 100644
index 0000000..e543acb
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/LICENSE
@@ -0,0 +1,23 @@
+Copyright (c) 2010 Chris Wanstrath
+Copyright (c) 2016 Konstantin Gredeskoul
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/README.md b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/README.md
new file mode 100644
index 0000000..f2da87b
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/README.md
@@ -0,0 +1,93 @@
+[](https://badge.fury.io/rb/colored2)
+[](https://rubygems.org/gems/colored2)
+[](https://gitter.im/colored2)
+
+[](https://travis-ci.org/kigster/colored2)
+[](https://codeclimate.com/github/kigster/colored2/coverage)
+[](https://codeclimate.com/github/kigster/colored2)
+[](https://codeclimate.com/github/kigster/colored2)
+
+## Colored2
+
+This is an actively maintained fork of Chris (defunkt) Wanstrath's gem [colored](https://github.com/defunkt/colored), which appears to be no longer supported.
+
+This fork comes with a slightly spruced up syntax, some additional features, and a test suite written in [RSpec](http://rspec.info/).
+
+## Usage
+
+In addition to the simple syntax of the original gem, which affected only the string to the left of the method call, the new "bang" syntax affects a string to the right. If the block or a method argument is provided, the contents is wrapped in the color, and the color is then reset back.
+
+If no block or argument is provided, the color is left open-ended, and must be explicitly reset – when using the 'bang' notation.
+
+
+
+### Complete set of colors:
+
+ * black
+ * red
+ * green
+ * yellow
+ * blue
+ * magenta
+ * cyan
+ * white
+
+### Complete Set of Effects
+
+> Note: previous versions used method name `clear` instead of `no_color`, which clashed with many 3rd party frameworks that defined similarly named method in the global namespace.
+> This highlights the dangers of introducing so many words into the `String` namespace.
+
+ * no_color
+ * bold
+ * dark
+ * italic
+ * underlined
+ * reversed
+ * plain
+ * normal
+
+## Usage in Other Classes
+
+With this gem you can add color to not just strings, but to any other class. `String` class is automatically decorated as soon as `require 'colored2'` is parsed by the ruby interpreter. Note that future versions may refrain from auto-requiring `colored2/strings`, and rely on explicitly requiring components they need colorized, eg `require 'colored2/numbers'`.
+
+To color numbers, require the following file, which automatically decorates `Integer` and `Float`. You can also add color methods to the `Object`. Finally, you can add the methods to any custom class by including the `Colored2` Module.
+
+Below is an `IRB` — session that shows a slightly more advanced usage.
+
+
+
+## Additional Helpers
+
+There are several additional helpers tucked onto the `String` class.
+
+ * `#to_bol` (to beginning of the line) will rewind the cursor back to the beginning of the current line.
+ * `#to_eol` (to end of line)
+
+## Installation
+
+Add this line to your application's Gemfile:
+
+
+ gem 'colored2'
+
+
+And then execute:
+
+ $ bundle
+
+Or install it yourself as:
+
+ $ gem install colored2
+
+
+## Development
+
+To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
+
+## Contributing
+
+Bug reports and pull requests are welcome on GitHub at [https://github.com/kigster/colored2](https://github.com/kigster/colored2).
+
+## License
+
+The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/Rakefile b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/Rakefile
new file mode 100644
index 0000000..47ca61b
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/Rakefile
@@ -0,0 +1,13 @@
+require 'bundler'
+require 'bundler/gem_tasks'
+require 'rake/clean'
+
+CLEAN.include %w(pkg coverage *.gem)
+
+begin
+ require 'rspec/core/rake_task'
+ RSpec::Core::RakeTask.new(:spec)
+rescue LoadError
+end
+
+task :default => [:spec]
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2.rb b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2.rb
new file mode 100644
index 0000000..c4305dd
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2.rb
@@ -0,0 +1,85 @@
+require 'colored2/codes'
+require 'colored2/ascii_decorator'
+
+module Colored2
+ def self.decorate(a_class)
+ a_class.send(:include, Colored2)
+ end
+
+ def self.included(from_class)
+ from_class.class_eval do
+
+ def surround_with_color(color: nil, effect: nil, color_self: nil, string: nil, &block)
+ color_type = if Colored2.background_next? && effect.nil?
+ Colored2.foreground_next!
+ :background
+ else
+ :foreground
+ end
+
+ opts = {}
+ opts.merge!(color_type => color) if color
+ opts.merge!(effect: effect) if effect
+
+ if color_self then
+ opts.merge!( beginning: :on, end: :off)
+ colored = Colored2::AsciiDecorator.new(self).decorate(opts)
+ if string || block
+ arg = "#{string}#{block.call if block}"
+ colored << Colored2::AsciiDecorator.new(arg).decorate(opts) if arg.length > 0
+ end
+ else
+ opts.merge!( end: :on )
+ colored = Colored2::AsciiDecorator.new(self).decorate(opts)
+ if string || block
+ arg = "#{string}#{block.call if block}"
+ colored << Colored2::AsciiDecorator.new(arg).decorate(opts.merge(end: :off)) if arg.length > 0
+ end
+ end
+ colored
+ end
+
+ def on
+ Colored2.background_next!
+ self
+ end
+ end
+
+ from_class.instance_eval do
+ COLORS.keys.each do |color|
+ define_method(color) do |string = nil, &block|
+ surround_with_color(color: color, color_self: true, string: string, &block)
+ end
+
+ define_method("#{color}!".to_sym) do |string = nil, &block|
+ surround_with_color(color: color, color_self: false, string: string, &block)
+ end
+ end
+
+ EFFECTS.keys.each do |effect|
+ next if effect == 'no_color'
+ define_method(effect) do |string = nil, &block|
+ surround_with_color(effect: effect, color_self: true, string: string, &block)
+ end
+
+ define_method("#{effect}!".to_sym) do |string = nil, &block|
+ surround_with_color(effect: effect, color_self: false, string: string, &block)
+ end
+ end
+
+ define_method(:to_eol) do
+ tmp = sub(/^(\e\[[\[\e0-9;m]+m)/, "\\1\e[2K")
+ if tmp == self
+ return "\e[2K" << self
+ end
+ tmp
+ end
+
+ define_method(:to_bol) do
+ "#{self}\033[#{length}D\033[0D"
+ end
+ end
+ end
+end
+
+require 'colored2/strings'
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/ascii_decorator.rb b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/ascii_decorator.rb
new file mode 100644
index 0000000..c491e61
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/ascii_decorator.rb
@@ -0,0 +1,86 @@
+require 'colored2/codes'
+require 'forwardable'
+
+module Colored2
+ def self.enable!
+ Colored2::AsciiDecorator.enable!
+ end
+ def self.disable!
+ Colored2::AsciiDecorator.disable!
+ end
+ def self.background_next!
+ Colored2::AsciiDecorator.background_next!
+ end
+ def self.foreground_next!
+ Colored2::AsciiDecorator.foreground_next!
+ end
+ def self.background_next?
+ Colored2::AsciiDecorator.background_next?
+ end
+
+ class AsciiDecorator
+ @__background_next = false
+ @__colors_disabled = false
+ class << self
+ attr_accessor :__background_next, :__colors_disabled
+ def enable!
+ self.__colors_disabled = false
+ end
+ def enabled?
+ !self.__colors_disabled
+ end
+ def disable!
+ self.__colors_disabled = true
+ end
+ def background_next!
+ self.__background_next = true
+ end
+ def foreground_next!
+ self.__background_next = false
+ end
+ def background_next?
+ self.__background_next
+ end
+ end
+
+ extend Forwardable
+ def_delegators :@my_class, :enable!, :disable!
+
+ attr_accessor :string, :my_class
+
+ def initialize(a_string)
+ self.string = a_string.instance_of?(Object) ? '' : a_string.to_s
+ self.my_class = self.class
+ end
+
+ # options[:start] = :color
+ # options[:end] = :color | :no_color
+ def decorate(options = {})
+ return string if !self.class.enabled? || string.length == 0
+ escape_sequence = [
+ Colored2::TextColor.new(options[:foreground]),
+ Colored2::BackgroundColor.new(options[:background]),
+ Colored2::Effect.new(options[:effect])
+ ].compact.join
+
+ colored = ''
+ colored << escape_sequence if options[:beginning] == :on
+ colored << string
+ if options[:end]
+ colored << no_color if options[:end] == :off && !colored.end_with?(no_color)
+ colored << escape_sequence if options[:end] == :on
+ end
+ colored
+ end
+
+ def un_decorate
+ string.gsub(%r{\e\[\d+(;\d+)*m}, '')
+ end
+
+ private
+
+ def no_color
+ @no_color ||= Colored2::Effect.new(:no_color).to_s
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/codes.rb b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/codes.rb
new file mode 100644
index 0000000..8f46f43
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/codes.rb
@@ -0,0 +1,63 @@
+module Colored2
+
+ COLORS = {
+ black: 30,
+ red: 31,
+ green: 32,
+ yellow: 33,
+ blue: 34,
+ magenta: 35,
+ cyan: 36,
+ white: 37
+ }
+
+ EFFECTS = {
+ no_color: 0,
+ bold: 1,
+ dark: 2,
+ italic: 3,
+ underlined: 4,
+ reversed: 7,
+ plain: 21, # non-bold
+ normal: 22
+ }
+
+ class Code
+ attr_accessor :name, :escape
+ def initialize(name)
+ @name = name
+ return if name.nil?
+ @escape = codes[name.to_sym]
+ raise ArgumentError.new("No color or effect named #{name} exists for #{self.class}.") if @escape.nil?
+ end
+
+ def value(shift = nil)
+ escape_code = escape
+ escape_code += shift if shift && escape_code
+ name && escape ? "\e[#{escape_code}m" : ''
+ end
+
+ def to_s
+ value
+ end
+ end
+
+ class Effect < Code
+ def codes
+ EFFECTS
+ end
+ end
+
+ class TextColor < Code
+ def codes
+ COLORS
+ end
+ end
+
+ class BackgroundColor < TextColor
+ def value
+ super 10
+ end
+ end
+
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/numbers.rb b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/numbers.rb
new file mode 100644
index 0000000..64161b0
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/numbers.rb
@@ -0,0 +1,11 @@
+require 'colored2' unless defined?(Colored2) && Colored2.respond_to?(:decorate)
+
+module Colored2
+ def self.integer_class
+ major, minor = RUBY_VERSION.split(/\./).map(&:to_i)
+ major >= 2 && minor >= 4 ? Integer : Kernel.const_get(:Fixnum)
+ end
+end
+
+Colored2.decorate(Colored2.integer_class)
+Colored2.decorate(Float)
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/object.rb b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/object.rb
new file mode 100644
index 0000000..439b0f9
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/object.rb
@@ -0,0 +1,2 @@
+require 'colored2' unless defined?(Colored2) && Colored2.respond_to?(:decorate)
+Colored2.decorate(Object)
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/strings.rb b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/strings.rb
new file mode 100644
index 0000000..8e099e8
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/strings.rb
@@ -0,0 +1,2 @@
+require 'colored2' unless defined?(Colored2) && Colored2.respond_to?(:decorate)
+Colored2.decorate(String)
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/version.rb b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/version.rb
new file mode 100644
index 0000000..ab0f8a7
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/version.rb
@@ -0,0 +1,3 @@
+module Colored2
+ VERSION = '3.1.2'
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2/numbers_spec.rb b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2/numbers_spec.rb
new file mode 100644
index 0000000..f686bfa
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2/numbers_spec.rb
@@ -0,0 +1,26 @@
+require File.expand_path('spec/spec_helper')
+require 'colored2/numbers'
+require 'colored2/strings'
+
+RSpec.describe Colored2.integer_class do
+ describe 'with foreground and background colors' do
+ it 'should work with one color' do
+ expect(32.red).to eql('32'.red)
+ end
+ it 'should insert escape sequences' do
+ expect(32.red).to eql("\e[31m32\e[0m")
+ end
+ end
+end
+
+RSpec.describe Float do
+ describe 'with foreground and background colors' do
+ it 'should add two colors chained' do
+ expect((32.5).blue.on.red).to eql('32.5'.blue.on.red)
+ end
+
+ it 'should insert escape sequences' do
+ expect((32.5).blue.on.red).to eql("\e[41m\e[34m32.5\e[0m")
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2/object_spec.rb b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2/object_spec.rb
new file mode 100644
index 0000000..6256254
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2/object_spec.rb
@@ -0,0 +1,24 @@
+require File.expand_path('spec/spec_helper')
+require 'colored2/object'
+
+subject1 = red('hello')
+subject2 = red('blue').on.blue
+subject3 = on.yellow('on yellow')
+
+RSpec.describe Object do
+
+ describe 'with foreground and background colors' do
+ it 'should work with one color' do
+ expect(subject1).to eql('hello'.red)
+ end
+
+ it 'should work with color on color' do
+ expect(subject2).to eql('blue'.red.on.blue)
+ end
+
+ it 'should add background color using on_' do
+ expect(subject3).to eql('on yellow'.on.yellow)
+ end
+
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2/strings_spec.rb b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2/strings_spec.rb
new file mode 100644
index 0000000..10da2a4
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2/strings_spec.rb
@@ -0,0 +1,77 @@
+require File.expand_path('spec/spec_helper')
+require 'colored2/strings'
+
+RSpec.describe String do
+ before do
+ Colored2.decorate(String)
+ end
+
+ describe 'with foreground and background colors' do
+ it 'should work with one color' do
+ expect('red'.red).to eql("\e[31mred\e[0m")
+ end
+
+ it 'should add two colors chained' do
+ expect('blue'.red.blue).to eql("\e[34m\e[31mblue\e[0m")
+ end
+
+ it 'should add background color using on_' do
+ expect('on yellow'.on.yellow).to eql("\e[43mon yellow\e[0m")
+ end
+
+ it 'should work with _on_ syntax' do
+ expect('red on blue'.red.on.blue).to eql("\e[44m\e[31mred on blue\e[0m")
+ end
+ end
+
+ describe 'with effects' do
+ it 'should add a bold modifier' do
+ expect('way bold'.bold).to eql("\e[1mway bold\e[0m")
+ end
+
+ it 'should let modifiers stack' do
+ expect('underlinedd bold'.bold.underlined).to eql("\e[4m\e[1munderlinedd bold\e[0m")
+ end
+
+ it 'should let modifiers stack with colors' do
+ expect('cyan underlinedd bold'.bold.underlined.cyan).to eql("\e[36m\e[4m\e[1mcyan underlinedd bold\e[0m")
+ end
+ end
+
+ describe 'new block syntax' do
+ it 'should defined block syntax nested colors' do
+ expect('No Color, then'.blue!('blue inside')).to eql('No Color, then' + 'blue inside'.blue)
+ end
+
+ it 'should defined block syntax nested colors two levels deep' do
+ expect('regular here'.blue! + 'blue here'.no_color!).to eql('regular here' << 'blue here'.blue)
+ end
+
+ it 'should defined block syntax nested colors two levels deep' do
+ expect('regular here'.blue! { 'something else'.red!('red riding hood') }).to eql('regular here'.blue! << 'something else'.red! << 'red riding hood'.no_color!)
+ end
+
+ it 'should defined block syntax nested colors two levels deep' do
+ expectation = 'this is regular, but '.red! do
+ 'this is red '.yellow! do
+ ' and yellow'.no_color!
+ end
+ end
+ expect(expectation).to eql('this is regular, but '.red! << 'this is red '.yellow! << ' and yellow'.no_color!)
+ end
+ end
+
+ describe 'end of line' do
+ it 'should work with eol' do
+ expect('nothing to see here really.'.to_eol).to eql("\e[2Knothing to see here really.")
+ end
+
+ it 'should work with eol_with_with_two_colors' do
+ expect('blue'.red.blue.to_eol).to eql("\e[34m\e[31m\e[2Kblue\e[0m")
+ end
+
+ it 'should work with eol_with_modifiers_stack_with_colors' do
+ expect('cyan underlinedd bold'.bold.underlined.cyan.to_eol).to eql("\e[36m\e[4m\e[1m\e[2Kcyan underlinedd bold\e[0m")
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2_spec.rb b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2_spec.rb
new file mode 100644
index 0000000..3b55f07
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2_spec.rb
@@ -0,0 +1,23 @@
+require 'spec_helper'
+require 'colored2/strings'
+
+RSpec.describe Colored2 do
+ describe 'global enable and disable' do
+ before do
+ Colored2.disable!
+ end
+ after do
+ Colored2.enable!
+ end
+ let(:sample) { 'sample string' }
+
+ describe 'colors' do
+ subject { sample.red.on.blue }
+ it { should eql(sample) }
+ end
+ describe 'effects' do
+ subject { sample.bold.on.red }
+ it { should eql(sample) }
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/spec_helper.rb b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/spec_helper.rb
new file mode 100644
index 0000000..3f2faa0
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/spec_helper.rb
@@ -0,0 +1,5 @@
+require 'simplecov'
+SimpleCov.start
+
+require 'rspec/core'
+
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.github/dependabot.yml b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.github/dependabot.yml
new file mode 100644
index 0000000..738566a
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.github/dependabot.yml
@@ -0,0 +1,14 @@
+version: 2
+updates:
+- package-ecosystem: bundler
+ directory: "/"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 10
+ ignore:
+ - dependency-name: rake
+ versions:
+ - ">= 13.a, < 14"
+ - dependency-name: rubocop
+ versions:
+ - "> 0.52.1"
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.github/workflows/test.yml b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.github/workflows/test.yml
new file mode 100644
index 0000000..73f7df2
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.github/workflows/test.yml
@@ -0,0 +1,43 @@
+name: test
+
+on:
+ push:
+ branches:
+ - master
+ - /.+-stable$/
+
+ pull_request:
+
+jobs:
+ test:
+ runs-on: ubuntu-20.04
+
+ strategy:
+ fail-fast: false
+
+ matrix:
+ ruby:
+ - 2.3.8
+ - 2.4.10
+ - 2.5.8
+ - 2.6.6
+ - 2.7.1
+ - 3.0.0
+ - 3.1.2
+ - jruby-9.2.11.1
+
+ env:
+ LANG: en_US.UTF-8
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Set up Ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: ${{ matrix.ruby }}
+ bundler-cache: true
+
+ - name: Run tests
+ run: bundle exec rake
+ continue-on-error: ${{ matrix.ruby == 'ruby-head' }}
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.gitignore b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.gitignore
new file mode 100644
index 0000000..9106b2a
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.gitignore
@@ -0,0 +1,8 @@
+/.bundle/
+/.yardoc
+/_yardoc/
+/coverage/
+/doc/
+/pkg/
+/spec/reports/
+/tmp/
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.rspec b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.rspec
new file mode 100644
index 0000000..8c18f1a
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.rspec
@@ -0,0 +1,2 @@
+--format documentation
+--color
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.rubocop.yml b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.rubocop.yml
new file mode 100644
index 0000000..f95e119
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.rubocop.yml
@@ -0,0 +1,14 @@
+inherit_from:
+ - .rubocop_todo.yml
+
+AllCops:
+ TargetRubyVersion: 2.3
+ Exclude:
+ - "lib/nanaimo/unicode/**/*.rb"
+ - "vendor/**/*"
+
+Lint/AssignmentInCondition:
+ Enabled: false
+
+Metrics:
+ Enabled: false
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.rubocop_todo.yml b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.rubocop_todo.yml
new file mode 100644
index 0000000..23fdf89
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.rubocop_todo.yml
@@ -0,0 +1,173 @@
+# This configuration was generated by
+# `rubocop --auto-gen-config`
+# on 2022-05-29 20:27:33 UTC using RuboCop version 1.30.0.
+# The point is for the user to remove these configuration records
+# one by one as the offenses are removed from the code base.
+# Note that changes in the inspected code, or installation of new
+# versions of RuboCop, may require this file to be generated again.
+
+# Offense count: 23
+# This cop supports safe autocorrection (--autocorrect).
+Layout/ClosingHeredocIndentation:
+ Exclude:
+ - 'spec/nanaimo/reader_spec.rb'
+
+# Offense count: 14
+# This cop supports safe autocorrection (--autocorrect).
+Layout/EmptyLineAfterGuardClause:
+ Exclude:
+ - 'lib/nanaimo.rb'
+ - 'lib/nanaimo/object.rb'
+ - 'lib/nanaimo/plist.rb'
+ - 'lib/nanaimo/reader.rb'
+ - 'lib/nanaimo/unicode.rb'
+ - 'lib/nanaimo/writer.rb'
+ - 'lib/nanaimo/writer/pbxproj.rb'
+ - 'lib/nanaimo/writer/xml.rb'
+
+# Offense count: 24
+# This cop supports safe autocorrection (--autocorrect).
+Layout/HeredocIndentation:
+ Exclude:
+ - 'Rakefile'
+ - 'lib/nanaimo/writer/xml.rb'
+ - 'spec/nanaimo/reader_spec.rb'
+ - 'spec/nanaimo/writer/xml_spec.rb'
+
+# Offense count: 1
+# Configuration parameters: AllowComments.
+Lint/EmptyFile:
+ Exclude:
+ - 'spec/nanaimo/plist_spec.rb'
+
+# Offense count: 2
+Lint/MissingSuper:
+ Exclude:
+ - 'lib/nanaimo/reader.rb'
+ - 'lib/nanaimo/writer.rb'
+
+# Offense count: 2
+# Configuration parameters: ForbiddenDelimiters.
+# ForbiddenDelimiters: (?-mix:(^|\s)(EO[A-Z]{1}|END)(\s|$))
+Naming/HeredocDelimiterNaming:
+ Exclude:
+ - 'lib/nanaimo/writer/xml.rb'
+
+# Offense count: 3
+# Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames.
+# AllowedNames: at, by, db, id, in, io, ip, of, on, os, pp, to
+Naming/MethodParameterName:
+ Exclude:
+ - 'lib/nanaimo/reader.rb'
+ - 'lib/nanaimo/writer/pbxproj.rb'
+
+# Offense count: 2
+# This cop supports unsafe autocorrection (--autocorrect-all).
+Style/CaseLikeIf:
+ Exclude:
+ - 'lib/nanaimo/object.rb'
+
+# Offense count: 1
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: EnforcedStyle.
+# SupportedStyles: compact, expanded
+Style/EmptyMethod:
+ Exclude:
+ - 'lib/nanaimo/writer/xml.rb'
+
+# Offense count: 1
+# This cop supports safe autocorrection (--autocorrect).
+Style/Encoding:
+ Exclude:
+ - 'nanaimo.gemspec'
+
+# Offense count: 3
+# This cop supports safe autocorrection (--autocorrect).
+Style/ExpandPathArguments:
+ Exclude:
+ - 'nanaimo.gemspec'
+ - 'spec/nanaimo/writer/pbxproj_spec.rb'
+ - 'spec/spec_helper.rb'
+
+# Offense count: 2
+# Configuration parameters: MaxUnannotatedPlaceholdersAllowed, IgnoredMethods.
+# SupportedStyles: annotated, template, unannotated
+Style/FormatStringToken:
+ EnforcedStyle: unannotated
+
+# Offense count: 2
+# This cop supports safe autocorrection (--autocorrect).
+Style/IdenticalConditionalBranches:
+ Exclude:
+ - 'lib/nanaimo/unicode.rb'
+
+# Offense count: 4
+# This cop supports safe autocorrection (--autocorrect).
+Style/IfUnlessModifier:
+ Exclude:
+ - 'lib/nanaimo/reader.rb'
+ - 'lib/nanaimo/unicode.rb'
+
+# Offense count: 2
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: EnforcedStyle.
+# SupportedStyles: literals, strict
+Style/MutableConstant:
+ Exclude:
+ - 'lib/nanaimo/reader.rb'
+ - 'lib/nanaimo/writer.rb'
+
+# Offense count: 3
+# This cop supports unsafe autocorrection (--autocorrect-all).
+# Configuration parameters: EnforcedStyle, IgnoredMethods.
+# SupportedStyles: predicate, comparison
+Style/NumericPredicate:
+ Exclude:
+ - 'spec/**/*'
+ - 'lib/nanaimo/writer.rb'
+
+# Offense count: 8
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: PreferredDelimiters.
+Style/PercentLiteralDelimiters:
+ Exclude:
+ - 'lib/nanaimo/reader.rb'
+ - 'lib/nanaimo/unicode.rb'
+ - 'spec/nanaimo/reader_spec.rb'
+ - 'spec/nanaimo/unicode_spec.rb'
+ - 'spec/nanaimo/writer/xml_spec.rb'
+ - 'spec/nanaimo/writer_spec.rb'
+
+# Offense count: 1
+# This cop supports safe autocorrection (--autocorrect).
+Style/RedundantFreeze:
+ Exclude:
+ - 'lib/nanaimo/reader.rb'
+
+# Offense count: 2
+# This cop supports safe autocorrection (--autocorrect).
+Style/RedundantRegexpEscape:
+ Exclude:
+ - 'lib/nanaimo/writer.rb'
+
+# Offense count: 1
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: MinSize.
+# SupportedStyles: percent, brackets
+Style/SymbolArray:
+ EnforcedStyle: brackets
+
+# Offense count: 1
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: EnforcedStyle, MinSize, WordRegex.
+# SupportedStyles: percent, brackets
+Style/WordArray:
+ Exclude:
+ - 'lib/nanaimo/reader.rb'
+
+# Offense count: 22
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns, IgnoredPatterns.
+# URISchemes: http, https
+Layout/LineLength:
+ Max: 331
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/CODE_OF_CONDUCT.md b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..ced55a5
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/CODE_OF_CONDUCT.md
@@ -0,0 +1,49 @@
+# Contributor Code of Conduct
+
+As contributors and maintainers of this project, and in the interest of
+fostering an open and welcoming community, we pledge to respect all people who
+contribute through reporting issues, posting feature requests, updating
+documentation, submitting pull requests or patches, and other activities.
+
+We are committed to making participation in this project a harassment-free
+experience for everyone, regardless of level of experience, gender, gender
+identity and expression, sexual orientation, disability, personal appearance,
+body size, race, ethnicity, age, religion, or nationality.
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery
+* Personal attacks
+* Trolling or insulting/derogatory comments
+* Public or private harassment
+* Publishing other's private information, such as physical or electronic
+ addresses, without explicit permission
+* Other unethical or unprofessional conduct
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+By adopting this Code of Conduct, project maintainers commit themselves to
+fairly and consistently applying these principles to every aspect of managing
+this project. Project maintainers who do not follow or enforce the Code of
+Conduct may be permanently removed from the project team.
+
+This code of conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community.
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting a project maintainer at dan@tomlinson.io. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. Maintainers are
+obligated to maintain confidentiality with regard to the reporter of an
+incident.
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 1.3.0, available at
+[http://contributor-covenant.org/version/1/3/0/][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/3/0/
\ No newline at end of file
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/Gemfile b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/Gemfile
new file mode 100644
index 0000000..c1db5fa
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/Gemfile
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+source 'https://rubygems.org'
+
+# Specify your gem's dependencies in nanaimo.gemspec
+gemspec
+
+group :development do
+ gem 'rake', '~> 12.0'
+ gem 'rspec'
+
+ install_if Gem.ruby_version >= Gem::Version.new('2.6') do
+ gem 'rubocop'
+ gem 'rubocop-rake', '~> 0.6.0'
+ gem 'rubocop-rspec', '~> 2.11'
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/Gemfile.lock b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/Gemfile.lock
new file mode 100644
index 0000000..b255f0e
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/Gemfile.lock
@@ -0,0 +1,62 @@
+PATH
+ remote: .
+ specs:
+ nanaimo (0.4.0)
+
+GEM
+ remote: https://rubygems.org/
+ specs:
+ ast (2.4.2)
+ diff-lcs (1.5.1)
+ parallel (1.19.2)
+ parser (3.1.2.0)
+ ast (~> 2.4.1)
+ rainbow (3.1.1)
+ rake (12.3.3)
+ regexp_parser (2.5.0)
+ rexml (3.2.5)
+ rspec (3.13.0)
+ rspec-core (~> 3.13.0)
+ rspec-expectations (~> 3.13.0)
+ rspec-mocks (~> 3.13.0)
+ rspec-core (3.13.0)
+ rspec-support (~> 3.13.0)
+ rspec-expectations (3.13.0)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.13.0)
+ rspec-mocks (3.13.0)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.13.0)
+ rspec-support (3.13.0)
+ rubocop (1.30.0)
+ parallel (~> 1.10)
+ parser (>= 3.1.0.0)
+ rainbow (>= 2.2.2, < 4.0)
+ regexp_parser (>= 1.8, < 3.0)
+ rexml (>= 3.2.5, < 4.0)
+ rubocop-ast (>= 1.18.0, < 2.0)
+ ruby-progressbar (~> 1.7)
+ unicode-display_width (>= 1.4.0, < 3.0)
+ rubocop-ast (1.18.0)
+ parser (>= 3.1.1.0)
+ rubocop-rake (0.6.0)
+ rubocop (~> 1.0)
+ rubocop-rspec (2.11.1)
+ rubocop (~> 1.19)
+ ruby-progressbar (1.11.0)
+ unicode-display_width (2.1.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ bundler (~> 2.3)
+ nanaimo!
+ rake (~> 12.0)
+ rspec
+ rubocop
+ rubocop-rake (~> 0.6.0)
+ rubocop-rspec (~> 2.11)
+
+BUNDLED WITH
+ 2.3.14
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/LICENSE.txt b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/LICENSE.txt
new file mode 100644
index 0000000..1617264
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/LICENSE.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Danielle Tomlinson, Samuel Giddins
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/README.md b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/README.md
new file mode 100644
index 0000000..f7787ce
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/README.md
@@ -0,0 +1,55 @@
+# Nanaimo
+
+Nanaimo is a simple library that implements ASCII Plist serialization and
+deserialization, entirely with native Ruby code (and zero dependencies). It
+also comes with out-of-the-box support for serializing Xcode projects (complete
+with annotations) and XML plists.
+
+## Installation
+
+Add this line to your application's Gemfile:
+
+```ruby
+gem 'nanaimo'
+```
+
+And then execute:
+
+ $ bundle
+
+Or install it yourself as:
+
+ $ gem install nanaimo
+
+## Usage
+
+```ruby
+require 'nanaimo'
+
+# parse a native ruby object from an ascii plist file
+project_hash = Nanaimo::Reader
+ .from_file("App.xcodeproj/project.pbxproj")
+ .parse!
+ .as_ruby
+
+# change that object
+project_hash['...'] = '...'
+
+# re-serialize it
+ascii_plist_string = Nanaimo::Writer.new(project_hash).write
+```
+
+## Development
+
+After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
+
+To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
+
+## Contributing
+
+Bug reports and pull requests are welcome on GitHub at https://github.com/CocoaPods/nanaimo. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
+
+
+## License
+
+The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/Rakefile b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/Rakefile
new file mode 100644
index 0000000..3c942d9
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/Rakefile
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'bundler/gem_tasks'
+require 'rspec/core/rake_task'
+
+RSpec::Core::RakeTask.new(:spec)
+
+task default: [:spec]
+
+if Gem.ruby_version >= Gem::Version.new('2.6')
+ require 'rubocop/rake_task'
+ RuboCop::RakeTask.new
+ task default: [:rubocop]
+end
+
+task :generate_nextstep_mappings do
+ require 'net/http'
+ url = 'http://ftp.unicode.org/Public/MAPPINGS/VENDORS/NEXT/NEXTSTEP.TXT'
+ mappings = Net::HTTP.get(URI(url))
+ .lines
+ .grep(/^[^#$]/)
+ .map { |l| l.split("\t", 3) }
+ .reduce(+'') do |f, (ns, uc, cm)|
+ f << " #{ns} => #{uc}, #{cm}"
+ end
+ map = <<-RUBY
+# frozen-string-literal: true
+module Nanaimo
+ module Unicode
+ # Taken from #{url}
+ NEXT_STEP_MAPPING = {
+#{mappings} }.freeze
+ end
+end
+ RUBY
+ File.open('lib/nanaimo/unicode/next_step_mapping.rb', 'w') { |f| f << map }
+end
+
+task :generate_quote_maps do
+ quote_map = {
+ "\a" => '\\a',
+ "\b" => '\\b',
+ "\f" => '\\f',
+ "\r" => '\\r',
+ "\t" => '\\t',
+ "\v" => '\\v',
+ "\n" => '\\n',
+ %(') => "\\'",
+ %(") => '\\"',
+ '\\' => '\\\\'
+ }
+
+ unquote_map = quote_map.each_with_object("\n" => "\n") do |(value, escaped), map|
+ map[escaped[1..-1]] = value
+ map
+ end
+ quote_map.delete("'")
+
+ 0.upto(31) { |i| quote_map[[i].pack('U')] ||= format('\\U%04x', i) }
+ quote_regexp = Regexp.union(quote_map.keys)
+
+ dump_hash = proc do |hash, indent = 4|
+ hash.reduce(+"{\n") { |dumped, (k, v)| dumped << "#{' ' * (indent + 2)}#{k.dump} => #{v.dump},\n" } << ' ' * indent << '}.freeze'
+ end
+
+ map = <<-RUBY
+# frozen-string-literal: true
+module Nanaimo
+ module Unicode
+ QUOTE_MAP = #{dump_hash[quote_map]}
+
+ UNQUOTE_MAP = #{dump_hash[unquote_map]}
+
+ QUOTE_REGEXP = #{quote_regexp.inspect}
+ end
+end
+ RUBY
+
+ File.open('lib/nanaimo/unicode/quote_maps.rb', 'w') { |f| f << map }
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/bin/console b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/bin/console
new file mode 100644
index 0000000..e66267b
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/bin/console
@@ -0,0 +1,15 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require 'bundler/setup'
+require 'nanaimo'
+
+# You can add fixtures and/or initialization code here to make experimenting
+# with your gem easier. You can also use a different console, if you like.
+
+# (If you use this, don't forget to add pry to your Gemfile!)
+# require "pry"
+# Pry.start
+
+require 'irb'
+IRB.start
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/bin/setup b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/bin/setup
new file mode 100644
index 0000000..dce67d8
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/bin/setup
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+set -euo pipefail
+IFS=$'\n\t'
+set -vx
+
+bundle install
+
+# Do any other automated setup that you need to do here
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo.rb b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo.rb
new file mode 100644
index 0000000..03f61a9
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require 'nanaimo/version'
+
+# A native Ruby implementation of ASCII plist parsing and serialization.
+#
+module Nanaimo
+ class Error < StandardError; end
+
+ DEBUG = !ENV['NANAIMO_DEBUG'].nil?
+ private_constant :DEBUG
+ def self.debug
+ return unless DEBUG
+ warn yield
+ end
+
+ require 'nanaimo/object'
+ require 'nanaimo/plist'
+ require 'nanaimo/reader'
+ require 'nanaimo/unicode'
+ require 'nanaimo/writer'
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/object.rb b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/object.rb
new file mode 100644
index 0000000..72a299e
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/object.rb
@@ -0,0 +1,102 @@
+# frozen_string_literal: true
+
+module Nanaimo
+ # An object that belongs to a plist.
+ #
+ class Object
+ # @return The underlying native Ruby value
+ #
+ attr_accessor :value
+
+ # @return [String] The annotation comment
+ #
+ attr_accessor :annotation
+
+ def initialize(value, annotation)
+ self.value = value
+ self.annotation = annotation
+
+ raise 'Item cannot be initialize with a nil value' if value.nil?
+ end
+
+ def ==(other)
+ return unless other
+ if other.is_a?(self.class)
+ other.value == value && annotation == other.annotation
+ elsif other.is_a?(value.class)
+ other == value
+ end
+ end
+ alias eql? ==
+
+ def hash
+ value.hash
+ end
+
+ def <=>(other)
+ other_value = if other.is_a?(Object)
+ other.value
+ elsif other.is_a?(value.class)
+ other
+ end
+ return unless other_value
+
+ value <=> other_value
+ end
+
+ def to_s
+ format('<%s %s>', self.class, value)
+ end
+
+ # @return A native Ruby object representation
+ #
+ def as_ruby
+ raise 'unimplemented'
+ end
+ end
+
+ # A string object in a Plist.
+ #
+ class String < Object
+ def as_ruby
+ value
+ end
+ end
+
+ # A string object surrounded by quotes in a Plist.
+ #
+ class QuotedString < Object
+ def as_ruby
+ value
+ end
+ end
+
+ # A data object in a Plist, represented by a binary-encoded string.
+ #
+ class Data < Object
+ def initialize(value, annotation)
+ value &&= value.dup.force_encoding(Encoding::BINARY)
+ super(value, annotation)
+ end
+
+ def as_ruby
+ value
+ end
+ end
+
+ # An array object in a Plist.
+ #
+ class Array < Object
+ def as_ruby
+ value.map(&:as_ruby)
+ end
+ end
+
+ # A dictionary object in a Plist.
+ #
+ class Dictionary < Object
+ def as_ruby
+ Hash[value.map { |k, v| [k.as_ruby, v.as_ruby] }]
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/plist.rb b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/plist.rb
new file mode 100644
index 0000000..fe465c4
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/plist.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Nanaimo
+ # A Plist.
+ #
+ class Plist
+ # @return [Nanaimo::Object] The root level object in the plist.
+ #
+ attr_accessor :root_object
+
+ # @return [String] The encoding of the plist.
+ #
+ attr_accessor :file_type
+
+ def initialize(root_object = nil, file_type = nil)
+ @root_object = root_object
+ @file_type = file_type
+ end
+
+ def ==(other)
+ return unless other.is_a?(Nanaimo::Plist)
+ file_type == other.file_type && root_object == other.root_object
+ end
+
+ def hash
+ root_object.hash
+ end
+
+ # @return A native Ruby object representation of the plist.
+ #
+ def as_ruby
+ root_object.as_ruby
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/reader.rb b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/reader.rb
new file mode 100644
index 0000000..076be6a
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/reader.rb
@@ -0,0 +1,287 @@
+# frozen-string-literal: true
+
+autoload :StringScanner, 'strscan'
+
+module Nanaimo
+ # Transforms plist strings into Plist objects.
+ #
+ class Reader
+ # Raised when attempting to read a plist with an unsupported file format.
+ #
+ class UnsupportedPlistFormatError < Error
+ # @return [Symbol] The unsupported format.
+ #
+ attr_reader :format
+
+ def initialize(format)
+ @format = format
+ end
+
+ def to_s
+ "#{format} plists are currently unsupported"
+ end
+ end
+
+ # Raised when parsing fails.
+ #
+ class ParseError < Error
+ # @return [[Integer, Integer]] The (line, column) offset into the plist
+ # where the error occurred
+ #
+ attr_accessor :location
+
+ # @return [String] The contents of the plist.
+ #
+ attr_accessor :plist_string
+
+ def to_s
+ "[!] #{super}#{context}"
+ end
+
+ def context(n = 2)
+ line_number, column = location
+ line_number -= 1
+ lines = plist_string.split(NEWLINE)
+
+ s = line_number.succ.to_s.size
+ indent = "#{' ' * s}# "
+ indicator = "#{line_number.succ}> "
+
+ m = ::String.new("\n")
+
+ m << "#{indent}-------------------------------------------\n"
+ m << lines[[line_number - n, 0].max...line_number].map do |l|
+ "#{indent}#{l}\n"
+ end.join
+
+ line = lines[line_number].to_s
+ m << "#{indicator}#{line}\n"
+
+ m << ' ' * indent.size
+ m << line[0, column.pred].gsub(/[^\t]/, ' ')
+ m << "^\n"
+
+ m << Array(lines[line_number.succ..[lines.count.pred, line_number + n].min]).map do |l|
+ l.strip.empty? ? '' : "#{indent}#{l}\n"
+ end.join
+ m << "#{indent}-------------------------------------------\n"
+ end
+ end
+
+ # @param plist_contents [String]
+ #
+ # @return [Symbol] The file format of the plist in the given string.
+ #
+ def self.plist_type(plist_contents)
+ case plist_contents
+ when /\Abplist/
+ :binary
+ when /\A<\?xml/
+ :xml
+ else
+ :ascii
+ end
+ end
+
+ # @param file_path [String]
+ #
+ # @return [Plist] A parsed plist from the given file
+ #
+ def self.from_file(file_path)
+ new(File.read(file_path))
+ end
+
+ # @param contents [String] The plist to be parsed
+ #
+ def initialize(contents)
+ @scanner = StringScanner.new(contents)
+ end
+
+ # Parses the contents of the plist
+ #
+ # @return [Plist] The parsed Plist object.
+ #
+ def parse!
+ plist_format = ensure_ascii_plist!
+ read_string_encoding
+ root_object = parse_object
+
+ eat_whitespace!
+ raise_parser_error ParseError, 'Found additional characters after parsing the root plist object' unless @scanner.eos?
+
+ Nanaimo::Plist.new(root_object, plist_format)
+ end
+
+ private
+
+ def ensure_ascii_plist!
+ self.class.plist_type(@scanner.string).tap do |plist_format|
+ raise UnsupportedPlistFormatError, plist_format unless plist_format == :ascii
+ end
+ end
+
+ def read_string_encoding
+ # TODO
+ end
+
+ def parse_object(already_parsed_comment: false)
+ _comment = skip_to_non_space_matching_annotations unless already_parsed_comment
+ start_pos = @scanner.pos
+ raise_parser_error ParseError, 'Unexpected end of string while parsing' if @scanner.eos?
+ if @scanner.skip(/\{/)
+ parse_dictionary
+ elsif @scanner.skip(/\(/)
+ parse_array
+ elsif @scanner.skip(/)
+ parse_data
+ elsif quote = @scanner.scan(/['"]/)
+ parse_quotedstring(quote)
+ else
+ parse_string
+ end.tap do |o|
+ o.annotation = skip_to_non_space_matching_annotations
+ Nanaimo.debug { "parsed #{o.inspect} from #{start_pos}..#{@scanner.pos}" }
+ end
+ end
+
+ def parse_string
+ eat_whitespace!
+ unless match = @scanner.scan(%r{[\w_$/:.-]+}o)
+ raise_parser_error ParseError, "Invalid character #{current_character.inspect} in unquoted string"
+ end
+ Nanaimo::String.new(match, nil)
+ end
+
+ def parse_quotedstring(quote)
+ unless string = @scanner.scan(/(?:([^#{quote}\\]|\\.)*)#{quote}/)
+ raise_parser_error ParseError, "Unterminated quoted string, expected #{quote} but never found it"
+ end
+ string = Unicode.unquotify_string(string.chomp!(quote))
+ Nanaimo::QuotedString.new(string, nil)
+ end
+
+ def parse_array
+ objects = []
+ until @scanner.eos?
+ _comment = skip_to_non_space_matching_annotations
+ break if @scanner.skip(/\)/)
+
+ objects << parse_object(already_parsed_comment: true)
+
+ eat_whitespace!
+ break if @scanner.skip(/\)/)
+ unless @scanner.skip(/,/)
+ raise_parser_error ParseError, "Array missing ',' in between objects"
+ end
+ end
+
+ Nanaimo::Array.new(objects, nil)
+ end
+
+ def parse_dictionary
+ objects = {}
+ until @scanner.eos?
+ _comment = skip_to_non_space_matching_annotations
+ break if @scanner.skip(/}/)
+
+ key = parse_object(already_parsed_comment: true)
+ eat_whitespace!
+ unless @scanner.skip(/=/)
+ raise_parser_error ParseError, "Dictionary missing value for key #{key.as_ruby.inspect}, expected '=' and found #{current_character.inspect}"
+ end
+
+ value = parse_object
+ objects[key] = value
+
+ eat_whitespace!
+ break if @scanner.skip(/}/)
+ unless @scanner.skip(/;/)
+ raise_parser_error ParseError, "Dictionary missing ';' after key-value pair for #{key.as_ruby.inspect}, found #{current_character.inspect}"
+ end
+ end
+
+ Nanaimo::Dictionary.new(objects, nil)
+ end
+
+ def parse_data
+ unless data = @scanner.scan(/[\h ]*>/)
+ raise_parser_error ParseError, "Data missing closing '>'"
+ end
+ data.chomp!('>')
+ data.delete!(' ')
+ unless data.size.even?
+ @scanner.unscan
+ raise_parser_error ParseError, 'Data has an uneven number of hex digits'
+ end
+ data = [data].pack('H*')
+ Nanaimo::Data.new(data, nil)
+ end
+
+ def current_character
+ @scanner.peek(1)
+ end
+
+ def read_singleline_comment
+ unless comment = @scanner.scan_until(NEWLINE)
+ raise_parser_error ParseError, 'Failed to terminate single line comment'
+ end
+ comment
+ end
+
+ def eat_whitespace!
+ @scanner.skip(MANY_WHITESPACES)
+ end
+
+ NEWLINE_CHARACTERS = %W(\x0A \x0D \u2028 \u2029).freeze
+ NEWLINE = Regexp.union(*NEWLINE_CHARACTERS)
+
+ WHITESPACE_CHARACTERS = NEWLINE_CHARACTERS + %W(\x09 \x0B \x0C \x20)
+ WHITESPACE = Regexp.union(*WHITESPACE_CHARACTERS)
+
+ MANY_WHITESPACES = /#{WHITESPACE}+/
+
+ def read_multiline_comment
+ unless annotation = @scanner.scan(%r{(?:.+?)(?=\*/)}m)
+ raise_parser_error ParseError, 'Failed to terminate multiline comment'
+ end
+ @scanner.skip(%r{\*/})
+
+ annotation
+ end
+
+ def skip_to_non_space_matching_annotations
+ annotation = ''.freeze
+ until @scanner.eos?
+ eat_whitespace!
+
+ # Comment Detection
+ if @scanner.skip(%r{//})
+ annotation = read_singleline_comment
+ next
+ elsif @scanner.skip(%r{/\*})
+ annotation = read_multiline_comment
+ next
+ end
+
+ break
+ end
+ annotation
+ end
+
+ def location_in(scanner)
+ pos = scanner.charpos
+ line = scanner.string[0..scanner.charpos].scan(NEWLINE).size + 1
+ column = pos - (scanner.string.rindex(NEWLINE, pos - 1) || -1)
+ column = [1, column].max
+ [line, column]
+ end
+
+ def raise_parser_error(klass, message)
+ exception = klass.new(message).tap do |error|
+ error.location = location_in(@scanner)
+ error.plist_string = @scanner.string
+ end
+ raise(exception)
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/unicode.rb b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/unicode.rb
new file mode 100644
index 0000000..b10865f
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/unicode.rb
@@ -0,0 +1,89 @@
+# frozen-string-literal: true
+
+require 'nanaimo/unicode/next_step_mapping'
+require 'nanaimo/unicode/quote_maps'
+module Nanaimo
+ # @!visibility private
+ #
+ module Unicode
+ class UnsupportedEscapeSequenceError < Error; end
+ class InvalidEscapeSequenceError < Error; end
+
+ module_function
+
+ def quotify_string(string)
+ string.gsub(QUOTE_REGEXP, QUOTE_MAP)
+ end
+
+ ESCAPE_PREFIXES = %W(
+ 0 1 2 3 4 5 6 7 a b f n r t v \n U \\
+ ).freeze
+
+ OCTAL_DIGITS = (0..7).map(&:to_s).freeze
+
+ # Credit to Samantha Marshall
+ # Taken from https://github.com/samdmarshall/pbPlist/blob/346c29f91f913d35d0e24f6722ec19edb24e5707/pbPlist/StrParse.py#L197
+ # Licensed under https://raw.githubusercontent.com/samdmarshall/pbPlist/blob/346c29f91f913d35d0e24f6722ec19edb24e5707/LICENSE
+ #
+ # Originally from: http://www.opensource.apple.com/source/CF/CF-744.19/CFOldStylePList.c See `getSlashedChar()`
+ def unquotify_string(string)
+ formatted_string = ::String.new
+ extracted_string = string
+ string_length = string.size
+ index = 0
+ while index < string_length
+ if escape_index = extracted_string.index('\\', index)
+ formatted_string << extracted_string[index...escape_index] unless index == escape_index
+ index = escape_index + 1
+ next_char = extracted_string[index]
+ if ESCAPE_PREFIXES.include?(next_char)
+ index += 1
+ if unquoted = UNQUOTE_MAP[next_char]
+ formatted_string << unquoted
+ elsif next_char == 'U'
+ length = 4
+ unicode_numbers = extracted_string[index, length]
+ unless unicode_numbers =~ /\A\h{4}\z/
+ raise InvalidEscapeSequenceError, "Unicode '\\U' escape sequence terminated without 4 following hex characters"
+ end
+ index += length
+ formatted_string << [unicode_numbers.to_i(16)].pack('U')
+ elsif OCTAL_DIGITS.include?(next_char) # https://twitter.com/Catfish_Man/status/658014170055507968
+ octal_string = extracted_string[index - 1, 3]
+ if octal_string =~ /\A[0-7]{3}\z/
+ index += 2
+ code_point = octal_string.to_i(8)
+ unless code_point <= 0x80 || converted = NEXT_STEP_MAPPING[code_point]
+ raise InvalidEscapeSequenceError, "Invalid octal escape sequence #{octal_string}"
+ end
+ formatted_string << [converted].pack('U')
+ else
+ formatted_string << next_char
+ end
+ else
+ raise UnsupportedEscapeSequenceError, "Failed to handle #{next_char} which is in the list of possible escapes"
+ end
+ else
+ index += 1
+ formatted_string << next_char
+ end
+ else
+ formatted_string << extracted_string[index..-1]
+ index = string_length
+ end
+ end
+ formatted_string
+ end
+
+ XML_STRING_ESCAPES = {
+ '&' => '&',
+ '<' => '<',
+ '>' => '>'
+ }.freeze
+ XML_STRING_ESCAPE_REGEXP = Regexp.union(XML_STRING_ESCAPES.keys)
+
+ def xml_escape_string(string)
+ string.to_s.gsub(XML_STRING_ESCAPE_REGEXP, XML_STRING_ESCAPES)
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/unicode/next_step_mapping.rb b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/unicode/next_step_mapping.rb
new file mode 100644
index 0000000..a286a92
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/unicode/next_step_mapping.rb
@@ -0,0 +1,136 @@
+# frozen-string-literal: true
+module Nanaimo
+ module Unicode
+ # Taken from http://ftp.unicode.org/Public/MAPPINGS/VENDORS/NEXT/NEXTSTEP.TXT
+ NEXT_STEP_MAPPING = {
+ 0x80 => 0x00a0, # NO-BREAK SPACE
+ 0x81 => 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE
+ 0x82 => 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE
+ 0x83 => 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ 0x84 => 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE
+ 0x85 => 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS
+ 0x86 => 0x00c5, # LATIN CAPITAL LETTER A WITH RING
+ 0x87 => 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA
+ 0x88 => 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE
+ 0x89 => 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE
+ 0x8a => 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ 0x8b => 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS
+ 0x8c => 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE
+ 0x8d => 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE
+ 0x8e => 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ 0x8f => 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS
+ 0x90 => 0x00d0, # LATIN CAPITAL LETTER ETH
+ 0x91 => 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE
+ 0x92 => 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE
+ 0x93 => 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE
+ 0x94 => 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ 0x95 => 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE
+ 0x96 => 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS
+ 0x97 => 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE
+ 0x98 => 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE
+ 0x99 => 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ 0x9a => 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS
+ 0x9b => 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE
+ 0x9c => 0x00de, # LATIN CAPITAL LETTER THORN
+ 0x9d => 0x00b5, # MICRO SIGN
+ 0x9e => 0x00d7, # MULTIPLICATION SIGN
+ 0x9f => 0x00f7, # DIVISION SIGN
+ 0xa0 => 0x00a9, # COPYRIGHT SIGN
+ 0xa1 => 0x00a1, # INVERTED EXCLAMATION MARK
+ 0xa2 => 0x00a2, # CENT SIGN
+ 0xa3 => 0x00a3, # POUND SIGN
+ 0xa4 => 0x2044, # FRACTION SLASH
+ 0xa5 => 0x00a5, # YEN SIGN
+ 0xa6 => 0x0192, # LATIN SMALL LETTER F WITH HOOK
+ 0xa7 => 0x00a7, # SECTION SIGN
+ 0xa8 => 0x00a4, # CURRENCY SIGN
+ 0xa9 => 0x2019, # RIGHT SINGLE QUOTATION MARK
+ 0xaa => 0x201c, # LEFT DOUBLE QUOTATION MARK
+ 0xab => 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0xac => 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 0xad => 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 0xae => 0xfb01, # LATIN SMALL LIGATURE FI
+ 0xaf => 0xfb02, # LATIN SMALL LIGATURE FL
+ 0xb0 => 0x00ae, # REGISTERED SIGN
+ 0xb1 => 0x2013, # EN DASH
+ 0xb2 => 0x2020, # DAGGER
+ 0xb3 => 0x2021, # DOUBLE DAGGER
+ 0xb4 => 0x00b7, # MIDDLE DOT
+ 0xb5 => 0x00a6, # BROKEN BAR
+ 0xb6 => 0x00b6, # PILCROW SIGN
+ 0xb7 => 0x2022, # BULLET
+ 0xb8 => 0x201a, # SINGLE LOW-9 QUOTATION MARK
+ 0xb9 => 0x201e, # DOUBLE LOW-9 QUOTATION MARK
+ 0xba => 0x201d, # RIGHT DOUBLE QUOTATION MARK
+ 0xbb => 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 0xbc => 0x2026, # HORIZONTAL ELLIPSIS
+ 0xbd => 0x2030, # PER MILLE SIGN
+ 0xbe => 0x00ac, # NOT SIGN
+ 0xbf => 0x00bf, # INVERTED QUESTION MARK
+ 0xc0 => 0x00b9, # SUPERSCRIPT ONE
+ 0xc1 => 0x02cb, # MODIFIER LETTER GRAVE ACCENT
+ 0xc2 => 0x00b4, # ACUTE ACCENT
+ 0xc3 => 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT
+ 0xc4 => 0x02dc, # SMALL TILDE
+ 0xc5 => 0x00af, # MACRON
+ 0xc6 => 0x02d8, # BREVE
+ 0xc7 => 0x02d9, # DOT ABOVE
+ 0xc8 => 0x00a8, # DIAERESIS
+ 0xc9 => 0x00b2, # SUPERSCRIPT TWO
+ 0xca => 0x02da, # RING ABOVE
+ 0xcb => 0x00b8, # CEDILLA
+ 0xcc => 0x00b3, # SUPERSCRIPT THREE
+ 0xcd => 0x02dd, # DOUBLE ACUTE ACCENT
+ 0xce => 0x02db, # OGONEK
+ 0xcf => 0x02c7, # CARON
+ 0xd0 => 0x2014, # EM DASH
+ 0xd1 => 0x00b1, # PLUS-MINUS SIGN
+ 0xd2 => 0x00bc, # VULGAR FRACTION ONE QUARTER
+ 0xd3 => 0x00bd, # VULGAR FRACTION ONE HALF
+ 0xd4 => 0x00be, # VULGAR FRACTION THREE QUARTERS
+ 0xd5 => 0x00e0, # LATIN SMALL LETTER A WITH GRAVE
+ 0xd6 => 0x00e1, # LATIN SMALL LETTER A WITH ACUTE
+ 0xd7 => 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX
+ 0xd8 => 0x00e3, # LATIN SMALL LETTER A WITH TILDE
+ 0xd9 => 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS
+ 0xda => 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE
+ 0xdb => 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA
+ 0xdc => 0x00e8, # LATIN SMALL LETTER E WITH GRAVE
+ 0xdd => 0x00e9, # LATIN SMALL LETTER E WITH ACUTE
+ 0xde => 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX
+ 0xdf => 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS
+ 0xe0 => 0x00ec, # LATIN SMALL LETTER I WITH GRAVE
+ 0xe1 => 0x00c6, # LATIN CAPITAL LETTER AE
+ 0xe2 => 0x00ed, # LATIN SMALL LETTER I WITH ACUTE
+ 0xe3 => 0x00aa, # FEMININE ORDINAL INDICATOR
+ 0xe4 => 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX
+ 0xe5 => 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS
+ 0xe6 => 0x00f0, # LATIN SMALL LETTER ETH
+ 0xe7 => 0x00f1, # LATIN SMALL LETTER N WITH TILDE
+ 0xe8 => 0x0141, # LATIN CAPITAL LETTER L WITH STROKE
+ 0xe9 => 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE
+ 0xea => 0x0152, # LATIN CAPITAL LIGATURE OE
+ 0xeb => 0x00ba, # MASCULINE ORDINAL INDICATOR
+ 0xec => 0x00f2, # LATIN SMALL LETTER O WITH GRAVE
+ 0xed => 0x00f3, # LATIN SMALL LETTER O WITH ACUTE
+ 0xee => 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX
+ 0xef => 0x00f5, # LATIN SMALL LETTER O WITH TILDE
+ 0xf0 => 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS
+ 0xf1 => 0x00e6, # LATIN SMALL LETTER AE
+ 0xf2 => 0x00f9, # LATIN SMALL LETTER U WITH GRAVE
+ 0xf3 => 0x00fa, # LATIN SMALL LETTER U WITH ACUTE
+ 0xf4 => 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX
+ 0xf5 => 0x0131, # LATIN SMALL LETTER DOTLESS I
+ 0xf6 => 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS
+ 0xf7 => 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE
+ 0xf8 => 0x0142, # LATIN SMALL LETTER L WITH STROKE
+ 0xf9 => 0x00f8, # LATIN SMALL LETTER O WITH STROKE
+ 0xfa => 0x0153, # LATIN SMALL LIGATURE OE
+ 0xfb => 0x00df, # LATIN SMALL LETTER SHARP S
+ 0xfc => 0x00fe, # LATIN SMALL LETTER THORN
+ 0xfd => 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS
+ 0xfe => 0xfffd, # .notdef, REPLACEMENT CHARACTER
+ 0xff => 0xfffd, # .notdef, REPLACEMENT CHARACTER
+ }.freeze
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/unicode/quote_maps.rb b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/unicode/quote_maps.rb
new file mode 100644
index 0000000..b051232
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/unicode/quote_maps.rb
@@ -0,0 +1,57 @@
+# frozen-string-literal: true
+module Nanaimo
+ module Unicode
+ QUOTE_MAP = {
+ "\a" => "\\a",
+ "\b" => "\\b",
+ "\f" => "\\f",
+ "\r" => "\\r",
+ "\t" => "\\t",
+ "\v" => "\\v",
+ "\n" => "\\n",
+ "\"" => "\\\"",
+ "\\" => "\\\\",
+ "\x00" => "\\U0000",
+ "\x01" => "\\U0001",
+ "\x02" => "\\U0002",
+ "\x03" => "\\U0003",
+ "\x04" => "\\U0004",
+ "\x05" => "\\U0005",
+ "\x06" => "\\U0006",
+ "\x0E" => "\\U000e",
+ "\x0F" => "\\U000f",
+ "\x10" => "\\U0010",
+ "\x11" => "\\U0011",
+ "\x12" => "\\U0012",
+ "\x13" => "\\U0013",
+ "\x14" => "\\U0014",
+ "\x15" => "\\U0015",
+ "\x16" => "\\U0016",
+ "\x17" => "\\U0017",
+ "\x18" => "\\U0018",
+ "\x19" => "\\U0019",
+ "\x1A" => "\\U001a",
+ "\e" => "\\U001b",
+ "\x1C" => "\\U001c",
+ "\x1D" => "\\U001d",
+ "\x1E" => "\\U001e",
+ "\x1F" => "\\U001f",
+ }.freeze
+
+ UNQUOTE_MAP = {
+ "\n" => "\n",
+ "a" => "\a",
+ "b" => "\b",
+ "f" => "\f",
+ "r" => "\r",
+ "t" => "\t",
+ "v" => "\v",
+ "n" => "\n",
+ "'" => "'",
+ "\"" => "\"",
+ "\\" => "\\",
+ }.freeze
+
+ QUOTE_REGEXP = /\x07|\x08|\f|\r|\t|\v|\n|"|\\|\x00|\x01|\x02|\x03|\x04|\x05|\x06|\x0E|\x0F|\x10|\x11|\x12|\x13|\x14|\x15|\x16|\x17|\x18|\x19|\x1A|\x1B|\x1C|\x1D|\x1E|\x1F/
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/version.rb b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/version.rb
new file mode 100644
index 0000000..f3e778c
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/version.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+module Nanaimo
+ VERSION = '0.4.0'
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/writer.rb b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/writer.rb
new file mode 100644
index 0000000..256e8ed
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/writer.rb
@@ -0,0 +1,206 @@
+# frozen_string_literal: true
+
+module Nanaimo
+ # Transforms native ruby objects or Plist objects into their ASCII Plist
+ # string representation.
+ #
+ class Writer
+ autoload :PBXProjWriter, 'nanaimo/writer/pbxproj'
+ autoload :XMLWriter, 'nanaimo/writer/xml'
+
+ # Raised when attempting to write a plist containing an object of an
+ # unsupported type.
+ #
+ class UnsupportedPlistTypeError < Error
+ def initialize(plist_format, object)
+ @plist_format = plist_format
+ @object = object
+ end
+
+ def to_s
+ "Unable to write #{@object.inspect}. " \
+ "`#{@object.class}` is an invalid object type to serialize in a #{@plist_format} plist."
+ end
+ end
+
+ # The magic comment that denotes a UTF8-encoded plist.
+ #
+ UTF8 = "// !$*UTF8*$!\n"
+
+ # @param plist [Plist,String,Hash,Array] The plist object to write
+ # @param pretty [Boolean] Whether to serialize annotations and add
+ # spaces and newlines to make output more legible
+ # @param output [#<<] The output stream to write the plist to
+ #
+ def initialize(plist, pretty: true, output: ::String.new, strict: true)
+ @plist = plist
+ @pretty = pretty
+ @output = output
+ @indent = 0
+ @newlines = true
+ @strict = strict
+ end
+
+ # Writes the plist to the given output.
+ #
+ def write
+ write_utf8
+ write_object(@plist.root_object)
+ write_newline
+ end
+
+ attr_reader :indent, :pretty, :output, :newlines, :strict
+ private :indent, :pretty, :output, :newlines, :strict
+
+ private
+
+ def plist_format
+ :ascii
+ end
+
+ def write_utf8
+ output << UTF8
+ end
+
+ def write_newline
+ output << if newlines
+ "\n"
+ else
+ ' '
+ end
+ end
+
+ def write_object(object)
+ case object
+ when Array, ::Array
+ write_array(object)
+ when Dictionary, ::Hash
+ write_dictionary(object)
+ when QUOTED_STRING_REGEXP, QuotedString
+ write_quoted_string(object)
+ when String, ::String, Symbol
+ write_string(object)
+ when Data
+ write_data(object)
+ else
+ raise UnsupportedPlistTypeError.new(plist_format, object) if strict
+ write_string_quoted_if_necessary(object)
+ end
+ write_annotation(object) if pretty
+ output
+ end
+
+ QUOTED_STRING_REGEXP = %r{\A\z|[^\w\.\$/]|\A___}
+ private_constant :QUOTED_STRING_REGEXP
+
+ def write_string_quoted_if_necessary(object)
+ string = object.to_s
+ string =~ QUOTED_STRING_REGEXP ? write_quoted_string(string) : write_string(string)
+ end
+
+ def write_string(object)
+ output << value_for(object).to_s
+ end
+
+ def write_quoted_string(object)
+ output << '"' << Unicode.quotify_string(value_for(object)) << '"'
+ end
+
+ def write_data(object)
+ output << '<'
+ value_for(object).unpack('H*').first.chars.each_with_index do |c, i|
+ output << "\n" if i > 0 && (i % 16).zero?
+ output << ' ' if i > 0 && (i % 4).zero?
+ output << c
+ end
+ output << '>'
+ end
+
+ def write_array(object)
+ write_array_start
+ value = value_for(object)
+ value.each do |v|
+ write_array_element(v)
+ end
+ write_array_end
+ end
+
+ def write_array_start
+ output << '('
+ write_newline if newlines
+ push_indent!
+ end
+
+ def write_array_end
+ pop_indent!
+ write_indent
+ output << ')'
+ end
+
+ def write_array_element(object)
+ write_indent
+ write_object(object)
+ output << ','
+ write_newline
+ end
+
+ def write_dictionary(object)
+ write_dictionary_start
+ value = value_for(object)
+ value.each do |key, val|
+ write_dictionary_key_value_pair(key, val)
+ end
+ write_dictionary_end
+ end
+
+ def write_dictionary_start
+ output << '{'
+ write_newline if newlines
+ push_indent!
+ end
+
+ def write_dictionary_end
+ pop_indent!
+ write_indent
+ output << '}'
+ end
+
+ def write_dictionary_key_value_pair(key, value)
+ write_indent
+ write_object(key)
+ output << ' = '
+ write_object(value)
+ output << ';'
+ write_newline
+ end
+
+ def write_annotation(object)
+ return output unless object.is_a?(Nanaimo::Object)
+ annotation = object.annotation
+ return output unless annotation && !annotation.empty?
+ output << " /*#{annotation}*/"
+ end
+
+ def value_for(object)
+ if object.is_a?(Nanaimo::Object)
+ object.value
+ else
+ object
+ end
+ end
+
+ def push_indent!
+ @indent += 1
+ end
+
+ def pop_indent!
+ @indent -= 1
+ @indent = 0 if @indent < 0
+ end
+
+ def write_indent
+ output << "\t" * indent if newlines
+ output
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/writer/pbxproj.rb b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/writer/pbxproj.rb
new file mode 100644
index 0000000..6f91963
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/writer/pbxproj.rb
@@ -0,0 +1,83 @@
+# frozen_string_literal: true
+
+module Nanaimo
+ class Writer
+ # Transforms native ruby objects or Plist objects into their ASCII Plist
+ # string representation, formatted as Xcode writes Xcode projects.
+ #
+ class PBXProjWriter < Writer
+ ISA = String.new('isa', '')
+ private_constant :ISA
+
+ def initialize(plist, **args)
+ super(plist, **args)
+ @objects_section = false
+ end
+
+ private
+
+ def write_dictionary(object)
+ n = newlines
+ @newlines = false if flat_dictionary?(object)
+ return super(sort_dictionary(object)) unless @objects_section
+ @objects_section = false
+ write_dictionary_start
+ value = value_for(object)
+ objects_by_isa = value.group_by { |_k, v| isa_for(v) }
+ objects_by_isa.each do |isa, kvs|
+ write_newline
+ output << "/* Begin #{isa} section */"
+ write_newline
+ sort_dictionary(kvs, key_can_be_isa: false).each do |k, v|
+ write_dictionary_key_value_pair(k, v)
+ end
+ output << "/* End #{isa} section */"
+ write_newline
+ end
+ write_dictionary_end
+ ensure
+ @newlines = n
+ end
+
+ def write_dictionary_key_value_pair(k, v)
+ # since the objects section is always at the top-level,
+ # we can avoid checking if we're starting the 'objects'
+ # section if we're further "indented" (aka deeper) in the project
+ @objects_section = true if indent == 1 && value_for(k) == 'objects'
+
+ super
+ end
+
+ def sort_dictionary(dictionary, key_can_be_isa: true)
+ hash = value_for(dictionary)
+ hash.sort_by do |k, _v|
+ k = value_for(k)
+ if key_can_be_isa
+ k == 'isa' ? '' : k
+ else
+ k
+ end
+ end
+ end
+
+ def isa_for(dictionary)
+ dictionary = value_for(dictionary)
+ return unless dictionary.is_a?(Hash)
+ if isa = dictionary['isa']
+ value_for(isa)
+ elsif isa = dictionary[ISA]
+ value_for(isa)
+ end
+ end
+
+ def flat_dictionary?(dictionary)
+ case isa_for(dictionary)
+ when 'PBXBuildFile', 'PBXFileReference'
+ true
+ else
+ false
+ end
+ end
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/writer/xml.rb b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/writer/xml.rb
new file mode 100644
index 0000000..869fe61
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/writer/xml.rb
@@ -0,0 +1,139 @@
+# frozen_string_literal: true
+
+autoload :Base64, 'base64'
+autoload :Date, 'date'
+autoload :DateTime, 'date'
+
+module Nanaimo
+ class Writer
+ # Transforms native ruby objects or Plist objects into their XML Plist
+ # string representation.
+ #
+ class XMLWriter < Writer
+ def write
+ write_xml_header
+ write_object(@plist.root_object)
+ write_newline
+ write_xml_footer
+ end
+
+ private
+
+ def plist_format
+ :xml
+ end
+
+ def write_object(object)
+ case object
+ when Float, Integer
+ write_number(object)
+ when Time, Date, DateTime
+ write_date(object)
+ when true, false
+ write_boolean(object)
+ else
+ super
+ end
+ end
+
+ def write_xml_header
+ output << <<-EOS
+
+
+
+ EOS
+ end
+
+ def write_xml_footer
+ output << <<-EOS
+
+ EOS
+ end
+
+ def write_annotation(_)
+ end
+
+ def write_number(object)
+ type = object.integer? ? 'integer' : 'real'
+ output << "<#{type}>#{object}#{type}>"
+ end
+
+ def write_boolean(object)
+ output << "<#{object}/>"
+ end
+
+ def write_date(object)
+ output << '' << object.iso8601 << ''
+ end
+
+ def write_string(object)
+ output << '' << Unicode.xml_escape_string(value_for(object)) << ''
+ end
+
+ def write_quoted_string(object)
+ write_string(object)
+ end
+
+ def write_data(object)
+ output << ''
+ data = Base64.encode64(value_for(object)).delete("\n")
+ data = data.scan(/.{1,76}/).join("\n") if pretty
+ output << data << ''
+ end
+
+ def write_array(object)
+ return output << '' if value_for(object).empty?
+ super
+ end
+
+ def write_array_start
+ output << ''
+ write_newline if newlines
+ push_indent!
+ end
+
+ def write_array_end
+ pop_indent!
+ write_indent
+ output << ''
+ end
+
+ def write_array_element(object)
+ write_indent
+ write_object(object)
+ write_newline
+ end
+
+ def write_dictionary(object)
+ object = value_for(object)
+ return output << '' if object.empty?
+ keys = object.keys.sort_by(&:to_s)
+ object = keys.each_with_object({}) do |key, hash|
+ hash[key.to_s] = object[key]
+ end
+ super(object)
+ end
+
+ def write_dictionary_start
+ output << ''
+ write_newline if newlines
+ push_indent!
+ end
+
+ def write_dictionary_end
+ pop_indent!
+ write_indent
+ output << ''
+ end
+
+ def write_dictionary_key_value_pair(key, value)
+ write_indent
+ output << '' << Unicode.xml_escape_string(value_for(key)) << ''
+ write_newline
+ write_indent
+ write_object(value)
+ write_newline
+ end
+ end
+ end
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/nanaimo.gemspec b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/nanaimo.gemspec
new file mode 100644
index 0000000..7cf888f
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/nanaimo.gemspec
@@ -0,0 +1,28 @@
+# coding: utf-8
+# frozen_string_literal: true
+
+lib = File.expand_path('../lib', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+require 'nanaimo/version'
+
+Gem::Specification.new do |spec|
+ spec.name = 'nanaimo'
+ spec.version = Nanaimo::VERSION
+ spec.authors = ['Danielle Tomlinson', 'Samuel Giddins']
+ spec.email = ['dan@tomlinson.io', 'segiddins@segiddins.me']
+
+ spec.summary = 'A library for (de)serialization of ASCII Plists.'
+ spec.homepage = 'https://github.com/CocoaPods/Nanaimo'
+ spec.license = 'MIT'
+
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
+ spec.bindir = 'exe'
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
+ spec.require_paths = ['lib']
+
+ spec.required_ruby_version = '>= 2.3.0'
+
+ spec.add_development_dependency 'bundler', '~> 2.3'
+ spec.add_development_dependency 'rake', '~> 12.3'
+ spec.add_development_dependency 'rspec', '~> 3.0'
+end
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.git-blame-ignore-revs b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.git-blame-ignore-revs
new file mode 100644
index 0000000..9434cab
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.git-blame-ignore-revs
@@ -0,0 +1,7 @@
+# This is a file used by GitHub to ignore the following commits on `git blame`.
+#
+# You can also do the same thing in your local repository with:
+# $ git config --local blame.ignoreRevsFile .git-blame-ignore-revs
+
+# Expand tabs
+564b86c8de70b636d94df815c77c5989a7a45c3b
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.github/dependabot.yml b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.github/dependabot.yml
new file mode 100644
index 0000000..b18fd29
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.github/dependabot.yml
@@ -0,0 +1,6 @@
+version: 2
+updates:
+ - package-ecosystem: 'github-actions'
+ directory: '/'
+ schedule:
+ interval: 'weekly'
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.github/workflows/test.yml b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.github/workflows/test.yml
new file mode 100644
index 0000000..819a886
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.github/workflows/test.yml
@@ -0,0 +1,29 @@
+name: build
+
+on: [push, pull_request]
+
+jobs:
+ ruby-versions:
+ uses: ruby/actions/.github/workflows/ruby_versions.yml@master
+ with:
+ engine: cruby-jruby
+ min_version: 2.5
+
+ build:
+ needs: ruby-versions
+ name: build (${{ matrix.ruby }} / ${{ matrix.os }})
+ strategy:
+ matrix:
+ ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }}
+ os: [ ubuntu-latest, macos-latest ]
+ runs-on: ${{ matrix.os }}
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up Ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: ${{ matrix.ruby }}
+ - name: Install dependencies
+ run: bundle install
+ - name: Run test
+ run: rake compile test
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.gitignore b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.gitignore
new file mode 100644
index 0000000..fdd6ba5
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.gitignore
@@ -0,0 +1,14 @@
+/.bundle/
+/.yardoc
+/_yardoc/
+/coverage/
+/doc/
+/pkg/
+/spec/reports/
+/tmp/
+*.bundle
+*.dll
+*.so
+lib/nkf.jar
+.idea
+nkf.iml
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/Gemfile b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/Gemfile
new file mode 100644
index 0000000..ea0b59d
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/Gemfile
@@ -0,0 +1,5 @@
+source "https://rubygems.org"
+
+gem "rake"
+gem "rake-compiler"
+gem "test-unit"
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/LICENSE.txt b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/LICENSE.txt
new file mode 100644
index 0000000..a009cae
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/README.md b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/README.md
new file mode 100644
index 0000000..6b65862
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/README.md
@@ -0,0 +1,38 @@
+# NKF
+
+This is a Ruby Extension version of nkf (Network Kanji Filter).
+It converts the first argument and returns converted result. Conversion
+details are specified by flags as the first argument.
+
+## Installation
+
+Add this line to your application's Gemfile:
+
+```ruby
+gem 'nkf'
+```
+
+And then execute:
+
+ $ bundle install
+
+Or install it yourself as:
+
+ $ gem install nkf
+
+## Usage
+
+```ruby
+require 'nkf'
+output = NKF.nkf("-s", input)
+```
+
+## Development
+
+After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
+
+To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
+
+## Contributing
+
+Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/nkf.
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/Rakefile b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/Rakefile
new file mode 100644
index 0000000..042b220
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/Rakefile
@@ -0,0 +1,24 @@
+require "bundler/gem_tasks"
+require "rake/testtask"
+
+Rake::TestTask.new(:test) do |t|
+ t.libs << "test"
+ t.libs << "lib"
+ t.test_files = FileList["test/**/test_*.rb"]
+end
+
+if RUBY_ENGINE == "jruby"
+ require "rake/javaextensiontask"
+ Rake::JavaExtensionTask.new("nkf") do |ext|
+ ext.source_version = "1.8"
+ ext.target_version = "1.8"
+ ext.ext_dir = "ext/java"
+ end
+
+ task :build => :compile
+else
+ require 'rake/extensiontask'
+ Rake::ExtensionTask.new("nkf")
+end
+
+task :default => :test
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/bin/console b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/bin/console
new file mode 100644
index 0000000..e6c456e
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/bin/console
@@ -0,0 +1,14 @@
+#!/usr/bin/env ruby
+
+require "bundler/setup"
+require "nkf"
+
+# You can add fixtures and/or initialization code here to make experimenting
+# with your gem easier. You can also use a different console, if you like.
+
+# (If you use this, don't forget to add pry to your Gemfile!)
+# require "pry"
+# Pry.start
+
+require "irb"
+IRB.start(__FILE__)
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/bin/setup b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/bin/setup
new file mode 100644
index 0000000..dce67d8
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/bin/setup
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+set -euo pipefail
+IFS=$'\n\t'
+set -vx
+
+bundle install
+
+# Do any other automated setup that you need to do here
diff --git a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/ext/java/org/jruby/ext/nkf/Command.java b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/ext/java/org/jruby/ext/nkf/Command.java
new file mode 100644
index 0000000..16ac1a9
--- /dev/null
+++ b/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/ext/java/org/jruby/ext/nkf/Command.java
@@ -0,0 +1,58 @@
+/***** BEGIN LICENSE BLOCK *****
+ * Version: EPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Eclipse Public
+ * 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.eclipse.org/legal/epl-v20.html
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ * Copyright (C) 2011 Koichiro Ohba
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the LGPL, and not to allow others to
+ * use your version of this file under the terms of the EPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the EPL, the LGPL.
+ ***** END LICENSE BLOCK *****/
+
+package org.jruby.ext.nkf;
+
+import java.util.List;
+import java.util.ArrayList;
+
+public class Command {
+ private final List