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(/ 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. + +[![Build Status](https://img.shields.io/github/workflow/status/CocoaPods/claide/ci)](https://github.com/CocoaPods/claide/actions) +[![Gem Version](https://img.shields.io/gem/v/claide)](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 @@ +[![Gem Version](https://badge.fury.io/rb/colored2.svg)](https://badge.fury.io/rb/colored2) +[![Downloads](http://ruby-gem-downloads-badge.herokuapp.com/colored2?type=total)](https://rubygems.org/gems/colored2) +[![Gitter](https://img.shields.io/gitter/room/gitterHQ/gitter.svg)](https://gitter.im/colored2) + +[![Build Status](https://travis-ci.org/kigster/colored2.svg?branch=master)](https://travis-ci.org/kigster/colored2) +[![Test Coverage](https://codeclimate.com/github/kigster/colored2/badges/coverage.svg)](https://codeclimate.com/github/kigster/colored2/coverage) +[![Code Climate](https://codeclimate.com/github/kigster/colored2/badges/gpa.svg)](https://codeclimate.com/github/kigster/colored2) +[![Issue Count](https://codeclimate.com/github/kigster/colored2/badges/issue_count.svg)](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. + +![](doc/colored2-session1.png) + +### 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. + +![](doc/colored2-session2.png) + +## 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(//) + 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}" + 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