diff --git a/.gitignore b/.gitignore index 41f392c..25d74b2 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,8 @@ ffmpegreadme.md sliderreadme.md bottomsheet.md fastimage.md + +# Backup directories +backup_sdk54_upgrade/ +SDK54_UPGRADE_SUMMARY.md +SDK54_UPGRADE_SUMMARY.md diff --git a/android/app/build.gradle b/android/app/build.gradle index 2212a88..9590358 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -14,6 +14,7 @@ react { hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc" codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() + enableBundleCompression = (findProperty('android.enableBundleCompression') ?: false).toBoolean() // Use Expo CLI to bundle the app, this ensures the Metro config // works correctly with Expo projects. cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim()) @@ -63,9 +64,9 @@ react { } /** - * Set this to true to Run Proguard on Release builds to minify the Java bytecode. + * Set this to true in release builds to optimize the app using [R8](https://developer.android.com/topic/performance/app-optimization/enable-app-optimization). */ -def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean() +def enableMinifyInReleaseBuilds = (findProperty('android.enableMinifyInReleaseBuilds') ?: false).toBoolean() /** * The preferred build flavor of JavaScriptCore (JSC) @@ -78,7 +79,7 @@ def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInRelea * give correct results when using with locales other than en-US. Note that * this variant is about 6MiB larger per architecture than default. */ -def jscFlavor = 'org.webkit:android-jsc:+' +def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+' apply from: new File(["node", "--print", "require('path').dirname(require.resolve('@sentry/react-native/package.json'))"].execute().text.trim(), "sentry.gradle") @@ -95,15 +96,8 @@ android { targetSdkVersion rootProject.ext.targetSdkVersion versionCode 19 versionName "1.2.4" - } - - splits { - abi { - reset() - enable true - universalApk false // If true, also generate a universal APK - include "arm64-v8a", "armeabi-v7a", "x86", "x86_64" - } + + buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "\"${findProperty('reactNativeReleaseLevel') ?: 'stable'}\"" } signingConfigs { debug { @@ -121,15 +115,18 @@ android { // Caution! In production, you need to generate your own keystore file. // see https://reactnative.dev/docs/signed-apk-android. signingConfig signingConfigs.debug - shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false) - minifyEnabled enableProguardInReleaseBuilds + def enableShrinkResources = findProperty('android.enableShrinkResourcesInReleaseBuilds') ?: 'false' + shrinkResources enableShrinkResources.toBoolean() + minifyEnabled enableMinifyInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - crunchPngs (findProperty('android.enablePngCrunchInReleaseBuilds')?.toBoolean() ?: true) + def enablePngCrunchInRelease = findProperty('android.enablePngCrunchInReleaseBuilds') ?: 'true' + crunchPngs enablePngCrunchInRelease.toBoolean() } } packagingOptions { jniLibs { - useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false) + def enableLegacyPackaging = findProperty('expo.useLegacyPackaging') ?: 'false' + useLegacyPackaging enableLegacyPackaging.toBoolean() } } androidResources { @@ -167,15 +164,15 @@ dependencies { if (isGifEnabled) { // For animated gif support - implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}") + implementation("com.facebook.fresco:animated-gif:${expoLibs.versions.fresco.get()}") } if (isWebpEnabled) { // For webp support - implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}") + implementation("com.facebook.fresco:webpsupport:${expoLibs.versions.fresco.get()}") if (isWebpAnimatedEnabled) { // Animated webp support - implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}") + implementation("com.facebook.fresco:animated-webp:${expoLibs.versions.fresco.get()}") } } diff --git a/android/app/src/debugOptimized/AndroidManifest.xml b/android/app/src/debugOptimized/AndroidManifest.xml new file mode 100644 index 0000000..3ec2507 --- /dev/null +++ b/android/app/src/debugOptimized/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 6259c1b..667d1f0 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ - + @@ -29,7 +29,6 @@ - diff --git a/android/app/src/main/java/com/nuvio/app/MainApplication.kt b/android/app/src/main/java/com/nuvio/app/MainApplication.kt index 31160e6..2a6f8de 100644 --- a/android/app/src/main/java/com/nuvio/app/MainApplication.kt +++ b/android/app/src/main/java/com/nuvio/app/MainApplication.kt @@ -5,13 +5,13 @@ import android.content.res.Configuration import com.facebook.react.PackageList import com.facebook.react.ReactApplication +import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative import com.facebook.react.ReactNativeHost import com.facebook.react.ReactPackage import com.facebook.react.ReactHost -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load +import com.facebook.react.common.ReleaseLevel +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint import com.facebook.react.defaults.DefaultReactNativeHost -import com.facebook.react.soloader.OpenSourceMergedSoMapping -import com.facebook.soloader.SoLoader import expo.modules.ApplicationLifecycleDispatcher import expo.modules.ReactNativeHostWrapper @@ -19,21 +19,19 @@ import expo.modules.ReactNativeHostWrapper class MainApplication : Application(), ReactApplication { override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper( - this, - object : DefaultReactNativeHost(this) { - override fun getPackages(): List { - val packages = PackageList(this).packages - // Packages that cannot be autolinked yet can be added manually here, for example: - // packages.add(new MyReactNativePackage()); - return packages - } + this, + object : DefaultReactNativeHost(this) { + override fun getPackages(): List = + PackageList(this).packages.apply { + // Packages that cannot be autolinked yet can be added manually here, for example: + // add(MyReactNativePackage()) + } override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry" override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED - override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED } ) @@ -42,11 +40,12 @@ class MainApplication : Application(), ReactApplication { override fun onCreate() { super.onCreate() - SoLoader.init(this, OpenSourceMergedSoMapping) - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - // If you opted-in for the New Architecture, we load the native entry point for this app. - load() + DefaultNewArchitectureEntryPoint.releaseLevel = try { + ReleaseLevel.valueOf(BuildConfig.REACT_NATIVE_RELEASE_LEVEL.uppercase()) + } catch (e: IllegalArgumentException) { + ReleaseLevel.STABLE } + loadReactNative(this) ApplicationLifecycleDispatcher.onApplicationCreate(this) } diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 7ee63e3..1dee011 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -1,17 +1,11 @@ - - diff --git a/android/build.gradle b/android/build.gradle index abbcb8e..0554dd1 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,41 +1,24 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext { - buildToolsVersion = findProperty('android.buildToolsVersion') ?: '35.0.0' - minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '24') - compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '35') - targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34') - kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.25' - - ndkVersion = "26.1.10909125" - } - repositories { - google() - mavenCentral() - } - dependencies { - classpath('com.android.tools.build:gradle') - classpath('com.facebook.react:react-native-gradle-plugin') - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin') - } + repositories { + google() + mavenCentral() + } + dependencies { + classpath('com.android.tools.build:gradle') + classpath('com.facebook.react:react-native-gradle-plugin') + classpath('org.jetbrains.kotlin:kotlin-gradle-plugin') + } } -apply plugin: "com.facebook.react.rootproject" - allprojects { - repositories { - maven { - // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm - url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android')) - } - maven { - // Android JSC is installed from npm - url(new File(['node', '--print', "require.resolve('jsc-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), '../dist')) - } - - google() - mavenCentral() - maven { url 'https://www.jitpack.io' } - } + repositories { + google() + mavenCentral() + maven { url 'https://www.jitpack.io' } + } } + +apply plugin: "expo-root-project" +apply plugin: "com.facebook.react.rootproject" diff --git a/android/gradle.properties b/android/gradle.properties index bc2e641..8e39f82 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -15,7 +15,7 @@ org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true +org.gradle.parallel=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app's APK @@ -41,6 +41,11 @@ newArchEnabled=true # If set to false, you will be using JSC instead. hermesEnabled=true +# Use this property to enable edge-to-edge display support. +# This allows your app to draw behind system bars for an immersive UI. +# Note: Only works with ReactActivity and should not be used with custom Activity. +edgeToEdgeEnabled=true + # Enable GIF support in React Native images (~200 B increase) expo.gif.enabled=true # Enable webp support in React Native images (~85 KB increase) @@ -54,8 +59,7 @@ EX_DEV_CLIENT_NETWORK_INSPECTOR=true # Use legacy packaging to compress native libraries in the resulting APK. expo.useLegacyPackaging=false -android.minSdkVersion=26 -RNVideo_media3Version=1.8.0 -# Whether the app is configured to use edge-to-edge via the app config or `react-native-edge-to-edge` plugin -expo.edgeToEdgeEnabled=false \ No newline at end of file +# Specifies whether the app is configured to use edge-to-edge via the app config or plugin +# WARNING: This property has been deprecated and will be removed in Expo SDK 55. Use `edgeToEdgeEnabled` or `react.edgeToEdgeEnabled` to determine whether the project is using edge-to-edge. +expo.edgeToEdgeEnabled=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar index a4b76b9..1b33c55 100644 Binary files a/android/gradle/wrapper/gradle-wrapper.jar and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 79eb9d0..d4081da 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/android/gradlew b/android/gradlew index f5feea6..7f94d3d 100755 --- a/android/gradlew +++ b/android/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -214,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/android/gradlew.bat b/android/gradlew.bat index 9b42019..5eed7ee 100644 --- a/android/gradlew.bat +++ b/android/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/android/settings.gradle b/android/settings.gradle index a39f8ed..ce00a2f 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,38 +1,39 @@ pluginManagement { - includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().toString()) + def reactNativeGradlePlugin = new File( + providers.exec { + workingDir(rootDir) + commandLine("node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })") + }.standardOutput.asText.get().trim() + ).getParentFile().absolutePath + includeBuild(reactNativeGradlePlugin) + + def expoPluginsPath = new File( + providers.exec { + workingDir(rootDir) + commandLine("node", "--print", "require.resolve('expo-modules-autolinking/package.json', { paths: [require.resolve('expo/package.json')] })") + }.standardOutput.asText.get().trim(), + "../android/expo-gradle-plugin" + ).absolutePath + includeBuild(expoPluginsPath) +} + +plugins { + id("com.facebook.react.settings") + id("expo-autolinking-settings") } -plugins { id("com.facebook.react.settings") } extensions.configure(com.facebook.react.ReactSettingsExtension) { ex -> if (System.getenv('EXPO_USE_COMMUNITY_AUTOLINKING') == '1') { ex.autolinkLibrariesFromCommand() } else { - def 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', - 'android' - ].toList() - ex.autolinkLibrariesFromCommand(command) + ex.autolinkLibrariesFromCommand(expoAutolinking.rnConfigCommand) } } +expoAutolinking.useExpoModules() rootProject.name = 'Nuvio' -dependencyResolutionManagement { - versionCatalogs { - reactAndroidLibs { - from(files(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../gradle/libs.versions.toml"))) - } - } -} - -apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle"); -useExpoModules() +expoAutolinking.useExpoVersionCatalog() include ':app' -includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile()) +includeBuild(expoAutolinking.reactNativeGradlePlugin) diff --git a/babel.config.js b/babel.config.js index 25fa974..a5c5a10 100644 --- a/babel.config.js +++ b/babel.config.js @@ -3,7 +3,7 @@ module.exports = function (api) { return { presets: ['babel-preset-expo'], plugins: [ - 'react-native-reanimated/plugin', + 'react-native-worklets/plugin', ], env: { production: { diff --git a/ios/Nuvio/KSPlayerManager.m b/backup_sdk54_upgrade/KSPlayerManager.m similarity index 100% rename from ios/Nuvio/KSPlayerManager.m rename to backup_sdk54_upgrade/KSPlayerManager.m diff --git a/ios/Nuvio/KSPlayerModule.swift b/backup_sdk54_upgrade/KSPlayerModule.swift similarity index 100% rename from ios/Nuvio/KSPlayerModule.swift rename to backup_sdk54_upgrade/KSPlayerModule.swift diff --git a/ios/Nuvio/KSPlayerView.swift b/backup_sdk54_upgrade/KSPlayerView.swift similarity index 100% rename from ios/Nuvio/KSPlayerView.swift rename to backup_sdk54_upgrade/KSPlayerView.swift diff --git a/ios/Nuvio/KSPlayerViewManager.swift b/backup_sdk54_upgrade/KSPlayerViewManager.swift similarity index 100% rename from ios/Nuvio/KSPlayerViewManager.swift rename to backup_sdk54_upgrade/KSPlayerViewManager.swift diff --git a/backup_sdk54_upgrade/NATIVE_MODIFICATIONS_GUIDE.md b/backup_sdk54_upgrade/NATIVE_MODIFICATIONS_GUIDE.md new file mode 100644 index 0000000..66b0a0a --- /dev/null +++ b/backup_sdk54_upgrade/NATIVE_MODIFICATIONS_GUIDE.md @@ -0,0 +1,173 @@ +# Native Modifications Guide - SDK 54 Upgrade + +**Created:** October 14, 2025 +**From SDK:** 52 +**To SDK:** 54 + +## Overview + +This document records all custom native modifications made to the Nuvio app that need to be preserved during the Expo SDK 54 upgrade. + +--- + +## iOS Modifications + +### 1. KSPlayer Bridge Integration + +**Purpose:** Custom video player for iOS using KSPlayer library + +**Files Added/Modified:** +- `ios/KSPlayerManager.m` - Objective-C bridge header +- `ios/KSPlayerModule.swift` - Swift module for KSPlayer +- `ios/KSPlayerView.swift` - Main player view implementation +- `ios/KSPlayerViewManager.swift` - React Native view manager + +**Location in Xcode Project:** +- Files are in `ios/Nuvio/` directory +- Referenced in `ios/Nuvio.xcodeproj/project.pbxproj` + +**Podfile Dependencies (lines 52-56):** +```ruby +# 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 +``` + +**Features:** +- Custom video player with multi-codec support +- Audio track selection +- Subtitle track selection +- Advanced playback controls +- Header injection for streaming +- Multi-channel audio downmixing + +**Restoration Steps:** +1. Copy KSPlayer bridge files to `ios/` directory after prebuild +2. Add Podfile dependencies +3. Run `pod install` +4. Ensure files are linked in Xcode project + +--- + +## Android Modifications + +### 1. FFmpeg Audio Decoder Extension + +**Purpose:** Enable ExoPlayer to play AC3, E-AC3, DTS, TrueHD audio codecs via FFmpeg + +**Files Added:** +- `android/app/libs/lib-decoder-ffmpeg-release.aar` - FFmpeg decoder AAR from Media3 + +**build.gradle Modifications (line 189):** +```gradle +// Include only FFmpeg decoder AAR to avoid duplicates with Maven Media3 +implementation files("libs/lib-decoder-ffmpeg-release.aar") +``` + +**proguard-rules.pro Additions (lines 16-18):** +```proguard +# Media3 / ExoPlayer keep (extensions and reflection) +-keep class androidx.media3.** { *; } +-dontwarn androidx.media3.** +``` + +**Node Modules Modification:** +- File: `node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java` +- Change: Set extension renderer mode to PREFER to use FFmpeg decoders +```java +new DefaultRenderersFactory(getContext()) + .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER) +``` + +**Important Notes:** +- FFmpeg module provides AUDIO decoders only (AC3, E-AC3, DTS, TrueHD) +- Does NOT provide video decoders (HEVC/Dolby Vision rely on device hardware or VLC fallback) +- The AAR is from Just Player base (`exobase/app/libs`) + +**Restoration Steps:** +1. Copy `lib-decoder-ffmpeg-release.aar` to `android/app/libs/` +2. Add implementation line to `android/app/build.gradle` +3. Add keep rules to `android/app/proguard-rules.pro` +4. Modify `ReactExoplayerView.java` in node_modules (after npm install) + +--- + +## Application Logic Changes + +### Player Fallback Strategy + +**Modified Files:** +- `src/screens/StreamsScreen.tsx` - Removed MKV pre-forcing to VLC +- `src/components/player/AndroidVideoPlayer.tsx` - Error handler toggles `forceVlc` + +**Behavior:** +- Start with ExoPlayer + FFmpeg audio decoders by default +- On decoder errors (codec not supported), automatically switch to VLC +- Do not pre-force VLC based on file extension + +--- + +## Backup Location + +All backups are stored in: `/Users/nayifnoushad/Documents/Projects/NuvioStreaming/backup_sdk54_upgrade/` + +**Backup Contents:** +- `android_original/` - Complete Android directory +- `ios_original/` - Complete iOS directory (partial - Pods symlinks failed) +- `KSPlayerManager.m` - iOS bridge file +- `KSPlayerModule.swift` - iOS module file +- `KSPlayerView.swift` - iOS view file +- `KSPlayerViewManager.swift` - iOS view manager file +- `lib-decoder-ffmpeg-release.aar` - FFmpeg AAR +- `build.gradle.backup` - Android build.gradle +- `proguard-rules.pro.backup` - ProGuard rules +- `Podfile.backup` - iOS Podfile +- `package.json.backup` - Original package.json +- `ReactExoplayerView.java.backup` - Modified react-native-video file + +--- + +## SDK 54 Upgrade Process + +### Pre-Upgrade Checklist +- ✅ All native files backed up +- ✅ Custom modifications documented +- ✅ FFmpeg AAR preserved +- ✅ KSPlayer bridge files preserved +- ✅ Build configuration files backed up + +### Upgrade Steps +1. Update package.json to SDK 54 +2. Run `npx expo install` to update compatible packages +3. Run `npx expo prebuild --clean` to regenerate native projects +4. Restore Android FFmpeg integration +5. Restore iOS KSPlayer integration +6. Test builds on both platforms + +### Post-Upgrade Verification +- [ ] Android: FFmpeg audio decoders working (test AC3/DTS stream) +- [ ] iOS: KSPlayer bridge working +- [ ] Audio track selection functional +- [ ] Subtitle track selection functional +- [ ] VLC fallback working on decoder errors +- [ ] App builds successfully for both platforms + +--- + +## Critical Notes + +1. **react-native-video modification:** This must be reapplied after every `npm install` or package update +2. **FFmpeg limitations:** Audio codecs only - video codecs require hardware decoder or VLC +3. **KSPlayer Podfile:** Uses git branches, may need version pinning for stability +4. **Xcode project:** KSPlayer files must be linked in project.pbxproj after prebuild + +--- + +## References + +- FFmpeg integration guide: `ffmpegreadme.md` +- KSPlayer repo: https://github.com/kingslay/KSPlayer +- Expo SDK 54 changelog: https://expo.dev/changelog/2025/ + diff --git a/backup_sdk54_upgrade/Podfile.backup b/backup_sdk54_upgrade/Podfile.backup new file mode 100644 index 0000000..4516ea1 --- /dev/null +++ b/backup_sdk54_upgrade/Podfile.backup @@ -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/backup_sdk54_upgrade/ReactExoplayerView.java.backup b/backup_sdk54_upgrade/ReactExoplayerView.java.backup new file mode 100644 index 0000000..5ab082c --- /dev/null +++ b/backup_sdk54_upgrade/ReactExoplayerView.java.backup @@ -0,0 +1,2740 @@ +package com.brentvatne.exoplayer; + +import static androidx.media3.common.C.CONTENT_TYPE_DASH; +import static androidx.media3.common.C.CONTENT_TYPE_HLS; +import static androidx.media3.common.C.CONTENT_TYPE_OTHER; +import static androidx.media3.common.C.CONTENT_TYPE_RTSP; +import static androidx.media3.common.C.CONTENT_TYPE_SS; +import static androidx.media3.common.C.TIME_END_OF_SOURCE; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.ActivityManager; +import android.app.PictureInPictureParams; +import android.app.RemoteAction; +import android.app.AlertDialog; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.media.AudioManager; +import android.net.Uri; +import android.os.Build; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; +import android.view.ViewGroup; +import android.view.accessibility.CaptioningManager; +import android.widget.FrameLayout; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.activity.OnBackPressedCallback; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.media3.common.AudioAttributes; +import androidx.media3.common.C; +import androidx.media3.common.Format; +import androidx.media3.common.MediaItem; +import androidx.media3.common.MediaMetadata; +import androidx.media3.common.Metadata; +import androidx.media3.common.PlaybackException; +import androidx.media3.common.PlaybackParameters; +import androidx.media3.common.Player; +import androidx.media3.common.StreamKey; +import androidx.media3.common.Timeline; +import androidx.media3.common.TrackGroup; +import androidx.media3.common.TrackSelectionOverride; +import androidx.media3.common.Tracks; +import androidx.media3.common.text.CueGroup; +import androidx.media3.common.util.Util; +import androidx.media3.datasource.DataSource; +import androidx.media3.datasource.DataSpec; +import androidx.media3.datasource.HttpDataSource; +import androidx.media3.exoplayer.DefaultLoadControl; +import androidx.media3.exoplayer.DefaultRenderersFactory; +import androidx.media3.exoplayer.ExoPlayer; +import androidx.media3.exoplayer.dash.DashMediaSource; +import androidx.media3.exoplayer.dash.DashUtil; +import androidx.media3.exoplayer.dash.DefaultDashChunkSource; +import androidx.media3.exoplayer.dash.manifest.AdaptationSet; +import androidx.media3.exoplayer.dash.manifest.DashManifest; +import androidx.media3.exoplayer.dash.manifest.Period; +import androidx.media3.exoplayer.dash.manifest.Representation; +import androidx.media3.exoplayer.drm.DefaultDrmSessionManager; +import androidx.media3.exoplayer.drm.DefaultDrmSessionManagerProvider; +import androidx.media3.exoplayer.drm.DrmSessionEventListener; +import androidx.media3.exoplayer.drm.DrmSessionManager; +import androidx.media3.exoplayer.drm.DrmSessionManagerProvider; +import androidx.media3.exoplayer.drm.FrameworkMediaDrm; +import androidx.media3.exoplayer.drm.HttpMediaDrmCallback; +import androidx.media3.exoplayer.drm.UnsupportedDrmException; +import androidx.media3.exoplayer.hls.HlsMediaSource; +import androidx.media3.exoplayer.ima.ImaAdsLoader; +import androidx.media3.exoplayer.mediacodec.MediaCodecInfo; +import androidx.media3.exoplayer.mediacodec.MediaCodecUtil; +import androidx.media3.exoplayer.rtsp.RtspMediaSource; +import androidx.media3.exoplayer.smoothstreaming.DefaultSsChunkSource; +import androidx.media3.exoplayer.smoothstreaming.SsMediaSource; +import androidx.media3.exoplayer.source.ClippingMediaSource; +import androidx.media3.exoplayer.source.DefaultMediaSourceFactory; +import androidx.media3.exoplayer.source.MediaSource; +import androidx.media3.exoplayer.source.MergingMediaSource; +import androidx.media3.exoplayer.source.ProgressiveMediaSource; +import androidx.media3.exoplayer.source.TrackGroupArray; +import androidx.media3.exoplayer.source.ads.AdsMediaSource; +import androidx.media3.exoplayer.trackselection.AdaptiveTrackSelection; +import androidx.media3.exoplayer.trackselection.DefaultTrackSelector; +import androidx.media3.exoplayer.trackselection.ExoTrackSelection; +import androidx.media3.exoplayer.trackselection.MappingTrackSelector; +import androidx.media3.exoplayer.trackselection.TrackSelection; +import androidx.media3.exoplayer.trackselection.TrackSelectionArray; +import androidx.media3.exoplayer.upstream.BandwidthMeter; +import androidx.media3.exoplayer.upstream.CmcdConfiguration; +import androidx.media3.exoplayer.upstream.DefaultAllocator; +import androidx.media3.exoplayer.upstream.DefaultBandwidthMeter; +import androidx.media3.exoplayer.util.EventLogger; +import androidx.media3.extractor.metadata.emsg.EventMessage; +import androidx.media3.extractor.metadata.id3.Id3Frame; +import androidx.media3.extractor.metadata.id3.TextInformationFrame; +import androidx.media3.session.MediaSessionService; + +import com.brentvatne.common.api.AdsProps; +import com.brentvatne.common.api.BufferConfig; +import com.brentvatne.common.api.BufferingStrategy; +import com.brentvatne.common.api.ControlsConfig; +import com.brentvatne.common.api.DRMProps; +import com.brentvatne.common.api.ResizeMode; +import com.brentvatne.common.api.SideLoadedTextTrack; +import com.brentvatne.common.api.Source; +import com.brentvatne.common.api.SubtitleStyle; +import com.brentvatne.common.api.TimedMetadata; +import com.brentvatne.common.api.Track; +import com.brentvatne.common.api.VideoTrack; +import com.brentvatne.common.react.VideoEventEmitter; +import com.brentvatne.common.toolbox.DebugLog; +import com.brentvatne.common.toolbox.ReactBridgeUtils; +import com.brentvatne.react.BuildConfig; +import com.brentvatne.react.R; +import com.brentvatne.react.ReactNativeVideoManager; +import com.brentvatne.receiver.AudioBecomingNoisyReceiver; +import com.brentvatne.receiver.BecomingNoisyListener; +import com.brentvatne.receiver.PictureInPictureReceiver; +import com.facebook.react.bridge.LifecycleEventListener; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.UiThreadUtil; +import com.facebook.react.uimanager.ThemedReactContext; +import com.google.ads.interactivemedia.v3.api.AdError; +import com.google.ads.interactivemedia.v3.api.AdErrorEvent; +import com.google.ads.interactivemedia.v3.api.AdEvent; +import com.google.ads.interactivemedia.v3.api.ImaSdkFactory; +import com.google.ads.interactivemedia.v3.api.ImaSdkSettings; +import com.google.common.collect.ImmutableList; + +import java.net.CookieHandler; +import java.net.CookieManager; +import java.net.CookiePolicy; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +@SuppressLint("ViewConstructor") +public class ReactExoplayerView extends FrameLayout implements + LifecycleEventListener, + Player.Listener, + BandwidthMeter.EventListener, + BecomingNoisyListener, + DrmSessionEventListener, + AdEvent.AdEventListener, + AdErrorEvent.AdErrorListener { + + public static final double DEFAULT_MAX_HEAP_ALLOCATION_PERCENT = 1; + public static final double DEFAULT_MIN_BUFFER_MEMORY_RESERVE = 0; + + private static final String TAG = "ReactExoplayerView"; + + private static final CookieManager DEFAULT_COOKIE_MANAGER; + private static final int SHOW_PROGRESS = 1; + + static { + DEFAULT_COOKIE_MANAGER = new CookieManager(); + DEFAULT_COOKIE_MANAGER.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER); + } + + protected final VideoEventEmitter eventEmitter; + private final ReactExoplayerConfig config; + private DefaultBandwidthMeter bandwidthMeter; + private Player.Listener eventListener; + + private ExoPlayerView exoPlayerView; + private FullScreenPlayerView fullScreenPlayerView; + private ImaAdsLoader adsLoader; + + private DataSource.Factory mediaDataSourceFactory; + private ExoPlayer player; + private DefaultTrackSelector trackSelector; + private boolean playerNeedsSource; + private ServiceConnection playbackServiceConnection; + private PlaybackServiceBinder playbackServiceBinder; + + // logger to be enable by props + private EventLogger debugEventLogger = null; + private boolean enableDebug = false; + private static final String TAG_EVENT_LOGGER = "RNVExoplayer"; + + private int resumeWindow; + private long resumePosition; + private boolean loadVideoStarted; + private boolean isFullscreen; + private boolean isInBackground; + private boolean isPaused; + private boolean isBuffering; + private boolean muted = false; + public boolean enterPictureInPictureOnLeave = false; + private PictureInPictureParams.Builder pictureInPictureParamsBuilder; + private boolean hasAudioFocus = false; + private float rate = 1f; + private AudioOutput audioOutput = AudioOutput.SPEAKER; + private float audioVolume = 1f; + private int maxBitRate = 0; + private boolean hasDrmFailed = false; + private boolean isUsingContentResolution = false; + private boolean selectTrackWhenReady = false; + private final Handler mainHandler; + private Runnable mainRunnable; + private Runnable pipListenerUnsubscribe; + private boolean useCache = false; + private boolean disableCache = false; + private ControlsConfig controlsConfig = new ControlsConfig(); + private ArrayList rootViewChildrenOriginalVisibility = new ArrayList(); + + /* + * When user is seeking first called is on onPositionDiscontinuity -> DISCONTINUITY_REASON_SEEK + * Then we set if to false when playback is back in onIsPlayingChanged -> true + */ + private boolean isSeeking = false; + private long seekPosition = -1; + + // Props from React + private Source source = new Source(); + private boolean repeat; + private String audioTrackType; + private String audioTrackValue; + private String videoTrackType; + private String videoTrackValue; + private String textTrackType = "disabled"; + private String textTrackValue; + private boolean disableFocus; + private boolean focusable = true; + private BufferingStrategy.BufferingStrategyEnum bufferingStrategy; + private boolean disableDisconnectError; + private boolean preventsDisplaySleepDuringVideoPlayback = true; + private float mProgressUpdateInterval = 250.0f; + protected boolean playInBackground = false; + private boolean mReportBandwidth = false; + private boolean controls = false; + + private boolean showNotificationControls = false; + // \ End props + + // React + private final ThemedReactContext themedReactContext; + private final AudioManager audioManager; + private final AudioBecomingNoisyReceiver audioBecomingNoisyReceiver; + private final PictureInPictureReceiver pictureInPictureReceiver; + private final AudioManager.OnAudioFocusChangeListener audioFocusChangeListener; + + // store last progress event values to avoid sending unnecessary messages + private long lastPos = -1; + private long lastBufferDuration = -1; + private long lastDuration = -1; + + private boolean viewHasDropped = false; + private int selectedSpeedIndex = 1; // Default is 1.0x + + private final String instanceId = String.valueOf(UUID.randomUUID()); + + private CmcdConfiguration.Factory cmcdConfigurationFactory; + + public void setCmcdConfigurationFactory(CmcdConfiguration.Factory factory) { + this.cmcdConfigurationFactory = factory; + } + + private void updateProgress() { + if (player != null) { + if (exoPlayerView != null && isPlayingAd() && controls) { + exoPlayerView.hideController(); + } + long bufferedDuration = player.getBufferedPercentage() * player.getDuration() / 100; + long duration = player.getDuration(); + long pos = player.getCurrentPosition(); + if (pos > duration) { + pos = duration; + } + + if (lastPos != pos + || lastBufferDuration != bufferedDuration + || lastDuration != duration) { + lastPos = pos; + lastBufferDuration = bufferedDuration; + lastDuration = duration; + eventEmitter.onVideoProgress.invoke(pos, bufferedDuration, player.getDuration(), getPositionInFirstPeriodMsForCurrentWindow(pos)); + } + } + } + + private final Handler progressHandler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(Message msg) { + if (msg.what == SHOW_PROGRESS) { + updateProgress(); + msg = obtainMessage(SHOW_PROGRESS); + sendMessageDelayed(msg, Math.round(mProgressUpdateInterval)); + } + } + }; + + public double getPositionInFirstPeriodMsForCurrentWindow(long currentPosition) { + Timeline.Window window = new Timeline.Window(); + if(!player.getCurrentTimeline().isEmpty()) { + player.getCurrentTimeline().getWindow(player.getCurrentMediaItemIndex(), window); + } + return window.windowStartTimeMs + currentPosition; + } + + public ReactExoplayerView(ThemedReactContext context, ReactExoplayerConfig config) { + super(context); + this.themedReactContext = context; + this.eventEmitter = new VideoEventEmitter(); + this.config = config; + this.bandwidthMeter = config.getBandwidthMeter(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && pictureInPictureParamsBuilder == null) { + this.pictureInPictureParamsBuilder = new PictureInPictureParams.Builder(); + } + mainHandler = new Handler(); + + createViews(); + + audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); + themedReactContext.addLifecycleEventListener(this); + audioBecomingNoisyReceiver = new AudioBecomingNoisyReceiver(themedReactContext); + audioFocusChangeListener = new OnAudioFocusChangedListener(this, themedReactContext); + pictureInPictureReceiver = new PictureInPictureReceiver(this, themedReactContext); + } + + private boolean isPlayingAd() { + return player != null && player.isPlayingAd(); + } + + private void createViews() { + if (CookieHandler.getDefault() != DEFAULT_COOKIE_MANAGER) { + CookieHandler.setDefault(DEFAULT_COOKIE_MANAGER); + } + + LayoutParams layoutParams = new LayoutParams( + LayoutParams.MATCH_PARENT, + LayoutParams.MATCH_PARENT); + exoPlayerView = new ExoPlayerView(getContext()); + exoPlayerView.addOnLayoutChangeListener( (View v, int l, int t, int r, int b, int ol, int ot, int or, int ob) -> + PictureInPictureUtil.applySourceRectHint(themedReactContext, pictureInPictureParamsBuilder, exoPlayerView) + ); + exoPlayerView.setLayoutParams(layoutParams); + addView(exoPlayerView, 0, layoutParams); + + exoPlayerView.setFocusable(this.focusable); + } + + @Override + protected void onDetachedFromWindow() { + cleanupPlaybackService(); + super.onDetachedFromWindow(); + } + + // LifecycleEventListener implementation + @Override + public void onHostResume() { + if (!playInBackground || !isInBackground) { + setPlayWhenReady(!isPaused); + } + isInBackground = false; + } + + @Override + public void onHostPause() { + isInBackground = true; + Activity activity = themedReactContext.getCurrentActivity(); + boolean isInPictureInPicture = Util.SDK_INT >= Build.VERSION_CODES.N && activity != null && activity.isInPictureInPictureMode(); + boolean isInMultiWindowMode = Util.SDK_INT >= Build.VERSION_CODES.N && activity != null && activity.isInMultiWindowMode(); + if (playInBackground || isInPictureInPicture || isInMultiWindowMode) { + return; + } + setPlayWhenReady(false); + } + + @Override + public void onHostDestroy() { + cleanUpResources(); + } + + public void cleanUpResources() { + stopPlayback(); + themedReactContext.removeLifecycleEventListener(this); + releasePlayer(); + viewHasDropped = true; + } + + //BandwidthMeter.EventListener implementation + @Override + public void onBandwidthSample(int elapsedMs, long bytes, long bitrate) { + if (mReportBandwidth) { + if (player == null) { + eventEmitter.onVideoBandwidthUpdate.invoke(bitrate, 0, 0, null); + } else { + Format videoFormat = player.getVideoFormat(); + boolean isRotatedContent = videoFormat != null && (videoFormat.rotationDegrees == 90 || videoFormat.rotationDegrees == 270); + int width = videoFormat != null ? (isRotatedContent ? videoFormat.height : videoFormat.width) : 0; + int height = videoFormat != null ? (isRotatedContent ? videoFormat.width : videoFormat.height) : 0; + String trackId = videoFormat != null ? videoFormat.id : null; + eventEmitter.onVideoBandwidthUpdate.invoke(bitrate, height, width, trackId); + } + } + } + + // Internal methods + + /** + * Toggling the visibility of the player control view + */ + private void togglePlayerControlVisibility() { + if (player == null) return; + if (exoPlayerView.isControllerVisible()) { + exoPlayerView.hideController(); + } else { + exoPlayerView.showController(); + } + } + + private void initializePlayerControl() { + exoPlayerView.setPlayer(player); + + exoPlayerView.setControllerVisibilityListener(visibility -> { + boolean isVisible = visibility == View.VISIBLE; + eventEmitter.onControlsVisibilityChange.invoke(isVisible); + }); + + exoPlayerView.setFullscreenButtonClickListener(isFullscreen -> { + setFullscreen(!this.isFullscreen); + }); + + updateControllerConfig(); + } + + private void updateControllerConfig() { + if (exoPlayerView == null) return; + + exoPlayerView.setControllerShowTimeoutMs(5000); + + exoPlayerView.setControllerAutoShow(true); + exoPlayerView.setControllerHideOnTouch(true); + + updateControllerVisibility(); + } + + private void updateControllerVisibility() { + if (exoPlayerView == null) return; + + exoPlayerView.setUseController(!controlsConfig.getHideFullscreen()); + } + + private void openSettings() { + AlertDialog.Builder builder = new AlertDialog.Builder(themedReactContext); + builder.setTitle(R.string.settings); + String[] settingsOptions = {themedReactContext.getString(R.string.playback_speed)}; + builder.setItems(settingsOptions, (dialog, which) -> { + if (which == 0) { + showPlaybackSpeedOptions(); + } + }); + builder.show(); + } + + private void showPlaybackSpeedOptions() { + String[] speedOptions = {"0.5x", "1.0x", "1.5x", "2.0x"}; + AlertDialog.Builder builder = new AlertDialog.Builder(themedReactContext); + builder.setTitle(R.string.select_playback_speed); + + builder.setSingleChoiceItems(speedOptions, selectedSpeedIndex, (dialog, which) -> { + selectedSpeedIndex = which; + float speed = 1.0f; + switch (which) { + case 0: + speed = 0.5f; + break; + case 2: + speed = 1.5f; + break; + case 3: + speed = 2.0f; + break; + default: + speed = 1.0f;; + }; + setRateModifier(speed); + }); + builder.show(); + } + + private void addPlayerControl() { + updateControllerConfig(); + } + + /** + * Update the layout + * @param view view needs to update layout + * + * This is a workaround for the open bug in react-native: ... + */ + private void reLayout(View view) { + if (view == null) return; + view.measure(MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY)); + view.layout(view.getLeft(), view.getTop(), view.getMeasuredWidth(), view.getMeasuredHeight()); + } + + private void refreshControlsStyles() { + if (exoPlayerView == null || player == null || !controls) return; + updateControllerVisibility(); + } + + // Note: The following methods for live content and button visibility are no longer needed + // as PlayerView handles controls automatically. Some functionality may need to be + // reimplemented using PlayerView's APIs if custom behavior is required. + + private void reLayoutControls() { + reLayout(exoPlayerView); + } + + /// returns true is adaptive bitrate shall be used + public boolean isUsingVideoABR() { + return videoTrackType == null || "auto".equals(videoTrackType); + } + + public void setDebug(boolean enableDebug) { + this.enableDebug = enableDebug; + refreshDebugState(); + } + + private void refreshDebugState() { + if (player == null) { + return; + } + if (enableDebug) { + debugEventLogger = new EventLogger(TAG_EVENT_LOGGER); + player.addAnalyticsListener(debugEventLogger); + } else if (debugEventLogger != null) { + player.removeAnalyticsListener(debugEventLogger); + debugEventLogger = null; + } + } + + public void setViewType(int viewType) { + exoPlayerView.updateSurfaceView(viewType); + } + + private class RNVLoadControl extends DefaultLoadControl { + private final int availableHeapInBytes; + private final Runtime runtime; + public RNVLoadControl(DefaultAllocator allocator, BufferConfig config) { + super(allocator, + config.getMinBufferMs() != BufferConfig.Companion.getBufferConfigPropUnsetInt() + ? config.getMinBufferMs() + : DefaultLoadControl.DEFAULT_MIN_BUFFER_MS, + config.getMaxBufferMs() != BufferConfig.Companion.getBufferConfigPropUnsetInt() + ? config.getMaxBufferMs() + : DefaultLoadControl.DEFAULT_MAX_BUFFER_MS, + config.getBufferForPlaybackMs() != BufferConfig.Companion.getBufferConfigPropUnsetInt() + ? config.getBufferForPlaybackMs() + : DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS , + config.getBufferForPlaybackAfterRebufferMs() != BufferConfig.Companion.getBufferConfigPropUnsetInt() + ? config.getBufferForPlaybackAfterRebufferMs() + : DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS, + -1, + true, + config.getBackBufferDurationMs() != BufferConfig.Companion.getBufferConfigPropUnsetInt() + ? config.getBackBufferDurationMs() + : DefaultLoadControl.DEFAULT_BACK_BUFFER_DURATION_MS, + DefaultLoadControl.DEFAULT_RETAIN_BACK_BUFFER_FROM_KEYFRAME); + runtime = Runtime.getRuntime(); + ActivityManager activityManager = (ActivityManager) themedReactContext.getSystemService(ThemedReactContext.ACTIVITY_SERVICE); + double maxHeap = config.getMaxHeapAllocationPercent() != BufferConfig.Companion.getBufferConfigPropUnsetDouble() + ? config.getMaxHeapAllocationPercent() + : DEFAULT_MAX_HEAP_ALLOCATION_PERCENT; + availableHeapInBytes = (int) Math.floor(activityManager.getMemoryClass() * maxHeap * 1024 * 1024); + } + + @Override + public boolean shouldContinueLoading(long playbackPositionUs, long bufferedDurationUs, float playbackSpeed) { + if (bufferingStrategy == BufferingStrategy.BufferingStrategyEnum.DisableBuffering) { + return false; + } else if (bufferingStrategy == BufferingStrategy.BufferingStrategyEnum.DependingOnMemory) { + // The goal of this algorithm is to pause video loading (increasing the buffer) + // when available memory on device become low. + int loadedBytes = getAllocator().getTotalBytesAllocated(); + boolean isHeapReached = availableHeapInBytes > 0 && loadedBytes >= availableHeapInBytes; + if (isHeapReached) { + return false; + } + long usedMemory = runtime.totalMemory() - runtime.freeMemory(); + long freeMemory = runtime.maxMemory() - usedMemory; + double minBufferMemoryReservePercent = source.getBufferConfig().getMinBufferMemoryReservePercent() != BufferConfig.Companion.getBufferConfigPropUnsetDouble() + ? source.getBufferConfig().getMinBufferMemoryReservePercent() + : ReactExoplayerView.DEFAULT_MIN_BUFFER_MEMORY_RESERVE; + long reserveMemory = (long) minBufferMemoryReservePercent * runtime.maxMemory(); + long bufferedMs = bufferedDurationUs / (long) 1000; + if (reserveMemory > freeMemory && bufferedMs > 2000) { + // We don't have enough memory in reserve so we stop buffering to allow other components to use it instead + return false; + } + if (runtime.freeMemory() == 0) { + DebugLog.w(TAG, "Free memory reached 0, forcing garbage collection"); + runtime.gc(); + return false; + } + } + // "default" case or normal case for "DependingOnMemory" + return super.shouldContinueLoading(playbackPositionUs, bufferedDurationUs, playbackSpeed); + } + } + + private void initializePlayer() { + disableCache = ReactNativeVideoManager.Companion.getInstance().shouldDisableCache(source); + + ReactExoplayerView self = this; + Activity activity = themedReactContext.getCurrentActivity(); + // This ensures all props have been settled, to avoid async racing conditions. + Source runningSource = source; + mainRunnable = () -> { + if (viewHasDropped && runningSource == source) { + return; + } + try { + if (runningSource.getUri() == null) { + return; + } + + if (player == null) { + // Initialize core configuration and listeners + initializePlayerCore(self); + pipListenerUnsubscribe = PictureInPictureUtil.addLifecycleEventListener(themedReactContext, this); + PictureInPictureUtil.applyAutoEnterEnabled(themedReactContext, pictureInPictureParamsBuilder, this.enterPictureInPictureOnLeave); + } + if (!source.isLocalAssetFile() && !source.isAsset() && source.getBufferConfig().getCacheSize() > 0) { + RNVSimpleCache.INSTANCE.setSimpleCache( + this.getContext(), + source.getBufferConfig().getCacheSize() + ); + useCache = true; + } else { + useCache = false; + } + if (playerNeedsSource) { + // Will force display of shutter view if needed + exoPlayerView.invalidateAspectRatio(); + // DRM session manager creation must be done on a different thread to prevent crashes so we start a new thread + ExecutorService es = Executors.newSingleThreadExecutor(); + es.execute(() -> { + // DRM initialization must run on a different thread + if (viewHasDropped && runningSource == source) { + return; + } + if (activity == null) { + DebugLog.e(TAG, "Failed to initialize Player!, null activity"); + eventEmitter.onVideoError.invoke("Failed to initialize Player!", new Exception("Current Activity is null!"), "1001"); + return; + } + + // Initialize handler to run on the main thread + activity.runOnUiThread(() -> { + if (viewHasDropped && runningSource == source) { + return; + } + try { + // Source initialization must run on the main thread + initializePlayerSource(runningSource); + } catch (Exception ex) { + self.playerNeedsSource = true; + DebugLog.e(TAG, "Failed to initialize Player! 1"); + DebugLog.e(TAG, ex.toString()); + ex.printStackTrace(); + eventEmitter.onVideoError.invoke(ex.toString(), ex, "1001"); + } + }); + }); + } else if (runningSource == source) { + initializePlayerSource(runningSource); + } + } catch (Exception ex) { + self.playerNeedsSource = true; + DebugLog.e(TAG, "Failed to initialize Player! 2"); + DebugLog.e(TAG, ex.toString()); + ex.printStackTrace(); + eventEmitter.onVideoError.invoke(ex.toString(), ex, "1001"); + } + }; + mainHandler.postDelayed(mainRunnable, 1); + } + + public void getCurrentPosition(Promise promise) { + if (player != null) { + float currentPosition = player.getCurrentPosition() / 1000.0f; + promise.resolve(currentPosition); + } else { + promise.reject("PLAYER_NOT_AVAILABLE", "Player is not initialized."); + } + } + + private void initializePlayerCore(ReactExoplayerView self) { + ExoTrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(); + self.trackSelector = new DefaultTrackSelector(getContext(), videoTrackSelectionFactory); + self.trackSelector.setParameters(trackSelector.buildUponParameters() + .setMaxVideoBitrate(maxBitRate == 0 ? Integer.MAX_VALUE : maxBitRate)); + + DefaultAllocator allocator = new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE); + RNVLoadControl loadControl = new RNVLoadControl( + allocator, + source.getBufferConfig() + ); + + long initialBitrate = source.getBufferConfig().getInitialBitrate(); + if (initialBitrate > 0) { + config.setInitialBitrate(initialBitrate); + this.bandwidthMeter = config.getBandwidthMeter(); + } + + DefaultRenderersFactory renderersFactory = + new DefaultRenderersFactory(getContext()) + .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER) + .setEnableDecoderFallback(true) + .forceEnableMediaCodecAsynchronousQueueing(); + + DefaultMediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(mediaDataSourceFactory); + if (useCache && !disableCache) { + mediaSourceFactory.setDataSourceFactory(RNVSimpleCache.INSTANCE.getCacheFactory(buildHttpDataSourceFactory(true))); + } + + mediaSourceFactory.setLocalAdInsertionComponents(unusedAdTagUri -> adsLoader, exoPlayerView.getPlayerView()); + + player = new ExoPlayer.Builder(getContext(), renderersFactory) + .setTrackSelector(self.trackSelector) + .setBandwidthMeter(bandwidthMeter) + .setLoadControl(loadControl) + .setMediaSourceFactory(mediaSourceFactory) + .build(); + ReactNativeVideoManager.Companion.getInstance().onInstanceCreated(instanceId, player); + refreshDebugState(); + player.addListener(self); + player.setVolume(muted ? 0.f : audioVolume * 1); + exoPlayerView.setPlayer(player); + + audioBecomingNoisyReceiver.setListener(self); + pictureInPictureReceiver.setListener(); + bandwidthMeter.addEventListener(new Handler(), self); + setPlayWhenReady(!isPaused); + playerNeedsSource = true; + + PlaybackParameters params = new PlaybackParameters(rate, 1f); + player.setPlaybackParameters(params); + changeAudioOutput(this.audioOutput); + + if(showNotificationControls) { + setupPlaybackService(); + } + } + + private AdsMediaSource initializeAds(MediaSource videoSource, Source runningSource) { + AdsProps adProps = runningSource.getAdsProps(); + Uri uri = runningSource.getUri(); + if (adProps != null && uri != null) { + Uri adTagUrl = adProps.getAdTagUrl(); + if (adTagUrl != null) { + // Create an AdsLoader. + ImaAdsLoader.Builder imaLoaderBuilder = new ImaAdsLoader + .Builder(themedReactContext) + .setAdEventListener(this) + .setAdErrorListener(this); + + if (adProps.getAdLanguage() != null) { + ImaSdkSettings imaSdkSettings = ImaSdkFactory.getInstance().createImaSdkSettings(); + imaSdkSettings.setLanguage(adProps.getAdLanguage()); + imaLoaderBuilder.setImaSdkSettings(imaSdkSettings); + } + adsLoader = imaLoaderBuilder.build(); + adsLoader.setPlayer(player); + if (adsLoader != null) { + DefaultMediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(mediaDataSourceFactory) + .setLocalAdInsertionComponents(unusedAdTagUri -> adsLoader, exoPlayerView.getPlayerView()); + DataSpec adTagDataSpec = new DataSpec(adTagUrl); + return new AdsMediaSource(videoSource, + adTagDataSpec, + ImmutableList.of(uri, adTagUrl), + mediaSourceFactory, adsLoader, exoPlayerView.getPlayerView()); + } + } + } + + return null; + } + + private DrmSessionManager buildDrmSessionManager(UUID uuid, DRMProps drmProps) throws UnsupportedDrmException { + if (Util.SDK_INT < 18) { + return null; + } + + try { + // First check if there's a custom DRM manager registered through the plugin system + DRMManagerSpec drmManager = ReactNativeVideoManager.Companion.getInstance().getDRMManager(); + if (drmManager == null) { + // If no custom manager is registered, use the default implementation + drmManager = new DRMManager(buildHttpDataSourceFactory(false)); + } + + DrmSessionManager drmSessionManager = drmManager.buildDrmSessionManager(uuid, drmProps); + if (drmSessionManager == null) { + eventEmitter.onVideoError.invoke("Failed to build DRM session manager", new Exception("DRM session manager is null"), "3007"); + } + + // Allow plugins to override the DrmSessionManager + DrmSessionManager overriddenManager = ReactNativeVideoManager.Companion.getInstance().overrideDrmSessionManager(source, drmSessionManager); + return overriddenManager != null ? overriddenManager : drmSessionManager; + } catch (UnsupportedDrmException ex) { + // Unsupported DRM exceptions are handled by the calling method + throw ex; + } catch (Exception ex) { + // Handle any other exception and emit to JS + eventEmitter.onVideoError.invoke(ex.toString(), ex, "3006"); + return null; + } + } + + private void initializePlayerSource(Source runningSource) { + if (runningSource.getUri() == null) { + return; + } + /// init DRM + DrmSessionManager drmSessionManager = initializePlayerDrm(); + if (drmSessionManager == null && runningSource.getDrmProps() != null && runningSource.getDrmProps().getDrmType() != null) { + // Failed to initialize DRM session manager - cannot continue + DebugLog.e(TAG, "Failed to initialize DRM Session Manager Framework!"); + return; + } + // init source to manage ads (external text tracks are now handled in MediaItem) + MediaSource videoSource = buildMediaSource(runningSource.getUri(), + runningSource.getExtension(), + drmSessionManager, + runningSource.getCropStartMs(), + runningSource.getCropEndMs()); + MediaSource mediaSourceWithAds = initializeAds(videoSource, runningSource); + MediaSource mediaSource = Objects.requireNonNullElse(mediaSourceWithAds, videoSource); + + // wait for player to be set + while (player == null) { + try { + wait(); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + DebugLog.e(TAG, ex.toString()); + } + } + + boolean haveResumePosition = resumeWindow != C.INDEX_UNSET; + if (haveResumePosition) { + player.seekTo(resumeWindow, resumePosition); + player.setMediaSource(mediaSource, false); + } else if (runningSource.getStartPositionMs() > 0) { + player.setMediaSource(mediaSource, runningSource.getStartPositionMs()); + } else { + player.setMediaSource(mediaSource, true); + } + player.prepare(); + playerNeedsSource = false; + + reLayoutControls(); + + eventEmitter.onVideoLoadStart.invoke(); + loadVideoStarted = true; + + finishPlayerInitialization(); + } + + private DrmSessionManager initializePlayerDrm() { + DrmSessionManager drmSessionManager = null; + DRMProps drmProps = source.getDrmProps(); + // need to realign UUID in DRM Props from source + if (drmProps != null && drmProps.getDrmType() != null) { + UUID uuid = Util.getDrmUuid(drmProps.getDrmType()); + if (uuid != null) { + try { + DebugLog.d(TAG, "drm buildDrmSessionManager"); + drmSessionManager = buildDrmSessionManager(uuid, drmProps); + } catch (UnsupportedDrmException e) { + int errorStringId = Util.SDK_INT < 18 ? R.string.error_drm_not_supported + : (e.reason == UnsupportedDrmException.REASON_UNSUPPORTED_SCHEME + ? R.string.error_drm_unsupported_scheme : R.string.error_drm_unknown); + eventEmitter.onVideoError.invoke(getResources().getString(errorStringId), e, "3003"); + } + } + } + return drmSessionManager; + } + + private void finishPlayerInitialization() { + // Initializing the playerControlView + initializePlayerControl(); + setControls(controls); + applyModifiers(); + } + + private void setupPlaybackService() { + if (!showNotificationControls || player == null) { + return; + } + + playbackServiceConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + playbackServiceBinder = (PlaybackServiceBinder) service; + + try { + Activity currentActivity = themedReactContext.getCurrentActivity(); + if (currentActivity != null) { + playbackServiceBinder.getService().registerPlayer(player, + (Class) currentActivity.getClass()); + } else { + // Handle the case where currentActivity is null + DebugLog.w(TAG, "Could not register ExoPlayer: currentActivity is null"); + } + } catch (Exception e) { + DebugLog.e(TAG, "Could not register ExoPlayer: " + e.getMessage()); + } + } + + @Override + public void onServiceDisconnected(ComponentName name) { + try { + if (playbackServiceBinder != null) { + playbackServiceBinder.getService().unregisterPlayer(player); + } + } catch (Exception ignored) {} + + playbackServiceBinder = null; + } + + @Override + public void onNullBinding(ComponentName name) { + DebugLog.e(TAG, "Could not register ExoPlayer"); + } + }; + + Intent intent = new Intent(themedReactContext, VideoPlaybackService.class); + intent.setAction(MediaSessionService.SERVICE_INTERFACE); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + themedReactContext.startForegroundService(intent); + } else { + themedReactContext.startService(intent); + } + + int flags; + if (Build.VERSION.SDK_INT >= 29) { + flags = Context.BIND_AUTO_CREATE | Context.BIND_INCLUDE_CAPABILITIES; + } else { + flags = Context.BIND_AUTO_CREATE; + } + + themedReactContext.bindService(intent, playbackServiceConnection, flags); + } + + private void cleanupPlaybackService() { + try { + if(player != null && playbackServiceBinder != null) { + playbackServiceBinder.getService().unregisterPlayer(player); + } + + playbackServiceBinder = null; + + if(playbackServiceConnection != null) { + themedReactContext.unbindService(playbackServiceConnection); + } + } catch(Exception e) { + DebugLog.w(TAG, "Cloud not cleanup playback service"); + } + } + + private MediaSource buildMediaSource(Uri uri, String overrideExtension, DrmSessionManager drmSessionManager, long cropStartMs, long cropEndMs) { + if (uri == null) { + throw new IllegalStateException("Invalid video uri"); + } + int type; + if ("rtsp".equals(overrideExtension)) { + type = CONTENT_TYPE_RTSP; + } else { + type = Util.inferContentType(!TextUtils.isEmpty(overrideExtension) ? "." + overrideExtension + : uri.getLastPathSegment()); + } + config.setDisableDisconnectError(this.disableDisconnectError); + + MediaItem.Builder mediaItemBuilder = new MediaItem.Builder() + .setUri(uri); + + // refresh custom Metadata + MediaMetadata customMetadata = ConfigurationUtils.buildCustomMetadata(source.getMetadata()); + if (customMetadata != null) { + mediaItemBuilder.setMediaMetadata(customMetadata); + } + + // Add external subtitles to MediaItem + List subtitleConfigurations = buildSubtitleConfigurations(); + if (subtitleConfigurations != null) { + mediaItemBuilder.setSubtitleConfigurations(subtitleConfigurations); + } + + if (source.getAdsProps() != null) { + Uri adTagUrl = source.getAdsProps().getAdTagUrl(); + if (adTagUrl != null) { + mediaItemBuilder.setAdsConfiguration( + new MediaItem.AdsConfiguration.Builder(adTagUrl).build() + ); + } + } + + MediaItem.LiveConfiguration.Builder liveConfiguration = ConfigurationUtils.getLiveConfiguration(source.getBufferConfig()); + mediaItemBuilder.setLiveConfiguration(liveConfiguration.build()); + + MediaSource.Factory mediaSourceFactory; + DrmSessionManagerProvider drmProvider; + List streamKeys = new ArrayList<>(); + if (drmSessionManager != null) { + drmProvider = ((_mediaItem) -> drmSessionManager); + } else { + drmProvider = new DefaultDrmSessionManagerProvider(); + } + + + switch (type) { + case CONTENT_TYPE_SS: + if(!BuildConfig.USE_EXOPLAYER_SMOOTH_STREAMING) { + DebugLog.e("Exo Player Exception", "Smooth Streaming is not enabled!"); + throw new IllegalStateException("Smooth Streaming is not enabled!"); + } + + mediaSourceFactory = new SsMediaSource.Factory( + new DefaultSsChunkSource.Factory(mediaDataSourceFactory), + buildDataSourceFactory(false) + ); + break; + case CONTENT_TYPE_DASH: + if(!BuildConfig.USE_EXOPLAYER_DASH) { + DebugLog.e("Exo Player Exception", "DASH is not enabled!"); + throw new IllegalStateException("DASH is not enabled!"); + } + + mediaSourceFactory = new DashMediaSource.Factory( + new DefaultDashChunkSource.Factory(mediaDataSourceFactory), + buildDataSourceFactory(false) + ); + break; + case CONTENT_TYPE_HLS: + if (!BuildConfig.USE_EXOPLAYER_HLS) { + DebugLog.e("Exo Player Exception", "HLS is not enabled!"); + throw new IllegalStateException("HLS is not enabled!"); + } + + DataSource.Factory dataSourceFactory = mediaDataSourceFactory; + + if (useCache && !disableCache) { + dataSourceFactory = RNVSimpleCache.INSTANCE.getCacheFactory(buildHttpDataSourceFactory(true)); + } + + mediaSourceFactory = new HlsMediaSource.Factory( + dataSourceFactory + ).setAllowChunklessPreparation(source.getTextTracksAllowChunklessPreparation()); + break; + case CONTENT_TYPE_OTHER: + if ("asset".equals(uri.getScheme())) { + try { + DataSource.Factory assetDataSourceFactory = DataSourceUtil.buildAssetDataSourceFactory(themedReactContext, uri); + mediaSourceFactory = new ProgressiveMediaSource.Factory(assetDataSourceFactory); + } catch (Exception e) { + throw new IllegalStateException("cannot open input file:" + uri); + } + } else if ("file".equals(uri.getScheme()) || + !useCache) { + mediaSourceFactory = new ProgressiveMediaSource.Factory( + mediaDataSourceFactory + ); + } else { + mediaSourceFactory = new ProgressiveMediaSource.Factory( + RNVSimpleCache.INSTANCE.getCacheFactory(buildHttpDataSourceFactory(true)) + ); + + } + break; + case CONTENT_TYPE_RTSP: + if (!BuildConfig.USE_EXOPLAYER_RTSP) { + DebugLog.e("Exo Player Exception", "RTSP is not enabled!"); + throw new IllegalStateException("RTSP is not enabled!"); + } + + mediaSourceFactory = new RtspMediaSource.Factory(); + break; + default: { + throw new IllegalStateException("Unsupported type: " + type); + } + } + + if (cmcdConfigurationFactory != null) { + mediaSourceFactory = mediaSourceFactory.setCmcdConfigurationFactory( + cmcdConfigurationFactory::createCmcdConfiguration + ); + } + + mediaSourceFactory = Objects.requireNonNullElse( + ReactNativeVideoManager.Companion.getInstance() + .overrideMediaSourceFactory(source, mediaSourceFactory, mediaDataSourceFactory), + mediaSourceFactory + ); + + mediaItemBuilder.setStreamKeys(streamKeys); + + @Nullable + final MediaItem.Builder overridenMediaItemBuilder = ReactNativeVideoManager.Companion.getInstance().overrideMediaItemBuilder(source, mediaItemBuilder); + + MediaItem mediaItem = overridenMediaItemBuilder != null + ? overridenMediaItemBuilder.build() + : mediaItemBuilder.build(); + + MediaSource mediaSource = mediaSourceFactory + .setDrmSessionManagerProvider(drmProvider) + .setLoadErrorHandlingPolicy( + config.buildLoadErrorHandlingPolicy(source.getMinLoadRetryCount()) + ) + .createMediaSource(mediaItem); + + if (cropStartMs >= 0 && cropEndMs >= 0) { + return new ClippingMediaSource(mediaSource, cropStartMs * 1000, cropEndMs * 1000); + } else if (cropStartMs >= 0) { + return new ClippingMediaSource(mediaSource, cropStartMs * 1000, TIME_END_OF_SOURCE); + } else if (cropEndMs >= 0) { + return new ClippingMediaSource(mediaSource, 0, cropEndMs * 1000); + } + + return mediaSource; + } + + @Nullable + private List buildSubtitleConfigurations() { + if (source.getSideLoadedTextTracks() == null || source.getSideLoadedTextTracks().getTracks().isEmpty()) { + return null; + } + + List subtitleConfigurations = new ArrayList<>(); + int trackIndex = 0; + + for (SideLoadedTextTrack track : source.getSideLoadedTextTracks().getTracks()) { + try { + // Create a more descriptive ID that PlayerView can use + String trackId = "external-subtitle-" + trackIndex; + String label = track.getTitle(); + if (label == null || label.isEmpty()) { + label = "External " + (trackIndex + 1); + if (track.getLanguage() != null && !track.getLanguage().isEmpty()) { + label += " (" + track.getLanguage() + ")"; + } + } + + MediaItem.SubtitleConfiguration.Builder configBuilder = new MediaItem.SubtitleConfiguration.Builder(track.getUri()) + .setId(trackId) + .setMimeType(track.getType()) + .setLabel(label) + .setRoleFlags(C.ROLE_FLAG_SUBTITLE); + + // Set language if available + if (track.getLanguage() != null && !track.getLanguage().isEmpty()) { + configBuilder.setLanguage(track.getLanguage()); + } + + // Set selection flags - make first track default if no specific track is selected + if (trackIndex == 0 && (textTrackType == null || "disabled".equals(textTrackType))) { + configBuilder.setSelectionFlags(C.SELECTION_FLAG_DEFAULT); + } else { + configBuilder.setSelectionFlags(0); + } + + MediaItem.SubtitleConfiguration subtitleConfiguration = configBuilder.build(); + subtitleConfigurations.add(subtitleConfiguration); + + DebugLog.d(TAG, "Created subtitle configuration: " + trackId + " - " + label + " (" + track.getType() + ")"); + trackIndex++; + } catch (Exception e) { + DebugLog.e(TAG, "Error creating SubtitleConfiguration for URI " + track.getUri() + ": " + e.getMessage()); + } + } + + if (!subtitleConfigurations.isEmpty()) { + DebugLog.d(TAG, "Built " + subtitleConfigurations.size() + " external subtitle configurations"); + } + + return subtitleConfigurations.isEmpty() ? null : subtitleConfigurations; + } + + private void releasePlayer() { + if (player != null) { + if(playbackServiceBinder != null) { + playbackServiceBinder.getService().unregisterPlayer(player); + themedReactContext.unbindService(playbackServiceConnection); + } + + updateResumePosition(); + player.release(); + player.removeListener(this); + PictureInPictureUtil.applyAutoEnterEnabled(themedReactContext, pictureInPictureParamsBuilder, false); + if (pipListenerUnsubscribe != null) { + pipListenerUnsubscribe.run(); + } + trackSelector = null; + + ReactNativeVideoManager.Companion.getInstance().onInstanceRemoved(instanceId, player); + player = null; + } + + if (adsLoader != null) { + adsLoader.release(); + adsLoader = null; + } + progressHandler.removeMessages(SHOW_PROGRESS); + audioBecomingNoisyReceiver.removeListener(); + pictureInPictureReceiver.removeListener(); + bandwidthMeter.removeEventListener(this); + + if (mainHandler != null && mainRunnable != null) { + mainHandler.removeCallbacks(mainRunnable); + mainRunnable = null; + } + } + + private static class OnAudioFocusChangedListener implements AudioManager.OnAudioFocusChangeListener { + private final ReactExoplayerView view; + private final ThemedReactContext themedReactContext; + + private OnAudioFocusChangedListener(ReactExoplayerView view, ThemedReactContext themedReactContext) { + this.view = view; + this.themedReactContext = themedReactContext; + } + + @Override + public void onAudioFocusChange(int focusChange) { + Activity activity = themedReactContext.getCurrentActivity(); + + switch (focusChange) { + case AudioManager.AUDIOFOCUS_LOSS: + view.hasAudioFocus = false; + view.eventEmitter.onAudioFocusChanged.invoke(false); + // FIXME this pause can cause issue if content doesn't have pause capability (can happen on live channel) + if (activity != null) { + activity.runOnUiThread(view::pausePlayback); + } + view.audioManager.abandonAudioFocus(this); + break; + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: + view.eventEmitter.onAudioFocusChanged.invoke(false); + break; + case AudioManager.AUDIOFOCUS_GAIN: + view.hasAudioFocus = true; + view.eventEmitter.onAudioFocusChanged.invoke(true); + break; + default: + break; + } + + if (view.player != null && activity != null) { + if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { + // Lower the volume + if (!view.muted) { + activity.runOnUiThread(() -> + view.player.setVolume(view.audioVolume * 0.8f) + ); + } + } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { + // Raise it back to normal + if (!view.muted) { + activity.runOnUiThread(() -> + view.player.setVolume(view.audioVolume * 1) + ); + } + } + } + } + } + + private boolean requestAudioFocus() { + if (disableFocus || source.getUri() == null || this.hasAudioFocus) { + return true; + } + int result = audioManager.requestAudioFocus(audioFocusChangeListener, + AudioManager.STREAM_MUSIC, + AudioManager.AUDIOFOCUS_GAIN); + return result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED; + } + + private void setPlayWhenReady(boolean playWhenReady) { + if (player == null) { + return; + } + + if (playWhenReady) { + this.hasAudioFocus = requestAudioFocus(); + if (this.hasAudioFocus) { + player.setPlayWhenReady(true); + } + } else { + player.setPlayWhenReady(false); + } + } + + private void resumePlayback() { + if (player != null) { + if (!player.getPlayWhenReady()) { + setPlayWhenReady(true); + } + setKeepScreenOn(preventsDisplaySleepDuringVideoPlayback); + } + } + + private void pausePlayback() { + if (player != null) { + if (player.getPlayWhenReady()) { + setPlayWhenReady(false); + } + } + setKeepScreenOn(false); + } + + private void stopPlayback() { + onStopPlayback(); + releasePlayer(); + } + + private void onStopPlayback() { + audioManager.abandonAudioFocus(audioFocusChangeListener); + } + + private void updateResumePosition() { + resumeWindow = player.getCurrentMediaItemIndex(); + resumePosition = player.isCurrentMediaItemSeekable() ? Math.max(0, player.getCurrentPosition()) + : C.TIME_UNSET; + } + + private void clearResumePosition() { + resumeWindow = C.INDEX_UNSET; + resumePosition = C.TIME_UNSET; + } + + /** + * Returns a new DataSource factory. + * + * @param useBandwidthMeter Whether to set {@link #bandwidthMeter} as a listener to the new + * DataSource factory. + * @return A new DataSource factory. + */ + private DataSource.Factory buildDataSourceFactory(boolean useBandwidthMeter) { + return DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, + useBandwidthMeter ? bandwidthMeter : null, source.getHeaders()); + } + + /** + * Returns a new HttpDataSource factory. + * + * @param useBandwidthMeter Whether to set {@link #bandwidthMeter} as a listener to the new + * DataSource factory. + * @return A new HttpDataSource factory. + */ + private HttpDataSource.Factory buildHttpDataSourceFactory(boolean useBandwidthMeter) { + return DataSourceUtil.getDefaultHttpDataSourceFactory(this.themedReactContext, useBandwidthMeter ? bandwidthMeter : null, source.getHeaders()); + } + + // AudioBecomingNoisyListener implementation + @Override + public void onAudioBecomingNoisy() { + eventEmitter.onVideoAudioBecomingNoisy.invoke(); + } + + // Player.Listener implementation + @Override + public void onIsLoadingChanged(boolean isLoading) { + // Do nothing. + } + + @Override + public void onEvents(@NonNull Player player, Player.Events events) { + if (events.contains(Player.EVENT_PLAYBACK_STATE_CHANGED) || events.contains(Player.EVENT_PLAY_WHEN_READY_CHANGED)) { + int playbackState = player.getPlaybackState(); + boolean playWhenReady = player.getPlayWhenReady(); + String text = "onStateChanged: playWhenReady=" + playWhenReady + ", playbackState="; + eventEmitter.onPlaybackRateChange.invoke(playWhenReady && playbackState == ExoPlayer.STATE_READY ? 1.0f : 0.0f); + switch (playbackState) { + case Player.STATE_IDLE: + text += "idle"; + eventEmitter.onVideoIdle.invoke(); + clearProgressMessageHandler(); + if (!player.getPlayWhenReady()) { + setKeepScreenOn(false); + } + break; + case Player.STATE_BUFFERING: + text += "buffering"; + onBuffering(true); + clearProgressMessageHandler(); + setKeepScreenOn(preventsDisplaySleepDuringVideoPlayback); + break; + case Player.STATE_READY: + text += "ready"; + eventEmitter.onReadyForDisplay.invoke(); + onBuffering(false); + clearProgressMessageHandler(); // ensure there is no other message + startProgressHandler(); + videoLoaded(); + if (selectTrackWhenReady && isUsingContentResolution) { + selectTrackWhenReady = false; + setSelectedTrack(C.TRACK_TYPE_VIDEO, videoTrackType, videoTrackValue); + } + // Setting the visibility for the player controls + if (exoPlayerView != null) { + exoPlayerView.showController(); + } + setKeepScreenOn(preventsDisplaySleepDuringVideoPlayback); + break; + case Player.STATE_ENDED: + text += "ended"; + updateProgress(); + eventEmitter.onVideoEnd.invoke(); + onStopPlayback(); + setKeepScreenOn(false); + break; + default: + text += "unknown"; + break; + } + DebugLog.d(TAG, text); + } + } + + private void startProgressHandler() { + progressHandler.sendEmptyMessage(SHOW_PROGRESS); + } + + /** + * The progress message handler will duplicate recursions of the onProgressMessage handler + * on change of player state from any state to STATE_READY with playWhenReady is true (when + * the video is not paused). This clears all existing messages. + */ + private void clearProgressMessageHandler() { + progressHandler.removeMessages(SHOW_PROGRESS); + } + + private void videoLoaded() { + if (!player.isPlayingAd() && loadVideoStarted) { + loadVideoStarted = false; + if (audioTrackType != null) { + setSelectedAudioTrack(audioTrackType, audioTrackValue); + } + if (videoTrackType != null) { + setSelectedVideoTrack(videoTrackType, videoTrackValue); + } + if (textTrackType != null) { + setSelectedTextTrack(textTrackType, textTrackValue); + } + Format videoFormat = player.getVideoFormat(); + boolean isRotatedContent = videoFormat != null && (videoFormat.rotationDegrees == 90 || videoFormat.rotationDegrees == 270); + int width = videoFormat != null ? (isRotatedContent ? videoFormat.height : videoFormat.width) : 0; + int height = videoFormat != null ? (isRotatedContent ? videoFormat.width : videoFormat.height) : 0; + String trackId = videoFormat != null ? videoFormat.id : null; + + // Properties that must be accessed on the main thread + long duration = player.getDuration(); + long currentPosition = player.getCurrentPosition(); + ArrayList audioTracks = getAudioTrackInfo(); + ArrayList textTracks = getTextTrackInfo(); + + if (source.getContentStartTime() != -1) { + ExecutorService es = Executors.newSingleThreadExecutor(); + es.execute(() -> { + // To prevent ANRs caused by getVideoTrackInfo we run this on a different thread and notify the player only when we're done + ArrayList videoTracks = getVideoTrackInfoFromManifest(); + if (videoTracks != null) { + isUsingContentResolution = true; + } + eventEmitter.onVideoLoad.invoke(duration, currentPosition, width, height, + audioTracks, textTracks, videoTracks, trackId ); + + updateSubtitleButtonVisibility(); + }); + return; + } + + ArrayList videoTracks = getVideoTrackInfo(); + + eventEmitter.onVideoLoad.invoke(duration, currentPosition, width, height, + audioTracks, textTracks, videoTracks, trackId); + + updateSubtitleButtonVisibility(); + refreshControlsStyles(); + } + } + + private static boolean isTrackSelected(TrackSelection selection, TrackGroup group, + int trackIndex){ + return selection != null && selection.getTrackGroup() == group + && selection.indexOf( trackIndex ) != C.INDEX_UNSET; + } + + private ArrayList getAudioTrackInfo() { + ArrayList audioTracks = new ArrayList<>(); + if (trackSelector == null) { + return audioTracks; + } + + MappingTrackSelector.MappedTrackInfo info = trackSelector.getCurrentMappedTrackInfo(); + int index = getTrackRendererIndex(C.TRACK_TYPE_AUDIO); + if (info == null || index == C.INDEX_UNSET) { + return audioTracks; + } + TrackGroupArray groups = info.getTrackGroups(index); + TrackSelectionArray selectionArray = player.getCurrentTrackSelections(); + TrackSelection selection = selectionArray.get(C.TRACK_TYPE_AUDIO); + + + for (int groupIndex = 0; groupIndex < groups.length; ++groupIndex) { + TrackGroup group = groups.get(groupIndex); + Format format = group.getFormat(0); + + // Check if this specific group is the currently selected one + boolean isSelected = false; + if (selection != null && selection.getTrackGroup() == group) { + isSelected = true; + } + + Track audioTrack = exoplayerTrackToGenericTrack(format, groupIndex, selection, group); + audioTrack.setBitrate(format.bitrate == Format.NO_VALUE ? 0 : format.bitrate); + audioTrack.setSelected(isSelected); + audioTracks.add(audioTrack); + } + + return audioTracks; + } + + private VideoTrack exoplayerVideoTrackToGenericVideoTrack(Format format, int trackIndex) { + VideoTrack videoTrack = new VideoTrack(); + videoTrack.setWidth(format.width == Format.NO_VALUE ? 0 : format.width); + videoTrack.setHeight(format.height == Format.NO_VALUE ? 0 : format.height); + videoTrack.setBitrate(format.bitrate == Format.NO_VALUE ? 0 : format.bitrate); + videoTrack.setRotation(format.rotationDegrees); + if (format.codecs != null) videoTrack.setCodecs(format.codecs); + videoTrack.setTrackId(format.id == null ? String.valueOf(trackIndex) : format.id); + videoTrack.setIndex(trackIndex); + return videoTrack; + } + + private ArrayList getVideoTrackInfo() { + ArrayList videoTracks = new ArrayList<>(); + if (trackSelector == null) { + // Likely player is unmounting so no video tracks are available anymore + return videoTracks; + } + MappingTrackSelector.MappedTrackInfo info = trackSelector.getCurrentMappedTrackInfo(); + int index = getTrackRendererIndex(C.TRACK_TYPE_VIDEO); + if (info == null || index == C.INDEX_UNSET) { + return videoTracks; + } + + TrackGroupArray groups = info.getTrackGroups(index); + for (int i = 0; i < groups.length; ++i) { + TrackGroup group = groups.get(i); + + for (int trackIndex = 0; trackIndex < group.length; trackIndex++) { + Format format = group.getFormat(trackIndex); + if (isFormatSupported(format)) { + VideoTrack videoTrack = exoplayerVideoTrackToGenericVideoTrack(format, trackIndex); + videoTracks.add(videoTrack); + } + } + } + return videoTracks; + } + + private ArrayList getVideoTrackInfoFromManifest() { + return this.getVideoTrackInfoFromManifest(0); + } + + // We need retry count to in case where minefest request fails from poor network conditions + @WorkerThread + private ArrayList getVideoTrackInfoFromManifest(int retryCount) { + ExecutorService es = Executors.newSingleThreadExecutor(); + final DataSource dataSource = this.mediaDataSourceFactory.createDataSource(); + final Uri sourceUri = source.getUri(); + final long startTime = source.getContentStartTime() * 1000 - 100; // s -> ms with 100ms offset + + Future> result = es.submit(new Callable() { + final DataSource ds = dataSource; + final Uri uri = sourceUri; + final long startTimeUs = startTime * 1000; // ms -> us + + public ArrayList call() { + ArrayList videoTracks = new ArrayList<>(); + try { + DashManifest manifest = DashUtil.loadManifest(this.ds, this.uri); + int periodCount = manifest.getPeriodCount(); + for (int i = 0; i < periodCount; i++) { + Period period = manifest.getPeriod(i); + for (int adaptationIndex = 0; adaptationIndex < period.adaptationSets.size(); adaptationIndex++) { + AdaptationSet adaptation = period.adaptationSets.get(adaptationIndex); + if (adaptation.type != C.TRACK_TYPE_VIDEO) { + continue; + } + boolean hasFoundContentPeriod = false; + for (int representationIndex = 0; representationIndex < adaptation.representations.size(); representationIndex++) { + Representation representation = adaptation.representations.get(representationIndex); + Format format = representation.format; + if (isFormatSupported(format)) { + if (representation.presentationTimeOffsetUs <= startTimeUs) { + break; + } + hasFoundContentPeriod = true; + VideoTrack videoTrack = exoplayerVideoTrackToGenericVideoTrack(format, representationIndex); + videoTracks.add(videoTrack); + } + } + if (hasFoundContentPeriod) { + return videoTracks; + } + } + } + } catch (Exception e) { + DebugLog.w(TAG, "error in getVideoTrackInfoFromManifest:" + e.getMessage()); + } + return null; + } + }); + + try { + ArrayList results = result.get(3000, TimeUnit.MILLISECONDS); + if (results == null && retryCount < 1) { + return this.getVideoTrackInfoFromManifest(++retryCount); + } + es.shutdown(); + return results; + } catch (Exception e) { + DebugLog.w(TAG, "error in getVideoTrackInfoFromManifest handling request:" + e.getMessage()); + } + + return null; + } + + private Track exoplayerTrackToGenericTrack(Format format, int trackIndex, TrackSelection selection, TrackGroup group) { + Track track = new Track(); + track.setIndex(trackIndex); + if (format.sampleMimeType != null) track.setMimeType(format.sampleMimeType); + if (format.language != null) track.setLanguage(format.language); + if (format.label != null) track.setTitle(format.label); + track.setSelected(isTrackSelected(selection, group, trackIndex)); + return track; + } + + private ArrayList getTextTrackInfo() { + ArrayList textTracks = new ArrayList<>(); + if (trackSelector == null) { + return textTracks; + } + + MappingTrackSelector.MappedTrackInfo info = trackSelector.getCurrentMappedTrackInfo(); + int index = getTrackRendererIndex(C.TRACK_TYPE_TEXT); + if (info == null || index == C.INDEX_UNSET) { + return textTracks; + } + + TrackSelectionArray selectionArray = player.getCurrentTrackSelections(); + TrackSelection selection = selectionArray.get(C.TRACK_TYPE_TEXT); + TrackGroupArray groups = info.getTrackGroups(index); + + for (int groupIndex = 0; groupIndex < groups.length; ++groupIndex) { + TrackGroup group = groups.get(groupIndex); + for (int trackIndex = 0; trackIndex < group.length; trackIndex++) { + Format format = group.getFormat(trackIndex); + Track textTrack = exoplayerTrackToGenericTrack(format, trackIndex, selection, group); + + boolean isExternal = format.id != null && format.id.startsWith("external-subtitle-"); + boolean isSelected = isTrackSelected(selection, group, trackIndex); + + textTrack.setIndex(textTracks.size()); + + if (textTrack.getTitle() == null || textTrack.getTitle().isEmpty()) { + if (isExternal) { + textTrack.setTitle("External " + (trackIndex + 1)); + } else { + textTrack.setTitle("Track " + (textTracks.size() + 1)); + } + } + + textTracks.add(textTrack); + } + } + return textTracks; + } + + private ArrayList getBasicAudioTrackInfo() { + ArrayList tracks = new ArrayList<>(); + if (trackSelector == null) { + return tracks; + } + + MappingTrackSelector.MappedTrackInfo info = trackSelector.getCurrentMappedTrackInfo(); + int index = getTrackRendererIndex(C.TRACK_TYPE_AUDIO); + if (info == null || index == C.INDEX_UNSET) { + return tracks; + } + + TrackGroupArray groups = info.getTrackGroups(index); + + for (int groupIndex = 0; groupIndex < groups.length; ++groupIndex) { + TrackGroup group = groups.get(groupIndex); + Format format = group.getFormat(0); + + // Create track without trying to determine selection status + Track track = new Track(); + track.setIndex(groupIndex); + track.setLanguage(format.language != null ? format.language : "unknown"); + track.setTitle(format.label != null ? format.label : "Track " + (groupIndex + 1)); + track.setSelected(false); // Don't report selection status - let PlayerView handle it + if (format.sampleMimeType != null) track.setMimeType(format.sampleMimeType); + track.setBitrate(format.bitrate == Format.NO_VALUE ? 0 : format.bitrate); + + tracks.add(track); + } + + DebugLog.d(TAG, "getBasicAudioTrackInfo: returning " + tracks.size() + " audio tracks (no selection status)"); + return tracks; + } + + private ArrayList getBasicTextTrackInfo() { + ArrayList textTracks = new ArrayList<>(); + if (trackSelector == null) { + return textTracks; + } + + MappingTrackSelector.MappedTrackInfo info = trackSelector.getCurrentMappedTrackInfo(); + int index = getTrackRendererIndex(C.TRACK_TYPE_TEXT); + if (info == null || index == C.INDEX_UNSET) { + return textTracks; + } + + TrackGroupArray groups = info.getTrackGroups(index); + + for (int groupIndex = 0; groupIndex < groups.length; ++groupIndex) { + TrackGroup group = groups.get(groupIndex); + for (int trackIndex = 0; trackIndex < group.length; trackIndex++) { + Format format = group.getFormat(trackIndex); + + Track textTrack = new Track(); + textTrack.setIndex(textTracks.size()); + if (format.sampleMimeType != null) textTrack.setMimeType(format.sampleMimeType); + if (format.language != null) textTrack.setLanguage(format.language); + + boolean isExternal = format.id != null && format.id.startsWith("external-subtitle-"); + + if (format.label != null && !format.label.isEmpty()) { + textTrack.setTitle(format.label); + } else if (isExternal) { + textTrack.setTitle("External " + (trackIndex + 1)); + } else { + textTrack.setTitle("Track " + (textTracks.size() + 1)); + } + + textTrack.setSelected(false); // Don't report selection status - let PlayerView handle it + textTracks.add(textTrack); + } + } + return textTracks; + } + + private void onBuffering(boolean buffering) { + if (isBuffering == buffering) { + return; + } + + if (isPaused && isSeeking && !buffering) { + eventEmitter.onVideoSeek.invoke(player.getCurrentPosition(), seekPosition); + isSeeking = false; + } + + isBuffering = buffering; + eventEmitter.onVideoBuffer.invoke(buffering); + } + + @Override + public void onPositionDiscontinuity(@NonNull Player.PositionInfo oldPosition, @NonNull Player.PositionInfo newPosition, @Player.DiscontinuityReason int reason) { + if (reason == Player.DISCONTINUITY_REASON_SEEK) { + isSeeking = true; + seekPosition = newPosition.positionMs; + if (isUsingContentResolution) { + // We need to update the selected track to make sure that it still matches user selection if track list has changed in this period + setSelectedTrack(C.TRACK_TYPE_VIDEO, videoTrackType, videoTrackValue); + } + } + + if (playerNeedsSource) { + // This will only occur if the user has performed a seek whilst in the error state. Update the + // resume position so that if the user then retries, playback will resume from the position to + // which they seeked. + updateResumePosition(); + } + if (isUsingContentResolution) { + // Discontinuity events might have a different track list so we update the selected track + setSelectedTrack(C.TRACK_TYPE_VIDEO, videoTrackType, videoTrackValue); + selectTrackWhenReady = true; + } + // When repeat is turned on, reaching the end of the video will not cause a state change + // so we need to explicitly detect it. + if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION + && player.getRepeatMode() == Player.REPEAT_MODE_ONE) { + updateProgress(); + eventEmitter.onVideoEnd.invoke(); + } + } + + @Override + public void onTimelineChanged(@NonNull Timeline timeline, int reason) { + // Do nothing. + } + + @Override + public void onTracksChanged(@NonNull Tracks tracks) { + DebugLog.d(TAG, "onTracksChanged called - updating track information, controls=" + controls); + + if (controls) { + ArrayList textTracks = getBasicTextTrackInfo(); + ArrayList audioTracks = getBasicAudioTrackInfo(); + ArrayList videoTracks = getVideoTrackInfo(); + + eventEmitter.onTextTracks.invoke(textTracks); + eventEmitter.onAudioTracks.invoke(audioTracks); + eventEmitter.onVideoTracks.invoke(videoTracks); + } else { + ArrayList textTracks = getTextTrackInfo(); + ArrayList audioTracks = getAudioTrackInfo(); + ArrayList videoTracks = getVideoTrackInfo(); + + eventEmitter.onTextTracks.invoke(textTracks); + eventEmitter.onAudioTracks.invoke(audioTracks); + eventEmitter.onVideoTracks.invoke(videoTracks); + int selectedAudioTracks = 0; + for (Track track : audioTracks) { + if (track.isSelected()) { + selectedAudioTracks++; + } + } + } + + updateSubtitleButtonVisibility(); + } + + + private boolean hasBuiltInTextTracks() { + if (player == null || trackSelector == null) return false; + + MappingTrackSelector.MappedTrackInfo info = trackSelector.getCurrentMappedTrackInfo(); + if (info == null) return false; + + int textRendererIndex = getTrackRendererIndex(C.TRACK_TYPE_TEXT); + if (textRendererIndex == C.INDEX_UNSET) return false; + + TrackGroupArray groups = info.getTrackGroups(textRendererIndex); + + // Check if any groups have tracks that are NOT external subtitles + for (int i = 0; i < groups.length; i++) { + TrackGroup group = groups.get(i); + for (int j = 0; j < group.length; j++) { + Format format = group.getFormat(j); + // If track ID doesn't start with "external-subtitle-", it's built-in + if (format.id == null || !format.id.startsWith("external-subtitle-")) { + return true; + } + } + } + + return false; + } + + private void updateSubtitleButtonVisibility() { + if (exoPlayerView == null) return; + + boolean hasTextTracks = (source.getSideLoadedTextTracks() != null && + !source.getSideLoadedTextTracks().getTracks().isEmpty()) || + hasBuiltInTextTracks(); + + exoPlayerView.setShowSubtitleButton(hasTextTracks); + } + + @Override + public void onPlaybackParametersChanged(PlaybackParameters params) { + eventEmitter.onPlaybackRateChange.invoke(params.speed); + } + + @Override + public void onVolumeChanged(float volume) { + eventEmitter.onVolumeChange.invoke(volume); + } + + @Override + public void onIsPlayingChanged(boolean isPlaying) { + if (isPlaying && isSeeking) { + eventEmitter.onVideoSeek.invoke(player.getCurrentPosition(), seekPosition); + } + PictureInPictureUtil.applyPlayingStatus(themedReactContext, pictureInPictureParamsBuilder, pictureInPictureReceiver, !isPlaying); + eventEmitter.onVideoPlaybackStateChanged.invoke(isPlaying, isSeeking); + + if (isPlaying) { + isSeeking = false; + } + } + + @Override + public void onPlayerError(@NonNull PlaybackException e) { + String errorString = "ExoPlaybackException: " + PlaybackException.getErrorCodeName(e.errorCode); + String errorCode = "2" + e.errorCode; + switch(e.errorCode) { + case PlaybackException.ERROR_CODE_DRM_DEVICE_REVOKED: + case PlaybackException.ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED: + case PlaybackException.ERROR_CODE_DRM_PROVISIONING_FAILED: + case PlaybackException.ERROR_CODE_DRM_SYSTEM_ERROR: + case PlaybackException.ERROR_CODE_DRM_UNSPECIFIED: + if (!hasDrmFailed) { + // When DRM fails to reach the app level certificate server it will fail with a source error so we assume that it is DRM related and try one more time + hasDrmFailed = true; + playerNeedsSource = true; + updateResumePosition(); + initializePlayer(); + setPlayWhenReady(true); + return; + } + break; + default: + break; + } + eventEmitter.onVideoError.invoke(errorString, e, errorCode); + playerNeedsSource = true; + if (isBehindLiveWindow(e)) { + clearResumePosition(); + if (player != null) { + player.seekToDefaultPosition(); + player.prepare(); + } + } else { + updateResumePosition(); + } + } + + private static boolean isBehindLiveWindow(PlaybackException e) { + return e.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW; + } + + public int getTrackRendererIndex(int trackType) { + if (player != null) { + int rendererCount = player.getRendererCount(); + for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) { + if (player.getRendererType(rendererIndex) == trackType) { + return rendererIndex; + } + } + } + return C.INDEX_UNSET; + } + + @Override + public void onMetadata(@NonNull Metadata metadata) { + ArrayList metadataArray = new ArrayList<>(); + for (int i = 0; i < metadata.length(); i++) { + Metadata.Entry entry = metadata.get(i); + + if (entry instanceof Id3Frame) { + Id3Frame frame = (Id3Frame) metadata.get(i); + + String value = ""; + + if (frame instanceof TextInformationFrame) { + TextInformationFrame txxxFrame = (TextInformationFrame) frame; + value = txxxFrame.value; + } + TimedMetadata timedMetadata = new TimedMetadata(frame.id, value); + metadataArray.add(timedMetadata); + } else if (entry instanceof EventMessage) { + EventMessage eventMessage = (EventMessage) entry; + TimedMetadata timedMetadata = new TimedMetadata(eventMessage.schemeIdUri, eventMessage.value); + metadataArray.add(timedMetadata); + } else { + DebugLog.d(TAG, "unhandled metadata " + entry); + } + } + eventEmitter.onTimedMetadata.invoke(metadataArray); + } + + public void onCues(CueGroup cueGroup) { + if (!cueGroup.cues.isEmpty() && cueGroup.cues.get(0).text != null) { + String subtitleText = cueGroup.cues.get(0).text.toString(); + eventEmitter.onTextTrackDataChanged.invoke(subtitleText); + } + } + + public void setSrc(Source source) { + if (source.getUri() != null) { + clearResumePosition(); + boolean isSourceEqual = source.isEquals(this.source); + hasDrmFailed = false; + this.source = source; + final DataSource.Factory tmpMediaDataSourceFactory = + DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, bandwidthMeter, + source.getHeaders()); + + @Nullable + final DataSource.Factory overriddenMediaDataSourceFactory = ReactNativeVideoManager.Companion.getInstance().overrideMediaDataSourceFactory(source, tmpMediaDataSourceFactory); + + this.mediaDataSourceFactory = Objects.requireNonNullElse(overriddenMediaDataSourceFactory, tmpMediaDataSourceFactory); + + if (source.getCmcdProps() != null) { + CMCDConfig cmcdConfig = new CMCDConfig(source.getCmcdProps()); + CmcdConfiguration.Factory factory = cmcdConfig.toCmcdConfigurationFactory(); + this.setCmcdConfigurationFactory(factory); + } else { + this.setCmcdConfigurationFactory(null); + } + + if (!isSourceEqual) { + playerNeedsSource = true; + initializePlayer(); + } + } else { + clearSrc(); + } + } + public void clearSrc() { + if (source.getUri() != null) { + if (player != null) { + player.stop(); + player.clearMediaItems(); + } + } + + this.source = new Source(); + this.mediaDataSourceFactory = null; + clearResumePosition(); + } + + public void setProgressUpdateInterval(final float progressUpdateInterval) { + mProgressUpdateInterval = progressUpdateInterval; + } + + public void setReportBandwidth(boolean reportBandwidth) { + mReportBandwidth = reportBandwidth; + } + + public void setResizeModeModifier(@ResizeMode.Mode int resizeMode) { + if (exoPlayerView != null) { + exoPlayerView.setResizeMode(resizeMode); + } + } + + private void applyModifiers() { + setRepeatModifier(repeat); + setMutedModifier(muted); + } + + public void setRepeatModifier(boolean repeat) { + if (player != null) { + if (repeat) { + player.setRepeatMode(Player.REPEAT_MODE_ONE); + } else { + player.setRepeatMode(Player.REPEAT_MODE_OFF); + } + } + this.repeat = repeat; + } + + public void setPreventsDisplaySleepDuringVideoPlayback(boolean preventsDisplaySleepDuringVideoPlayback) { + this.preventsDisplaySleepDuringVideoPlayback = preventsDisplaySleepDuringVideoPlayback; + } + + public void disableTrack(int rendererIndex) { + if (trackSelector == null) return; + + DefaultTrackSelector.Parameters disableParameters = trackSelector.getParameters() + .buildUpon() + .setRendererDisabled(rendererIndex, true) + .build(); + trackSelector.setParameters(disableParameters); + } + + private void selectTextTrackInternal(String type, String value) { + if (player == null || trackSelector == null) return; + + DebugLog.d(TAG, "selectTextTrackInternal: type=" + type + ", value=" + value); + + DefaultTrackSelector.Parameters.Builder parametersBuilder = trackSelector.getParameters().buildUpon(); + + if ("disabled".equals(type) || value == null) { + parametersBuilder.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, true); + } else { + parametersBuilder.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, false); + + parametersBuilder.clearOverridesOfType(C.TRACK_TYPE_TEXT); + + MappingTrackSelector.MappedTrackInfo info = trackSelector.getCurrentMappedTrackInfo(); + if (info != null) { + int textRendererIndex = getTrackRendererIndex(C.TRACK_TYPE_TEXT); + if (textRendererIndex != C.INDEX_UNSET) { + TrackGroupArray groups = info.getTrackGroups(textRendererIndex); + boolean trackFound = false; + + for (int groupIndex = 0; groupIndex < groups.length; groupIndex++) { + TrackGroup group = groups.get(groupIndex); + for (int trackIndex = 0; trackIndex < group.length; trackIndex++) { + Format format = group.getFormat(trackIndex); + + boolean isMatch = false; + if ("language".equals(type) && format.language != null && format.language.equals(value)) { + isMatch = true; + } else if ("title".equals(type) && format.label != null && format.label.equals(value)) { + isMatch = true; + } else if ("index".equals(type)) { + int targetIndex = ReactBridgeUtils.safeParseInt(value, -1); + if (targetIndex == trackIndex) { + isMatch = true; + } + } + + if (isMatch) { + TrackSelectionOverride override = new TrackSelectionOverride(group, + java.util.Arrays.asList(trackIndex)); + parametersBuilder.addOverride(override); + trackFound = true; + break; + } + } + if (trackFound) break; + } + + if (!trackFound) { + DebugLog.w(TAG, "Text track not found for type=" + type + ", value=" + value + + ". Keeping current selection."); + } + } + } + } + + try { + trackSelector.setParameters(parametersBuilder.build()); + + // Give PlayerView time to update its controls + mainHandler.postDelayed(() -> { + if (exoPlayerView != null) { + updateSubtitleButtonVisibility(); + } + }, 100); + } catch (Exception e) { + DebugLog.e(TAG, "Error setting text track parameters: " + e.getMessage()); + } + } + + public void setSelectedTrack(int trackType, String type, String value) { + if (player == null || trackSelector == null) return; + + if (controls) { + return; + } + + int rendererIndex = getTrackRendererIndex(trackType); + if (rendererIndex == C.INDEX_UNSET) { + return; + } + + MappingTrackSelector.MappedTrackInfo info = trackSelector.getCurrentMappedTrackInfo(); + if (info == null) { + return; + } + + TrackGroupArray groups = info.getTrackGroups(rendererIndex); + int groupIndex = C.INDEX_UNSET; + List tracks = new ArrayList<>(); + tracks.add(0); + + if (TextUtils.isEmpty(type)) { + type = "default"; + } + + if ("disabled".equals(type)) { + disableTrack(rendererIndex); + return; + } else if ("language".equals(type)) { + for (int i = 0; i < groups.length; ++i) { + Format format = groups.get(i).getFormat(0); + if (format.language != null && format.language.equals(value)) { + groupIndex = i; + break; + } + } + } else if ("title".equals(type)) { + for (int i = 0; i < groups.length; ++i) { + Format format = groups.get(i).getFormat(0); + if (format.label != null && format.label.equals(value)) { + groupIndex = i; + break; + } + } + } else if ("index".equals(type)) { + int iValue = ReactBridgeUtils.safeParseInt(value, -1); + if (iValue != -1) { + if (trackType == C.TRACK_TYPE_VIDEO && groups.length == 1) { + groupIndex = 0; + if (iValue < groups.get(groupIndex).length) { + tracks.set(0, iValue); + } + } else if (iValue < groups.length) { + groupIndex = iValue; + } + } + } else if ("resolution".equals(type)) { + int height = ReactBridgeUtils.safeParseInt(value, -1); + if (height != -1) { + for (int i = 0; i < groups.length; ++i) { // Search for the exact height + TrackGroup group = groups.get(i); + Format closestFormat = null; + int closestTrackIndex = -1; + boolean usingExactMatch = false; + for (int j = 0; j < group.length; j++) { + Format format = group.getFormat(j); + if (format.height == height) { + groupIndex = i; + tracks.set(0, j); + closestFormat = null; + closestTrackIndex = -1; + usingExactMatch = true; + break; + } else if (isUsingContentResolution) { + // When using content resolution rather than ads, we need to try and find the closest match if there is no exact match + if (closestFormat != null) { + if ((format.bitrate > closestFormat.bitrate || format.height > closestFormat.height) && format.height < height) { + // Higher quality match + closestFormat = format; + closestTrackIndex = j; + } + } else if (format.height < height) { + closestFormat = format; + closestTrackIndex = j; + } + } + } + // This is a fallback if the new period contains only higher resolutions than the user has selected + if (closestFormat == null && isUsingContentResolution && !usingExactMatch) { + // No close match found - so we pick the lowest quality + int minHeight = Integer.MAX_VALUE; + for (int j = 0; j < group.length; j++) { + Format format = group.getFormat(j); + if (format.height < minHeight) { + minHeight = format.height; + groupIndex = i; + tracks.set(0, j); + } + } + } + // Selecting the closest match found + if (closestFormat != null && closestTrackIndex != -1) { + // We found the closest match instead of an exact one + groupIndex = i; + tracks.set(0, closestTrackIndex); + } + } + } + } else if (trackType == C.TRACK_TYPE_TEXT && Util.SDK_INT > 18) { // Text default + // Use system settings if possible + CaptioningManager captioningManager + = (CaptioningManager)themedReactContext.getSystemService(Context.CAPTIONING_SERVICE); + if (captioningManager != null && captioningManager.isEnabled()) { + groupIndex = getGroupIndexForDefaultLocale(groups); + } + } else if (trackType == C.TRACK_TYPE_AUDIO) { // Audio default + groupIndex = getGroupIndexForDefaultLocale(groups); + } + + if (groupIndex == C.INDEX_UNSET && trackType == C.TRACK_TYPE_VIDEO && groups.length != 0) { // Video auto + // Add all tracks as valid options for ABR to choose from + TrackGroup group = groups.get(0); + ArrayList allTracks = new ArrayList<>(group.length); + groupIndex = 0; + for (int j = 0; j < group.length; j++) { + allTracks.add(j); + } + + // Valiate list of all tracks and add only supported formats + int supportedFormatLength = 0; + for (int g = 0; g < allTracks.size(); g++) { + Format format = group.getFormat(g); + if (isFormatSupported(format)) { + supportedFormatLength++; + } + } + if (allTracks.size() == 1) { + // With only one tracks we can't remove any tracks so attempt to play it anyway + tracks = allTracks; + } else { + tracks = new ArrayList<>(supportedFormatLength + 1); + for (int k = 0; k < allTracks.size(); k++) { + Format format = group.getFormat(k); + if (isFormatSupported(format)) { + tracks.add(allTracks.get(k)); + } + } + } + } + + if (groupIndex == C.INDEX_UNSET) { + disableTrack(rendererIndex); + return; + } + + try { + TrackSelectionOverride selectionOverride = new TrackSelectionOverride(groups.get(groupIndex), tracks); + + DefaultTrackSelector.Parameters.Builder selectionParameters = trackSelector.getParameters() + .buildUpon() + .setExceedAudioConstraintsIfNecessary(true) + .setExceedRendererCapabilitiesIfNecessary(true) + .setExceedVideoConstraintsIfNecessary(true) + .setRendererDisabled(rendererIndex, false); + + // Clear existing overrides for this track type to avoid conflicts + // But be careful with audio tracks - don't clear unless explicitly selecting a different track + if (trackType != C.TRACK_TYPE_AUDIO || !type.equals("default")) { + selectionParameters.clearOverridesOfType(selectionOverride.getType()); + } + + if (trackType == C.TRACK_TYPE_VIDEO && isUsingVideoABR()) { + selectionParameters.setMaxVideoBitrate(maxBitRate == 0 ? Integer.MAX_VALUE : maxBitRate); + } else { + selectionParameters.addOverride(selectionOverride); + } + + // For audio tracks, ensure audio renderer stays enabled + if (trackType == C.TRACK_TYPE_AUDIO) { + selectionParameters.setForceHighestSupportedBitrate(false); + selectionParameters.setForceLowestBitrate(false); + DebugLog.d(TAG, "Audio track selection: group=" + groupIndex + ", tracks=" + tracks + + ", override=" + selectionOverride); + } + + trackSelector.setParameters(selectionParameters.build()); + DebugLog.d(TAG, "Applied track selection for type: " + trackType + ", group: " + groupIndex); + } catch (Exception e) { + DebugLog.e(TAG, "Error applying track selection: " + e.getMessage()); + e.printStackTrace(); + } + } + + private boolean isFormatSupported(Format format) { + int width = format.width == Format.NO_VALUE ? 0 : format.width; + int height = format.height == Format.NO_VALUE ? 0 : format.height; + float frameRate = format.frameRate == Format.NO_VALUE ? 0 : format.frameRate; + String mimeType = format.sampleMimeType; + if (mimeType == null) { + return true; + } + boolean isSupported; + try { + MediaCodecInfo codecInfo = MediaCodecUtil.getDecoderInfo(mimeType, false, false); + isSupported = codecInfo.isVideoSizeAndRateSupportedV21(width, height, frameRate); + } catch (Exception e) { + // Failed to get decoder info - assume it is supported + isSupported = true; + } + return isSupported; + } + + private int getGroupIndexForDefaultLocale(TrackGroupArray groups) { + if (groups.length == 0){ + return C.INDEX_UNSET; + } + + int groupIndex = 0; // default if no match + String locale2 = Locale.getDefault().getLanguage(); // 2 letter code + String locale3 = Locale.getDefault().getISO3Language(); // 3 letter code + for (int i = 0; i < groups.length; ++i) { + Format format = groups.get(i).getFormat(0); + String language = format.language; + if (language != null && (language.equals(locale2) || language.equals(locale3))) { + groupIndex = i; + break; + } + } + return groupIndex; + } + + public void setSelectedVideoTrack(String type, String value) { + videoTrackType = type; + videoTrackValue = value; + if (!loadVideoStarted) setSelectedTrack(C.TRACK_TYPE_VIDEO, videoTrackType, videoTrackValue); + } + + public void setSelectedAudioTrack(String type, String value) { + audioTrackType = type; + audioTrackValue = value; + + if (!controls && player != null && trackSelector != null) { + setSelectedTrack(C.TRACK_TYPE_AUDIO, audioTrackType, audioTrackValue); + } + } + + public void setSelectedTextTrack(String type, String value) { + textTrackType = type; + textTrackValue = value; + + selectTextTrackInternal(type, value); + } + + public void setPausedModifier(boolean paused) { + isPaused = paused; + if (player != null) { + if (!paused) { + resumePlayback(); + } else { + pausePlayback(); + } + } + } + + public void setEnterPictureInPictureOnLeave(boolean enterPictureInPictureOnLeave) { + this.enterPictureInPictureOnLeave = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && enterPictureInPictureOnLeave; + if (player != null) { + PictureInPictureUtil.applyAutoEnterEnabled(themedReactContext, pictureInPictureParamsBuilder, this.enterPictureInPictureOnLeave); + } + } + + protected void setIsInPictureInPicture(boolean isInPictureInPicture) { + eventEmitter.onPictureInPictureStatusChanged.invoke(isInPictureInPicture); + + if (fullScreenPlayerView != null && fullScreenPlayerView.isShowing()) { + if (isInPictureInPicture) fullScreenPlayerView.hideWithoutPlayer(); + return; + } + + Activity currentActivity = themedReactContext.getCurrentActivity(); + if (currentActivity == null) return; + + View decorView = currentActivity.getWindow().getDecorView(); + ViewGroup rootView = decorView.findViewById(android.R.id.content); + + LayoutParams layoutParams = new LayoutParams( + LayoutParams.MATCH_PARENT, + LayoutParams.MATCH_PARENT); + + if (isInPictureInPicture) { + ViewGroup parent = (ViewGroup)exoPlayerView.getParent(); + if (parent != null) { + parent.removeView(exoPlayerView); + } + for (int i = 0; i < rootView.getChildCount(); i++) { + if (rootView.getChildAt(i) != exoPlayerView) { + rootViewChildrenOriginalVisibility.add(rootView.getChildAt(i).getVisibility()); + rootView.getChildAt(i).setVisibility(View.GONE); + } + } + rootView.addView(exoPlayerView, layoutParams); + } else { + rootView.removeView(exoPlayerView); + if (!rootViewChildrenOriginalVisibility.isEmpty()) { + for (int i = 0; i < rootView.getChildCount(); i++) { + rootView.getChildAt(i).setVisibility(rootViewChildrenOriginalVisibility.get(i)); + } + addView(exoPlayerView, 0, layoutParams); + } + } + } + + public void enterPictureInPictureMode() { + PictureInPictureParams _pipParams = null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + ArrayList actions = PictureInPictureUtil.getPictureInPictureActions(themedReactContext, isPaused, pictureInPictureReceiver); + pictureInPictureParamsBuilder.setActions(actions); + if (player.getPlaybackState() == Player.STATE_READY) { + pictureInPictureParamsBuilder.setAspectRatio(PictureInPictureUtil.calcPictureInPictureAspectRatio(player)); + } + _pipParams = pictureInPictureParamsBuilder.build(); + } + PictureInPictureUtil.enterPictureInPictureMode(themedReactContext, _pipParams); + } + + public void exitPictureInPictureMode() { + Activity currentActivity = themedReactContext.getCurrentActivity(); + if (currentActivity == null) return; + + View decorView = currentActivity.getWindow().getDecorView(); + ViewGroup rootView = decorView.findViewById(android.R.id.content); + + if (!rootViewChildrenOriginalVisibility.isEmpty()) { + if (exoPlayerView.getParent().equals(rootView)) rootView.removeView(exoPlayerView); + for (int i = 0; i < rootView.getChildCount(); i++) { + rootView.getChildAt(i).setVisibility(rootViewChildrenOriginalVisibility.get(i)); + } + rootViewChildrenOriginalVisibility.clear(); + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && currentActivity.isInPictureInPictureMode()) { + currentActivity.moveTaskToBack(false); + } + } + + public void setMutedModifier(boolean muted) { + this.muted = muted; + if (player != null) { + player.setVolume(muted ? 0.f : audioVolume); + } + } + + private void changeAudioOutput(AudioOutput output) { + if (player != null) { + int streamType = output.getStreamType(); + int usage = Util.getAudioUsageForStreamType(streamType); + int contentType = Util.getAudioContentTypeForStreamType(streamType); + AudioAttributes audioAttributes = new AudioAttributes.Builder().setUsage(usage) + .setContentType(contentType) + .build(); + player.setAudioAttributes(audioAttributes, false); + AudioManager audioManager = (AudioManager) themedReactContext.getSystemService(Context.AUDIO_SERVICE); + boolean isSpeakerOutput = output == AudioOutput.SPEAKER; + audioManager.setMode( + isSpeakerOutput ? AudioManager.MODE_NORMAL + : AudioManager.MODE_IN_COMMUNICATION); + audioManager.setSpeakerphoneOn(isSpeakerOutput); + } + } + + public void setAudioOutput(AudioOutput output) { + if (audioOutput != output) { + this.audioOutput = output; + changeAudioOutput(output); + } + } + + public void setVolumeModifier(float volume) { + audioVolume = volume; + if (player != null) { + player.setVolume(audioVolume); + } + } + + public void seekTo(long positionMs) { + if (player != null) { + player.seekTo(positionMs); + } + } + + public void setRateModifier(float newRate) { + if (newRate <= 0) { + DebugLog.w(TAG, "cannot set rate <= 0"); + return; + } + + rate = newRate; + + if (player != null) { + PlaybackParameters params = new PlaybackParameters(rate, 1f); + player.setPlaybackParameters(params); + } + } + + public void setMaxBitRateModifier(int newMaxBitRate) { + maxBitRate = newMaxBitRate; + if (player != null && isUsingVideoABR()) { + // do not apply yet if not auto + trackSelector.setParameters(trackSelector.buildUponParameters() + .setMaxVideoBitrate(maxBitRate == 0 ? Integer.MAX_VALUE : maxBitRate)); + } + } + + public void setPlayInBackground(boolean playInBackground) { + this.playInBackground = playInBackground; + } + + public void setDisableFocus(boolean disableFocus) { + this.disableFocus = disableFocus; + } + + public void setFocusable(boolean focusable) { + this.focusable = focusable; + exoPlayerView.setFocusable(this.focusable); + } + + public void setShowNotificationControls(boolean showNotificationControls) { + this.showNotificationControls = showNotificationControls; + + if (playbackServiceConnection == null && showNotificationControls) { + setupPlaybackService(); + } else if(!showNotificationControls && playbackServiceConnection != null) { + cleanupPlaybackService(); + } + } + + public void setBufferingStrategy(BufferingStrategy.BufferingStrategyEnum _bufferingStrategy) { + bufferingStrategy = _bufferingStrategy; + } + + public boolean getPreventsDisplaySleepDuringVideoPlayback() { + return preventsDisplaySleepDuringVideoPlayback; + } + + public void setDisableDisconnectError(boolean disableDisconnectError) { + this.disableDisconnectError = disableDisconnectError; + } + + public void setFullscreen(boolean fullscreen) { + if (fullscreen == isFullscreen) { + return; // Avoid generating events when nothing is changing + } + isFullscreen = fullscreen; + + Activity activity = themedReactContext.getCurrentActivity(); + if (activity == null) { + return; + } + + if (isFullscreen) { + fullScreenPlayerView = new FullScreenPlayerView(getContext(), exoPlayerView, this, null, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + setFullscreen(false); + } + }, controlsConfig); + eventEmitter.onVideoFullscreenPlayerWillPresent.invoke(); + if (fullScreenPlayerView != null) { + fullScreenPlayerView.show(); + } + UiThreadUtil.runOnUiThread(() -> { + eventEmitter.onVideoFullscreenPlayerDidPresent.invoke(); + }); + } else { + eventEmitter.onVideoFullscreenPlayerWillDismiss.invoke(); + if (fullScreenPlayerView != null) { + fullScreenPlayerView.dismiss(); + reLayoutControls(); + setControls(controls); + } + UiThreadUtil.runOnUiThread(() -> { + eventEmitter.onVideoFullscreenPlayerDidDismiss.invoke(); + }); + } + } + + @Override + public void onDrmKeysLoaded(int windowIndex, MediaSource.MediaPeriodId mediaPeriodId) { + DebugLog.d("DRM Info", "onDrmKeysLoaded"); + } + + @Override + public void onDrmSessionAcquired(int windowIndex, MediaSource.MediaPeriodId mediaPeriodId, int state) { + DebugLog.d("DRM Info", "onDrmSessionAcquired"); + } + + @Override + public void onDrmSessionReleased(int windowIndex, MediaSource.MediaPeriodId mediaPeriodId) { + DebugLog.d("DRM Info", "onDrmSessionReleased"); + } + + @Override + public void onDrmSessionManagerError(int windowIndex, MediaSource.MediaPeriodId mediaPeriodId, @NonNull Exception e) { + DebugLog.d("DRM Info", "onDrmSessionManagerError"); + eventEmitter.onVideoError.invoke("onDrmSessionManagerError", e, "3002"); + } + + @Override + public void onDrmKeysRestored(int windowIndex, MediaSource.MediaPeriodId mediaPeriodId) { + DebugLog.d("DRM Info", "onDrmKeysRestored"); + } + + @Override + public void onDrmKeysRemoved(int windowIndex, MediaSource.MediaPeriodId mediaPeriodId) { + DebugLog.d("DRM Info", "onDrmKeysRemoved"); + } + + /** + * Handling controls prop + * + * @param controls Controls prop, if true enable controls, if false disable them + */ + public void setControls(boolean controls) { + this.controls = controls; + if (exoPlayerView != null) { + exoPlayerView.setUseController(controls); + // Additional configuration for proper touch handling + if (controls) { + exoPlayerView.setControllerAutoShow(true); + exoPlayerView.setControllerHideOnTouch(true); // Show controls on touch, don't hide + exoPlayerView.setControllerShowTimeoutMs(5000); + } + } + if (controls) { + addPlayerControl(); + } + refreshControlsStyles(); + } + + public void setSubtitleStyle(SubtitleStyle style) { + exoPlayerView.setSubtitleStyle(style); + } + + public void setShutterColor(Integer color) { + exoPlayerView.setShutterColor(color); + } + + @Override + public void onAdEvent(AdEvent adEvent) { + if (adEvent.getAdData() != null) { + eventEmitter.onReceiveAdEvent.invoke(adEvent.getType().name(), adEvent.getAdData()); + } else { + eventEmitter.onReceiveAdEvent.invoke(adEvent.getType().name(), null); + } + } + + @Override + public void onAdError(AdErrorEvent adErrorEvent) { + AdError error = adErrorEvent.getError(); + Map errMap = Map.of( + "message", error.getMessage(), + "code", String.valueOf(error.getErrorCode()), + "type", String.valueOf(error.getErrorType()) + ); + eventEmitter.onReceiveAdEvent.invoke("ERROR", errMap); + } + + public void setControlsStyles(ControlsConfig controlsStyles) { + controlsConfig = controlsStyles; + refreshControlsStyles(); + } +} diff --git a/backup_sdk54_upgrade/android_original/.gitignore b/backup_sdk54_upgrade/android_original/.gitignore new file mode 100644 index 0000000..8a6be07 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/.gitignore @@ -0,0 +1,16 @@ +# OSX +# +.DS_Store + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml +*.hprof +.cxx/ + +# Bundle artifacts +*.jsbundle diff --git a/backup_sdk54_upgrade/android_original/app/build.gradle b/backup_sdk54_upgrade/android_original/app/build.gradle new file mode 100644 index 0000000..2212a88 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/build.gradle @@ -0,0 +1,190 @@ +apply plugin: "com.android.application" +apply plugin: "org.jetbrains.kotlin.android" +apply plugin: "com.facebook.react" + +def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath() + +/** + * This is the configuration block to customize your React Native Android app. + * By default you don't need to apply any configuration, just uncomment the lines you need. + */ +react { + entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim()) + reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() + hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc" + codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() + + // Use Expo CLI to bundle the app, this ensures the Metro config + // works correctly with Expo projects. + cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim()) + bundleCommand = "export:embed" + + /* Folders */ + // The root of your project, i.e. where "package.json" lives. Default is '../..' + // root = file("../../") + // The folder where the react-native NPM package is. Default is ../../node_modules/react-native + // reactNativeDir = file("../../node_modules/react-native") + // The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen + // codegenDir = file("../../node_modules/@react-native/codegen") + + /* Variants */ + // The list of variants to that are debuggable. For those we're going to + // skip the bundling of the JS bundle and the assets. By default is just 'debug'. + // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. + // debuggableVariants = ["liteDebug", "prodDebug"] + + /* Bundling */ + // A list containing the node command and its flags. Default is just 'node'. + // nodeExecutableAndArgs = ["node"] + + // + // The path to the CLI configuration file. Default is empty. + // bundleConfig = file(../rn-cli.config.js) + // + // The name of the generated asset file containing your JS bundle + // bundleAssetName = "MyApplication.android.bundle" + // + // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' + // entryFile = file("../js/MyApplication.android.js") + // + // A list of extra flags to pass to the 'bundle' commands. + // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle + // extraPackagerArgs = [] + + /* Hermes Commands */ + // The hermes compiler command to run. By default it is 'hermesc' + // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" + // + // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" + // hermesFlags = ["-O", "-output-source-map"] + + /* Autolinking */ + autolinkLibrariesWithApp() +} + +/** + * Set this to true to Run Proguard on Release builds to minify the Java bytecode. + */ +def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean() + +/** + * The preferred build flavor of JavaScriptCore (JSC) + * + * For example, to use the international variant, you can use: + * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` + * + * The international variant includes ICU i18n library and necessary data + * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that + * give correct results when using with locales other than en-US. Note that + * this variant is about 6MiB larger per architecture than default. + */ +def jscFlavor = 'org.webkit:android-jsc:+' + +apply from: new File(["node", "--print", "require('path').dirname(require.resolve('@sentry/react-native/package.json'))"].execute().text.trim(), "sentry.gradle") + +android { + ndkVersion rootProject.ext.ndkVersion + + buildToolsVersion rootProject.ext.buildToolsVersion + compileSdk rootProject.ext.compileSdkVersion + + namespace 'com.nuvio.app' + defaultConfig { + applicationId 'com.nuvio.app' + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 19 + versionName "1.2.4" + } + + splits { + abi { + reset() + enable true + universalApk false // If true, also generate a universal APK + include "arm64-v8a", "armeabi-v7a", "x86", "x86_64" + } + } + signingConfigs { + debug { + storeFile file('debug.keystore') + storePassword 'android' + keyAlias 'androiddebugkey' + keyPassword 'android' + } + } + buildTypes { + debug { + signingConfig signingConfigs.debug + } + release { + // Caution! In production, you need to generate your own keystore file. + // see https://reactnative.dev/docs/signed-apk-android. + signingConfig signingConfigs.debug + shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false) + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + crunchPngs (findProperty('android.enablePngCrunchInReleaseBuilds')?.toBoolean() ?: true) + } + } + packagingOptions { + jniLibs { + useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false) + } + } + androidResources { + ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~' + } +} + +// Apply static values from `gradle.properties` to the `android.packagingOptions` +// Accepts values in comma delimited lists, example: +// android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini +["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop -> + // Split option: 'foo,bar' -> ['foo', 'bar'] + def options = (findProperty("android.packagingOptions.$prop") ?: "").split(","); + // Trim all elements in place. + for (i in 0.. 0) { + println "android.packagingOptions.$prop += $options ($options.length)" + // Ex: android.packagingOptions.pickFirsts += '**/SCCS/**' + options.each { + android.packagingOptions[prop] += it + } + } +} + +dependencies { + // The version of react-native is set by the React Native Gradle Plugin + implementation("com.facebook.react:react-android") + + def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; + def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; + def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; + + if (isGifEnabled) { + // For animated gif support + implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}") + } + + if (isWebpEnabled) { + // For webp support + implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}") + if (isWebpAnimatedEnabled) { + // Animated webp support + implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}") + } + } + + if (hermesEnabled.toBoolean()) { + implementation("com.facebook.react:hermes-android") + } else { + implementation jscFlavor + } + + // Include only FFmpeg decoder AAR to avoid duplicates with Maven Media3 + implementation files("libs/lib-decoder-ffmpeg-release.aar") +} diff --git a/backup_sdk54_upgrade/android_original/app/debug.keystore b/backup_sdk54_upgrade/android_original/app/debug.keystore new file mode 100644 index 0000000..364e105 Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/debug.keystore differ diff --git a/backup_sdk54_upgrade/android_original/app/libs/lib-decoder-ffmpeg-release.aar b/backup_sdk54_upgrade/android_original/app/libs/lib-decoder-ffmpeg-release.aar new file mode 100644 index 0000000..2ee1cee Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/libs/lib-decoder-ffmpeg-release.aar differ diff --git a/backup_sdk54_upgrade/android_original/app/proguard-rules.pro b/backup_sdk54_upgrade/android_original/app/proguard-rules.pro new file mode 100644 index 0000000..4e63972 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/proguard-rules.pro @@ -0,0 +1,28 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# react-native-reanimated +-keep class com.swmansion.reanimated.** { *; } +-keep class com.facebook.react.turbomodule.** { *; } + +# Add any project specific keep options here: + +# Media3 / ExoPlayer keep (extensions and reflection) +-keep class androidx.media3.** { *; } +-dontwarn androidx.media3.** + +# FastImage / Glide ProGuard rules +-keep public class com.dylanvann.fastimage.* {*;} +-keep public class com.dylanvann.fastimage.** {*;} +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public class * extends com.bumptech.glide.module.AppGlideModule +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} diff --git a/backup_sdk54_upgrade/android_original/app/src/debug/AndroidManifest.xml b/backup_sdk54_upgrade/android_original/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..3ec2507 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/backup_sdk54_upgrade/android_original/app/src/main/AndroidManifest.xml b/backup_sdk54_upgrade/android_original/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..6259c1b --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/src/main/AndroidManifest.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backup_sdk54_upgrade/android_original/app/src/main/java/com/nuvio/app/MainActivity.kt b/backup_sdk54_upgrade/android_original/app/src/main/java/com/nuvio/app/MainActivity.kt new file mode 100644 index 0000000..bdd6bfe --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/src/main/java/com/nuvio/app/MainActivity.kt @@ -0,0 +1,61 @@ +package com.nuvio.app + +import android.os.Build +import android.os.Bundle + +import com.facebook.react.ReactActivity +import com.facebook.react.ReactActivityDelegate +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled +import com.facebook.react.defaults.DefaultReactActivityDelegate + +import expo.modules.ReactActivityDelegateWrapper + +class MainActivity : ReactActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + // Set the theme to AppTheme BEFORE onCreate to support + // coloring the background, status bar, and navigation bar. + // This is required for expo-splash-screen. + setTheme(R.style.AppTheme); + super.onCreate(null) + } + + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + override fun getMainComponentName(): String = "main" + + /** + * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] + * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] + */ + override fun createReactActivityDelegate(): ReactActivityDelegate { + return ReactActivityDelegateWrapper( + this, + BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, + object : DefaultReactActivityDelegate( + this, + mainComponentName, + fabricEnabled + ){}) + } + + /** + * Align the back button behavior with Android S + * where moving root activities to background instead of finishing activities. + * @see onBackPressed + */ + override fun invokeDefaultOnBackPressed() { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { + if (!moveTaskToBack(false)) { + // For non-root activities, use the default implementation to finish them. + super.invokeDefaultOnBackPressed() + } + return + } + + // Use the default back button implementation on Android S + // because it's doing more than [Activity.moveTaskToBack] in fact. + super.invokeDefaultOnBackPressed() + } +} diff --git a/backup_sdk54_upgrade/android_original/app/src/main/java/com/nuvio/app/MainApplication.kt b/backup_sdk54_upgrade/android_original/app/src/main/java/com/nuvio/app/MainApplication.kt new file mode 100644 index 0000000..31160e6 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/src/main/java/com/nuvio/app/MainApplication.kt @@ -0,0 +1,57 @@ +package com.nuvio.app + +import android.app.Application +import android.content.res.Configuration + +import com.facebook.react.PackageList +import com.facebook.react.ReactApplication +import com.facebook.react.ReactNativeHost +import com.facebook.react.ReactPackage +import com.facebook.react.ReactHost +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load +import com.facebook.react.defaults.DefaultReactNativeHost +import com.facebook.react.soloader.OpenSourceMergedSoMapping +import com.facebook.soloader.SoLoader + +import expo.modules.ApplicationLifecycleDispatcher +import expo.modules.ReactNativeHostWrapper + +class MainApplication : Application(), ReactApplication { + + override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper( + this, + object : DefaultReactNativeHost(this) { + override fun getPackages(): List { + val packages = PackageList(this).packages + // Packages that cannot be autolinked yet can be added manually here, for example: + // packages.add(new MyReactNativePackage()); + return packages + } + + override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry" + + override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG + + override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED + } + ) + + override val reactHost: ReactHost + get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost) + + override fun onCreate() { + super.onCreate() + SoLoader.init(this, OpenSourceMergedSoMapping) + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + // If you opted-in for the New Architecture, we load the native entry point for this app. + load() + } + ApplicationLifecycleDispatcher.onApplicationCreate(this) + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig) + } +} diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-hdpi/splashscreen_logo.png b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-hdpi/splashscreen_logo.png new file mode 100644 index 0000000..29ed05b Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-hdpi/splashscreen_logo.png differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-mdpi/splashscreen_logo.png b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-mdpi/splashscreen_logo.png new file mode 100644 index 0000000..1e3a378 Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-mdpi/splashscreen_logo.png differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-xhdpi/splashscreen_logo.png b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-xhdpi/splashscreen_logo.png new file mode 100644 index 0000000..6b7ddf9 Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-xhdpi/splashscreen_logo.png differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-xxhdpi/splashscreen_logo.png b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-xxhdpi/splashscreen_logo.png new file mode 100644 index 0000000..b977b3f Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-xxhdpi/splashscreen_logo.png differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-xxxhdpi/splashscreen_logo.png b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-xxxhdpi/splashscreen_logo.png new file mode 100644 index 0000000..a79fe8b Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable-xxxhdpi/splashscreen_logo.png differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/drawable/ic_launcher_background.xml b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..883b2a0 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/drawable/rn_edit_text_material.xml b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable/rn_edit_text_material.xml new file mode 100644 index 0000000..5c25e72 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/src/main/res/drawable/rn_edit_text_material.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..3941bea --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..3941bea --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..4f55492 Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..acff384 Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..68b2b6b Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..7ce788c Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..695874a Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..de65e82 Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..f48cd8b Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..b9693cb Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..d48403b Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..eebf7ad Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..5f71916 Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..4f6de84 Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..bee06ef Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..4208368 Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..34afa47 Binary files /dev/null and b/backup_sdk54_upgrade/android_original/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/values-night/colors.xml b/backup_sdk54_upgrade/android_original/app/src/main/res/values-night/colors.xml new file mode 100644 index 0000000..3c05de5 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/src/main/res/values-night/colors.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/values/colors.xml b/backup_sdk54_upgrade/android_original/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..bdcf8bb --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/src/main/res/values/colors.xml @@ -0,0 +1,7 @@ + + #020404 + #020404 + #023c69 + #020404 + #020404 + \ No newline at end of file diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/values/strings.xml b/backup_sdk54_upgrade/android_original/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..8fdc2ab --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/src/main/res/values/strings.xml @@ -0,0 +1,7 @@ + + Nuvio + contain + false + dark + 1.2.4 + \ No newline at end of file diff --git a/backup_sdk54_upgrade/android_original/app/src/main/res/values/styles.xml b/backup_sdk54_upgrade/android_original/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..7ee63e3 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/backup_sdk54_upgrade/android_original/build.gradle b/backup_sdk54_upgrade/android_original/build.gradle new file mode 100644 index 0000000..abbcb8e --- /dev/null +++ b/backup_sdk54_upgrade/android_original/build.gradle @@ -0,0 +1,41 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + ext { + buildToolsVersion = findProperty('android.buildToolsVersion') ?: '35.0.0' + minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '24') + compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '35') + targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34') + kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.25' + + ndkVersion = "26.1.10909125" + } + repositories { + google() + mavenCentral() + } + dependencies { + classpath('com.android.tools.build:gradle') + classpath('com.facebook.react:react-native-gradle-plugin') + classpath('org.jetbrains.kotlin:kotlin-gradle-plugin') + } +} + +apply plugin: "com.facebook.react.rootproject" + +allprojects { + repositories { + maven { + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android')) + } + maven { + // Android JSC is installed from npm + url(new File(['node', '--print', "require.resolve('jsc-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), '../dist')) + } + + google() + mavenCentral() + maven { url 'https://www.jitpack.io' } + } +} diff --git a/backup_sdk54_upgrade/android_original/gradle.properties b/backup_sdk54_upgrade/android_original/gradle.properties new file mode 100644 index 0000000..bc2e641 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/gradle.properties @@ -0,0 +1,61 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true + +# Enable AAPT2 PNG crunching +android.enablePngCrunchInReleaseBuilds=true + +# Use this property to specify which architecture you want to build. +# You can also override it from the CLI using +# ./gradlew -PreactNativeArchitectures=x86_64 +reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 + +# Use this property to enable support to the new architecture. +# This will allow you to use TurboModules and the Fabric render in +# your application. You should enable this flag either if you want +# to write custom TurboModules/Fabric components OR use libraries that +# are providing them. +newArchEnabled=true + +# Use this property to enable or disable the Hermes JS engine. +# If set to false, you will be using JSC instead. +hermesEnabled=true + +# Enable GIF support in React Native images (~200 B increase) +expo.gif.enabled=true +# Enable webp support in React Native images (~85 KB increase) +expo.webp.enabled=true +# Enable animated webp support (~3.4 MB increase) +# Disabled by default because iOS doesn't support animated webp +expo.webp.animated=false + +# Enable network inspector +EX_DEV_CLIENT_NETWORK_INSPECTOR=true + +# Use legacy packaging to compress native libraries in the resulting APK. +expo.useLegacyPackaging=false +android.minSdkVersion=26 +RNVideo_media3Version=1.8.0 + +# Whether the app is configured to use edge-to-edge via the app config or `react-native-edge-to-edge` plugin +expo.edgeToEdgeEnabled=false \ No newline at end of file diff --git a/backup_sdk54_upgrade/android_original/gradle/wrapper/gradle-wrapper.jar b/backup_sdk54_upgrade/android_original/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..a4b76b9 Binary files /dev/null and b/backup_sdk54_upgrade/android_original/gradle/wrapper/gradle-wrapper.jar differ diff --git a/backup_sdk54_upgrade/android_original/gradle/wrapper/gradle-wrapper.properties b/backup_sdk54_upgrade/android_original/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..79eb9d0 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/backup_sdk54_upgrade/android_original/gradlew b/backup_sdk54_upgrade/android_original/gradlew new file mode 100755 index 0000000..f5feea6 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/backup_sdk54_upgrade/android_original/gradlew.bat b/backup_sdk54_upgrade/android_original/gradlew.bat new file mode 100644 index 0000000..9b42019 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/backup_sdk54_upgrade/android_original/sentry.properties b/backup_sdk54_upgrade/android_original/sentry.properties new file mode 100644 index 0000000..5581e03 --- /dev/null +++ b/backup_sdk54_upgrade/android_original/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/backup_sdk54_upgrade/android_original/settings.gradle b/backup_sdk54_upgrade/android_original/settings.gradle new file mode 100644 index 0000000..a39f8ed --- /dev/null +++ b/backup_sdk54_upgrade/android_original/settings.gradle @@ -0,0 +1,38 @@ +pluginManagement { + includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().toString()) +} +plugins { id("com.facebook.react.settings") } + +extensions.configure(com.facebook.react.ReactSettingsExtension) { ex -> + if (System.getenv('EXPO_USE_COMMUNITY_AUTOLINKING') == '1') { + ex.autolinkLibrariesFromCommand() + } else { + def 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', + 'android' + ].toList() + ex.autolinkLibrariesFromCommand(command) + } +} + +rootProject.name = 'Nuvio' + +dependencyResolutionManagement { + versionCatalogs { + reactAndroidLibs { + from(files(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../gradle/libs.versions.toml"))) + } + } +} + +apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle"); +useExpoModules() + +include ':app' +includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile()) diff --git a/backup_sdk54_upgrade/build.gradle.backup b/backup_sdk54_upgrade/build.gradle.backup new file mode 100644 index 0000000..2212a88 --- /dev/null +++ b/backup_sdk54_upgrade/build.gradle.backup @@ -0,0 +1,190 @@ +apply plugin: "com.android.application" +apply plugin: "org.jetbrains.kotlin.android" +apply plugin: "com.facebook.react" + +def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath() + +/** + * This is the configuration block to customize your React Native Android app. + * By default you don't need to apply any configuration, just uncomment the lines you need. + */ +react { + entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim()) + reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() + hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc" + codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() + + // Use Expo CLI to bundle the app, this ensures the Metro config + // works correctly with Expo projects. + cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim()) + bundleCommand = "export:embed" + + /* Folders */ + // The root of your project, i.e. where "package.json" lives. Default is '../..' + // root = file("../../") + // The folder where the react-native NPM package is. Default is ../../node_modules/react-native + // reactNativeDir = file("../../node_modules/react-native") + // The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen + // codegenDir = file("../../node_modules/@react-native/codegen") + + /* Variants */ + // The list of variants to that are debuggable. For those we're going to + // skip the bundling of the JS bundle and the assets. By default is just 'debug'. + // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. + // debuggableVariants = ["liteDebug", "prodDebug"] + + /* Bundling */ + // A list containing the node command and its flags. Default is just 'node'. + // nodeExecutableAndArgs = ["node"] + + // + // The path to the CLI configuration file. Default is empty. + // bundleConfig = file(../rn-cli.config.js) + // + // The name of the generated asset file containing your JS bundle + // bundleAssetName = "MyApplication.android.bundle" + // + // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' + // entryFile = file("../js/MyApplication.android.js") + // + // A list of extra flags to pass to the 'bundle' commands. + // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle + // extraPackagerArgs = [] + + /* Hermes Commands */ + // The hermes compiler command to run. By default it is 'hermesc' + // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" + // + // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" + // hermesFlags = ["-O", "-output-source-map"] + + /* Autolinking */ + autolinkLibrariesWithApp() +} + +/** + * Set this to true to Run Proguard on Release builds to minify the Java bytecode. + */ +def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean() + +/** + * The preferred build flavor of JavaScriptCore (JSC) + * + * For example, to use the international variant, you can use: + * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` + * + * The international variant includes ICU i18n library and necessary data + * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that + * give correct results when using with locales other than en-US. Note that + * this variant is about 6MiB larger per architecture than default. + */ +def jscFlavor = 'org.webkit:android-jsc:+' + +apply from: new File(["node", "--print", "require('path').dirname(require.resolve('@sentry/react-native/package.json'))"].execute().text.trim(), "sentry.gradle") + +android { + ndkVersion rootProject.ext.ndkVersion + + buildToolsVersion rootProject.ext.buildToolsVersion + compileSdk rootProject.ext.compileSdkVersion + + namespace 'com.nuvio.app' + defaultConfig { + applicationId 'com.nuvio.app' + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 19 + versionName "1.2.4" + } + + splits { + abi { + reset() + enable true + universalApk false // If true, also generate a universal APK + include "arm64-v8a", "armeabi-v7a", "x86", "x86_64" + } + } + signingConfigs { + debug { + storeFile file('debug.keystore') + storePassword 'android' + keyAlias 'androiddebugkey' + keyPassword 'android' + } + } + buildTypes { + debug { + signingConfig signingConfigs.debug + } + release { + // Caution! In production, you need to generate your own keystore file. + // see https://reactnative.dev/docs/signed-apk-android. + signingConfig signingConfigs.debug + shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false) + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + crunchPngs (findProperty('android.enablePngCrunchInReleaseBuilds')?.toBoolean() ?: true) + } + } + packagingOptions { + jniLibs { + useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false) + } + } + androidResources { + ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~' + } +} + +// Apply static values from `gradle.properties` to the `android.packagingOptions` +// Accepts values in comma delimited lists, example: +// android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini +["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop -> + // Split option: 'foo,bar' -> ['foo', 'bar'] + def options = (findProperty("android.packagingOptions.$prop") ?: "").split(","); + // Trim all elements in place. + for (i in 0.. 0) { + println "android.packagingOptions.$prop += $options ($options.length)" + // Ex: android.packagingOptions.pickFirsts += '**/SCCS/**' + options.each { + android.packagingOptions[prop] += it + } + } +} + +dependencies { + // The version of react-native is set by the React Native Gradle Plugin + implementation("com.facebook.react:react-android") + + def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; + def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; + def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; + + if (isGifEnabled) { + // For animated gif support + implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}") + } + + if (isWebpEnabled) { + // For webp support + implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}") + if (isWebpAnimatedEnabled) { + // Animated webp support + implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}") + } + } + + if (hermesEnabled.toBoolean()) { + implementation("com.facebook.react:hermes-android") + } else { + implementation jscFlavor + } + + // Include only FFmpeg decoder AAR to avoid duplicates with Maven Media3 + implementation files("libs/lib-decoder-ffmpeg-release.aar") +} diff --git a/ios/.bundle/config b/backup_sdk54_upgrade/ios_original/.bundle/config similarity index 100% rename from ios/.bundle/config rename to backup_sdk54_upgrade/ios_original/.bundle/config diff --git a/backup_sdk54_upgrade/ios_original/.gitignore b/backup_sdk54_upgrade/ios_original/.gitignore new file mode 100644 index 0000000..8beb344 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/.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/backup_sdk54_upgrade/ios_original/.xcode.env b/backup_sdk54_upgrade/ios_original/.xcode.env new file mode 100644 index 0000000..3d5782c --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/.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/backup_sdk54_upgrade/ios_original/Gemfile similarity index 100% rename from ios/Gemfile rename to backup_sdk54_upgrade/ios_original/Gemfile diff --git a/ios/Gemfile.lock b/backup_sdk54_upgrade/ios_original/Gemfile.lock similarity index 100% rename from ios/Gemfile.lock rename to backup_sdk54_upgrade/ios_original/Gemfile.lock diff --git a/backup_sdk54_upgrade/ios_original/KSPlayerManager.m b/backup_sdk54_upgrade/ios_original/KSPlayerManager.m new file mode 100644 index 0000000..f521027 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/KSPlayerManager.m @@ -0,0 +1,42 @@ +// +// 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) +RCT_EXTERN_METHOD(getTracks:(nonnull NSNumber *)node resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) + +@end + +@interface RCT_EXTERN_MODULE(KSPlayerModule, RCTEventEmitter) + +RCT_EXTERN_METHOD(getTracks:(nonnull NSNumber *)nodeTag resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) + +@end diff --git a/backup_sdk54_upgrade/ios_original/KSPlayerModule.swift b/backup_sdk54_upgrade/ios_original/KSPlayerModule.swift new file mode 100644 index 0000000..ee487c1 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/KSPlayerModule.swift @@ -0,0 +1,37 @@ +// +// 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(_ nodeTag: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { + DispatchQueue.main.async { + if let viewManager = self.bridge.module(for: KSPlayerViewManager.self) as? KSPlayerViewManager { + viewManager.getTracks(nodeTag, resolve: resolve, reject: reject) + } else { + reject("NO_VIEW_MANAGER", "KSPlayerViewManager not found", nil) + } + } + } +} diff --git a/backup_sdk54_upgrade/ios_original/KSPlayerView.swift b/backup_sdk54_upgrade/ios_original/KSPlayerView.swift new file mode 100644 index 0000000..7570f29 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/KSPlayerView.swift @@ -0,0 +1,519 @@ +// +// 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 + // Hide native controls - we use custom React Native controls + playerView.isUserInteractionEnabled = false + // Hide KSPlayer's built-in overlay/controls + playerView.controllerView.isHidden = true + playerView.contentOverlayView.isHidden = true + playerView.controllerView.alpha = 0 + playerView.contentOverlayView.alpha = 0 + playerView.controllerView.gestureRecognizers?.forEach { $0.isEnabled = 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() { + // Configure KSOptions (use static defaults where required) + KSOptions.isAutoPlay = false + #if targetEnvironment(simulator) + // Simulator: disable hardware decode and MEPlayer to avoid VT/Vulkan issues + KSOptions.hardwareDecode = false + KSOptions.asynchronousDecompression = false + KSOptions.secondPlayerType = nil + #endif + } + + func setSource(_ source: NSDictionary) { + currentSource = source + + guard let uri = source["uri"] as? String else { + print("KSPlayerView: No URI provided") + sendEvent("onError", ["error": "No URI provided in source"]) + return + } + + // Validate URL before proceeding + guard let url = URL(string: uri), url.scheme != nil else { + print("KSPlayerView: Invalid URL format: \(uri)") + sendEvent("onError", ["error": "Invalid URL format: \(uri)"]) + return + } + + var headers: [String: String] = [:] + if let headersDict = source["headers"] as? [String: String] { + headers = headersDict + } + + // Choose player pipeline based on format + let isMKV = uri.lowercased().contains(".mkv") + #if targetEnvironment(simulator) + if isMKV { + // MKV not supported on AVPlayer in Simulator and MEPlayer is disabled + sendEvent("onError", ["error": "MKV playback is not supported in the iOS Simulator. Test on a real device."]) + } + #else + if isMKV { + // Prefer MEPlayer (FFmpeg) for MKV on device + KSOptions.firstPlayerType = KSMEPlayer.self + KSOptions.secondPlayerType = nil + } else { + KSOptions.firstPlayerType = KSAVPlayer.self + KSOptions.secondPlayerType = KSMEPlayer.self + } + #endif + + // Create KSPlayerResource with validated URL + let resource = KSPlayerResource(url: url, options: createOptions(with: headers), name: "Video") + + print("KSPlayerView: Setting source: \(uri)") + print("KSPlayerView: URL scheme: \(url.scheme ?? "unknown"), host: \(url.host ?? "unknown")") + + playerView.set(resource: resource) + + // Set up delegate after setting the resource + playerView.playerLayer?.delegate = self + + // Apply current state + if isPaused { + playerView.pause() + } else { + playerView.play() + } + + setVolume(currentVolume) + } + + private func createOptions(with headers: [String: String]) -> KSOptions { + let options = KSOptions() + // Disable native player remote control center integration; use RN controls + options.registerRemoteControll = false + + // Configure audio for proper dialogue mixing using FFmpeg's pan filter + // This approach uses standard audio engineering practices for multi-channel downmixing + + // Use conservative center channel mixing that preserves spatial audio + // c0 (Left) = 70% original left + 30% center (dialogue) + 20% rear left + // c1 (Right) = 70% original right + 30% center (dialogue) + 20% rear right + // This creates natural dialogue presence without the "playing on both ears" effect + options.audioFilters.append("pan=stereo|c0=0.7*c0+0.3*c2+0.2*c4|c1=0.7*c1+0.3*c2+0.2*c5") + + // Alternative: Use FFmpeg's surround filter for more sophisticated downmixing + // This provides better spatial audio processing and natural dialogue mixing + // options.audioFilters.append("surround=ang=45") + + #if targetEnvironment(simulator) + options.hardwareDecode = false + options.asynchronousDecompression = false + #else + options.hardwareDecode = KSOptions.hardwareDecode + #endif + if !headers.isEmpty { + // Clean and validate headers before adding + var cleanHeaders: [String: String] = [:] + for (key, value) in headers { + // Remove any null or empty values + if !value.isEmpty && value != "null" { + cleanHeaders[key] = value + } + } + + if !cleanHeaders.isEmpty { + options.appendHeader(cleanHeaders) + print("KSPlayerView: Added headers: \(cleanHeaders.keys.joined(separator: ", "))") + + if let referer = cleanHeaders["Referer"] ?? cleanHeaders["referer"] { + options.referer = referer + print("KSPlayerView: Set 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) { + guard let playerLayer = playerView.playerLayer, + playerLayer.player.isReadyToPlay, + playerLayer.player.seekable else { + print("KSPlayerView: Cannot seek - player not ready or not seekable") + return + } + + playerView.seek(time: time) { success in + if success { + print("KSPlayerView: Seek successful to \(time)") + } else { + print("KSPlayerView: Seek failed to \(time)") + } + } + } + + func setAudioTrack(_ trackId: Int) { + if let player = playerView.playerLayer?.player { + let audioTracks = player.tracks(mediaType: .audio) + print("KSPlayerView: Available audio tracks count: \(audioTracks.count)") + print("KSPlayerView: Requested track ID: \(trackId)") + + // Debug: Print all track information + for (index, track) in audioTracks.enumerated() { + print("KSPlayerView: Track \(index) - ID: \(track.trackID), Name: '\(track.name)', Language: '\(track.language ?? "nil")', isEnabled: \(track.isEnabled)") + } + + // First try to find track by trackID (proper way) + var selectedTrack: MediaPlayerTrack? = nil + var trackIndex: Int = -1 + + // Try to find by exact trackID match + if let track = audioTracks.first(where: { Int($0.trackID) == trackId }) { + selectedTrack = track + trackIndex = audioTracks.firstIndex(where: { $0.trackID == track.trackID }) ?? -1 + print("KSPlayerView: Found track by trackID \(trackId) at index \(trackIndex)") + } + // Fallback: treat trackId as array index + else if trackId >= 0 && trackId < audioTracks.count { + selectedTrack = audioTracks[trackId] + trackIndex = trackId + print("KSPlayerView: Found track by array index \(trackId) (fallback)") + } + + if let track = selectedTrack { + print("KSPlayerView: Selecting track \(trackId) (index: \(trackIndex)): '\(track.name)' (ID: \(track.trackID))") + + // Use KSPlayer's select method which properly handles track selection + player.select(track: track) + + print("KSPlayerView: Successfully selected audio track \(trackId)") + + // Verify the selection worked + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in + let tracksAfter = player.tracks(mediaType: .audio) + for (index, track) in tracksAfter.enumerated() { + print("KSPlayerView: After selection - Track \(index) (ID: \(track.trackID)) isEnabled: \(track.isEnabled)") + } + } + + // Configure audio downmixing for multi-channel tracks + configureAudioDownmixing(for: track) + } else if trackId == -1 { + // Disable all audio tracks (mute) + for track in audioTracks { track.isEnabled = false } + print("KSPlayerView: Disabled all audio tracks") + } else { + print("KSPlayerView: Track \(trackId) not found. Available track IDs: \(audioTracks.map { Int($0.trackID) }), array indices: 0..\(audioTracks.count - 1)") + } + } else { + print("KSPlayerView: No player available for audio track selection") + } + } + + private func configureAudioDownmixing(for track: MediaPlayerTrack) { + // Check if this is a multi-channel audio track that needs downmixing + // This is a simplified check - in practice, you might want to check the actual channel layout + let trackName = track.name.lowercased() + let isMultiChannel = trackName.contains("5.1") || trackName.contains("7.1") || + trackName.contains("truehd") || trackName.contains("dts") || + trackName.contains("dolby") || trackName.contains("atmos") + + if isMultiChannel { + print("KSPlayerView: Detected multi-channel audio track '\(track.name)', ensuring proper dialogue mixing") + print("KSPlayerView: Using FFmpeg pan filter for natural stereo downmixing") + } else { + print("KSPlayerView: Stereo or mono audio track '\(track.name)', no additional downmixing needed") + } + } + + func setTextTrack(_ trackId: Int) { + if let player = playerView.playerLayer?.player { + let textTracks = player.tracks(mediaType: .subtitle) + print("KSPlayerView: Available text tracks count: \(textTracks.count)") + print("KSPlayerView: Requested text track ID: \(trackId)") + + // First try to find track by trackID (proper way) + var selectedTrack: MediaPlayerTrack? = nil + var trackIndex: Int = -1 + + // Try to find by exact trackID match + if let track = textTracks.first(where: { Int($0.trackID) == trackId }) { + selectedTrack = track + trackIndex = textTracks.firstIndex(where: { $0.trackID == track.trackID }) ?? -1 + print("KSPlayerView: Found text track by trackID \(trackId) at index \(trackIndex)") + } + // Fallback: treat trackId as array index + else if trackId >= 0 && trackId < textTracks.count { + selectedTrack = textTracks[trackId] + trackIndex = trackId + print("KSPlayerView: Found text track by array index \(trackId) (fallback)") + } + + if let track = selectedTrack { + print("KSPlayerView: Selecting text track \(trackId) (index: \(trackIndex)): '\(track.name)' (ID: \(track.trackID))") + + // Use KSPlayer's select method which properly handles track selection + player.select(track: track) + + print("KSPlayerView: Successfully selected text track \(trackId)") + } else if trackId == -1 { + // Disable all subtitles + for track in textTracks { track.isEnabled = false } + print("KSPlayerView: Disabled all text tracks") + } else { + print("KSPlayerView: Text track \(trackId) not found. Available track IDs: \(textTracks.map { Int($0.trackID) }), array indices: 0..\(textTracks.count - 1)") + } + } else { + print("KSPlayerView: No player available for text track selection") + } + } + + // Get available tracks for React Native + func getAvailableTracks() -> [String: Any] { + guard let player = playerView.playerLayer?.player else { + return ["audioTracks": [], "textTracks": []] + } + + let audioTracks = player.tracks(mediaType: .audio).enumerated().map { index, track in + return [ + "id": Int(track.trackID), // Use actual track ID, not array index + "index": index, // Keep index for backward compatibility + "name": track.name, + "language": track.language ?? "Unknown", + "languageCode": track.languageCode ?? "", + "isEnabled": track.isEnabled, + "bitRate": track.bitRate, + "bitDepth": track.bitDepth + ] + } + + let textTracks = player.tracks(mediaType: .subtitle).enumerated().map { index, track in + return [ + "id": Int(track.trackID), // Use actual track ID, not array index + "index": index, // Keep index for backward compatibility + "name": track.name, + "language": track.language ?? "Unknown", + "languageCode": track.languageCode ?? "", + "isEnabled": track.isEnabled, + "isImageSubtitle": track.isImageSubtitle + ] + } + + return [ + "audioTracks": audioTracks, + "textTracks": textTracks + ] + } + + // 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 with track information + let p = layer.player + let tracks = getAvailableTracks() + sendEvent("onLoad", [ + "duration": p.duration, + "currentTime": p.currentPlaybackTime, + "naturalSize": [ + "width": p.naturalSize.width, + "height": p.naturalSize.height + ], + "audioTracks": tracks["audioTracks"] ?? [], + "textTracks": tracks["textTracks"] ?? [] + ]) + 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 + // Ensure we have valid duration before sending progress updates + if totalTime > 0 { + sendEvent("onProgress", [ + "currentTime": currentTime, + "duration": totalTime, + "bufferTime": p.playableTime + ]) + } + } + + func player(layer: KSPlayerLayer, finish error: Error?) { + if let error = error { + let errorMessage = error.localizedDescription + print("KSPlayerView: Player finished with error: \(errorMessage)") + + // Provide more specific error messages for common issues + var detailedError = errorMessage + if errorMessage.contains("avformat can't open input") { + detailedError = "Unable to open video stream. This could be due to:\n• Invalid or malformed URL\n• Network connectivity issues\n• Server blocking the request\n• Unsupported video format\n• Missing required headers" + } else if errorMessage.contains("timeout") { + detailedError = "Stream connection timed out. The server may be slow or unreachable." + } else if errorMessage.contains("404") || errorMessage.contains("Not Found") { + detailedError = "Video stream not found. The URL may be expired or incorrect." + } else if errorMessage.contains("403") || errorMessage.contains("Forbidden") { + detailedError = "Access denied. The server may be blocking requests or require authentication." + } + + sendEvent("onError", ["error": detailedError]) + } + } + + 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/backup_sdk54_upgrade/ios_original/KSPlayerViewManager.swift b/backup_sdk54_upgrade/ios_original/KSPlayerViewManager.swift new file mode 100644 index 0000000..ce9e3f0 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/KSPlayerViewManager.swift @@ -0,0 +1,99 @@ +// +// 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)) + } + } + } + + @objc func getTracks(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { + DispatchQueue.main.async { + if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView { + let tracks = view.getAvailableTracks() + resolve(tracks) + } else { + reject("NO_VIEW", "KSPlayerView not found", nil) + } + } + } +} diff --git a/backup_sdk54_upgrade/ios_original/Nuvio.xcodeproj/project.pbxproj b/backup_sdk54_upgrade/ios_original/Nuvio.xcodeproj/project.pbxproj new file mode 100644 index 0000000..73cf974 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/Nuvio.xcodeproj/project.pbxproj @@ -0,0 +1,660 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + 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 */; }; + 2F6C4443E26F4184A8EA68F1 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B16751559433B951A993C /* noop-file.swift */; }; + 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; + 96905EF65AED1B983A6B3ABC /* libPods-Nuvio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Nuvio.a */; }; + 9FBA88F42E86ECD700892850 /* KSPlayerViewManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FBA88F32E86ECD700892850 /* KSPlayerViewManager.swift */; }; + 9FBA88F52E86ECD700892850 /* KSPlayerModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FBA88F12E86ECD700892850 /* KSPlayerModule.swift */; }; + 9FBA88F62E86ECD700892850 /* KSPlayerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FBA88F02E86ECD700892850 /* KSPlayerManager.m */; }; + 9FBA88F72E86ECD700892850 /* KSPlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FBA88F22E86ECD700892850 /* KSPlayerView.swift */; }; + B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; }; + BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; + E660DA8F5C7B39AACB568229 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 8F20890D58E6A611113A359A /* PrivacyInfo.xcprivacy */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 05FDEBFD08F44643A98FC770 /* 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 = ""; }; + 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 = ""; }; + 4C4B16751559433B951A993C /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "Nuvio/noop-file.swift"; sourceTree = ""; }; + 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Nuvio.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Nuvio.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 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 = ""; }; + 8F20890D58E6A611113A359A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Nuvio/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 9F9D45D12E85C42200C88FAD /* NuvioRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = NuvioRelease.entitlements; path = Nuvio/NuvioRelease.entitlements; sourceTree = ""; }; + 9FBA88F02E86ECD700892850 /* KSPlayerManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSPlayerManager.m; sourceTree = ""; }; + 9FBA88F12E86ECD700892850 /* KSPlayerModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KSPlayerModule.swift; sourceTree = ""; }; + 9FBA88F22E86ECD700892850 /* KSPlayerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KSPlayerView.swift; sourceTree = ""; }; + 9FBA88F32E86ECD700892850 /* KSPlayerViewManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KSPlayerViewManager.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 = ( + 9F9D45D12E85C42200C88FAD /* NuvioRelease.entitlements */, + BB2F792B24A3F905000567C9 /* Supporting */, + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.mm */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 13B07FB71A68108700A75B9A /* main.m */, + AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, + 4C4B16751559433B951A993C /* noop-file.swift */, + 05FDEBFD08F44643A98FC770 /* Nuvio-Bridging-Header.h */, + 8F20890D58E6A611113A359A /* PrivacyInfo.xcprivacy */, + 9FBA88F02E86ECD700892850 /* KSPlayerManager.m */, + 9FBA88F12E86ECD700892850 /* KSPlayerModule.swift */, + 9FBA88F22E86ECD700892850 /* KSPlayerView.swift */, + 9FBA88F32E86ECD700892850 /* KSPlayerViewManager.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 */, + F4369179AD7AC6092CDB69AE /* [Expo] Configure project */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, + F1A0F0E877DA4A6087E44736 /* Upload Debug Symbols to Sentry */, + 323616B0BA3A89D8CC396FB0 /* [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 = { + LastSwiftMigration = 1250; + }; + }; + }; + 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 */, + E660DA8F5C7B39AACB568229 /* 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; + }; + 323616B0BA3A89D8CC396FB0 /* [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; + }; + 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_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Feather.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome6_Brands.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome6_Regular.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome6_Solid.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Foundation.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Octicons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf", + "${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}/AntDesign.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Feather.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Brands.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Regular.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Solid.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome6_Brands.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome6_Regular.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome6_Solid.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Fontisto.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Foundation.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Ionicons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialCommunityIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Octicons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf", + "${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; + }; + F1A0F0E877DA4A6087E44736 /* 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'\"`"; + }; + F4369179AD7AC6092CDB69AE /* [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"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, + 9FBA88F42E86ECD700892850 /* KSPlayerViewManager.swift in Sources */, + 9FBA88F52E86ECD700892850 /* KSPlayerModule.swift in Sources */, + 9FBA88F62E86ECD700892850 /* KSPlayerManager.m in Sources */, + 9FBA88F72E86ECD700892850 /* KSPlayerView.swift in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */, + 2F6C4443E26F4184A8EA68F1 /* noop-file.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/NuvioRelease.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"; + PROVISIONING_PROFILE_SPECIFIER = ""; + 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/backup_sdk54_upgrade/ios_original/Nuvio.xcodeproj/xcshareddata/xcschemes/Nuvio.xcscheme b/backup_sdk54_upgrade/ios_original/Nuvio.xcodeproj/xcshareddata/xcschemes/Nuvio.xcscheme new file mode 100644 index 0000000..40d32da --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/Nuvio.xcodeproj/xcshareddata/xcschemes/Nuvio.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backup_sdk54_upgrade/ios_original/Nuvio.xcworkspace/contents.xcworkspacedata b/backup_sdk54_upgrade/ios_original/Nuvio.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..5249d92 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/Nuvio.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/Nuvio/AppDelegate.h b/backup_sdk54_upgrade/ios_original/Nuvio/AppDelegate.h similarity index 100% rename from ios/Nuvio/AppDelegate.h rename to backup_sdk54_upgrade/ios_original/Nuvio/AppDelegate.h diff --git a/ios/Nuvio/AppDelegate.mm b/backup_sdk54_upgrade/ios_original/Nuvio/AppDelegate.mm similarity index 100% rename from ios/Nuvio/AppDelegate.mm rename to backup_sdk54_upgrade/ios_original/Nuvio/AppDelegate.mm diff --git a/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png b/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png new file mode 100644 index 0000000..e9a189f Binary files /dev/null and b/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png differ diff --git a/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/AppIcon.appiconset/Contents.json b/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..90d8d4c --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/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/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/Contents.json b/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/Contents.json new file mode 100644 index 0000000..ed285c2 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "expo" + } +} diff --git a/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/SplashScreenBackground.colorset/Contents.json b/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/SplashScreenBackground.colorset/Contents.json new file mode 100644 index 0000000..dba1090 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/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/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/SplashScreenLogo.imageset/Contents.json similarity index 100% rename from ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/Contents.json rename to backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/SplashScreenLogo.imageset/Contents.json diff --git a/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image.png b/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image.png similarity index 100% rename from ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image.png rename to backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image.png diff --git a/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@2x.png b/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@2x.png similarity index 100% rename from ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@2x.png rename to backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@2x.png diff --git a/ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@3x.png b/backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@3x.png similarity index 100% rename from ios/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@3x.png rename to backup_sdk54_upgrade/ios_original/Nuvio/Images.xcassets/SplashScreenLogo.imageset/image@3x.png diff --git a/backup_sdk54_upgrade/ios_original/Nuvio/Info.plist b/backup_sdk54_upgrade/ios_original/Nuvio/Info.plist new file mode 100644 index 0000000..7946fb9 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/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.2.4 + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleURLSchemes + + nuvio + com.nuvio.app + + + + CFBundleURLSchemes + + exp+nuvio + + + + CFBundleVersion + 19 + LSMinimumSystemVersion + 12.0 + LSRequiresIPhoneOS + + LSSupportsOpeningDocumentsInPlace + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSBonjourServices + + _http._tcp + + NSLocalNetworkUsageDescription + Allow $(PRODUCT_NAME) to access your local network + 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/backup_sdk54_upgrade/ios_original/Nuvio/KSPlayerManager.m b/backup_sdk54_upgrade/ios_original/Nuvio/KSPlayerManager.m new file mode 100644 index 0000000..f521027 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/Nuvio/KSPlayerManager.m @@ -0,0 +1,42 @@ +// +// 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) +RCT_EXTERN_METHOD(getTracks:(nonnull NSNumber *)node resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) + +@end + +@interface RCT_EXTERN_MODULE(KSPlayerModule, RCTEventEmitter) + +RCT_EXTERN_METHOD(getTracks:(nonnull NSNumber *)nodeTag resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) + +@end diff --git a/backup_sdk54_upgrade/ios_original/Nuvio/KSPlayerModule.swift b/backup_sdk54_upgrade/ios_original/Nuvio/KSPlayerModule.swift new file mode 100644 index 0000000..ee487c1 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/Nuvio/KSPlayerModule.swift @@ -0,0 +1,37 @@ +// +// 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(_ nodeTag: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { + DispatchQueue.main.async { + if let viewManager = self.bridge.module(for: KSPlayerViewManager.self) as? KSPlayerViewManager { + viewManager.getTracks(nodeTag, resolve: resolve, reject: reject) + } else { + reject("NO_VIEW_MANAGER", "KSPlayerViewManager not found", nil) + } + } + } +} diff --git a/backup_sdk54_upgrade/ios_original/Nuvio/KSPlayerView.swift b/backup_sdk54_upgrade/ios_original/Nuvio/KSPlayerView.swift new file mode 100644 index 0000000..7570f29 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/Nuvio/KSPlayerView.swift @@ -0,0 +1,519 @@ +// +// 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 + // Hide native controls - we use custom React Native controls + playerView.isUserInteractionEnabled = false + // Hide KSPlayer's built-in overlay/controls + playerView.controllerView.isHidden = true + playerView.contentOverlayView.isHidden = true + playerView.controllerView.alpha = 0 + playerView.contentOverlayView.alpha = 0 + playerView.controllerView.gestureRecognizers?.forEach { $0.isEnabled = 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() { + // Configure KSOptions (use static defaults where required) + KSOptions.isAutoPlay = false + #if targetEnvironment(simulator) + // Simulator: disable hardware decode and MEPlayer to avoid VT/Vulkan issues + KSOptions.hardwareDecode = false + KSOptions.asynchronousDecompression = false + KSOptions.secondPlayerType = nil + #endif + } + + func setSource(_ source: NSDictionary) { + currentSource = source + + guard let uri = source["uri"] as? String else { + print("KSPlayerView: No URI provided") + sendEvent("onError", ["error": "No URI provided in source"]) + return + } + + // Validate URL before proceeding + guard let url = URL(string: uri), url.scheme != nil else { + print("KSPlayerView: Invalid URL format: \(uri)") + sendEvent("onError", ["error": "Invalid URL format: \(uri)"]) + return + } + + var headers: [String: String] = [:] + if let headersDict = source["headers"] as? [String: String] { + headers = headersDict + } + + // Choose player pipeline based on format + let isMKV = uri.lowercased().contains(".mkv") + #if targetEnvironment(simulator) + if isMKV { + // MKV not supported on AVPlayer in Simulator and MEPlayer is disabled + sendEvent("onError", ["error": "MKV playback is not supported in the iOS Simulator. Test on a real device."]) + } + #else + if isMKV { + // Prefer MEPlayer (FFmpeg) for MKV on device + KSOptions.firstPlayerType = KSMEPlayer.self + KSOptions.secondPlayerType = nil + } else { + KSOptions.firstPlayerType = KSAVPlayer.self + KSOptions.secondPlayerType = KSMEPlayer.self + } + #endif + + // Create KSPlayerResource with validated URL + let resource = KSPlayerResource(url: url, options: createOptions(with: headers), name: "Video") + + print("KSPlayerView: Setting source: \(uri)") + print("KSPlayerView: URL scheme: \(url.scheme ?? "unknown"), host: \(url.host ?? "unknown")") + + playerView.set(resource: resource) + + // Set up delegate after setting the resource + playerView.playerLayer?.delegate = self + + // Apply current state + if isPaused { + playerView.pause() + } else { + playerView.play() + } + + setVolume(currentVolume) + } + + private func createOptions(with headers: [String: String]) -> KSOptions { + let options = KSOptions() + // Disable native player remote control center integration; use RN controls + options.registerRemoteControll = false + + // Configure audio for proper dialogue mixing using FFmpeg's pan filter + // This approach uses standard audio engineering practices for multi-channel downmixing + + // Use conservative center channel mixing that preserves spatial audio + // c0 (Left) = 70% original left + 30% center (dialogue) + 20% rear left + // c1 (Right) = 70% original right + 30% center (dialogue) + 20% rear right + // This creates natural dialogue presence without the "playing on both ears" effect + options.audioFilters.append("pan=stereo|c0=0.7*c0+0.3*c2+0.2*c4|c1=0.7*c1+0.3*c2+0.2*c5") + + // Alternative: Use FFmpeg's surround filter for more sophisticated downmixing + // This provides better spatial audio processing and natural dialogue mixing + // options.audioFilters.append("surround=ang=45") + + #if targetEnvironment(simulator) + options.hardwareDecode = false + options.asynchronousDecompression = false + #else + options.hardwareDecode = KSOptions.hardwareDecode + #endif + if !headers.isEmpty { + // Clean and validate headers before adding + var cleanHeaders: [String: String] = [:] + for (key, value) in headers { + // Remove any null or empty values + if !value.isEmpty && value != "null" { + cleanHeaders[key] = value + } + } + + if !cleanHeaders.isEmpty { + options.appendHeader(cleanHeaders) + print("KSPlayerView: Added headers: \(cleanHeaders.keys.joined(separator: ", "))") + + if let referer = cleanHeaders["Referer"] ?? cleanHeaders["referer"] { + options.referer = referer + print("KSPlayerView: Set 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) { + guard let playerLayer = playerView.playerLayer, + playerLayer.player.isReadyToPlay, + playerLayer.player.seekable else { + print("KSPlayerView: Cannot seek - player not ready or not seekable") + return + } + + playerView.seek(time: time) { success in + if success { + print("KSPlayerView: Seek successful to \(time)") + } else { + print("KSPlayerView: Seek failed to \(time)") + } + } + } + + func setAudioTrack(_ trackId: Int) { + if let player = playerView.playerLayer?.player { + let audioTracks = player.tracks(mediaType: .audio) + print("KSPlayerView: Available audio tracks count: \(audioTracks.count)") + print("KSPlayerView: Requested track ID: \(trackId)") + + // Debug: Print all track information + for (index, track) in audioTracks.enumerated() { + print("KSPlayerView: Track \(index) - ID: \(track.trackID), Name: '\(track.name)', Language: '\(track.language ?? "nil")', isEnabled: \(track.isEnabled)") + } + + // First try to find track by trackID (proper way) + var selectedTrack: MediaPlayerTrack? = nil + var trackIndex: Int = -1 + + // Try to find by exact trackID match + if let track = audioTracks.first(where: { Int($0.trackID) == trackId }) { + selectedTrack = track + trackIndex = audioTracks.firstIndex(where: { $0.trackID == track.trackID }) ?? -1 + print("KSPlayerView: Found track by trackID \(trackId) at index \(trackIndex)") + } + // Fallback: treat trackId as array index + else if trackId >= 0 && trackId < audioTracks.count { + selectedTrack = audioTracks[trackId] + trackIndex = trackId + print("KSPlayerView: Found track by array index \(trackId) (fallback)") + } + + if let track = selectedTrack { + print("KSPlayerView: Selecting track \(trackId) (index: \(trackIndex)): '\(track.name)' (ID: \(track.trackID))") + + // Use KSPlayer's select method which properly handles track selection + player.select(track: track) + + print("KSPlayerView: Successfully selected audio track \(trackId)") + + // Verify the selection worked + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in + let tracksAfter = player.tracks(mediaType: .audio) + for (index, track) in tracksAfter.enumerated() { + print("KSPlayerView: After selection - Track \(index) (ID: \(track.trackID)) isEnabled: \(track.isEnabled)") + } + } + + // Configure audio downmixing for multi-channel tracks + configureAudioDownmixing(for: track) + } else if trackId == -1 { + // Disable all audio tracks (mute) + for track in audioTracks { track.isEnabled = false } + print("KSPlayerView: Disabled all audio tracks") + } else { + print("KSPlayerView: Track \(trackId) not found. Available track IDs: \(audioTracks.map { Int($0.trackID) }), array indices: 0..\(audioTracks.count - 1)") + } + } else { + print("KSPlayerView: No player available for audio track selection") + } + } + + private func configureAudioDownmixing(for track: MediaPlayerTrack) { + // Check if this is a multi-channel audio track that needs downmixing + // This is a simplified check - in practice, you might want to check the actual channel layout + let trackName = track.name.lowercased() + let isMultiChannel = trackName.contains("5.1") || trackName.contains("7.1") || + trackName.contains("truehd") || trackName.contains("dts") || + trackName.contains("dolby") || trackName.contains("atmos") + + if isMultiChannel { + print("KSPlayerView: Detected multi-channel audio track '\(track.name)', ensuring proper dialogue mixing") + print("KSPlayerView: Using FFmpeg pan filter for natural stereo downmixing") + } else { + print("KSPlayerView: Stereo or mono audio track '\(track.name)', no additional downmixing needed") + } + } + + func setTextTrack(_ trackId: Int) { + if let player = playerView.playerLayer?.player { + let textTracks = player.tracks(mediaType: .subtitle) + print("KSPlayerView: Available text tracks count: \(textTracks.count)") + print("KSPlayerView: Requested text track ID: \(trackId)") + + // First try to find track by trackID (proper way) + var selectedTrack: MediaPlayerTrack? = nil + var trackIndex: Int = -1 + + // Try to find by exact trackID match + if let track = textTracks.first(where: { Int($0.trackID) == trackId }) { + selectedTrack = track + trackIndex = textTracks.firstIndex(where: { $0.trackID == track.trackID }) ?? -1 + print("KSPlayerView: Found text track by trackID \(trackId) at index \(trackIndex)") + } + // Fallback: treat trackId as array index + else if trackId >= 0 && trackId < textTracks.count { + selectedTrack = textTracks[trackId] + trackIndex = trackId + print("KSPlayerView: Found text track by array index \(trackId) (fallback)") + } + + if let track = selectedTrack { + print("KSPlayerView: Selecting text track \(trackId) (index: \(trackIndex)): '\(track.name)' (ID: \(track.trackID))") + + // Use KSPlayer's select method which properly handles track selection + player.select(track: track) + + print("KSPlayerView: Successfully selected text track \(trackId)") + } else if trackId == -1 { + // Disable all subtitles + for track in textTracks { track.isEnabled = false } + print("KSPlayerView: Disabled all text tracks") + } else { + print("KSPlayerView: Text track \(trackId) not found. Available track IDs: \(textTracks.map { Int($0.trackID) }), array indices: 0..\(textTracks.count - 1)") + } + } else { + print("KSPlayerView: No player available for text track selection") + } + } + + // Get available tracks for React Native + func getAvailableTracks() -> [String: Any] { + guard let player = playerView.playerLayer?.player else { + return ["audioTracks": [], "textTracks": []] + } + + let audioTracks = player.tracks(mediaType: .audio).enumerated().map { index, track in + return [ + "id": Int(track.trackID), // Use actual track ID, not array index + "index": index, // Keep index for backward compatibility + "name": track.name, + "language": track.language ?? "Unknown", + "languageCode": track.languageCode ?? "", + "isEnabled": track.isEnabled, + "bitRate": track.bitRate, + "bitDepth": track.bitDepth + ] + } + + let textTracks = player.tracks(mediaType: .subtitle).enumerated().map { index, track in + return [ + "id": Int(track.trackID), // Use actual track ID, not array index + "index": index, // Keep index for backward compatibility + "name": track.name, + "language": track.language ?? "Unknown", + "languageCode": track.languageCode ?? "", + "isEnabled": track.isEnabled, + "isImageSubtitle": track.isImageSubtitle + ] + } + + return [ + "audioTracks": audioTracks, + "textTracks": textTracks + ] + } + + // 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 with track information + let p = layer.player + let tracks = getAvailableTracks() + sendEvent("onLoad", [ + "duration": p.duration, + "currentTime": p.currentPlaybackTime, + "naturalSize": [ + "width": p.naturalSize.width, + "height": p.naturalSize.height + ], + "audioTracks": tracks["audioTracks"] ?? [], + "textTracks": tracks["textTracks"] ?? [] + ]) + 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 + // Ensure we have valid duration before sending progress updates + if totalTime > 0 { + sendEvent("onProgress", [ + "currentTime": currentTime, + "duration": totalTime, + "bufferTime": p.playableTime + ]) + } + } + + func player(layer: KSPlayerLayer, finish error: Error?) { + if let error = error { + let errorMessage = error.localizedDescription + print("KSPlayerView: Player finished with error: \(errorMessage)") + + // Provide more specific error messages for common issues + var detailedError = errorMessage + if errorMessage.contains("avformat can't open input") { + detailedError = "Unable to open video stream. This could be due to:\n• Invalid or malformed URL\n• Network connectivity issues\n• Server blocking the request\n• Unsupported video format\n• Missing required headers" + } else if errorMessage.contains("timeout") { + detailedError = "Stream connection timed out. The server may be slow or unreachable." + } else if errorMessage.contains("404") || errorMessage.contains("Not Found") { + detailedError = "Video stream not found. The URL may be expired or incorrect." + } else if errorMessage.contains("403") || errorMessage.contains("Forbidden") { + detailedError = "Access denied. The server may be blocking requests or require authentication." + } + + sendEvent("onError", ["error": detailedError]) + } + } + + 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/backup_sdk54_upgrade/ios_original/Nuvio/KSPlayerViewManager.swift b/backup_sdk54_upgrade/ios_original/Nuvio/KSPlayerViewManager.swift new file mode 100644 index 0000000..ce9e3f0 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/Nuvio/KSPlayerViewManager.swift @@ -0,0 +1,99 @@ +// +// 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)) + } + } + } + + @objc func getTracks(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { + DispatchQueue.main.async { + if let view = self.bridge.uiManager.view(forReactTag: node) as? KSPlayerView { + let tracks = view.getAvailableTracks() + resolve(tracks) + } else { + reject("NO_VIEW", "KSPlayerView not found", nil) + } + } + } +} diff --git a/backup_sdk54_upgrade/ios_original/Nuvio/Nuvio-Bridging-Header.h b/backup_sdk54_upgrade/ios_original/Nuvio/Nuvio-Bridging-Header.h new file mode 100644 index 0000000..5f6de5e --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/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/NuvioDebug.entitlements b/backup_sdk54_upgrade/ios_original/Nuvio/Nuvio.entitlements similarity index 100% rename from ios/Nuvio/NuvioDebug.entitlements rename to backup_sdk54_upgrade/ios_original/Nuvio/Nuvio.entitlements diff --git a/backup_sdk54_upgrade/ios_original/Nuvio/NuvioDebug.entitlements b/backup_sdk54_upgrade/ios_original/Nuvio/NuvioDebug.entitlements new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/Nuvio/NuvioDebug.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/ios/Nuvio/NuvioRelease.entitlements b/backup_sdk54_upgrade/ios_original/Nuvio/NuvioRelease.entitlements similarity index 100% rename from ios/Nuvio/NuvioRelease.entitlements rename to backup_sdk54_upgrade/ios_original/Nuvio/NuvioRelease.entitlements diff --git a/backup_sdk54_upgrade/ios_original/Nuvio/PrivacyInfo.xcprivacy b/backup_sdk54_upgrade/ios_original/Nuvio/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..c6b452e --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/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/backup_sdk54_upgrade/ios_original/Nuvio/SplashScreen.storyboard b/backup_sdk54_upgrade/ios_original/Nuvio/SplashScreen.storyboard new file mode 100644 index 0000000..1ff6f24 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/Nuvio/SplashScreen.storyboard @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backup_sdk54_upgrade/ios_original/Nuvio/Supporting/Expo.plist b/backup_sdk54_upgrade/ios_original/Nuvio/Supporting/Expo.plist new file mode 100644 index 0000000..cff0afd --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/Nuvio/Supporting/Expo.plist @@ -0,0 +1,16 @@ + + + + + EXUpdatesCheckOnLaunch + ERROR_RECOVERY_ONLY + EXUpdatesEnabled + + EXUpdatesLaunchWaitMs + 30000 + EXUpdatesRuntimeVersion + 1.2.4 + EXUpdatesURL + https://grim-reyna-tapframe-69970143.koyeb.app/api/manifest + + \ No newline at end of file diff --git a/ios/Nuvio/main.m b/backup_sdk54_upgrade/ios_original/Nuvio/main.m similarity index 100% rename from ios/Nuvio/main.m rename to backup_sdk54_upgrade/ios_original/Nuvio/main.m diff --git a/ios/Nuvio/noop-file.swift b/backup_sdk54_upgrade/ios_original/Nuvio/noop-file.swift similarity index 100% rename from ios/Nuvio/noop-file.swift rename to backup_sdk54_upgrade/ios_original/Nuvio/noop-file.swift diff --git a/backup_sdk54_upgrade/ios_original/Podfile b/backup_sdk54_upgrade/ios_original/Podfile new file mode 100644 index 0000000..4516ea1 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/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/backup_sdk54_upgrade/ios_original/Podfile.lock b/backup_sdk54_upgrade/ios_original/Podfile.lock new file mode 100644 index 0000000..30f302b --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/Podfile.lock @@ -0,0 +1,3060 @@ +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 + - ExpoDocumentPicker (13.0.3): + - ExpoModulesCore + - ExpoFileSystem (18.0.12): + - ExpoModulesCore + - ExpoFont (13.0.4): + - ExpoModulesCore + - ExpoHaptics (14.0.1): + - ExpoModulesCore + - ExpoKeepAwake (14.0.3): + - ExpoModulesCore + - ExpoLibVlcPlayer (2.2.1): + - ExpoModulesCore + - MobileVLCKit (= 3.6.1b1) + - 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 + - ExpoSharing (13.0.1): + - ExpoModulesCore + - 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) + - libwebp (1.5.0): + - libwebp/demux (= 1.5.0) + - libwebp/mux (= 1.5.0) + - libwebp/sharpyuv (= 1.5.0) + - libwebp/webp (= 1.5.0) + - libwebp/demux (1.5.0): + - libwebp/webp + - libwebp/mux (1.5.0): + - libwebp/demux + - libwebp/sharpyuv (1.5.0) + - libwebp/webp (1.5.0): + - libwebp/sharpyuv + - 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.6.1b1) + - 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-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 + - RNFastImage (8.12.0): + - DoubleConversion + - glog + - hermes-engine + - libavif/core (~> 0.11.1) + - libavif/libdav1d (~> 0.11.1) + - 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 + - SDWebImage (>= 5.19.1) + - SDWebImageAVIFCoder (~> 0.11.0) + - SDWebImageWebPCoder (~> 0.14) + - 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.17.4): + - 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-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated (= 3.17.4) + - RNReanimated/worklets (= 3.17.4) + - Yoga + - RNReanimated/reanimated (3.17.4): + - 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-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated/apple (= 3.17.4) + - Yoga + - RNReanimated/reanimated/apple (3.17.4): + - 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-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNReanimated/worklets (3.17.4): + - 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-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/worklets/apple (= 3.17.4) + - Yoga + - RNReanimated/worklets/apple (3.17.4): + - 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-jsi + - 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 + - RNVectorIcons (10.3.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.1): + - libavif/core (>= 0.11.0) + - SDWebImage (~> 5.10) + - SDWebImageWebPCoder (0.14.6): + - libwebp (~> 1.0) + - SDWebImage/Core (~> 5.17) + - 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`) + - ExpoDocumentPicker (from `../node_modules/expo-document-picker/ios`) + - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) + - ExpoFont (from `../node_modules/expo-font/ios`) + - ExpoHaptics (from `../node_modules/expo-haptics/ios`) + - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) + - ExpoLibVlcPlayer (from `../node_modules/expo-libvlc-player/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`) + - ExpoSharing (from `../node_modules/expo-sharing/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-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`)" + - "RNFastImage (from `../node_modules/@d11/react-native-fast-image`)" + - 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`) + - RNVectorIcons (from `../node_modules/react-native-vector-icons`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - libavif + - libdav1d + - libwebp + - lottie-ios + - MobileVLCKit + - ReachabilitySwift + - SDWebImage + - SDWebImageAVIFCoder + - SDWebImageWebPCoder + - 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" + ExpoDocumentPicker: + :path: "../node_modules/expo-document-picker/ios" + ExpoFileSystem: + :path: "../node_modules/expo-file-system/ios" + ExpoFont: + :path: "../node_modules/expo-font/ios" + ExpoHaptics: + :path: "../node_modules/expo-haptics/ios" + ExpoKeepAwake: + :path: "../node_modules/expo-keep-awake/ios" + ExpoLibVlcPlayer: + :path: "../node_modules/expo-libvlc-player/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" + ExpoSharing: + :path: "../node_modules/expo-sharing/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-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" + RNFastImage: + :path: "../node_modules/@d11/react-native-fast-image" + 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" + RNVectorIcons: + :path: "../node_modules/react-native-vector-icons" + 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 + ExpoDocumentPicker: 6d3d499cf15b692688a804f42927d0f35de5ebaa + ExpoFileSystem: 42d363d3b96f9afab980dcef60d5657a4443c655 + ExpoFont: f354e926f8feae5e831ec8087f36652b44a0b188 + ExpoHaptics: 8d199b2f33245ea85289ff6c954c7ee7c00a5b5d + ExpoKeepAwake: b0171a73665bfcefcfcc311742a72a956e6aa680 + ExpoLibVlcPlayer: dce3d0b5847838cd5f8c5f3c3aa1bc55c92e911d + ExpoLinearGradient: 35ebd83b16f80b3add053a2fd68cc328ed927f60 + ExpoLinking: 8d12bee174ba0cdf31239706578e29e74a417402 + ExpoLocalization: 7776ea3bdb112125390745bbaf919b734b2ad1c7 + ExpoModulesCore: c25d77625038b1968ea1afefc719862c0d8dd993 + ExpoRandom: d1444df65007bdd4070009efd5dab18e20bf0f00 + ExpoScreenOrientation: af8b31d3164239a4ef3ea0b32bd63fb65df70d58 + ExpoSharing: 849a5ce9985c22598c16ec027e32969be8062e8e + 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 + libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 + lottie-ios: a881093fab623c467d3bce374367755c272bdd59 + lottie-react-native: 4ba06e2e4985c53dda6595a880f780e7ff551df1 + MobileVLCKit: 2d9c7c373393ae43086aeeff890bf0b1afc15c5c + 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-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 + RNFastImage: 5881b37a068ee3f58cb3346ea7ff97110befe675 + RNGestureHandler: fffddeb8af59709c6d8de11b6461a6af63cad532 + RNReanimated: b54ef33fc4b2dc50c4de3e8cdd8a7540b1ac928f + RNScreens: 362f4c861dd155f898908d5035d97b07a3f1a9d1 + RNSentry: ac7beae04304d95491a512b5abf6926d4501c73c + RNSVG: b889dc9c1948eeea0576a16cc405c91c37a12c19 + RNVectorIcons: c95fdae217b0ed388f2b4d7ed7a4edc457c1df47 + SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3 + SDWebImageAVIFCoder: afe194a084e851f70228e4be35ef651df0fc5c57 + SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 + Sentry: 1ca8405451040482877dcd344dfa3ef80b646631 + SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 + Yoga: feb4910aba9742cfedc059e2b2902e22ffe9954a + +PODFILE CHECKSUM: 2743ffad4c68da0945d48cdefa62202d726c27d2 + +COCOAPODS: 1.16.2 diff --git a/backup_sdk54_upgrade/ios_original/Podfile.properties.json b/backup_sdk54_upgrade/ios_original/Podfile.properties.json new file mode 100644 index 0000000..417e2e5 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/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/backup_sdk54_upgrade/ios_original/scripts/add_ksplayer_bridge.rb similarity index 100% rename from ios/scripts/add_ksplayer_bridge.rb rename to backup_sdk54_upgrade/ios_original/scripts/add_ksplayer_bridge.rb diff --git a/backup_sdk54_upgrade/ios_original/sentry.properties b/backup_sdk54_upgrade/ios_original/sentry.properties new file mode 100644 index 0000000..5581e03 --- /dev/null +++ b/backup_sdk54_upgrade/ios_original/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/backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/bin/xcodeproj similarity index 100% rename from ios/vendor/bundle/ruby/2.6.0/bin/xcodeproj rename to backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/bin/xcodeproj diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/CFPropertyList-3.0.7.gem b/backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/CFPropertyList-3.0.7.gem similarity index 100% rename from ios/vendor/bundle/ruby/2.6.0/cache/CFPropertyList-3.0.7.gem rename to backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/CFPropertyList-3.0.7.gem diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/atomos-0.1.3.gem b/backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/atomos-0.1.3.gem similarity index 100% rename from ios/vendor/bundle/ruby/2.6.0/cache/atomos-0.1.3.gem rename to backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/atomos-0.1.3.gem diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/base64-0.3.0.gem b/backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/base64-0.3.0.gem similarity index 100% rename from ios/vendor/bundle/ruby/2.6.0/cache/base64-0.3.0.gem rename to backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/base64-0.3.0.gem diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/claide-1.1.0.gem b/backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/claide-1.1.0.gem similarity index 100% rename from ios/vendor/bundle/ruby/2.6.0/cache/claide-1.1.0.gem rename to backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/claide-1.1.0.gem diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/colored2-3.1.2.gem b/backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/colored2-3.1.2.gem similarity index 100% rename from ios/vendor/bundle/ruby/2.6.0/cache/colored2-3.1.2.gem rename to backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/colored2-3.1.2.gem diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/nanaimo-0.4.0.gem b/backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/nanaimo-0.4.0.gem similarity index 100% rename from ios/vendor/bundle/ruby/2.6.0/cache/nanaimo-0.4.0.gem rename to backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/nanaimo-0.4.0.gem diff --git a/ios/vendor/bundle/ruby/2.6.0/cache/nkf-0.2.0.gem b/backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/nkf-0.2.0.gem similarity index 100% rename from ios/vendor/bundle/ruby/2.6.0/cache/nkf-0.2.0.gem rename to backup_sdk54_upgrade/ios_original/vendor/bundle/ruby/2.6.0/cache/nkf-0.2.0.gem diff --git a/ios/Nuvio.xcodeproj/project.pbxproj b/ios/Nuvio.xcodeproj/project.pbxproj index 73cf974..1c107f7 100644 --- a/ios/Nuvio.xcodeproj/project.pbxproj +++ b/ios/Nuvio.xcodeproj/project.pbxproj @@ -7,43 +7,37 @@ objects = { /* Begin PBXBuildFile section */ - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; + 0FFC28FB1FEA74CCFA112268 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 49055D6E250FAFA21141FE49 /* PrivacyInfo.xcprivacy */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 2F6C4443E26F4184A8EA68F1 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B16751559433B951A993C /* noop-file.swift */; }; + 2AA769395C1242F225F875AF /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E007C0BAC8C453623E81663 /* ExpoModulesProvider.swift */; }; 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; - 96905EF65AED1B983A6B3ABC /* libPods-Nuvio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Nuvio.a */; }; + 8449DE1C42ADA4CF10BC6D93 /* libPods-Nuvio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2DDA95A7458A78E817D9496D /* libPods-Nuvio.a */; }; 9FBA88F42E86ECD700892850 /* KSPlayerViewManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FBA88F32E86ECD700892850 /* KSPlayerViewManager.swift */; }; 9FBA88F52E86ECD700892850 /* KSPlayerModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FBA88F12E86ECD700892850 /* KSPlayerModule.swift */; }; 9FBA88F62E86ECD700892850 /* KSPlayerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FBA88F02E86ECD700892850 /* KSPlayerManager.m */; }; 9FBA88F72E86ECD700892850 /* KSPlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FBA88F22E86ECD700892850 /* KSPlayerView.swift */; }; - B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; }; BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; - E660DA8F5C7B39AACB568229 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 8F20890D58E6A611113A359A /* PrivacyInfo.xcprivacy */; }; + F11748422D0307B40044C1D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F11748412D0307B40044C1D9 /* AppDelegate.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 05FDEBFD08F44643A98FC770 /* 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 = ""; }; 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 = ""; }; - 4C4B16751559433B951A993C /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "Nuvio/noop-file.swift"; sourceTree = ""; }; - 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Nuvio.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Nuvio.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 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 = ""; }; - 8F20890D58E6A611113A359A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Nuvio/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 9F9D45D12E85C42200C88FAD /* NuvioRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = NuvioRelease.entitlements; path = Nuvio/NuvioRelease.entitlements; sourceTree = ""; }; + 2DDA95A7458A78E817D9496D /* libPods-Nuvio.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Nuvio.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 49055D6E250FAFA21141FE49 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Nuvio/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 6E0017E5203955A430ABF21B /* 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 = ""; }; + 6E007C0BAC8C453623E81663 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Nuvio/ExpoModulesProvider.swift"; sourceTree = ""; }; 9FBA88F02E86ECD700892850 /* KSPlayerManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSPlayerManager.m; sourceTree = ""; }; 9FBA88F12E86ECD700892850 /* KSPlayerModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KSPlayerModule.swift; sourceTree = ""; }; 9FBA88F22E86ECD700892850 /* KSPlayerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KSPlayerView.swift; sourceTree = ""; }; 9FBA88F32E86ECD700892850 /* KSPlayerViewManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KSPlayerViewManager.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 = ""; }; + BD6015E69A4861CCBD3C1D39 /* 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 = ""; }; 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 = ""; }; + F11748412D0307B40044C1D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = Nuvio/AppDelegate.swift; sourceTree = ""; }; + F11748442D0722820044C1D9 /* Nuvio-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Nuvio-Bridging-Header.h"; path = "Nuvio/Nuvio-Bridging-Header.h"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -51,7 +45,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 96905EF65AED1B983A6B3ABC /* libPods-Nuvio.a in Frameworks */, + 8449DE1C42ADA4CF10BC6D93 /* libPods-Nuvio.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -61,21 +55,17 @@ 13B07FAE1A68108700A75B9A /* Nuvio */ = { isa = PBXGroup; children = ( - 9F9D45D12E85C42200C88FAD /* NuvioRelease.entitlements */, - BB2F792B24A3F905000567C9 /* Supporting */, - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.mm */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 13B07FB71A68108700A75B9A /* main.m */, - AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, - 4C4B16751559433B951A993C /* noop-file.swift */, - 05FDEBFD08F44643A98FC770 /* Nuvio-Bridging-Header.h */, - 8F20890D58E6A611113A359A /* PrivacyInfo.xcprivacy */, + F11748412D0307B40044C1D9 /* AppDelegate.swift */, + F11748442D0722820044C1D9 /* Nuvio-Bridging-Header.h */, 9FBA88F02E86ECD700892850 /* KSPlayerManager.m */, 9FBA88F12E86ECD700892850 /* KSPlayerModule.swift */, 9FBA88F22E86ECD700892850 /* KSPlayerView.swift */, 9FBA88F32E86ECD700892850 /* KSPlayerViewManager.swift */, + BB2F792B24A3F905000567C9 /* Supporting */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, + 49055D6E250FAFA21141FE49 /* PrivacyInfo.xcprivacy */, ); name = Nuvio; sourceTree = ""; @@ -84,11 +74,19 @@ isa = PBXGroup; children = ( ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Nuvio.a */, + 2DDA95A7458A78E817D9496D /* libPods-Nuvio.a */, ); name = Frameworks; sourceTree = ""; }; + 358C5C99C443A921C8EEDDC8 /* ExpoModulesProviders */ = { + isa = PBXGroup; + children = ( + ECB31D9B6FF08C7E8E875650 /* Nuvio */, + ); + name = ExpoModulesProviders; + sourceTree = ""; + }; 832341AE1AAA6A7D00B99B32 /* Libraries */ = { isa = PBXGroup; children = ( @@ -103,8 +101,8 @@ 832341AE1AAA6A7D00B99B32 /* Libraries */, 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, - D65327D7A22EEC0BE12398D9 /* Pods */, - D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */, + D90A3959C97EE9926C513293 /* Pods */, + 358C5C99C443A921C8EEDDC8 /* ExpoModulesProviders */, ); indentWidth = 2; sourceTree = ""; @@ -119,14 +117,6 @@ name = Products; sourceTree = ""; }; - 92DBD88DE9BF7D494EA9DA96 /* Nuvio */ = { - isa = PBXGroup; - children = ( - FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */, - ); - name = Nuvio; - sourceTree = ""; - }; BB2F792B24A3F905000567C9 /* Supporting */ = { isa = PBXGroup; children = ( @@ -136,21 +126,22 @@ path = Nuvio/Supporting; sourceTree = ""; }; - D65327D7A22EEC0BE12398D9 /* Pods */ = { + D90A3959C97EE9926C513293 /* Pods */ = { isa = PBXGroup; children = ( - 6C2E3173556A471DD304B334 /* Pods-Nuvio.debug.xcconfig */, - 7A4D352CD337FB3A3BF06240 /* Pods-Nuvio.release.xcconfig */, + BD6015E69A4861CCBD3C1D39 /* Pods-Nuvio.debug.xcconfig */, + 6E0017E5203955A430ABF21B /* Pods-Nuvio.release.xcconfig */, ); + name = Pods; path = Pods; sourceTree = ""; }; - D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = { + ECB31D9B6FF08C7E8E875650 /* Nuvio */ = { isa = PBXGroup; children = ( - 92DBD88DE9BF7D494EA9DA96 /* Nuvio */, + 6E007C0BAC8C453623E81663 /* ExpoModulesProvider.swift */, ); - name = ExpoModulesProviders; + name = Nuvio; sourceTree = ""; }; /* End PBXGroup section */ @@ -161,14 +152,14 @@ buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Nuvio" */; buildPhases = ( 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, - F4369179AD7AC6092CDB69AE /* [Expo] Configure project */, + 99A79B70155E84EE1FB7F466 /* [Expo] Configure project */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, - F1A0F0E877DA4A6087E44736 /* Upload Debug Symbols to Sentry */, - 323616B0BA3A89D8CC396FB0 /* [CP] Embed Pods Frameworks */, + 9B977D89FE30470F8C59964C /* Upload Debug Symbols to Sentry */, + 7051E1DA5B27A8E632AD8CB9 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -218,7 +209,7 @@ BB2F792D24A3F905000567C9 /* Expo.plist in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, - E660DA8F5C7B39AACB568229 /* PrivacyInfo.xcprivacy in Resources */, + 0FFC28FB1FEA74CCFA112268 /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -232,6 +223,8 @@ files = ( ); inputPaths = ( + "$(SRCROOT)/.xcode.env", + "$(SRCROOT)/.xcode.env.local", ); name = "Bundle React Native code and images"; outputPaths = ( @@ -262,7 +255,7 @@ 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; }; - 323616B0BA3A89D8CC396FB0 /* [CP] Embed Pods Frameworks */ = { + 7051E1DA5B27A8E632AD8CB9 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -270,11 +263,15 @@ inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Nuvio/Pods-Nuvio-frameworks.sh", "${PODS_XCFRAMEWORKS_BUILD_DIR}/MobileVLCKit/MobileVLCKit.framework/MobileVLCKit", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/React-Core-prebuilt/React.framework/React", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/ReactNativeDependencies/ReactNativeDependencies.framework/ReactNativeDependencies", "${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}/React.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReactNativeDependencies.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", ); runOnlyForDeploymentPostprocessing = 0; @@ -299,8 +296,8 @@ "${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}/RNSVG/RNSVGFilters.bundle", "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf", "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", @@ -325,10 +322,8 @@ "${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", ); @@ -344,8 +339,8 @@ "${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}/RNSVGFilters.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf", @@ -370,10 +365,8 @@ "${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", ); @@ -382,7 +375,31 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Nuvio/Pods-Nuvio-resources.sh\"\n"; showEnvVarsInLog = 0; }; - F1A0F0E877DA4A6087E44736 /* Upload Debug Symbols to Sentry */ = { + 99A79B70155E84EE1FB7F466 /* [Expo] Configure project */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(SRCROOT)/.xcode.env", + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/Nuvio/Nuvio.entitlements", + "$(SRCROOT)/Pods/Target Support Files/Pods-Nuvio/expo-configure-project.sh", + ); + name = "[Expo] Configure project"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(SRCROOT)/Pods/Target Support Files/Pods-Nuvio/ExpoModulesProvider.swift", + ); + 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"; + }; + 9B977D89FE30470F8C59964C /* Upload Debug Symbols to Sentry */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -396,25 +413,6 @@ 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'\"`"; }; - F4369179AD7AC6092CDB69AE /* [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"; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -422,14 +420,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, + F11748422D0307B40044C1D9 /* AppDelegate.swift in Sources */, 9FBA88F42E86ECD700892850 /* KSPlayerViewManager.swift in Sources */, 9FBA88F52E86ECD700892850 /* KSPlayerModule.swift in Sources */, 9FBA88F62E86ECD700892850 /* KSPlayerManager.m in Sources */, 9FBA88F72E86ECD700892850 /* KSPlayerView.swift in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */, - 2F6C4443E26F4184A8EA68F1 /* noop-file.swift in Sources */, + 2AA769395C1242F225F875AF /* ExpoModulesProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -438,15 +434,12 @@ /* Begin XCBuildConfiguration section */ 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-Nuvio.debug.xcconfig */; + baseConfigurationReference = BD6015E69A4861CCBD3C1D39 /* 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)", @@ -477,15 +470,12 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-Nuvio.release.xcconfig */; + baseConfigurationReference = 6E0017E5203955A430ABF21B /* Pods-Nuvio.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Nuvio/NuvioRelease.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_ENTITLEMENTS = Nuvio/Nuvio.entitlements; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = NLXTHANK2N; INFOPLIST_FILE = Nuvio/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( @@ -501,7 +491,6 @@ OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.nuvio.app; PRODUCT_NAME = "Nuvio"; - PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Nuvio/Nuvio-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -564,13 +553,10 @@ 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"; + SWIFT_ENABLE_EXPLICIT_MODULES = NO; USE_HERMES = true; }; name = Debug; @@ -622,12 +608,9 @@ ); 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; + SWIFT_ENABLE_EXPLICIT_MODULES = NO; USE_HERMES = true; VALIDATE_PRODUCT = YES; }; diff --git a/ios/Nuvio.xcodeproj/xcshareddata/xcschemes/Nuvio.xcscheme b/ios/Nuvio.xcodeproj/xcshareddata/xcschemes/Nuvio.xcscheme index 40d32da..d56adf8 100644 --- a/ios/Nuvio.xcodeproj/xcshareddata/xcschemes/Nuvio.xcscheme +++ b/ios/Nuvio.xcodeproj/xcshareddata/xcschemes/Nuvio.xcscheme @@ -42,8 +42,8 @@ Bool { + let delegate = ReactNativeDelegate() + let factory = ExpoReactNativeFactory(delegate: delegate) + delegate.dependencyProvider = RCTAppDependencyProvider() + + reactNativeDelegate = delegate + reactNativeFactory = factory + bindReactNativeFactory(factory) + +#if os(iOS) || os(tvOS) + window = UIWindow(frame: UIScreen.main.bounds) + factory.startReactNative( + withModuleName: "main", + in: window, + launchOptions: launchOptions) +#endif + + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } + + // Linking API + public override func application( + _ app: UIApplication, + open url: URL, + options: [UIApplication.OpenURLOptionsKey: Any] = [:] + ) -> Bool { + return super.application(app, open: url, options: options) || RCTLinkingManager.application(app, open: url, options: options) + } + + // Universal Links + public override func application( + _ application: UIApplication, + continue userActivity: NSUserActivity, + restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void + ) -> Bool { + let result = RCTLinkingManager.application(application, continue: userActivity, restorationHandler: restorationHandler) + return super.application(application, continue: userActivity, restorationHandler: restorationHandler) || result + } +} + +class ReactNativeDelegate: ExpoReactNativeFactoryDelegate { + // Extension point for config-plugins + + override func sourceURL(for bridge: RCTBridge) -> URL? { + // needed to return the correct URL for expo-dev-client. + bridge.bundleURL ?? bundleURL() + } + + override func bundleURL() -> URL? { +#if DEBUG + return RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: ".expo/.virtual-metro-entry") +#else + return Bundle.main.url(forResource: "main", withExtension: "jsbundle") +#endif + } +} diff --git a/ios/Nuvio/Images.xcassets/SplashScreenLegacy.imageset/Contents.json b/ios/Nuvio/Images.xcassets/SplashScreenLegacy.imageset/Contents.json new file mode 100644 index 0000000..f65c008 --- /dev/null +++ b/ios/Nuvio/Images.xcassets/SplashScreenLegacy.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/SplashScreenLegacy.imageset/image.png b/ios/Nuvio/Images.xcassets/SplashScreenLegacy.imageset/image.png new file mode 100644 index 0000000..efcdf22 Binary files /dev/null and b/ios/Nuvio/Images.xcassets/SplashScreenLegacy.imageset/image.png differ diff --git a/ios/Nuvio/Images.xcassets/SplashScreenLegacy.imageset/image@2x.png b/ios/Nuvio/Images.xcassets/SplashScreenLegacy.imageset/image@2x.png new file mode 100644 index 0000000..efcdf22 Binary files /dev/null and b/ios/Nuvio/Images.xcassets/SplashScreenLegacy.imageset/image@2x.png differ diff --git a/ios/Nuvio/Images.xcassets/SplashScreenLegacy.imageset/image@3x.png b/ios/Nuvio/Images.xcassets/SplashScreenLegacy.imageset/image@3x.png new file mode 100644 index 0000000..efcdf22 Binary files /dev/null and b/ios/Nuvio/Images.xcassets/SplashScreenLegacy.imageset/image@3x.png differ diff --git a/ios/Nuvio/Info.plist b/ios/Nuvio/Info.plist index 7946fb9..ffd3ebb 100644 --- a/ios/Nuvio/Info.plist +++ b/ios/Nuvio/Info.plist @@ -59,6 +59,8 @@ Allow $(PRODUCT_NAME) to access your local network NSMicrophoneUsageDescription This app does not require microphone access. + RCTNewArchEnabled + RCTRootViewBackgroundColor 4278322180 UIBackgroundModes diff --git a/ios/Nuvio/Nuvio-Bridging-Header.h b/ios/Nuvio/Nuvio-Bridging-Header.h index 5f6de5e..8361941 100644 --- a/ios/Nuvio/Nuvio-Bridging-Header.h +++ b/ios/Nuvio/Nuvio-Bridging-Header.h @@ -1,11 +1,3 @@ // -// Use this file to import your target's public headers that you would like to expose to Swift. +// 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 index 0c67376..a0bc443 100644 --- a/ios/Nuvio/Nuvio.entitlements +++ b/ios/Nuvio/Nuvio.entitlements @@ -1,5 +1,10 @@ - - + + aps-environment + development + com.apple.developer.associated-domains + + + \ No newline at end of file diff --git a/ios/Nuvio/SplashScreen.storyboard b/ios/Nuvio/SplashScreen.storyboard index 1ff6f24..4069709 100644 --- a/ios/Nuvio/SplashScreen.storyboard +++ b/ios/Nuvio/SplashScreen.storyboard @@ -1,11 +1,12 @@ - + - + + @@ -16,7 +17,7 @@ - + @@ -36,7 +37,10 @@ - + + + + diff --git a/ios/Podfile b/ios/Podfile index 4516ea1..490153d 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -4,12 +4,19 @@ require File.join(File.dirname(`node --print "require.resolve('react-native/pack 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'] +def ccache_enabled?(podfile_properties) + # Environment variable takes precedence + return ENV['USE_CCACHE'] == '1' if ENV['USE_CCACHE'] + + # Fall back to Podfile properties + podfile_properties['apple.ccacheEnabled'] == 'true' +end +ENV['RCT_NEW_ARCH_ENABLED'] ||= '0' if podfile_properties['newArchEnabled'] == 'false' +ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] ||= podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR'] +ENV['RCT_USE_RN_DEP'] ||= '1' if podfile_properties['ios.buildReactNativeFromSource'] != 'true' && podfile_properties['newArchEnabled'] != 'false' +ENV['RCT_USE_PREBUILT_RNCORE'] ||= '1' if podfile_properties['ios.buildReactNativeFromSource'] != 'true' && podfile_properties['newArchEnabled'] != 'false' platform :ios, podfile_properties['ios.deploymentTarget'] || '15.1' -install! 'cocoapods', - :deterministic_uuids => false prepare_react_native_project! @@ -20,10 +27,8 @@ target 'Nuvio' do 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))', + 'npx', + 'expo-modules-autolinking', 'react-native-config', '--json', '--platform', @@ -45,28 +50,17 @@ target 'Nuvio' do ) # 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 + pod 'KSPlayer', :git => 'https://github.com/kingslay/KSPlayer.git', :branch => 'main' + 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' post_install do |installer| react_native_post_install( installer, config[:reactNativePath], :mac_catalyst_enabled => false, - :ccache_enabled => podfile_properties['apple.ccacheEnabled'] == 'true', + :ccache_enabled => ccache_enabled?(podfile_properties), ) - - # 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 index 30f302b..f855bc8 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,350 +1,334 @@ PODS: - - boost (1.84.0) - DisplayCriteria (1.1.0) - - DoubleConversion (1.1.6) - - EASClient (0.13.3): + - EASClient (1.0.7): - ExpoModulesCore - - EXApplication (6.0.2): + - EXApplication (7.0.7): - ExpoModulesCore - - EXConstants (17.0.8): + - EXConstants (18.0.9): - ExpoModulesCore - - EXJSONUtils (0.14.0) - - EXManifests (0.15.8): + - EXJSONUtils (0.15.0) + - EXManifests (1.0.8): - ExpoModulesCore - - EXNotifications (0.29.14): + - EXNotifications (0.32.12): - ExpoModulesCore - - Expo (52.0.47): + - Expo (54.0.13): - 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-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactAppDependencyProvider + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - expo-dev-client (6.0.15): + - EXManifests + - expo-dev-launcher + - expo-dev-menu + - expo-dev-menu-interface + - EXUpdatesInterface + - expo-dev-launcher (6.0.15): + - EXManifests + - expo-dev-launcher/Main (= 6.0.15) + - expo-dev-menu + - expo-dev-menu-interface + - ExpoModulesCore + - EXUpdatesInterface + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi - React-jsinspector - React-NativeModulesApple - React-RCTAppDelegate - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils + - ReactAppDependencyProvider - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - expo-dev-launcher/Main (5.0.35): - - DoubleConversion + - expo-dev-launcher/Main (6.0.15): - 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-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-jsinspector - React-NativeModulesApple - React-RCTAppDelegate - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils + - ReactAppDependencyProvider - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - expo-dev-launcher/Unsafe (5.0.35): - - DoubleConversion + - expo-dev-launcher/Unsafe (6.0.15): - EXManifests - expo-dev-menu - expo-dev-menu-interface - ExpoModulesCore - EXUpdatesInterface - - glog - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-jsinspector - React-NativeModulesApple - React-RCTAppDelegate - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils + - ReactAppDependencyProvider - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - expo-dev-menu (6.0.25): - - DoubleConversion - - expo-dev-menu/Main (= 6.0.25) - - expo-dev-menu/ReactNativeCompatibles (= 6.0.25) - - glog + - expo-dev-menu (7.0.14): + - expo-dev-menu/Main (= 7.0.14) + - expo-dev-menu/ReactNativeCompatibles (= 7.0.14) - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - expo-dev-menu-interface (1.9.3) - - expo-dev-menu/Main (6.0.25): - - DoubleConversion + - expo-dev-menu-interface (2.0.0) + - expo-dev-menu/Main (7.0.14): - EXManifests - expo-dev-menu-interface - - expo-dev-menu/Vendored - ExpoModulesCore - - glog - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-jsinspector - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - expo-dev-menu/ReactNativeCompatibles (6.0.25): - - DoubleConversion - - glog + - expo-dev-menu/ReactNativeCompatibles (7.0.14): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - expo-dev-menu/SafeAreaView (6.0.25): - - DoubleConversion + - ExpoAsset (12.0.9): - 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): + - ExpoBlur (15.0.7): - ExpoModulesCore - - ExpoBlur (14.0.3): + - ExpoBrightness (14.0.7): - ExpoModulesCore - - ExpoBrightness (13.0.3): + - ExpoCrypto (15.0.7): - ExpoModulesCore - - ExpoCrypto (14.0.2): + - ExpoDevice (8.0.9): - ExpoModulesCore - - ExpoDevice (7.0.3): + - ExpoDocumentPicker (14.0.7): - ExpoModulesCore - - ExpoDocumentPicker (13.0.3): + - ExpoFileSystem (19.0.17): - ExpoModulesCore - - ExpoFileSystem (18.0.12): + - ExpoFont (14.0.9): - ExpoModulesCore - - ExpoFont (13.0.4): + - ExpoHaptics (15.0.7): - ExpoModulesCore - - ExpoHaptics (14.0.1): - - ExpoModulesCore - - ExpoKeepAwake (14.0.3): + - ExpoKeepAwake (15.0.7): - ExpoModulesCore - ExpoLibVlcPlayer (2.2.1): - ExpoModulesCore - MobileVLCKit (= 3.6.1b1) - - ExpoLinearGradient (14.0.2): + - ExpoLinearGradient (15.0.7): - ExpoModulesCore - - ExpoLinking (7.0.5): + - ExpoLinking (8.0.8): - ExpoModulesCore - - ExpoLocalization (16.0.1): + - ExpoLocalization (17.0.7): - ExpoModulesCore - - ExpoModulesCore (2.2.3): - - DoubleConversion - - glog + - ExpoModulesCore (3.0.21): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-jsinspector - React-NativeModulesApple - - React-RCTAppDelegate - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - ExpoRandom (14.0.1): - ExpoModulesCore - - ExpoScreenOrientation (8.0.4): - - DoubleConversion + - ExpoScreenOrientation (9.0.7): - ExpoModulesCore - - glog - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - ExpoSharing (13.0.1): + - ExpoSharing (14.0.7): - ExpoModulesCore - - ExpoSystemUI (4.0.9): + - ExpoSystemUI (6.0.7): - ExpoModulesCore - - ExpoWebBrowser (14.0.2): + - ExpoWebBrowser (15.0.8): - ExpoModulesCore - - EXStructuredHeaders (4.0.0) - - EXUpdates (0.27.4): - - DoubleConversion + - EXStructuredHeaders (5.0.0) + - EXUpdates (29.0.12): - EASClient - EXManifests - ExpoModulesCore - EXStructuredHeaders - EXUpdatesInterface - - glog - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - ReachabilitySwift - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - EXUpdatesInterface (1.0.0): + - EXUpdatesInterface (2.0.0): - ExpoModulesCore - - fast_float (6.1.4) - - FBLazyVector (0.76.9) + - FBLazyVector (0.81.4) - 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) + - hermes-engine (0.81.4): + - hermes-engine/Pre-built (= 0.81.4) + - hermes-engine/Pre-built (0.81.4) - ImageColors (2.5.0): - ExpoModulesCore - KSPlayer (1.1.0): @@ -395,432 +379,416 @@ PODS: - libwebp/webp (1.5.0): - libwebp/sharpyuv - lottie-ios (4.5.0) - - lottie-react-native (7.1.0): - - DoubleConversion - - glog + - lottie-react-native (7.3.4): - hermes-engine - lottie-ios (= 4.5.0) - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - MobileVLCKit (3.6.1b1) - - 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) + - RCTDeprecation (0.81.4) + - RCTRequired (0.81.4) + - RCTTypeSafety (0.81.4): + - FBLazyVector (= 0.81.4) + - RCTRequired (= 0.81.4) + - React-Core (= 0.81.4) - 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 + - React (0.81.4): + - React-Core (= 0.81.4) + - React-Core/DevSupport (= 0.81.4) + - React-Core/RCTWebSocket (= 0.81.4) + - React-RCTActionSheet (= 0.81.4) + - React-RCTAnimation (= 0.81.4) + - React-RCTBlob (= 0.81.4) + - React-RCTImage (= 0.81.4) + - React-RCTLinking (= 0.81.4) + - React-RCTNetwork (= 0.81.4) + - React-RCTSettings (= 0.81.4) + - React-RCTText (= 0.81.4) + - React-RCTVibration (= 0.81.4) + - React-callinvoker (0.81.4) + - React-Core (0.81.4): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTDeprecation - - React-Core/Default (= 0.76.9) + - React-Core-prebuilt + - React-Core/Default (= 0.81.4) - 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-jsinspectorcdp + - React-jsitooling - React-perflogger - React-runtimeexecutor - - React-timing - - React-debug (0.76.9) - - React-defaultsnativemodule (0.76.9): - - DoubleConversion - - glog + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-Core-prebuilt (0.81.4): + - ReactNativeDependencies + - React-Core/CoreModulesHeaders (0.81.4): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug + - RCTDeprecation + - React-Core-prebuilt + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-Core/Default (0.81.4): + - hermes-engine + - RCTDeprecation + - React-Core-prebuilt + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-Core/DevSupport (0.81.4): + - hermes-engine + - RCTDeprecation + - React-Core-prebuilt + - React-Core/Default (= 0.81.4) + - React-Core/RCTWebSocket (= 0.81.4) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-Core/RCTActionSheetHeaders (0.81.4): + - hermes-engine + - RCTDeprecation + - React-Core-prebuilt + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-Core/RCTAnimationHeaders (0.81.4): + - hermes-engine + - RCTDeprecation + - React-Core-prebuilt + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-Core/RCTBlobHeaders (0.81.4): + - hermes-engine + - RCTDeprecation + - React-Core-prebuilt + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-Core/RCTImageHeaders (0.81.4): + - hermes-engine + - RCTDeprecation + - React-Core-prebuilt + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-Core/RCTLinkingHeaders (0.81.4): + - hermes-engine + - RCTDeprecation + - React-Core-prebuilt + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-Core/RCTNetworkHeaders (0.81.4): + - hermes-engine + - RCTDeprecation + - React-Core-prebuilt + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-Core/RCTSettingsHeaders (0.81.4): + - hermes-engine + - RCTDeprecation + - React-Core-prebuilt + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-Core/RCTTextHeaders (0.81.4): + - hermes-engine + - RCTDeprecation + - React-Core-prebuilt + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-Core/RCTVibrationHeaders (0.81.4): + - hermes-engine + - RCTDeprecation + - React-Core-prebuilt + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-Core/RCTWebSocket (0.81.4): + - hermes-engine + - RCTDeprecation + - React-Core-prebuilt + - React-Core/Default (= 0.81.4) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - Yoga + - React-CoreModules (0.81.4): + - RCTTypeSafety (= 0.81.4) + - React-Core-prebuilt + - React-Core/CoreModulesHeaders (= 0.81.4) + - React-jsi (= 0.81.4) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-NativeModulesApple + - React-RCTBlob + - React-RCTFBReactNativeSpec + - React-RCTImage (= 0.81.4) + - React-runtimeexecutor + - ReactCommon + - ReactNativeDependencies + - React-cxxreact (0.81.4): + - hermes-engine + - React-callinvoker (= 0.81.4) + - React-Core-prebuilt + - React-debug (= 0.81.4) + - React-jsi (= 0.81.4) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-logger (= 0.81.4) + - React-perflogger (= 0.81.4) + - React-runtimeexecutor + - React-timing (= 0.81.4) + - ReactNativeDependencies + - React-debug (0.81.4) + - React-defaultsnativemodule (0.81.4): + - hermes-engine + - React-Core-prebuilt - React-domnativemodule - - React-Fabric - - React-featureflags - React-featureflagsnativemodule - - React-graphics - React-idlecallbacksnativemodule - - React-ImageManager + - React-jsi + - React-jsiexecutor - 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 + - React-RCTFBReactNativeSpec + - ReactNativeDependencies + - React-domnativemodule (0.81.4): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug + - React-Core-prebuilt - React-Fabric + - React-Fabric/bridging - React-FabricComponents - - React-featureflags - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-Fabric (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-Fabric (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - 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-Fabric/animations (= 0.81.4) + - React-Fabric/attributedstring (= 0.81.4) + - React-Fabric/bridging (= 0.81.4) + - React-Fabric/componentregistry (= 0.81.4) + - React-Fabric/componentregistrynative (= 0.81.4) + - React-Fabric/components (= 0.81.4) + - React-Fabric/consistency (= 0.81.4) + - React-Fabric/core (= 0.81.4) + - React-Fabric/dom (= 0.81.4) + - React-Fabric/imagemanager (= 0.81.4) + - React-Fabric/leakchecker (= 0.81.4) + - React-Fabric/mounting (= 0.81.4) + - React-Fabric/observers (= 0.81.4) + - React-Fabric/scheduler (= 0.81.4) + - React-Fabric/telemetry (= 0.81.4) + - React-Fabric/templateprocessor (= 0.81.4) + - React-Fabric/uimanager (= 0.81.4) - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/animations (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/animations (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -829,19 +797,17 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/attributedstring (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/attributedstring (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -850,19 +816,17 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistry (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/bridging (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -871,19 +835,17 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistrynative (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/componentregistry (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -892,43 +854,17 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/componentregistrynative (0.81.4): - 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-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -937,19 +873,40 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/root (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/components (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.81.4) + - React-Fabric/components/root (= 0.81.4) + - React-Fabric/components/scrollview (= 0.81.4) + - React-Fabric/components/view (= 0.81.4) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/components/legacyviewmanagerinterop (0.81.4): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -958,19 +915,17 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/view (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/components/root (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -979,20 +934,57 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/components/scrollview (0.81.4): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/components/view (0.81.4): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-renderercss + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-Fabric/core (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-Fabric/consistency (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1001,19 +993,17 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/dom (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/core (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1022,19 +1012,17 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/imagemanager (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/dom (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1043,19 +1031,17 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/leakchecker (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/imagemanager (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1064,19 +1050,17 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/mounting (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/leakchecker (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1085,41 +1069,17 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/observers (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/mounting (0.81.4): - 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-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1128,19 +1088,56 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/scheduler (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/observers (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric/observers/events (= 0.81.4) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/observers/events (0.81.4): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/scheduler (0.81.4): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric/observers/events @@ -1151,19 +1148,17 @@ PODS: - React-logger - React-performancetimeline - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/telemetry (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/telemetry (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1172,19 +1167,17 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/templateprocessor (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/templateprocessor (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1193,22 +1186,20 @@ PODS: - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/uimanager (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/uimanager (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/uimanager/consistency (= 0.76.9) + - React-Fabric/uimanager/consistency (= 0.81.4) - React-featureflags - React-graphics - React-jsi @@ -1216,19 +1207,17 @@ PODS: - React-logger - React-rendererconsistency - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/uimanager/consistency (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-Fabric/uimanager/consistency (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1238,78 +1227,72 @@ PODS: - React-logger - React-rendererconsistency - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-FabricComponents (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-FabricComponents (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components (= 0.76.9) - - React-FabricComponents/textlayoutmanager (= 0.76.9) + - React-FabricComponents/components (= 0.81.4) + - React-FabricComponents/textlayoutmanager (= 0.81.4) - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-FabricComponents/components (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - 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-FabricComponents/components/inputaccessory (= 0.81.4) + - React-FabricComponents/components/iostextinput (= 0.81.4) + - React-FabricComponents/components/modal (= 0.81.4) + - React-FabricComponents/components/rncore (= 0.81.4) + - React-FabricComponents/components/safeareaview (= 0.81.4) + - React-FabricComponents/components/scrollview (= 0.81.4) + - React-FabricComponents/components/switch (= 0.81.4) + - React-FabricComponents/components/text (= 0.81.4) + - React-FabricComponents/components/textinput (= 0.81.4) + - React-FabricComponents/components/unimplementedview (= 0.81.4) + - React-FabricComponents/components/virtualview (= 0.81.4) - React-featureflags - React-graphics - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/inputaccessory (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-FabricComponents/components/inputaccessory (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1318,22 +1301,19 @@ PODS: - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/iostextinput (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-FabricComponents/components/iostextinput (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1342,22 +1322,19 @@ PODS: - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/modal (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-FabricComponents/components/modal (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1366,22 +1343,19 @@ PODS: - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/rncore (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-FabricComponents/components/rncore (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1390,22 +1364,19 @@ PODS: - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/safeareaview (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-FabricComponents/components/safeareaview (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1414,22 +1385,19 @@ PODS: - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/scrollview (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-FabricComponents/components/scrollview (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1438,22 +1406,19 @@ PODS: - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/text (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-FabricComponents/components/switch (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1462,22 +1427,19 @@ PODS: - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/textinput (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-FabricComponents/components/text (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1486,22 +1448,19 @@ PODS: - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/unimplementedview (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-FabricComponents/components/textinput (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1510,22 +1469,19 @@ PODS: - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/textlayoutmanager (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-FabricComponents/components/unimplementedview (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1534,189 +1490,220 @@ PODS: - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricImage (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-FabricComponents/components/virtualview (0.81.4): - hermes-engine - - RCT-Folly/Fabric - RCTRequired - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/textlayoutmanager (0.81.4): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricImage (0.81.4): + - hermes-engine + - RCTRequired (= 0.81.4) + - RCTTypeSafety (= 0.81.4) + - React-Core-prebuilt + - React-Fabric + - React-featureflags - React-graphics - React-ImageManager - React-jsi - - React-jsiexecutor + - React-jsiexecutor (= 0.81.4) - React-logger - React-rendererdebug - React-utils - ReactCommon + - ReactNativeDependencies - Yoga - - React-featureflags (0.76.9) - - React-featureflagsnativemodule (0.76.9): - - DoubleConversion - - glog + - React-featureflags (0.81.4): + - React-Core-prebuilt + - ReactNativeDependencies + - React-featureflagsnativemodule (0.81.4): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric + - React-Core-prebuilt - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - Yoga - - React-graphics (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly/Fabric + - ReactNativeDependencies + - React-graphics (0.81.4): + - hermes-engine + - React-Core-prebuilt - React-jsi - React-jsiexecutor - React-utils - - React-hermes (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - ReactNativeDependencies + - React-hermes (0.81.4): - hermes-engine - - RCT-Folly - - React-cxxreact + - React-Core-prebuilt + - React-cxxreact (= 0.81.4) - React-jsi - - React-jsiexecutor + - React-jsiexecutor (= 0.81.4) - React-jsinspector - - React-perflogger + - React-jsinspectorcdp + - React-jsinspectortracing + - React-perflogger (= 0.81.4) - React-runtimeexecutor - - React-idlecallbacksnativemodule (0.76.9): - - DoubleConversion - - glog + - ReactNativeDependencies + - React-idlecallbacksnativemodule (0.81.4): - 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-Core-prebuilt + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - Yoga - - React-ImageManager (0.76.9): - - glog - - RCT-Folly/Fabric + - ReactNativeDependencies + - React-ImageManager (0.81.4): + - React-Core-prebuilt - React-Core/Default - React-debug - React-Fabric - React-graphics - React-rendererdebug - React-utils - - React-jserrorhandler (0.76.9): - - glog + - ReactNativeDependencies + - React-jserrorhandler (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) + - React-Core-prebuilt - React-cxxreact - React-debug + - React-featureflags - React-jsi - - React-jsi (0.76.9): - - boost - - DoubleConversion - - fast_float - - fmt - - glog + - ReactCommon/turbomodule/bridging + - ReactNativeDependencies + - React-jsi (0.81.4): - hermes-engine - - RCT-Folly - - React-jsiexecutor (0.76.9): - - DoubleConversion - - fast_float - - fmt - - glog + - React-Core-prebuilt + - ReactNativeDependencies + - React-jsiexecutor (0.81.4): - hermes-engine - - RCT-Folly - - React-cxxreact - - React-jsi + - React-Core-prebuilt + - React-cxxreact (= 0.81.4) + - React-jsi (= 0.81.4) - React-jsinspector - - React-perflogger - - React-jsinspector (0.76.9): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly - - React-featureflags - - React-jsi - - React-perflogger + - React-jsinspectorcdp + - React-jsinspectortracing + - React-perflogger (= 0.81.4) - React-runtimeexecutor - - React-jsitracing (0.76.9): + - ReactNativeDependencies + - React-jsinspector (0.81.4): + - hermes-engine + - React-Core-prebuilt + - React-featureflags - 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-jsinspectorcdp + - React-jsinspectornetwork + - React-jsinspectortracing + - React-oscompat + - React-perflogger (= 0.81.4) + - React-runtimeexecutor + - ReactNativeDependencies + - React-jsinspectorcdp (0.81.4): + - React-Core-prebuilt + - ReactNativeDependencies + - React-jsinspectornetwork (0.81.4): + - React-Core-prebuilt - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging + - React-jsinspectorcdp + - React-performancetimeline + - React-timing + - ReactNativeDependencies + - React-jsinspectortracing (0.81.4): + - React-Core-prebuilt + - React-oscompat + - React-timing + - ReactNativeDependencies + - React-jsitooling (0.81.4): + - React-Core-prebuilt + - React-cxxreact (= 0.81.4) + - React-jsi (= 0.81.4) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-runtimeexecutor + - ReactNativeDependencies + - React-jsitracing (0.81.4): + - React-jsi + - React-logger (0.81.4): + - React-Core-prebuilt + - ReactNativeDependencies + - React-Mapbuffer (0.81.4): + - React-Core-prebuilt + - React-debug + - ReactNativeDependencies + - React-microtasksnativemodule (0.81.4): + - hermes-engine + - React-Core-prebuilt + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - Yoga + - ReactNativeDependencies - react-native-blur (4.4.1): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-device-brightness (1.2.7): - React @@ -1724,214 +1711,231 @@ PODS: - React-Core - react-native-netinfo (11.4.1): - React-Core - - react-native-safe-area-context (4.12.0): - - DoubleConversion - - glog + - react-native-safe-area-context (5.6.1): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - 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-jsi + - react-native-safe-area-context/common (= 5.6.1) + - react-native-safe-area-context/fabric (= 5.6.1) - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-safe-area-context/common (4.12.0): - - DoubleConversion - - glog + - react-native-safe-area-context/common (5.6.1): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-safe-area-context/fabric (4.12.0): - - DoubleConversion - - glog + - react-native-safe-area-context/fabric (5.6.1): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - react-native-safe-area-context/common - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-slider (4.5.5): - - DoubleConversion - - glog + - react-native-slider (5.0.1): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager - - react-native-slider/common (= 4.5.5) + - React-jsi + - react-native-slider/common (= 5.0.1) - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-slider/common (4.5.5): - - DoubleConversion - - glog + - react-native-slider/common (5.0.1): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-video (6.16.1): - - DoubleConversion - - glog + - react-native-video (6.17.0): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager - - react-native-video/Video (= 6.16.1) + - React-jsi + - react-native-video/Video (= 6.17.0) - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-video/Fabric (6.16.1): - - DoubleConversion - - glog + - react-native-video/Fabric (6.17.0): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-video/Video (6.16.1): - - DoubleConversion - - glog + - react-native-video/Video (6.17.0): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - react-native-video/Fabric - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-nativeconfig (0.76.9) - - React-NativeModulesApple (0.76.9): - - glog + - React-NativeModulesApple (0.81.4): - hermes-engine - React-callinvoker - React-Core + - React-Core-prebuilt - React-cxxreact + - React-featureflags - React-jsi - React-jsinspector + - React-jsinspectorcdp - 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 + - ReactNativeDependencies + - React-oscompat (0.81.4) + - React-perflogger (0.81.4): + - React-Core-prebuilt + - ReactNativeDependencies + - React-performancetimeline (0.81.4): + - React-Core-prebuilt + - React-featureflags + - React-jsinspectortracing + - React-perflogger - React-timing - - React-RCTActionSheet (0.76.9): - - React-Core/RCTActionSheetHeaders (= 0.76.9) - - React-RCTAnimation (0.76.9): - - RCT-Folly (= 2024.10.14.00) + - ReactNativeDependencies + - React-RCTActionSheet (0.81.4): + - React-Core/RCTActionSheetHeaders (= 0.81.4) + - React-RCTAnimation (0.81.4): - RCTTypeSafety + - React-Core-prebuilt - React-Core/RCTAnimationHeaders + - React-featureflags - React-jsi - React-NativeModulesApple - - ReactCodegen + - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTAppDelegate (0.76.9): - - RCT-Folly (= 2024.10.14.00) + - ReactNativeDependencies + - React-RCTAppDelegate (0.81.4): + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-CoreModules - React-debug - React-defaultsnativemodule @@ -1939,38 +1943,38 @@ PODS: - React-featureflags - React-graphics - React-hermes - - React-nativeconfig + - React-jsitooling - React-NativeModulesApple - React-RCTFabric + - React-RCTFBReactNativeSpec - React-RCTImage - React-RCTNetwork + - React-RCTRuntime - React-rendererdebug - React-RuntimeApple - React-RuntimeCore - - React-RuntimeHermes + - React-runtimeexecutor - React-runtimescheduler - React-utils - - ReactCodegen - ReactCommon - - React-RCTBlob (0.76.9): - - DoubleConversion - - fast_float - - fmt + - ReactNativeDependencies + - React-RCTBlob (0.81.4): - hermes-engine - - RCT-Folly (= 2024.10.14.00) + - React-Core-prebuilt - React-Core/RCTBlobHeaders - React-Core/RCTWebSocket - React-jsi - React-jsinspector + - React-jsinspectorcdp - React-NativeModulesApple + - React-RCTFBReactNativeSpec - React-RCTNetwork - - ReactCodegen - ReactCommon - - React-RCTFabric (0.76.9): - - glog + - ReactNativeDependencies + - React-RCTFabric (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-FabricComponents @@ -1980,141 +1984,214 @@ PODS: - React-ImageManager - React-jsi - React-jsinspector - - React-nativeconfig + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-jsinspectortracing - React-performancetimeline + - React-RCTAnimation + - React-RCTFBReactNativeSpec - React-RCTImage - React-RCTText - React-rendererconsistency + - React-renderercss - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils + - ReactNativeDependencies - Yoga - - React-RCTImage (0.76.9): - - RCT-Folly (= 2024.10.14.00) + - React-RCTFBReactNativeSpec (0.81.4): + - hermes-engine + - RCTRequired - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec/components (= 0.81.4) + - ReactCommon + - ReactNativeDependencies + - React-RCTFBReactNativeSpec/components (0.81.4): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-NativeModulesApple + - React-rendererdebug + - React-utils + - ReactCommon + - ReactNativeDependencies + - Yoga + - React-RCTImage (0.81.4): + - RCTTypeSafety + - React-Core-prebuilt - React-Core/RCTImageHeaders - React-jsi - React-NativeModulesApple + - React-RCTFBReactNativeSpec - React-RCTNetwork - - ReactCodegen - ReactCommon - - React-RCTLinking (0.76.9): - - React-Core/RCTLinkingHeaders (= 0.76.9) - - React-jsi (= 0.76.9) + - ReactNativeDependencies + - React-RCTLinking (0.81.4): + - React-Core/RCTLinkingHeaders (= 0.81.4) + - React-jsi (= 0.81.4) - React-NativeModulesApple - - ReactCodegen + - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 0.76.9) - - React-RCTNetwork (0.76.9): - - RCT-Folly (= 2024.10.14.00) + - ReactCommon/turbomodule/core (= 0.81.4) + - React-RCTNetwork (0.81.4): - RCTTypeSafety + - React-Core-prebuilt - React-Core/RCTNetworkHeaders + - React-featureflags - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork - React-NativeModulesApple - - ReactCodegen + - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTSettings (0.76.9): - - RCT-Folly (= 2024.10.14.00) + - ReactNativeDependencies + - React-RCTRuntime (0.81.4): + - hermes-engine + - React-Core + - React-Core-prebuilt + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-RuntimeApple + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - ReactNativeDependencies + - React-RCTSettings (0.81.4): - RCTTypeSafety + - React-Core-prebuilt - React-Core/RCTSettingsHeaders - React-jsi - React-NativeModulesApple - - ReactCodegen + - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTText (0.76.9): - - React-Core/RCTTextHeaders (= 0.76.9) + - ReactNativeDependencies + - React-RCTText (0.81.4): + - React-Core/RCTTextHeaders (= 0.81.4) - Yoga - - React-RCTVibration (0.76.9): - - RCT-Folly (= 2024.10.14.00) + - React-RCTVibration (0.81.4): + - React-Core-prebuilt - React-Core/RCTVibrationHeaders - React-jsi - React-NativeModulesApple - - ReactCodegen + - React-RCTFBReactNativeSpec - ReactCommon - - React-rendererconsistency (0.76.9) - - React-rendererdebug (0.76.9): - - DoubleConversion - - fast_float - - fmt - - RCT-Folly + - ReactNativeDependencies + - React-rendererconsistency (0.81.4) + - React-renderercss (0.81.4): - React-debug - - React-rncore (0.76.9) - - React-RuntimeApple (0.76.9): + - React-utils + - React-rendererdebug (0.81.4): + - React-Core-prebuilt + - React-debug + - ReactNativeDependencies + - React-RuntimeApple (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) - React-callinvoker + - React-Core-prebuilt - React-Core/Default - React-CoreModules - React-cxxreact + - React-featureflags - React-jserrorhandler - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-Mapbuffer - React-NativeModulesApple - React-RCTFabric + - React-RCTFBReactNativeSpec - React-RuntimeCore - React-runtimeexecutor - React-RuntimeHermes - React-runtimescheduler - React-utils - - React-RuntimeCore (0.76.9): - - glog + - ReactNativeDependencies + - React-RuntimeCore (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) + - React-Core-prebuilt - React-cxxreact + - React-Fabric - React-featureflags - React-jserrorhandler - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-performancetimeline - React-runtimeexecutor - React-runtimescheduler - React-utils - - React-runtimeexecutor (0.76.9): - - React-jsi (= 0.76.9) - - React-RuntimeHermes (0.76.9): + - ReactNativeDependencies + - React-runtimeexecutor (0.81.4): + - React-Core-prebuilt + - React-debug + - React-featureflags + - React-jsi (= 0.81.4) + - React-utils + - ReactNativeDependencies + - React-RuntimeHermes (0.81.4): - hermes-engine - - RCT-Folly/Fabric (= 2024.10.14.00) + - React-Core-prebuilt - React-featureflags - React-hermes - React-jsi - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling - React-jsitracing - - React-nativeconfig - React-RuntimeCore + - React-runtimeexecutor - React-utils - - React-runtimescheduler (0.76.9): - - glog + - ReactNativeDependencies + - React-runtimescheduler (0.81.4): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - React-callinvoker + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-jsi + - React-jsinspectortracing - 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) + - ReactNativeDependencies + - React-timing (0.81.4): - React-debug - - React-jsi (= 0.76.9) - - ReactCodegen (0.76.9): - - DoubleConversion - - glog + - React-utils (0.81.4): + - hermes-engine + - React-Core-prebuilt + - React-debug + - React-jsi (= 0.81.4) + - ReactNativeDependencies + - ReactAppDependencyProvider (0.81.4): + - ReactCodegen + - ReactCodegen (0.81.4): - hermes-engine - - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-FabricImage @@ -2123,150 +2200,148 @@ PODS: - React-jsi - React-jsiexecutor - React-NativeModulesApple + - React-RCTAppDelegate - 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 + - ReactNativeDependencies + - ReactCommon (0.81.4): + - React-Core-prebuilt + - ReactCommon/turbomodule (= 0.81.4) + - ReactNativeDependencies + - ReactCommon/turbomodule (0.81.4): - 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 + - React-callinvoker (= 0.81.4) + - React-Core-prebuilt + - React-cxxreact (= 0.81.4) + - React-jsi (= 0.81.4) + - React-logger (= 0.81.4) + - React-perflogger (= 0.81.4) + - ReactCommon/turbomodule/bridging (= 0.81.4) + - ReactCommon/turbomodule/core (= 0.81.4) + - ReactNativeDependencies + - ReactCommon/turbomodule/bridging (0.81.4): - 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 + - React-callinvoker (= 0.81.4) + - React-Core-prebuilt + - React-cxxreact (= 0.81.4) + - React-jsi (= 0.81.4) + - React-logger (= 0.81.4) + - React-perflogger (= 0.81.4) + - ReactNativeDependencies + - ReactCommon/turbomodule/core (0.81.4): - 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 + - React-callinvoker (= 0.81.4) + - React-Core-prebuilt + - React-cxxreact (= 0.81.4) + - React-debug (= 0.81.4) + - React-featureflags (= 0.81.4) + - React-jsi (= 0.81.4) + - React-logger (= 0.81.4) + - React-perflogger (= 0.81.4) + - React-utils (= 0.81.4) + - ReactNativeDependencies + - ReactNativeDependencies (0.81.4) + - RNCAsyncStorage (2.2.0): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - RNCPicker (2.9.0): - - DoubleConversion - - glog + - RNCPicker (2.11.1): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - RNFastImage (8.12.0): - - DoubleConversion - - glog - hermes-engine - libavif/core (~> 0.11.1) - libavif/libdav1d (~> 0.11.1) - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - SDWebImage (>= 5.19.1) - SDWebImageAVIFCoder (~> 0.11.0) - SDWebImageWebPCoder (~> 0.14) - Yoga - - RNGestureHandler (2.20.2): - - DoubleConversion - - glog + - RNGestureHandler (2.28.0): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - RNReanimated (3.17.4): - - DoubleConversion - - glog + - RNReanimated (3.19.3): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2276,22 +2351,22 @@ PODS: - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated (= 3.17.4) - - RNReanimated/worklets (= 3.17.4) + - ReactNativeDependencies + - RNReanimated/reanimated (= 3.19.3) + - RNReanimated/worklets (= 3.19.3) - Yoga - - RNReanimated/reanimated (3.17.4): - - DoubleConversion - - glog + - RNReanimated/reanimated (3.19.3): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2301,21 +2376,21 @@ PODS: - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated/apple (= 3.17.4) + - ReactNativeDependencies + - RNReanimated/reanimated/apple (= 3.19.3) - Yoga - - RNReanimated/reanimated/apple (3.17.4): - - DoubleConversion - - glog + - RNReanimated/reanimated/apple (3.19.3): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2325,20 +2400,20 @@ PODS: - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - RNReanimated/worklets (3.17.4): - - DoubleConversion - - glog + - RNReanimated/worklets (3.19.3): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2348,21 +2423,21 @@ PODS: - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/worklets/apple (= 3.17.4) + - ReactNativeDependencies + - RNReanimated/worklets/apple (= 3.19.3) - Yoga - - RNReanimated/worklets/apple (3.17.4): - - DoubleConversion - - glog + - RNReanimated/worklets/apple (3.19.3): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2372,161 +2447,166 @@ PODS: - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - RNScreens (4.4.0): - - DoubleConversion - - glog + - RNScreens (4.16.0): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric - React-RCTImage + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNScreens/common (= 4.4.0) + - ReactNativeDependencies + - RNScreens/common (= 4.16.0) - Yoga - - RNScreens/common (4.4.0): - - DoubleConversion - - glog + - RNScreens/common (4.16.0): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric - React-RCTImage + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - RNSentry (6.10.0): - - DoubleConversion - - glog + - RNSentry (7.2.0): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - Sentry/HybridSDK (= 8.48.0) + - ReactNativeDependencies + - Sentry/HybridSDK (= 8.56.1) - Yoga - - RNSVG (15.8.0): - - DoubleConversion - - glog + - RNSVG (15.12.1): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNSVG/common (= 15.8.0) + - ReactNativeDependencies + - RNSVG/common (= 15.12.1) - Yoga - - RNSVG/common (15.8.0): - - DoubleConversion - - glog + - RNSVG/common (15.12.1): - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - RNVectorIcons (10.3.0): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.10.14.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - SDWebImage (5.19.7): - - SDWebImage/Core (= 5.19.7) - - SDWebImage/Core (5.19.7) + - SDWebImage (5.21.3): + - SDWebImage/Core (= 5.21.3) + - SDWebImage/Core (5.21.3) - SDWebImageAVIFCoder (0.11.1): - libavif/core (>= 0.11.0) - SDWebImage (~> 5.10) - SDWebImageWebPCoder (0.14.6): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.17) - - Sentry/HybridSDK (8.48.0) - - SocketRocket (0.7.1) + - Sentry/HybridSDK (8.56.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`) @@ -2561,24 +2641,20 @@ DEPENDENCIES: - 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-prebuilt (from `../node_modules/react-native/React-Core-prebuilt.podspec`) - 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`) @@ -2598,6 +2674,10 @@ DEPENDENCIES: - 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-jsinspectorcdp (from `../node_modules/react-native/ReactCommon/jsinspector-modern/cdp`) + - React-jsinspectornetwork (from `../node_modules/react-native/ReactCommon/jsinspector-modern/network`) + - React-jsinspectortracing (from `../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`) + - React-jsitooling (from `../node_modules/react-native/ReactCommon/jsitooling`) - 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`) @@ -2609,8 +2689,8 @@ DEPENDENCIES: - 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-nativeconfig (from `../node_modules/react-native/ReactCommon`) - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`) - 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`) @@ -2618,15 +2698,17 @@ DEPENDENCIES: - 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-RCTFBReactNativeSpec (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-RCTRuntime (from `../node_modules/react-native/React/Runtime`) - 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-renderercss (from `../node_modules/react-native/ReactCommon/react/renderer/css`) - 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`) @@ -2634,8 +2716,10 @@ DEPENDENCIES: - 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`) + - ReactAppDependencyProvider (from `build/generated/ios`) - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - ReactNativeDependencies (from `../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`) - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" - "RNFastImage (from `../node_modules/@d11/react-native-fast-image`)" @@ -2659,16 +2743,11 @@ SPEC REPOS: - SDWebImageAVIFCoder - SDWebImageWebPCoder - 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: @@ -2737,20 +2816,14 @@ EXTERNAL SOURCES: :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 + :tag: hermes-2025-07-07-RNv0.81.0-e0fc67142ec0763c6b6153ca2bf96df815539782 ImageColors: :path: "../node_modules/react-native-image-colors/ios" KSPlayer: @@ -2761,8 +2834,6 @@ EXTERNAL SOURCES: :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: @@ -2775,6 +2846,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/callinvoker" React-Core: :path: "../node_modules/react-native/" + React-Core-prebuilt: + :podspec: "../node_modules/react-native/React-Core-prebuilt.podspec" React-CoreModules: :path: "../node_modules/react-native/React/CoreModules" React-cxxreact: @@ -2811,6 +2884,14 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" + React-jsinspectorcdp: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" + React-jsinspectornetwork: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/network" + React-jsinspectortracing: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" + React-jsitooling: + :path: "../node_modules/react-native/ReactCommon/jsitooling" React-jsitracing: :path: "../node_modules/react-native/ReactCommon/hermes/executor/" React-logger: @@ -2833,10 +2914,10 @@ EXTERNAL SOURCES: :path: "../node_modules/@react-native-community/slider" react-native-video: :path: "../node_modules/react-native-video" - React-nativeconfig: - :path: "../node_modules/react-native/ReactCommon" React-NativeModulesApple: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-oscompat: + :path: "../node_modules/react-native/ReactCommon/oscompat" React-perflogger: :path: "../node_modules/react-native/ReactCommon/reactperflogger" React-performancetimeline: @@ -2851,12 +2932,16 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/Blob" React-RCTFabric: :path: "../node_modules/react-native/React" + React-RCTFBReactNativeSpec: + :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-RCTRuntime: + :path: "../node_modules/react-native/React/Runtime" React-RCTSettings: :path: "../node_modules/react-native/Libraries/Settings" React-RCTText: @@ -2865,10 +2950,10 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/Vibration" React-rendererconsistency: :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" + React-renderercss: + :path: "../node_modules/react-native/ReactCommon/react/renderer/css" 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: @@ -2883,10 +2968,14 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/timing" React-utils: :path: "../node_modules/react-native/ReactCommon/react/utils" + ReactAppDependencyProvider: + :path: build/generated/ios ReactCodegen: :path: build/generated/ios ReactCommon: :path: "../node_modules/react-native/ReactCommon" + ReactNativeDependencies: + :podspec: "../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec" RNCAsyncStorage: :path: "../node_modules/@react-native-async-storage/async-storage" RNCPicker: @@ -2910,62 +2999,57 @@ EXTERNAL SOURCES: CHECKOUT OPTIONS: DisplayCriteria: - :commit: 8fe5feb73ca3ee5092d2ed1dd8fcb692c10e3c11 + :commit: f9c3b86dfed683b278a6f5551d4e68ebcdcc3bf2 :git: https://github.com/kingslay/KSPlayer.git FFmpegKit: :commit: d7048037a2eb94a3b08113fbf43aa92bdcb332d9 :git: https://github.com/kingslay/FFmpegKit.git KSPlayer: - :commit: 8fe5feb73ca3ee5092d2ed1dd8fcb692c10e3c11 + :commit: f9c3b86dfed683b278a6f5551d4e68ebcdcc3bf2 :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 - ExpoDocumentPicker: 6d3d499cf15b692688a804f42927d0f35de5ebaa - ExpoFileSystem: 42d363d3b96f9afab980dcef60d5657a4443c655 - ExpoFont: f354e926f8feae5e831ec8087f36652b44a0b188 - ExpoHaptics: 8d199b2f33245ea85289ff6c954c7ee7c00a5b5d - ExpoKeepAwake: b0171a73665bfcefcfcc311742a72a956e6aa680 + EASClient: 68127f1248d2b25fdc82dbbfb17be95d1c4700be + EXApplication: 296622817d459f46b6c5fe8691f4aac44d2b79e7 + EXConstants: a95804601ee4a6aa7800645f9b070d753b1142b3 + EXJSONUtils: 1d3e4590438c3ee593684186007028a14b3686cd + EXManifests: 224345a575fca389073c416297b6348163f28d1a + EXNotifications: 7cff475adb5d7a255a9ea46bbd2589cb3b454506 + Expo: 6580dbf21d94626792b38a95cddb2fb369ec6b0c + expo-dev-client: 6da1a574fa7caa33a315d818b43c4e560be91915 + expo-dev-launcher: ab4604b4cc823ff8c67835a90e7e36834224ea8c + expo-dev-menu: 6db57f4d3001fe3992d84a0c2e285de381e4b51b + expo-dev-menu-interface: 600df12ea01efecdd822daaf13cc0ac091775533 + ExpoAsset: 9ba6fbd677fb8e241a3899ac00fa735bc911eadf + ExpoBlur: 2dd8f64aa31f5d405652c21d3deb2d2588b1852f + ExpoBrightness: 32672952bf8b152d0cceaf8ec9f1def3a9a5e0d9 + ExpoCrypto: c1fbce112d1b6b79652bbe380b4fd4cc91676595 + ExpoDevice: 148accb4071873d19fba80a2506c58ffa433d620 + ExpoDocumentPicker: 2200eefc2817f19315fa18f0147e0b80ece86926 + ExpoFileSystem: b79eadbda7b7f285f378f95f959cc9313a1c9c61 + ExpoFont: cf9d90ec1d3b97c4f513211905724c8171f82961 + ExpoHaptics: 807476b0c39e9d82b7270349d6487928ce32df84 + ExpoKeepAwake: 1a2e820692e933c94a565ec3fbbe38ac31658ffe ExpoLibVlcPlayer: dce3d0b5847838cd5f8c5f3c3aa1bc55c92e911d - ExpoLinearGradient: 35ebd83b16f80b3add053a2fd68cc328ed927f60 - ExpoLinking: 8d12bee174ba0cdf31239706578e29e74a417402 - ExpoLocalization: 7776ea3bdb112125390745bbaf919b734b2ad1c7 - ExpoModulesCore: c25d77625038b1968ea1afefc719862c0d8dd993 + ExpoLinearGradient: a464898cb95153125e3b81894fd479bcb1c7dd27 + ExpoLinking: f051f28e50ea9269ff539317c166adec81d9342d + ExpoLocalization: b852a5d8ec14c5349c1593eca87896b5b3ebfcca + ExpoModulesCore: 3a6eb12a5f4d67b2f5fc7d0bc4777b18348f2d7a ExpoRandom: d1444df65007bdd4070009efd5dab18e20bf0f00 - ExpoScreenOrientation: af8b31d3164239a4ef3ea0b32bd63fb65df70d58 - ExpoSharing: 849a5ce9985c22598c16ec027e32969be8062e8e - ExpoSystemUI: b82a45cf0f6a4fa18d07c46deba8725dd27688b4 - ExpoWebBrowser: a212e6b480d8857d3e441fba51e0c968333803b3 - EXStructuredHeaders: 09c70347b282e3d2507e25fb4c747b1b885f87f6 - EXUpdates: 4fc73950af0af03388063823e75eb2f7566a48c9 - EXUpdatesInterface: 7c977640bdd8b85833c19e3959ba46145c5719db - fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6 - FBLazyVector: 7605ea4810e0e10ae4815292433c09bf4324ba45 + ExpoScreenOrientation: ef9ab3fb85c8a8ff57d52aa169b750aca03f0f4c + ExpoSharing: 032c01bb034319e2374badf082ae935be866d2e9 + ExpoSystemUI: 6cd74248a2282adf6dec488a75fa532d69dee314 + ExpoWebBrowser: d04a0d6247a0bea4519fbc2ea816610019ad83e0 + EXStructuredHeaders: c951e77f2d936f88637421e9588c976da5827368 + EXUpdates: ef83273afc231a627b170358c90689ac30a4429d + EXUpdatesInterface: 5adf50cb41e079c861da6d9b4b954c3db9a50734 + FBLazyVector: 9e0cd874afd81d9a4d36679daca991b58b260d42 FFmpegKit: 3885085fbbc320745838ee4c8a1f9c5e5953dab2 - fmt: 01b82d4ca6470831d1cc0852a1af644be019e8f6 - glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a - hermes-engine: 9e868dc7be781364296d6ee2f56d0c1a9ef0bb11 + hermes-engine: 35c763d57c9832d0eef764316ca1c4d043581394 ImageColors: 51cd79f7a9d2524b7a681c660b0a50574085563b KSPlayer: f163ac6195f240b6fa5b8225aeb39ec811a70c62 Libass: e88af2324e1217e3a4c8bdc675f6f23a9dfc7677 @@ -2973,88 +3057,95 @@ SPEC CHECKSUMS: libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 lottie-ios: a881093fab623c467d3bce374367755c272bdd59 - lottie-react-native: 4ba06e2e4985c53dda6595a880f780e7ff551df1 + lottie-react-native: cbe3d931a7c24f7891a8e8032c2bb9b2373c4b9c MobileVLCKit: 2d9c7c373393ae43086aeeff890bf0b1afc15c5c - RCT-Folly: ea9d9256ba7f9322ef911169a9f696e5857b9e17 - RCTDeprecation: ebe712bb05077934b16c6bf25228bdec34b64f83 - RCTRequired: ca91e5dd26b64f577b528044c962baf171c6b716 - RCTTypeSafety: e7678bd60850ca5a41df9b8dc7154638cb66871f + RCTDeprecation: 7487d6dda857ccd4cb3dd6ecfccdc3170e85dcbc + RCTRequired: 54128b7df8be566881d48c7234724a78cb9b6157 + RCTTypeSafety: d2b07797a79e45d7b19e1cd2f53c79ab419fe217 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: 2073376f47c71b7e9a0af7535986a77522ce1049 + React-callinvoker: 00fa0972a70df7408a4f088144b67207b157e386 + React-Core: d375dd308561785c739a621a21802e5e7e047dee + React-Core-prebuilt: dde79b89f8863efebb1d532a3335f472927da669 + React-CoreModules: 3eb9b1410a317987c557afc683cc50099562c91d + React-cxxreact: 724210b64158d97f150d8d254a7319e73ef77ee7 + React-debug: c01d176522cf57cdc4a4a66d1974968fcf497f32 + React-defaultsnativemodule: 3953ff49013fa997e72586628e1d218fdaf3abdb + React-domnativemodule: 540b9c7a8f31b6f4ed449aafd3a272e1f1107089 + React-Fabric: 00b792be016edad758a63c4ebac15e01d35f6355 + React-FabricComponents: 16ebdb9245d91ec27985a038d0a6460f499db54e + React-FabricImage: 2a967b5f0293c1c49ec883babfd4992d161e3583 + React-featureflags: 4150b4ddac8210b1e3c538cfb455050b5ee05d8d + React-featureflagsnativemodule: ff977040205b96818ac1f884846493cb8a2aca28 + React-graphics: ec689ac1c13a9ddb1af83baf195264676ecdbeb6 + React-hermes: ff60a3407f27f3fc82f661774a7ab6559a24ab69 + React-idlecallbacksnativemodule: 5f5ce3c424941f77da4ac3adba681149e68b1221 + React-ImageManager: 8d87296a86f9ee290c1d32c68c7be1be63492467 + React-jserrorhandler: 072756f12136284c86e96c33cdfece4d7286a99f + React-jsi: b507852b42a9125dffbf6ae7a33792fb521b29a2 + React-jsiexecutor: f970eed6debb91fe5d5d6cb5734d39cf86c59896 + React-jsinspector: 766e113e9482b22971b30236d10c04d8af38269e + React-jsinspectorcdp: 5b60350e29fe2566d9ed9799858c04b8e6095a3e + React-jsinspectornetwork: b3cc9a20c6b270f792eaaaa14313019a031b327d + React-jsinspectortracing: d99120fcf0864209c45cefbc9fc4605c8189c0ef + React-jsitooling: 9e41724cc47feadefbede31ca91d70f6ff079656 + React-jsitracing: ca020d934502de8e02cccf451501434a5e584027 + React-logger: 7b234de35acb469ce76d6bbb0457f664d6f32f62 + React-Mapbuffer: fbe1da882a187e5898bdf125e1cc6e603d27ecae + React-microtasksnativemodule: 76905804171d8ccbe69329fc84c57eb7934add7f + react-native-blur: 1b00ef07fe0efdc0c40b37139a5268ccad73c72d 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-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 - RNFastImage: 5881b37a068ee3f58cb3346ea7ff97110befe675 - RNGestureHandler: fffddeb8af59709c6d8de11b6461a6af63cad532 - RNReanimated: b54ef33fc4b2dc50c4de3e8cdd8a7540b1ac928f - RNScreens: 362f4c861dd155f898908d5035d97b07a3f1a9d1 - RNSentry: ac7beae04304d95491a512b5abf6926d4501c73c - RNSVG: b889dc9c1948eeea0576a16cc405c91c37a12c19 - RNVectorIcons: c95fdae217b0ed388f2b4d7ed7a4edc457c1df47 - SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3 + react-native-safe-area-context: 42a1b4f8774b577d03b53de7326e3d5757fe9513 + react-native-slider: 8c562583722c396a3682f451f0b6e68e351ec3b9 + react-native-video: 5d9635903e562e0c5eb47c5fa401f1c807d6e068 + React-NativeModulesApple: a9464983ccc0f66f45e93558671f60fc7536e438 + React-oscompat: 73db7dbc80edef36a9d6ed3c6c4e1724ead4236d + React-perflogger: 123272debf907cc423962adafcf4513320e43757 + React-performancetimeline: 095146e4dc8fa4568e44d7a9debc134f27e103f9 + React-RCTActionSheet: 9fc2a0901af63cefe09c8df95a08c2cf8bb7797b + React-RCTAnimation: 785e743e489bc7aec14415dbc15f4f275b2c0276 + React-RCTAppDelegate: 0602c9e13130edcde4661ea66d11122a3a66f11a + React-RCTBlob: ae53b7508a5ced43378de2a88816f63423df1f24 + React-RCTFabric: 687a0cfb5726adea7fac63560b04410c86d97134 + React-RCTFBReactNativeSpec: 7c55cf4fb4d2baad32ce3850b8504a6ee22e11ce + React-RCTImage: f45474c75cdf1526114f75b27e86d004aa171b90 + React-RCTLinking: 56622ff97570e15e01dd9b5a657010c756a9e2d8 + React-RCTNetwork: 3fffa1ab5d6981f839e7679d56f8cb731ba92c07 + React-RCTRuntime: f38c04f744596fc8e1b4c5f6a57fc05c26955257 + React-RCTSettings: f4a8e1bd36f58ec8273c73d3deefdcf90143ac6a + React-RCTText: da852a51dd1d169b38136a4f4d1eaed35376556b + React-RCTVibration: ff92ef336e32e18efff0fa83c798a2dbbebe09bd + React-rendererconsistency: b83b300e607f4e30478a5c3365e260a760232b04 + React-renderercss: aa6a3cdd4fa4e3726123c42b49ba4dd978f81688 + React-rendererdebug: 6b12a782caf2e7e2f730434264357b7b6aed1781 + React-RuntimeApple: 8934aab108dcab957a87208fef4b6f1b3a04973a + React-RuntimeCore: 1d4345561ecc402e9e88b38e1d9b059a7a13b113 + React-runtimeexecutor: a9a059f222e4d78f45a4e92cada48a5fde989fb8 + React-RuntimeHermes: 05b955709a75038d282a9420342d7bea5857768a + React-runtimescheduler: 4ce23c9157b51101092537d4171ea4de48a5b863 + React-timing: 62441edf291b91ab5b96ab8f2f8fb648c063ce6f + React-utils: 485abe7eaefa04b20e0ef442593e022563a1419b + ReactAppDependencyProvider: 433ddfb4536948630aadd5bd925aff8a632d2fe3 + ReactCodegen: a15ad48730e9fb2a51a4c9f61fe1ed253dfcf10f + ReactCommon: 149b6c05126f2e99f2ed0d3c63539369546f8cae + ReactNativeDependencies: ed6d1e64802b150399f04f1d5728ec16b437251e + RNCAsyncStorage: 3a4f5e2777dae1688b781a487923a08569e27fe4 + RNCPicker: a7170edbcbf8288de8edb2502e08e7fc757fa755 + RNFastImage: 42a769cd260a7686b1db32a9f7d754333bad4e77 + RNGestureHandler: 2914750df066d89bf9d8f48a10ad5f0051108ac3 + RNReanimated: 112c0628c3c11b56c261bafb8df9ae72eb525aec + RNScreens: d8d6f1792f6e7ac12b0190d33d8d390efc0c1845 + RNSentry: 41979b419908128847ef662cc130a400b7576fa9 + RNSVG: 31d6639663c249b7d5abc9728dde2041eb2a3c34 + RNVectorIcons: 4351544f100d4f12cac156a7c13399e60bab3e26 + SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a SDWebImageAVIFCoder: afe194a084e851f70228e4be35ef651df0fc5c57 SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 - Sentry: 1ca8405451040482877dcd344dfa3ef80b646631 - SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: feb4910aba9742cfedc059e2b2902e22ffe9954a + Sentry: b3ec44d01708fce73f99b544beb57e890eca4406 + Yoga: 051f086b5ccf465ff2ed38a2cf5a558ae01aaaa1 -PODFILE CHECKSUM: 2743ffad4c68da0945d48cdefa62202d726c27d2 +PODFILE CHECKSUM: 1db7b3713ca6ad8568e4bdf6b72b92b72ee8199d COCOAPODS: 1.16.2 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 deleted file mode 100644 index 46cc01a..0000000 Binary files a/ios/vendor/bundle/ruby/2.6.0/cache/rexml-3.4.4.gem and /dev/null 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 deleted file mode 100644 index 29e64e0..0000000 Binary files a/ios/vendor/bundle/ruby/2.6.0/cache/xcodeproj-1.27.0.gem and /dev/null 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 deleted file mode 100644 index e69de29..0000000 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 deleted file mode 100644 index 24554a7..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/extensions/universal-darwin-24/2.6.0/nkf-0.2.0/gem_make.out +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index 0d1f46a..0000000 Binary files a/ios/vendor/bundle/ruby/2.6.0/extensions/universal-darwin-24/2.6.0/nkf-0.2.0/nkf.bundle and /dev/null 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 deleted file mode 100644 index ba6ffb2..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -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 deleted file mode 100644 index 49f0c07..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/README.md +++ /dev/null @@ -1,79 +0,0 @@ -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 deleted file mode 100644 index a71005c..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/README.rdoc +++ /dev/null @@ -1,43 +0,0 @@ -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 deleted file mode 100644 index c981a51..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/THANKS +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index f83fef7..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist.rb +++ /dev/null @@ -1,6 +0,0 @@ -# -*- 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 deleted file mode 100644 index da84b63..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbBinaryCFPropertyList.rb +++ /dev/null @@ -1,594 +0,0 @@ -# -*- 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 deleted file mode 100644 index e276565..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPlistError.rb +++ /dev/null @@ -1,26 +0,0 @@ -# -*- 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 deleted file mode 100644 index d31ba51..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFPropertyList.rb +++ /dev/null @@ -1,449 +0,0 @@ -# -*- 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 deleted file mode 100644 index 8563721..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbCFTypes.rb +++ /dev/null @@ -1,349 +0,0 @@ -# -*- 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 deleted file mode 100644 index 3642016..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbLibXMLParser.rb +++ /dev/null @@ -1,149 +0,0 @@ -# -*- 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 deleted file mode 100644 index e2de688..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbNokogiriParser.rb +++ /dev/null @@ -1,152 +0,0 @@ -# -*- 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 deleted file mode 100644 index fa698ce..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/CFPropertyList-3.0.7/lib/cfpropertylist/rbPlainCFPropertyList.rb +++ /dev/null @@ -1,199 +0,0 @@ -# -*- 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 deleted file mode 100644 index b04a8c8..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -/.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 deleted file mode 100644 index 34c5164..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rspec +++ /dev/null @@ -1,3 +0,0 @@ ---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 deleted file mode 100644 index 3ffe2b0..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rubocop.yml +++ /dev/null @@ -1,2 +0,0 @@ -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 deleted file mode 100644 index 826a7a2..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.rubocop_todo.yml +++ /dev/null @@ -1,32 +0,0 @@ -# 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 deleted file mode 100644 index 6a8e36f..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 3399e24..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +0,0 @@ -# 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 deleted file mode 100644 index 2d1d7e6..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Gemfile +++ /dev/null @@ -1,8 +0,0 @@ -# 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 deleted file mode 100644 index edfb2e5..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Gemfile.lock +++ /dev/null @@ -1,51 +0,0 @@ -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 deleted file mode 100644 index 7a54c62..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index de832a5..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# 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 deleted file mode 100644 index 8ce173e..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/Rakefile +++ /dev/null @@ -1,11 +0,0 @@ -# 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 deleted file mode 100644 index b1e80bb..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/VERSION +++ /dev/null @@ -1 +0,0 @@ -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 deleted file mode 100644 index 7ad4922..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/atomos.gemspec +++ /dev/null @@ -1,26 +0,0 @@ -# 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 deleted file mode 100644 index 535613d..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/console +++ /dev/null @@ -1,15 +0,0 @@ -#!/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 deleted file mode 100644 index 8226b57..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rake +++ /dev/null @@ -1,29 +0,0 @@ -#!/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 deleted file mode 100644 index d086973..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rspec +++ /dev/null @@ -1,29 +0,0 @@ -#!/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 deleted file mode 100644 index 8424d87..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/rubocop +++ /dev/null @@ -1,29 +0,0 @@ -#!/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 deleted file mode 100644 index dce67d8..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/bin/setup +++ /dev/null @@ -1,8 +0,0 @@ -#!/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 deleted file mode 100644 index 4b56d05..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/lib/atomos.rb +++ /dev/null @@ -1,47 +0,0 @@ -# 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 deleted file mode 100644 index f52f703..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/atomos-0.1.3/lib/atomos/version.rb +++ /dev/null @@ -1,5 +0,0 @@ -# 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 deleted file mode 100644 index 66d9359..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/BSDL +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index 48e5a96..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/COPYING +++ /dev/null @@ -1,56 +0,0 @@ -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 deleted file mode 100644 index f2d8014..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/LEGAL +++ /dev/null @@ -1,60 +0,0 @@ -# -*- 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 deleted file mode 100644 index a29c58e..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# 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 deleted file mode 100644 index 8c0145d..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/lib/base64.rb +++ /dev/null @@ -1,381 +0,0 @@ -# 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 deleted file mode 100644 index 147e874..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/base64-0.3.0/sig/base64.rbs +++ /dev/null @@ -1,355 +0,0 @@ -# -# 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 deleted file mode 100644 index 54e1f05..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.github/workflows/ci.yml +++ /dev/null @@ -1,45 +0,0 @@ -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 deleted file mode 100644 index 001d28f..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -*.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 deleted file mode 100644 index 0686cce..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.kick +++ /dev/null @@ -1,30 +0,0 @@ -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 deleted file mode 100644 index 3ef9f69..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop.yml +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100644 index 4702a3e..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop_cocoapods.yml +++ /dev/null @@ -1,151 +0,0 @@ -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 deleted file mode 100644 index 926b32c..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.rubocop_todo.yml +++ /dev/null @@ -1,70 +0,0 @@ -# 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 deleted file mode 100644 index a647564..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/.yardopts +++ /dev/null @@ -1 +0,0 @@ ---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 deleted file mode 100644 index c33e9bc..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/Gemfile +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index 22fe1a9..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/Gemfile.lock +++ /dev/null @@ -1,79 +0,0 @@ -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 deleted file mode 100644 index 7c1df53..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index f4ed63d..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/README.md +++ /dev/null @@ -1,115 +0,0 @@ -# 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 deleted file mode 100644 index dc22070..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/Rakefile +++ /dev/null @@ -1,57 +0,0 @@ -# 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 deleted file mode 100644 index 1f298d3..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/claide.gemspec +++ /dev/null @@ -1,23 +0,0 @@ -# -*- 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 deleted file mode 100644 index 25d2c75..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide.rb +++ /dev/null @@ -1,13 +0,0 @@ -# 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 deleted file mode 100644 index 0839ed6..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi.rb +++ /dev/null @@ -1,126 +0,0 @@ -# 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 deleted file mode 100644 index acfd5b6..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi/cursor.rb +++ /dev/null @@ -1,69 +0,0 @@ -# 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 deleted file mode 100644 index e5c2d15..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi/graphics.rb +++ /dev/null @@ -1,72 +0,0 @@ -# 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 deleted file mode 100644 index b6f461c..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/ansi/string_escaper.rb +++ /dev/null @@ -1,79 +0,0 @@ -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 deleted file mode 100644 index 4d54f29..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/argument.rb +++ /dev/null @@ -1,62 +0,0 @@ -# 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 deleted file mode 100644 index ecadfaf..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/argv.rb +++ /dev/null @@ -1,329 +0,0 @@ -# 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 deleted file mode 100644 index 6414b5c..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command.rb +++ /dev/null @@ -1,669 +0,0 @@ -# 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 deleted file mode 100644 index a13575c..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command/argument_suggester.rb +++ /dev/null @@ -1,99 +0,0 @@ -# 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 deleted file mode 100644 index d87c699..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command/banner.rb +++ /dev/null @@ -1,307 +0,0 @@ -# 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 deleted file mode 100644 index 184a5ea..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/command/plugin_manager.rb +++ /dev/null @@ -1,124 +0,0 @@ -# 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 deleted file mode 100644 index cdb020c..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/gem_version.rb +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index 7d3b183..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/help.rb +++ /dev/null @@ -1,58 +0,0 @@ -# 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 deleted file mode 100644 index 8a92bd0..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/claide-1.1.0/lib/claide/informative_error.rb +++ /dev/null @@ -1,21 +0,0 @@ -# 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 deleted file mode 100644 index e543acb..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -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 deleted file mode 100644 index f2da87b..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/README.md +++ /dev/null @@ -1,93 +0,0 @@ -[![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 deleted file mode 100644 index 47ca61b..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/Rakefile +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index c4305dd..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2.rb +++ /dev/null @@ -1,85 +0,0 @@ -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 deleted file mode 100644 index c491e61..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/ascii_decorator.rb +++ /dev/null @@ -1,86 +0,0 @@ -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 deleted file mode 100644 index 8f46f43..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/codes.rb +++ /dev/null @@ -1,63 +0,0 @@ -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 deleted file mode 100644 index 64161b0..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/numbers.rb +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 439b0f9..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/object.rb +++ /dev/null @@ -1,2 +0,0 @@ -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 deleted file mode 100644 index 8e099e8..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/strings.rb +++ /dev/null @@ -1,2 +0,0 @@ -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 deleted file mode 100644 index ab0f8a7..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/lib/colored2/version.rb +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100644 index f686bfa..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2/numbers_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -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 deleted file mode 100644 index 6256254..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2/object_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -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 deleted file mode 100644 index 10da2a4..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2/strings_spec.rb +++ /dev/null @@ -1,77 +0,0 @@ -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 deleted file mode 100644 index 3b55f07..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/colored2_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -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 deleted file mode 100644 index 3f2faa0..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/colored2-3.1.2/spec/spec_helper.rb +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 738566a..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.github/dependabot.yml +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 73f7df2..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.github/workflows/test.yml +++ /dev/null @@ -1,43 +0,0 @@ -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 deleted file mode 100644 index 9106b2a..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -/.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 deleted file mode 100644 index 8c18f1a..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.rspec +++ /dev/null @@ -1,2 +0,0 @@ ---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 deleted file mode 100644 index f95e119..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.rubocop.yml +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 23fdf89..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/.rubocop_todo.yml +++ /dev/null @@ -1,173 +0,0 @@ -# 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 deleted file mode 100644 index ced55a5..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,49 +0,0 @@ -# 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 deleted file mode 100644 index c1db5fa..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/Gemfile +++ /dev/null @@ -1,17 +0,0 @@ -# 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 deleted file mode 100644 index b255f0e..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/Gemfile.lock +++ /dev/null @@ -1,62 +0,0 @@ -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 deleted file mode 100644 index 1617264..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index f7787ce..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# 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 deleted file mode 100644 index 3c942d9..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/Rakefile +++ /dev/null @@ -1,80 +0,0 @@ -# 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 deleted file mode 100644 index e66267b..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/bin/console +++ /dev/null @@ -1,15 +0,0 @@ -#!/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 deleted file mode 100644 index dce67d8..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/bin/setup +++ /dev/null @@ -1,8 +0,0 @@ -#!/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 deleted file mode 100644 index 03f61a9..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo.rb +++ /dev/null @@ -1,22 +0,0 @@ -# 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 deleted file mode 100644 index 72a299e..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/object.rb +++ /dev/null @@ -1,102 +0,0 @@ -# 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 deleted file mode 100644 index fe465c4..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/plist.rb +++ /dev/null @@ -1,35 +0,0 @@ -# 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 deleted file mode 100644 index 076be6a..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/reader.rb +++ /dev/null @@ -1,287 +0,0 @@ -# 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 deleted file mode 100644 index b10865f..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/unicode.rb +++ /dev/null @@ -1,89 +0,0 @@ -# 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 deleted file mode 100644 index a286a92..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/unicode/next_step_mapping.rb +++ /dev/null @@ -1,136 +0,0 @@ -# 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 deleted file mode 100644 index b051232..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/unicode/quote_maps.rb +++ /dev/null @@ -1,57 +0,0 @@ -# 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 deleted file mode 100644 index f3e778c..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/version.rb +++ /dev/null @@ -1,5 +0,0 @@ -# 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 deleted file mode 100644 index 256e8ed..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/writer.rb +++ /dev/null @@ -1,206 +0,0 @@ -# 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 deleted file mode 100644 index 6f91963..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/writer/pbxproj.rb +++ /dev/null @@ -1,83 +0,0 @@ -# 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 deleted file mode 100644 index 869fe61..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/lib/nanaimo/writer/xml.rb +++ /dev/null @@ -1,139 +0,0 @@ -# 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 deleted file mode 100644 index 7cf888f..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nanaimo-0.4.0/nanaimo.gemspec +++ /dev/null @@ -1,28 +0,0 @@ -# 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 deleted file mode 100644 index 9434cab..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.git-blame-ignore-revs +++ /dev/null @@ -1,7 +0,0 @@ -# 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 deleted file mode 100644 index b18fd29..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.github/dependabot.yml +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100644 index 819a886..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.github/workflows/test.yml +++ /dev/null @@ -1,29 +0,0 @@ -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 deleted file mode 100644 index fdd6ba5..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -/.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 deleted file mode 100644 index ea0b59d..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/Gemfile +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index a009cae..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index 6b65862..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# 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 deleted file mode 100644 index 042b220..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/Rakefile +++ /dev/null @@ -1,24 +0,0 @@ -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 deleted file mode 100644 index e6c456e..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/bin/console +++ /dev/null @@ -1,14 +0,0 @@ -#!/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 deleted file mode 100644 index dce67d8..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/bin/setup +++ /dev/null @@ -1,8 +0,0 @@ -#!/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 deleted file mode 100644 index 16ac1a9..0000000 --- a/ios/vendor/bundle/ruby/2.6.0/gems/nkf-0.2.0/ext/java/org/jruby/ext/nkf/Command.java +++ /dev/null @@ -1,58 +0,0 @@ -/***** 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