diff --git a/App.js b/App.js index 09c1f15..42d6efa 100644 --- a/App.js +++ b/App.js @@ -3,8 +3,6 @@ * https://github.com/facebook/react-native * * @format - * @flow - * @lint-ignore-every XPLATJSCOPYRIGHT1 */ import React, {Component} from 'react'; @@ -14,7 +12,7 @@ type Props = {}; export default class App extends Component { render() { return ( - + ); } -} +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ee121c..59e050a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,20 @@ ### +## [0.5.0] - 2024-05-09 + +- Android: + + 升级SDK到2.21.2 + +- iOS: + + 升级SDK到2.21.1 + +- RN: + + RN 版本升级至0.71.8 + ## [0.4.5] - 2021-04-23 - android: diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..1142b1b --- /dev/null +++ b/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' + +# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version +ruby '>= 2.6.10' + +gem 'cocoapods', '>= 1.11.3' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..d2d61b3 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,104 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.7) + base64 + nkf + rexml + activesupport (6.1.7.7) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) + addressable (2.8.6) + public_suffix (>= 2.0.2, < 6.0) + algoliasearch (1.27.5) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) + atomos (0.1.3) + base64 (0.2.0) + claide (1.1.0) + cocoapods (1.15.2) + addressable (~> 2.8) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.15.2) + cocoapods-deintegrate (>= 1.0.3, < 2.0) + cocoapods-downloader (>= 2.1, < 3.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.6.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (>= 2.3.0, < 3.0) + gh_inspector (~> 1.0) + molinillo (~> 0.8.0) + nap (~> 1.0) + ruby-macho (>= 2.3.0, < 3.0) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-core (1.15.2) + activesupport (>= 5.0, < 8) + addressable (~> 2.8) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + netrc (~> 0.11) + public_suffix (~> 4.0) + typhoeus (~> 1.0) + cocoapods-deintegrate (1.0.5) + cocoapods-downloader (2.1) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.1) + cocoapods-trunk (1.6.0) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.2.0) + colored2 (3.1.2) + concurrent-ruby (1.2.3) + escape (0.0.4) + ethon (0.16.0) + ffi (>= 1.15.0) + ffi (1.16.3) + fourflusher (2.3.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + httpclient (2.8.3) + i18n (1.14.4) + concurrent-ruby (~> 1.0) + json (2.7.2) + minitest (5.22.3) + molinillo (0.8.0) + nanaimo (0.3.0) + nap (1.1.0) + netrc (0.11.0) + nkf (0.2.0) + public_suffix (4.0.7) + rexml (3.2.6) + ruby-macho (2.5.1) + typhoeus (1.4.1) + ethon (>= 0.9.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + xcodeproj (1.24.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + rexml (~> 3.2.4) + zeitwerk (2.6.13) + +PLATFORMS + ruby + +DEPENDENCIES + cocoapods (>= 1.11.3) + +RUBY VERSION + ruby 2.6.10p210 + +BUNDLED WITH + 1.17.2 diff --git a/README.md b/README.md index f6d5460..6b2d2c5 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ PolyvRNVodDemo 支持 Android + iOS, 是专为 ReactNative 技术开发者定 ### 1.1 支持设备 -Android 4.1.0 (API 16) 以上 或 iOS 9.0 以上 +Android 4.1.0 (API 16) 以上 或 iOS 11.0 以上 ### 1.2 接入条件 @@ -19,8 +19,8 @@ Android 4.1.0 (API 16) 以上 或 iOS 9.0 以上 RN 版本是基于原生 demo + sdk 开发的,iOS 与 android 对应版本,及 SDK 版本更新日志链接如下: -- iOS SDK 对应版本为 v2.13.1,[版本更新日志](https://github.com/polyv/polyv-ios-vod-sdk/releases) -- android SDK 对应版本为 v2.13.1,[版本更新日志](https://github.com/easefun/polyv-android-sdk-2.0-demo/releases) +- iOS SDK 对应版本为 v2.21.1,[版本更新日志](https://github.com/polyv/polyv-ios-vod-sdk/releases) +- Android SDK 对应版本为 v2.21.2,[版本更新日志](https://github.com/easefun/polyv-android-sdk-2.0-demo/releases) ## 2. 快速开始 @@ -99,28 +99,37 @@ npm install 2. 在 package.json 文件中配置依赖。 ```json -"dependencies": { - "react": "16.6.3", - "react-native": "^0.58.6", - - //polyv/demo里需要的依赖(如不需要可删除) + "dependencies": { + "@react-navigation/material-top-tabs": "^6.6.13", + "@react-navigation/native": "^6.1.17", + "@react-navigation/stack": "^6.3.29", "axios": "^0.18.0", - "bower": "^1.8.8", - "jest-haste-map": "^24.5.0", - "loadash": "^1.0.0", - "native-base": "^2.12.1", - "react-art": "^16.8.4", - "react-dom": "^16.8.4", - "react-native-gesture-handler": "^1.1.0", - "react-native-web": "^0.10.1", - "react-navigation": "^3.3.2" + "native-base": "^3.4.12", + "react": "18.2.0", + "react-native": "0.71.8", + "react-native-gesture-handler": "^2.16.0", + "react-native-pager-view": "^6.3.0", + "react-native-safe-area-context": "^4.9.0", + "react-native-screens": "^3.30.1", + "react-native-svg": "^14.1.0", + "react-native-tab-view": "^3.5.2" }, "devDependencies": { - "babel-core": "^7.0.0-bridge.0", - "babel-jest": "24.3.1", - "jest": "24.3.1", - "metro-react-native-babel-preset": "0.53.0", - "react-test-renderer": "16.6.3" + "@babel/core": "^7.20.0", + "@babel/preset-env": "^7.20.0", + "@babel/runtime": "^7.20.0", + "@react-native-community/eslint-config": "^3.2.0", + "@tsconfig/react-native": "^2.0.2", + "@types/jest": "^29.2.1", + "@types/react": "^18.0.24", + "@types/react-test-renderer": "^18.0.0", + "babel-jest": "^29.2.1", + "eslint": "^8.19.0", + "jest": "^29.2.1", + "metro-react-native-babel-preset": "0.73.9", + "prettier": "^2.4.1", + "react-test-renderer": "18.2.0", + "typescript": "4.8.4" }, ``` @@ -131,7 +140,7 @@ npm install 0.4.0起建议使用初始化方法`setToken`,该方法是一个异步有返回结果的函数。推荐使用 https 接口,从服务端获取加密串,APP 本地解密(开发者设计自己的加解密方式)得到 `useId`、`readtoken`、`writetoken`、`secretkey` ,再使用该方法配置用户信息。 -低于0.4.0的可以继续使用`init`方法初始化,他也是异步有返回结果的函数。 +低于0.4.0的可以使用`init`方法初始化,他也是异步有返回结果的函数。 ```javascript /* @@ -431,36 +440,23 @@ iOS 端工程的原生插件代码全部包含在 ios/PolyvVodRnModule文件夹 2)如果目标项目原来有Podfile 文件,只需要把 Polyv vod rn sdk 所需要的配置拷贝到 ios/Podfile文件 中; - 3)如果存在 RNGestureHandler 的配置行,需要删除或者注释掉; - - 4)在命令行环境进入ios 目录,执行 pod install 命令; + 3)在命令行环境进入ios 目录,添加点播SDK,执行 pod install 命令; ```java - project 'PolyvVodRnDemo.xcodeproj' - - platform :ios, '8.0' - inhibit_all_warnings! - - target 'PolyvVodRnDemo' do - - # Polyv vod rn sdk + # Polyv vod rn sdk pod 'XRCarouselView', '~> 2.6.1' pod 'YYWebImage', '~> 1.0.5' pod 'FDStackView', '~> 1.0.1' pod 'PLVMasonry', '~> 1.1.2' - pod 'PolyvVodSDK', '2.13.1' - pod 'LBLelinkKit', '~> 30226' - pod 'PLVVodDanmu', '~> 0.0.1' - pod 'PLVSubtitle', '~> 0.1.0' - # 执行 npm install命令之后,有可能会自动生成下面这一行配置。需要把这一行配置删掉或者注释掉; - # pod 'RNGestureHandler', :path => '../node_modules/react-native-gesture-handler' + # Polyv vod rn sdk 2.13.1 + # pod 'PolyvVodSDK', '2.13.1' + + # Polyv vod rn sdk 2.21.1 + pod 'PLVAliHttpDNS', '~> 1.10.0' + pod 'SSZipArchive', '~> 2.1.5' + pod 'PolyvVodSDK', '2.21.1', :subspecs => ['Core','Player'] - end + pod 'PLVVodDanmu', '~> 0.0.1' + pod 'PLVSubtitle', '~> 0.1.0' ``` - -4. 集成react-native-gesture-handler插件(如果RN端没有集成react-native-gesture-handler,可跳过本步骤) - - 1)把Demo项目的 ios/PolyvVodRnDemo/react-native-gesture-handler文件夹 拷贝到 目标项目的 ios 目录下; - - 2)在XCode中,把上述文件夹增加(Add Files)到项目中; diff --git a/__tests__/App.js b/__tests__/App-test.tsx similarity index 86% rename from __tests__/App.js rename to __tests__/App-test.tsx index a79ec3d..1784766 100644 --- a/__tests__/App.js +++ b/__tests__/App-test.tsx @@ -1,6 +1,5 @@ /** * @format - * @lint-ignore-every XPLATJSCOPYRIGHT1 */ import 'react-native'; diff --git a/android/.gitignore b/android/.gitignore deleted file mode 100644 index cd8c944..0000000 --- a/android/.gitignore +++ /dev/null @@ -1,59 +0,0 @@ -# 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 - -# Android/IntelliJ -# -build/ -.idea -.gradle -local.properties -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -# BUCK -buck-out/ -\.buckd/ -*.keystore - -# fastlane -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/ - -*/fastlane/report.xml -*/fastlane/Preview.html -*/fastlane/screenshots - -# Bundle artifact -*.jsbundle - -ios/Pods/ -IDEWorkspaceChecks.plist diff --git a/android/.project b/android/.project deleted file mode 100644 index cf8ddf2..0000000 --- a/android/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - PolyvVodRnDemo - Project android created by Buildship. - - - - - org.eclipse.buildship.core.gradleprojectbuilder - - - - - - org.eclipse.buildship.core.gradleprojectnature - - diff --git a/android/.settings/org.eclipse.buildship.core.prefs b/android/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index e889521..0000000 --- a/android/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -connection.project.dir= -eclipse.preferences.version=1 diff --git a/android/app/.classpath b/android/app/.classpath deleted file mode 100644 index eb19361..0000000 --- a/android/app/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/android/app/.project b/android/app/.project deleted file mode 100644 index ac485d7..0000000 --- a/android/app/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - app - Project app created by Buildship. - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.buildship.core.gradleprojectbuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.buildship.core.gradleprojectnature - - diff --git a/android/app/.settings/org.eclipse.buildship.core.prefs b/android/app/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index b1886ad..0000000 --- a/android/app/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -connection.project.dir=.. -eclipse.preferences.version=1 diff --git a/android/app/BUCK b/android/app/BUCK deleted file mode 100644 index c5cb484..0000000 --- a/android/app/BUCK +++ /dev/null @@ -1,55 +0,0 @@ -# To learn about Buck see [Docs](https://buckbuild.com/). -# To run your application with Buck: -# - install Buck -# - `npm start` - to start the packager -# - `cd android` -# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` -# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck -# - `buck install -r android/app` - compile, install and run application -# - -load(":build_defs.bzl", "create_aar_targets", "create_jar_targets") - -lib_deps = [] - -create_aar_targets(glob(["libs/*.aar"])) - -create_jar_targets(glob(["libs/*.jar"])) - -android_library( - name = "all-libs", - exported_deps = lib_deps, -) - -android_library( - name = "app-code", - srcs = glob([ - "src/main/java/**/*.java", - ]), - deps = [ - ":all-libs", - ":build_config", - ":res", - ], -) - -android_build_config( - name = "build_config", - package = "com.easefun.polyvsdk.rn", -) - -android_resource( - name = "res", - package = "com.easefun.polyvsdk.rn", - res = "src/main/res", -) - -android_binary( - name = "app", - keystore = "//android/keystores:debug", - manifest = "src/main/AndroidManifest.xml", - package_type = "debug", - deps = [ - ":app-code", - ], -) diff --git a/android/app/build.gradle b/android/app/build.gradle index 139c24d..d0fa20b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,181 +1,172 @@ apply plugin: "com.android.application" +apply plugin: "com.facebook.react" import com.android.build.OutputFile /** - * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets - * and bundleReleaseJsAndAssets). - * These basically call `react-native bundle` with the correct arguments during the Android build - * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the - * bundle directly from the development server. Below you can see all the possible configurations - * and their defaults. If you decide to add a configuration block, make sure to add it before the - * `apply from: "../../node_modules/react-native/react.gradle"` line. - * - * project.ext.react = [ - * // the name of the generated asset file containing your JS bundle - * bundleAssetName: "index.android.bundle", - * - * // the entry file for bundle generation - * entryFile: "index.android.js", - * - * // whether to bundle JS and assets in debug mode - * bundleInDebug: false, - * - * // whether to bundle JS and assets in release mode - * bundleInRelease: true, - * - * // whether to bundle JS and assets in another build variant (if configured). - * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants - * // The configuration property can be in the following formats - * // 'bundleIn${productFlavor}${buildType}' - * // 'bundleIn${buildType}' - * // bundleInFreeDebug: true, - * // bundleInPaidRelease: true, - * // bundleInBeta: true, - * - * // whether to disable dev mode in custom build variants (by default only disabled in release) - * // for example: to disable dev mode in the staging build type (if configured) - * devDisabledInStaging: true, - * // The configuration property can be in the following formats - * // 'devDisabledIn${productFlavor}${buildType}' - * // 'devDisabledIn${buildType}' - * - * // the root of your project, i.e. where "package.json" lives - * root: "../../", - * - * // where to put the JS bundle asset in debug mode - * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", - * - * // where to put the JS bundle asset in release mode - * jsBundleDirRelease: "$buildDir/intermediates/assets/release", - * - * // where to put drawable resources / React Native assets, e.g. the ones you use via - * // require('./image.png')), in debug mode - * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", - * - * // where to put drawable resources / React Native assets, e.g. the ones you use via - * // require('./image.png')), in release mode - * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", - * - * // by default the gradle tasks are skipped if none of the JS files or assets change; this means - * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to - * // date; if you have any other folders that you want to ignore for performance reasons (gradle - * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ - * // for example, you might want to remove it from here. - * inputExcludes: ["android/**", "ios/**"], - * - * // override which node gets called and with what additional arguments - * nodeExecutableAndArgs: ["node"], - * - * // supply additional arguments to the packager - * extraPackagerArgs: [] - * ] + * 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. */ - -project.ext.react = [ - entryFile: "index.js" -] - -apply from: "../../node_modules/react-native/react.gradle" +react { + /* 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") + // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js + // cliFile = file("../node_modules/react-native/cli.js") + + /* 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 command to run when bundling. By default is 'bundle' + // bundleCommand = "ram-bundle" + // + // 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"] +} /** - * Set this to true to create two separate APKs instead of one: - * - An APK that only works on ARM devices - * - An APK that only works on x86 devices - * The advantage is the size of the APK is reduced by about 4MB. - * Upload all the APKs to the Play Store and people will download - * the correct one based on the CPU architecture of their device. + * Set this to true to create four separate APKs instead of one, + * one for each native architecture. This is useful if you don't + * use App Bundles (https://developer.android.com/guide/app-bundle/) + * and want to have separate APKs to upload to the Play Store. */ def enableSeparateBuildPerCPUArchitecture = false /** - * Run Proguard to shrink the Java bytecode in release builds. + * Set this to true to Run Proguard on Release builds to minify the Java bytecode. */ def enableProguardInReleaseBuilds = false +/** + * 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:+' + +/** + * Private function to get the list of Native Architectures you want to build. + * This reads the value from reactNativeArchitectures in your gradle.properties + * file and works together with the --active-arch-only flag of react-native run-android. + */ +def reactNativeArchitectures() { + def value = project.getProperties().get("reactNativeArchitectures") + return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] +} + android { + ndkVersion rootProject.ext.ndkVersion + compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion + namespace "com.polyvrnvoddemo" defaultConfig { - applicationId "com.easefun.polyvsdk.rn" + applicationId "com.polyvrnvoddemo" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 20 - versionName "0.2.1" - - //64K 引用限制 - multiDexEnabled true - - //依赖的包可能支持很多类型的ABI - //为了避免打包了我们没有支持的ABI,指定需要打包的ABI目录 - ndk { - abiFilters 'arm64-v8a', 'armeabi-v7a', 'armeabi', 'x86_64', 'x86' - } + versionCode 1 + versionName "1.0" } - signingConfigs { - release { - storeFile file(MYAPP_RELEASE_STORE_FILE) - storePassword MYAPP_RELEASE_STORE_PASSWORD - keyAlias MYAPP_RELEASE_KEY_ALIAS - keyPassword MYAPP_RELEASE_KEY_PASSWORD - } - } splits { abi { reset() enable enableSeparateBuildPerCPUArchitecture universalApk false // If true, also generate a universal APK - include "armeabi-v7a", "x86", "arm64-v8a" + include (*reactNativeArchitectures()) + } + } + 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 minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - signingConfig signingConfigs.release - } - } - repositories { - flatDir { - dirs 'libs' } } - // applicationVariants are e.g. debug, release applicationVariants.all { variant -> variant.outputs.each { output -> // For each separate APK per architecture, set a unique version code as described here: - // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits - def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3] + // https://developer.android.com/studio/build/configure-apk-splits.html + // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc. + def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = - versionCodes.get(abi) * 1048576 + defaultConfig.versionCode + defaultConfig.versionCode * 1000 + versionCodes.get(abi) } + } } } dependencies { + // The version of react-native is set by the React Native Gradle Plugin + implementation("com.facebook.react:react-android") - implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation ("com.facebook.react:react-native:+"){ - exclude group:'com.android.support',module:'appcompat-v7' - } - - implementation 'com.android.support:multidex:1.0.1'//64K 引用限制 + implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0") implementation project(path: ':polyvsdk') //polyvsdk模块的依赖配置 - implementation project(':react-native-gesture-handler') //react-native-gesture-handler模块的依赖配置 -} + debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") + debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { + exclude group:'com.squareup.okhttp3', module:'okhttp' + } -// Run this once to be able to run the application with BUCK -// puts all compile dependencies into folder libs for BUCK to use -task copyDownloadableDepsToLibs(type: Copy) { - from configurations.compile - into 'libs' + debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") + if (hermesEnabled.toBoolean()) { + implementation("com.facebook.react:hermes-android") + } else { + implementation jscFlavor + } } + +apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) diff --git a/android/app/build_defs.bzl b/android/app/build_defs.bzl deleted file mode 100644 index fff270f..0000000 --- a/android/app/build_defs.bzl +++ /dev/null @@ -1,19 +0,0 @@ -"""Helper definitions to glob .aar and .jar targets""" - -def create_aar_targets(aarfiles): - for aarfile in aarfiles: - name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")] - lib_deps.append(":" + name) - android_prebuilt_aar( - name = name, - aar = aarfile, - ) - -def create_jar_targets(jarfiles): - for jarfile in jarfiles: - name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")] - lib_deps.append(":" + name) - prebuilt_jar( - name = name, - binary_jar = jarfile, - ) diff --git a/android/app/polyv_rn.jks b/android/app/polyv_rn.jks deleted file mode 100644 index 45a107d..0000000 Binary files a/android/app/polyv_rn.jks and /dev/null differ diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index a92fa17..11b0257 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -8,10 +8,3 @@ # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..4b185bc --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/android/app/src/debug/java/com/polyvrnvoddemo/ReactNativeFlipper.java b/android/app/src/debug/java/com/polyvrnvoddemo/ReactNativeFlipper.java new file mode 100644 index 0000000..484a728 --- /dev/null +++ b/android/app/src/debug/java/com/polyvrnvoddemo/ReactNativeFlipper.java @@ -0,0 +1,75 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + *

This source code is licensed under the MIT license found in the LICENSE file in the root + * directory of this source tree. + */ +package com.polyvrnvoddemo; + +import android.content.Context; +import com.facebook.flipper.android.AndroidFlipperClient; +import com.facebook.flipper.android.utils.FlipperUtils; +import com.facebook.flipper.core.FlipperClient; +import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; +import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; +import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; +import com.facebook.flipper.plugins.inspector.DescriptorMapping; +import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; +import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; +import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; +import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; +import com.facebook.react.ReactInstanceEventListener; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.bridge.ReactContext; +import com.facebook.react.modules.network.NetworkingModule; +import okhttp3.OkHttpClient; + +/** + * Class responsible of loading Flipper inside your React Native application. This is the debug + * flavor of it. Here you can add your own plugins and customize the Flipper setup. + */ +public class ReactNativeFlipper { + public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { + if (FlipperUtils.shouldEnableFlipper(context)) { + final FlipperClient client = AndroidFlipperClient.getInstance(context); + + client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); + client.addPlugin(new DatabasesFlipperPlugin(context)); + client.addPlugin(new SharedPreferencesFlipperPlugin(context)); + client.addPlugin(CrashReporterPlugin.getInstance()); + + NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); + NetworkingModule.setCustomClientBuilder( + new NetworkingModule.CustomClientBuilder() { + @Override + public void apply(OkHttpClient.Builder builder) { + builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); + } + }); + client.addPlugin(networkFlipperPlugin); + client.start(); + + // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized + // Hence we run if after all native modules have been initialized + ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); + if (reactContext == null) { + reactInstanceManager.addReactInstanceEventListener( + new ReactInstanceEventListener() { + @Override + public void onReactContextInitialized(ReactContext reactContext) { + reactInstanceManager.removeReactInstanceEventListener(this); + reactContext.runOnNativeModulesQueueThread( + new Runnable() { + @Override + public void run() { + client.addPlugin(new FrescoFlipperPlugin()); + } + }); + } + }); + } else { + client.addPlugin(new FrescoFlipperPlugin()); + } + } + } +} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b3bcb82..b4e0664 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ - + package="com.polyvrnvoddemo"> @@ -14,25 +13,23 @@ + - - - - - - - - + android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" + android:launchMode="singleTask" + android:windowSoftInputMode="adjustResize" + android:exported="true"> + + + + + - - \ No newline at end of file + diff --git a/android/app/src/main/assets/fonts/AntDesign.ttf b/android/app/src/main/assets/fonts/AntDesign.ttf deleted file mode 100644 index 2abf035..0000000 Binary files a/android/app/src/main/assets/fonts/AntDesign.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Entypo.ttf b/android/app/src/main/assets/fonts/Entypo.ttf deleted file mode 100644 index 1c8f5e9..0000000 Binary files a/android/app/src/main/assets/fonts/Entypo.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/EvilIcons.ttf b/android/app/src/main/assets/fonts/EvilIcons.ttf deleted file mode 100644 index b270f98..0000000 Binary files a/android/app/src/main/assets/fonts/EvilIcons.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Feather.ttf b/android/app/src/main/assets/fonts/Feather.ttf deleted file mode 100644 index 244854c..0000000 Binary files a/android/app/src/main/assets/fonts/Feather.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/FontAwesome.ttf b/android/app/src/main/assets/fonts/FontAwesome.ttf deleted file mode 100644 index 35acda2..0000000 Binary files a/android/app/src/main/assets/fonts/FontAwesome.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/FontAwesome5_Brands.ttf b/android/app/src/main/assets/fonts/FontAwesome5_Brands.ttf deleted file mode 100644 index 953d567..0000000 Binary files a/android/app/src/main/assets/fonts/FontAwesome5_Brands.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/FontAwesome5_Regular.ttf b/android/app/src/main/assets/fonts/FontAwesome5_Regular.ttf deleted file mode 100644 index 235101c..0000000 Binary files a/android/app/src/main/assets/fonts/FontAwesome5_Regular.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/FontAwesome5_Solid.ttf b/android/app/src/main/assets/fonts/FontAwesome5_Solid.ttf deleted file mode 100644 index 7c92e98..0000000 Binary files a/android/app/src/main/assets/fonts/FontAwesome5_Solid.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Foundation.ttf b/android/app/src/main/assets/fonts/Foundation.ttf deleted file mode 100644 index 6cce217..0000000 Binary files a/android/app/src/main/assets/fonts/Foundation.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Ionicons.ttf b/android/app/src/main/assets/fonts/Ionicons.ttf deleted file mode 100644 index 307ad88..0000000 Binary files a/android/app/src/main/assets/fonts/Ionicons.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf b/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf deleted file mode 100644 index 82524a0..0000000 Binary files a/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/MaterialIcons.ttf b/android/app/src/main/assets/fonts/MaterialIcons.ttf deleted file mode 100644 index 7015564..0000000 Binary files a/android/app/src/main/assets/fonts/MaterialIcons.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Octicons.ttf b/android/app/src/main/assets/fonts/Octicons.ttf deleted file mode 100644 index 09f5a96..0000000 Binary files a/android/app/src/main/assets/fonts/Octicons.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Roboto.ttf b/android/app/src/main/assets/fonts/Roboto.ttf deleted file mode 100644 index 3e6e2e7..0000000 Binary files a/android/app/src/main/assets/fonts/Roboto.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Roboto_medium.ttf b/android/app/src/main/assets/fonts/Roboto_medium.ttf deleted file mode 100644 index aa00de0..0000000 Binary files a/android/app/src/main/assets/fonts/Roboto_medium.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/SimpleLineIcons.ttf b/android/app/src/main/assets/fonts/SimpleLineIcons.ttf deleted file mode 100644 index 6ecb686..0000000 Binary files a/android/app/src/main/assets/fonts/SimpleLineIcons.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Zocial.ttf b/android/app/src/main/assets/fonts/Zocial.ttf deleted file mode 100644 index e4ae46c..0000000 Binary files a/android/app/src/main/assets/fonts/Zocial.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/rubicon-icon-font.ttf b/android/app/src/main/assets/fonts/rubicon-icon-font.ttf deleted file mode 100644 index 25e7d92..0000000 Binary files a/android/app/src/main/assets/fonts/rubicon-icon-font.ttf and /dev/null differ diff --git a/android/app/src/main/assets/index.android.bundle b/android/app/src/main/assets/index.android.bundle deleted file mode 100644 index d59adc0..0000000 --- a/android/app/src/main/assets/index.android.bundle +++ /dev/null @@ -1,747 +0,0 @@ -var __DEV__=false,__BUNDLE_START_TIME__=this.nativePerformanceNow?nativePerformanceNow():Date.now(),process=this.process||{};process.env=process.env||{};process.env.NODE_ENV="production"; -!(function(r){"use strict";r.__r=o,r.__d=function(r,i,n){if(null!=e[i])return;e[i]={dependencyMap:n,factory:r,hasError:!1,importedAll:t,importedDefault:t,isInitialized:!1,publicModule:{exports:{}}}},r.__c=n;var e=n(),t={},i={}.hasOwnProperty;function n(){return e="number"==typeof __NUM_MODULES__?Array(0|__NUM_MODULES__):Object.create(null)}function o(r){var t=r,i=e[t];return i&&i.isInitialized?i.publicModule.exports:d(t,i)}function l(r){var i=r;if(e[i]&&e[i].importedDefault!==t)return e[i].importedDefault;var n=o(i),l=n&&n.__esModule?n.default:n;return e[i].importedDefault=l}function u(r){var n=r;if(e[n]&&e[n].importedAll!==t)return e[n].importedAll;var l,u=o(n);if(u&&u.__esModule)l=u;else{if(l={},u)for(var a in u)i.call(u,a)&&(l[a]=u[a]);l.default=u}return e[n].importedAll=l}o.importDefault=l,o.importAll=u;var a=!1;function d(e,t){if(!a&&r.ErrorUtils){var i;a=!0;try{i=_(e,t)}catch(e){r.ErrorUtils.reportFatalError(e)}return a=!1,i}return _(e,t)}var f=16,c=65535;function p(r){return{segmentId:r>>>f,localId:r&c}}o.unpackModuleId=p,o.packModuleId=function(r){return(r.segmentId<0)for(var M=0;M=0||f.indexOf('description')>=0))return o(e);if(0===f.length){if(h(e)){var s=e.name?': '+e.name:'';return n.stylize('[Function'+s+']','special')}if(g(e))return n.stylize(RegExp.prototype.toString.call(e),'regexp');if(y(e))return n.stylize(Date.prototype.toString.call(e),'date');if(v(e))return o(e)}var d,b,j='',m=!1,z=['{','}'];(d=e,Array.isArray(d)&&(m=!0,z=['[',']']),h(e))&&(j=' [Function'+(e.name?': '+e.name:'')+']');return g(e)&&(j=' '+RegExp.prototype.toString.call(e)),y(e)&&(j=' '+Date.prototype.toUTCString.call(e)),v(e)&&(j=' '+o(e)),0!==f.length||m&&0!=e.length?c<0?g(e)?n.stylize(RegExp.prototype.toString.call(e),'regexp'):n.stylize('[Object]','special'):(n.seen.push(e),b=m?i(n,e,c,p,f):f.map(function(r){return u(n,e,c,p,r,m)}),n.seen.pop(),a(b,j,z)):z[0]+j+z[1]}function t(n,r){if(p(r))return n.stylize('undefined','undefined');if('string'==typeof r){var e="'"+JSON.stringify(r).replace(/^"|"$/g,'').replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return n.stylize(e,'string')}return f(r)?n.stylize(''+r,'number'):c(r)?n.stylize(''+r,'boolean'):l(r)?n.stylize('null','null'):void 0}function o(n){return'['+Error.prototype.toString.call(n)+']'}function i(n,r,e,t,o){for(var i=[],a=0,c=r.length;a-1&&(c=u?c.split('\n').map(function(n){return' '+n}).join('\n').substr(2):'\n'+c.split('\n').map(function(n){return' '+n}).join('\n')):c=n.stylize('[Circular]','special')),p(a)){if(u&&i.match(/^\d+$/))return c;(a=JSON.stringify(''+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(a=a.substr(1,a.length-2),a=n.stylize(a,'name')):(a=a.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),a=n.stylize(a,'string'))}return a+': '+c}function a(n,r,e){return n.reduce(function(n,r){return 0,r.indexOf('\n')>=0&&0,n+r.replace(/\u001b\[\d\d?m/g,'').length+1},0)>60?e[0]+(''===r?'':r+'\n ')+' '+n.join(',\n ')+' '+e[1]:e[0]+r+' '+n.join(', ')+' '+e[1]}function c(n){return'boolean'==typeof n}function l(n){return null===n}function f(n){return'number'==typeof n}function p(n){return void 0===n}function g(n){return s(n)&&'[object RegExp]'===d(n)}function s(n){return'object'==typeof n&&null!==n}function y(n){return s(n)&&'[object Date]'===d(n)}function v(n){return s(n)&&('[object Error]'===d(n)||n instanceof Error)}function h(n){return'function'==typeof n}function d(n){return Object.prototype.toString.call(n)}function b(n,r){return Object.prototype.hasOwnProperty.call(n,r)}return function(r,t){return e({seen:[],stylize:n},r,t.depth)}})(),e='(index)',t={trace:0,info:1,warn:2,error:3},o=[];o[t.trace]='debug',o[t.info]='log',o[t.warn]='warning',o[t.error]='error';var i=1;function u(e){return function(){var u;u=1===arguments.length&&'string'==typeof arguments[0]?arguments[0]:Array.prototype.map.call(arguments,function(n){return r(n,{depth:10})}).join(', ');var a=e;'Warning: '===u.slice(0,9)&&a>=t.error&&(a=t.warn),n.__inspectorLog&&n.__inspectorLog(o[a],u,[].slice.call(arguments),i),p.length&&(u=g('',u)),n.nativeLoggingHook(u,a)}}function a(n,r){return Array.apply(null,Array(r)).map(function(){return n})}var c="\u2502",l="\u2510",f="\u2518",p=[];function g(n,r){return p.join('')+n+' '+(r||'')}if(n.nativeLoggingHook){n.console;n.console={error:u(t.error),info:u(t.info),log:u(t.info),warn:u(t.warn),trace:u(t.trace),debug:u(t.trace),table:function(r){if(!Array.isArray(r)){var o=r;for(var i in r=[],o)if(o.hasOwnProperty(i)){var u=o[i];u[e]=i,r.push(u)}}if(0!==r.length){var c=Object.keys(r[0]).sort(),l=[],f=[];c.forEach(function(n,e){f[e]=n.length;for(var t=0;t',function(){return u.applyWithGuard(n,t||this,arguments,null,r)}}};n.ErrorUtils=u})('undefined'!=typeof global?global:'undefined'!=typeof window?window:this); -!(function(e){if(void 0===Number.EPSILON&&Object.defineProperty(Number,'EPSILON',{value:Math.pow(2,-52)}),void 0===Number.MAX_SAFE_INTEGER&&Object.defineProperty(Number,'MAX_SAFE_INTEGER',{value:Math.pow(2,53)-1}),void 0===Number.MIN_SAFE_INTEGER&&Object.defineProperty(Number,'MIN_SAFE_INTEGER',{value:-(Math.pow(2,53)-1)}),!Number.isNaN){var r=e.isNaN;Object.defineProperty(Number,'isNaN',{configurable:!0,enumerable:!1,value:function(e){return'number'==typeof e&&r(e)},writable:!0})}})('undefined'!=typeof global?global:'undefined'!=typeof window?window:this); -'undefined'!=typeof global?global:'undefined'!=typeof window&&window,String.prototype.startsWith||(String.prototype.startsWith=function(t){'use strict';if(null==this)throw TypeError();var r=String(this),n=arguments.length>1&&Number(arguments[1])||0,i=Math.min(Math.max(n,0),r.length);return r.indexOf(String(t),n)===i}),String.prototype.endsWith||(String.prototype.endsWith=function(t){'use strict';if(null==this)throw TypeError();var r=String(this),n=r.length,i=String(t),e=arguments.length>1?Number(arguments[1])||0:n,o=Math.min(Math.max(e,0),n)-i.length;return!(o<0)&&r.lastIndexOf(i,o)===o}),String.prototype.repeat||(String.prototype.repeat=function(t){'use strict';if(null==this)throw TypeError();var r=String(this);if((t=Number(t)||0)<0||t===1/0)throw RangeError();if(1===t)return r;for(var n='';t;)1&t&&(n+=r),(t>>=1)&&(r+=r);return n}),String.prototype.includes||(String.prototype.includes=function(t,r){'use strict';return'number'!=typeof r&&(r=0),!(r+t.length>this.length)&&-1!==this.indexOf(t,r)}),String.prototype.codePointAt||(String.prototype.codePointAt=function(t){if(null==this)throw TypeError();var r=String(this),n=r.length,i=t?Number(t):0;if(Number.isNaN(i)&&(i=0),!(i<0||i>=n)){var e,o=r.charCodeAt(i);return o>=55296&&o<=56319&&n>i+1&&(e=r.charCodeAt(i+1))>=56320&&e<=57343?1024*(o-55296)+e-56320+65536:o}}),String.prototype.padEnd||(String.prototype.padEnd=function(t,r){return t>>=0,r=String(void 0!==r?r:' '),this.length>t?String(this):((t-=this.length)>r.length&&(r+=r.repeat(t/r.length)),String(this)+r.slice(0,t))}),String.prototype.padStart||(String.prototype.padStart=function(t,r){return t>>=0,r=String(void 0!==r?r:' '),this.length>t?String(this):((t-=this.length)>r.length&&(r+=r.repeat(t/r.length)),r.slice(0,t)+String(this))}); -!(function(e){function r(e,r){if(null==this)throw new TypeError('Array.prototype.findIndex called on null or undefined');if('function'!=typeof e)throw new TypeError('predicate must be a function');for(var n=Object(this),t=n.length>>>0,o=0;o=0?t=i:(t=n+i)<0&&(t=0);t2?f-2:0),u=2;u0?f[f.length-1]:null,v=f.length>1?f[f.length-2]:null,h='function'==typeof s,y='function'==typeof v;y&&l(h,'Cannot have a non-function arg after a function arg.');var C=h?s:null,p=y?v:null,M=h+y;f=f.slice(0,f.length-M),u.enqueueNativeCall(n,t,f,p,C)}).type=o,f}function v(n,t){return-1!==n.indexOf(t)}function h(o){var u=o||{},l=u.message,f=n(u,["message"]),c=new Error(l);return c.framesToPop=1,t(c,f)}g.__fbGenNativeModule=f;var y={};if(g.nativeModuleProxy)y=g.nativeModuleProxy;else if(!g.nativeExtensions){var C=g.__fbBatchedBridgeConfig;l(C,'__fbBatchedBridgeConfig is not set, cannot invoke native modules');var p=r(d[5]);(C.remoteModuleConfig||[]).forEach(function(n,t){var o=f(n,t);o&&(o.module?y[o.name]=o.module:p(y,o.name,{get:function(){return c(o.name,t)}}))})}m.exports=y},5,[6,8,9,13,3,25]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);m.exports=function(n,o){if(null==n)return{};var l,p,b=t(n,o);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(n);for(p=0;p=0||Object.prototype.propertyIsEnumerable.call(n,l)&&(b[l]=n[l])}return b}},6,[7]); -__d(function(g,r,i,a,m,e,d){m.exports=function(n,t){if(null==n)return{};var f,u,o={},c=Object.keys(n);for(u=0;u=0||(o[f]=n[f]);return o}},7,[]); -__d(function(g,r,i,a,m,e,d){function t(){return m.exports=t=Object.assign||function(t){for(var n=1;n=5){var c=this._queue;this._queue=[[],[],[],this._callID],this._lastFlush=o,g.nativeFlushQueueImmediate(c)}n.counterEvent('pending_js_to_native_queue',this._queue[0].length),this.__spy&&this.__spy({type:1,module:t+'',method:u,args:l})}},{key:"createDebugLookup",value:function(t,u,l){}},{key:"setImmediatesCallback",value:function(t){this._immediatesCallback=t}},{key:"__guard",value:function(t){if(this.__shouldPauseOnThrow())t();else try{t()}catch(t){s.reportFatalError(t)}}},{key:"__shouldPauseOnThrow",value:function(){return'undefined'!=typeof DebuggerInternal&&!0===DebuggerInternal.shouldPauseOnThrow}},{key:"__callImmediates",value:function(){n.beginEvent('JSTimers.callImmediates()'),null!=this._immediatesCallback&&this._immediatesCallback(),n.endEvent()}},{key:"__callFunction",value:function(t,u,l){this._lastFlush=Date.now(),this._eventLoopStartTime=this._lastFlush,this.__spy?n.beginEvent(t+"."+u+"("+o(l)+")"):n.beginEvent(t+"."+u+"(...)"),this.__spy&&this.__spy({type:0,module:t,method:u,args:l});var s=this.getCallableModule(t);h(!!s,'Module %s is not a registered callable module (calling %s)',t,u),h(!!s[u],'Method %s does not exist on module %s',u,t);var c=s[u].apply(s,l);return n.endEvent(),c}},{key:"__invokeCallback",value:function(u,l){this._lastFlush=Date.now(),this._eventLoopStartTime=this._lastFlush;var s=u>>>1,n=1&u?this._successCallbacks[s]:this._failureCallbacks[s];n&&(delete this._successCallbacks[s],delete this._failureCallbacks[s],n.apply(void 0,t(l)))}}],[{key:"spy",value:function(t){c.prototype.__spy=!0===t?function(t){console.log((0===t.type?'N->JS':'JS->N')+" : "+(t.module?t.module+'.':'')+t.method+"("+JSON.stringify(t.args)+")")}:!1===t?null:t}}]),c})();m.exports=c},14,[15,19,20,21,22,23,3,24]); -__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]),o=r(d[2]);m.exports=function(u){return n(u)||t(u)||o()}},15,[16,17,18]); -__d(function(g,r,i,a,m,e,d){m.exports=function(n){if(Array.isArray(n)){for(var t=0,f=new Array(n.length);t2?o-2:0),c=2;cT.length&&T.push(t)}function L(t,n,f,l){var c=typeof t;"undefined"!==c&&"boolean"!==c||(t=null);var p=!1;if(null===t)p=!0;else switch(c){case"string":case"number":p=!0;break;case"object":switch(t.$$typeof){case o:case u:p=!0}}if(p)return f(l,t,""===n?"."+z(t,0):n),1;if(p=0,n=""===n?".":n+":",Array.isArray(t))for(var y=0;y1&&(t-=1),t<.16666666666666666?l+6*(n-l)*t:t<.5?n:t<.6666666666666666?l+(n-l)*(.6666666666666666-t)*6:l}function n(n,t,o){var u=o<.5?o*(1+t):o+t-o*t,s=2*o-u,h=l(s,u,n+.3333333333333333),c=l(s,u,n),b=l(s,u,n-.3333333333333333);return Math.round(255*h)<<24|Math.round(255*c)<<16|Math.round(255*b)<<8}var t,o='[-+]?\\d*\\.?\\d+',u="[-+]?\\d*\\.?\\d+%";function s(){for(var l=arguments.length,n=new Array(l),t=0;t255?255:n}function c(l){return(parseFloat(l)%360+360)%360/360}function b(l){var n=parseFloat(l);return n<0?0:n>1?255:Math.round(255*n)}function p(l){var n=parseFloat(l);return n<0?0:n>100?1:n/100}var y={transparent:0,aliceblue:4042850303,antiquewhite:4209760255,aqua:16777215,aquamarine:2147472639,azure:4043309055,beige:4126530815,bisque:4293182719,black:255,blanchedalmond:4293643775,blue:65535,blueviolet:2318131967,brown:2771004159,burlywood:3736635391,burntsienna:3934150143,cadetblue:1604231423,chartreuse:2147418367,chocolate:3530104575,coral:4286533887,cornflowerblue:1687547391,cornsilk:4294499583,crimson:3692313855,cyan:16777215,darkblue:35839,darkcyan:9145343,darkgoldenrod:3095792639,darkgray:2846468607,darkgreen:6553855,darkgrey:2846468607,darkkhaki:3182914559,darkmagenta:2332068863,darkolivegreen:1433087999,darkorange:4287365375,darkorchid:2570243327,darkred:2332033279,darksalmon:3918953215,darkseagreen:2411499519,darkslateblue:1211993087,darkslategray:793726975,darkslategrey:793726975,darkturquoise:13554175,darkviolet:2483082239,deeppink:4279538687,deepskyblue:12582911,dimgray:1768516095,dimgrey:1768516095,dodgerblue:512819199,firebrick:2988581631,floralwhite:4294635775,forestgreen:579543807,fuchsia:4278255615,gainsboro:3705462015,ghostwhite:4177068031,gold:4292280575,goldenrod:3668254975,gray:2155905279,green:8388863,greenyellow:2919182335,grey:2155905279,honeydew:4043305215,hotpink:4285117695,indianred:3445382399,indigo:1258324735,ivory:4294963455,khaki:4041641215,lavender:3873897215,lavenderblush:4293981695,lawngreen:2096890111,lemonchiffon:4294626815,lightblue:2916673279,lightcoral:4034953471,lightcyan:3774873599,lightgoldenrodyellow:4210742015,lightgray:3553874943,lightgreen:2431553791,lightgrey:3553874943,lightpink:4290167295,lightsalmon:4288707327,lightseagreen:548580095,lightskyblue:2278488831,lightslategray:2005441023,lightslategrey:2005441023,lightsteelblue:2965692159,lightyellow:4294959359,lime:16711935,limegreen:852308735,linen:4210091775,magenta:4278255615,maroon:2147483903,mediumaquamarine:1724754687,mediumblue:52735,mediumorchid:3126187007,mediumpurple:2473647103,mediumseagreen:1018393087,mediumslateblue:2070474495,mediumspringgreen:16423679,mediumturquoise:1221709055,mediumvioletred:3340076543,midnightblue:421097727,mintcream:4127193855,mistyrose:4293190143,moccasin:4293178879,navajowhite:4292783615,navy:33023,oldlace:4260751103,olive:2155872511,olivedrab:1804477439,orange:4289003775,orangered:4282712319,orchid:3664828159,palegoldenrod:4008225535,palegreen:2566625535,paleturquoise:2951671551,palevioletred:3681588223,papayawhip:4293907967,peachpuff:4292524543,peru:3448061951,pink:4290825215,plum:3718307327,powderblue:2967529215,purple:2147516671,rebeccapurple:1714657791,red:4278190335,rosybrown:3163525119,royalblue:1097458175,saddlebrown:2336560127,salmon:4202722047,sandybrown:4104413439,seagreen:780883967,seashell:4294307583,sienna:2689740287,silver:3233857791,skyblue:2278484991,slateblue:1784335871,slategray:1887473919,slategrey:1887473919,snow:4294638335,springgreen:16744447,steelblue:1182971135,tan:3535047935,teal:8421631,thistle:3636451583,tomato:4284696575,turquoise:1088475391,violet:4001558271,wheat:4125012991,white:4294967295,whitesmoke:4126537215,yellow:4294902015,yellowgreen:2597139199};m.exports=function(l){var k,f=(void 0===t&&(t={rgb:new RegExp('rgb'+s(o,o,o)),rgba:new RegExp('rgba'+s(o,o,o,o)),hsl:new RegExp('hsl'+s(o,u,u)),hsla:new RegExp('hsla'+s(o,u,u,o)),hex3:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex4:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#([0-9a-fA-F]{6})$/,hex8:/^#([0-9a-fA-F]{8})$/}),t);return'number'==typeof l?l>>>0===l&&l>=0&&l<=4294967295?l:null:(k=f.hex6.exec(l))?parseInt(k[1]+'ff',16)>>>0:y.hasOwnProperty(l)?y[l]:(k=f.rgb.exec(l))?(h(k[1])<<24|h(k[2])<<16|h(k[3])<<8|255)>>>0:(k=f.rgba.exec(l))?(h(k[1])<<24|h(k[2])<<16|h(k[3])<<8|b(k[4]))>>>0:(k=f.hex3.exec(l))?parseInt(k[1]+k[1]+k[2]+k[2]+k[3]+k[3]+'ff',16)>>>0:(k=f.hex8.exec(l))?parseInt(k[1],16)>>>0:(k=f.hex4.exec(l))?parseInt(k[1]+k[1]+k[2]+k[2]+k[3]+k[3]+k[4]+k[4],16)>>>0:(k=f.hsl.exec(l))?(255|n(c(k[1]),p(k[2]),p(k[3])))>>>0:(k=f.hsla.exec(l))?(n(c(k[1]),p(k[2]),p(k[3]))|b(k[4]))>>>0:null}},57,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),t={display:n.oneOf(['none','flex']),width:n.oneOfType([n.number,n.string]),height:n.oneOfType([n.number,n.string]),start:n.oneOfType([n.number,n.string]),end:n.oneOfType([n.number,n.string]),top:n.oneOfType([n.number,n.string]),left:n.oneOfType([n.number,n.string]),right:n.oneOfType([n.number,n.string]),bottom:n.oneOfType([n.number,n.string]),minWidth:n.oneOfType([n.number,n.string]),maxWidth:n.oneOfType([n.number,n.string]),minHeight:n.oneOfType([n.number,n.string]),maxHeight:n.oneOfType([n.number,n.string]),margin:n.oneOfType([n.number,n.string]),marginVertical:n.oneOfType([n.number,n.string]),marginHorizontal:n.oneOfType([n.number,n.string]),marginTop:n.oneOfType([n.number,n.string]),marginBottom:n.oneOfType([n.number,n.string]),marginLeft:n.oneOfType([n.number,n.string]),marginRight:n.oneOfType([n.number,n.string]),marginStart:n.oneOfType([n.number,n.string]),marginEnd:n.oneOfType([n.number,n.string]),padding:n.oneOfType([n.number,n.string]),paddingVertical:n.oneOfType([n.number,n.string]),paddingHorizontal:n.oneOfType([n.number,n.string]),paddingTop:n.oneOfType([n.number,n.string]),paddingBottom:n.oneOfType([n.number,n.string]),paddingLeft:n.oneOfType([n.number,n.string]),paddingRight:n.oneOfType([n.number,n.string]),paddingStart:n.oneOfType([n.number,n.string]),paddingEnd:n.oneOfType([n.number,n.string]),borderWidth:n.number,borderTopWidth:n.number,borderStartWidth:n.number,borderEndWidth:n.number,borderRightWidth:n.number,borderBottomWidth:n.number,borderLeftWidth:n.number,position:n.oneOf(['absolute','relative']),flexDirection:n.oneOf(['row','row-reverse','column','column-reverse']),flexWrap:n.oneOf(['wrap','nowrap','wrap-reverse']),justifyContent:n.oneOf(['flex-start','flex-end','center','space-between','space-around','space-evenly']),alignItems:n.oneOf(['flex-start','flex-end','center','stretch','baseline']),alignSelf:n.oneOf(['auto','flex-start','flex-end','center','stretch','baseline']),alignContent:n.oneOf(['flex-start','flex-end','center','stretch','space-between','space-around']),overflow:n.oneOf(['visible','hidden','scroll']),flex:n.number,flexGrow:n.number,flexShrink:n.number,flexBasis:n.oneOfType([n.number,n.string]),aspectRatio:n.number,zIndex:n.number,direction:n.oneOf(['inherit','ltr','rtl'])};m.exports=t},58,[59]); -__d(function(g,r,i,a,m,e,d){m.exports=r(d[0])()},59,[60]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]);function t(){}function o(){}o.resetWarningCache=t,m.exports=function(){function p(t,o,p,c,s,y){if(y!==n){var f=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw f.name='Invariant Violation',f}}function c(){return p}p.isRequired=p;var s={array:p,bool:p,func:p,number:p,object:p,string:p,symbol:p,any:p,arrayOf:c,element:p,elementType:p,instanceOf:c,node:p,objectOf:c,oneOf:c,oneOfType:c,shape:c,exact:c,checkPropTypes:o,resetWarningCache:t};return s.PropTypes=s,s}},60,[61]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports='SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'},61,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var s=r(d[0]),h=r(d[1]),o={shadowColor:s,shadowOffset:h.shape({width:h.number,height:h.number}),shadowOpacity:h.number,shadowRadius:h.number};m.exports=o},62,[56,59]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]),n={transform:t.arrayOf(t.oneOfType([t.shape({perspective:t.number}),t.shape({rotate:t.string}),t.shape({rotateX:t.string}),t.shape({rotateY:t.string}),t.shape({rotateZ:t.string}),t.shape({scale:t.number}),t.shape({scaleX:t.number}),t.shape({scaleY:t.number}),t.shape({translateX:t.number}),t.shape({translateY:t.number}),t.shape({skewX:t.string}),t.shape({skewY:t.string})])),transformMatrix:function(t,s,n){if(t[s])return new Error("The transformMatrix style property is deprecated. Use `transform: [{ matrix: ... }]` instead.")},decomposedMatrix:function(t,s,n){if(t[s])return new Error("The decomposedMatrix style property is deprecated. Use `transform: [...]` instead.")},scaleX:s(t.number,'Use the transform prop instead.'),scaleY:s(t.number,'Use the transform prop instead.'),rotation:s(t.number,'Use the transform prop instead.'),translateX:s(t.number,'Use the transform prop instead.'),translateY:s(t.number,'Use the transform prop instead.')};m.exports=n},63,[59,64]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]);m.exports=function(t,o){return function(c,u,p){n.getViewManagerConfig(p)||void 0===c[u]||console.warn("`"+u+"` supplied to `"+p+"` has been deprecated. "+o);for(var s=arguments.length,f=new Array(s>3?s-3:0),l=3;l>>8)>>>0,u|=0):void 0}},67,[41,57]); -__d(function(g,r,i,a,m,e,d){'use strict';r(d[0]),r(d[1]),r(d[2]),r(d[3]);m.exports=function(t){return t}},68,[69,41,3,24]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o={createIdentityMatrix:function(){return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},createCopy:function(t){return[t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15]]},createOrthographic:function(t,n,o,u,s,c){return[2/(n-t),0,0,0,0,2/(u-o),0,0,0,0,-2/(c-s),0,-(n+t)/(n-t),-(u+o)/(u-o),-(c+s)/(c-s),1]},createFrustum:function(t,n,o,u,s,c){var v=1/(n-t),f=1/(u-o),h=1/(s-c);return[s*v*2,0,0,0,0,s*f*2,0,0,(n+t)*v,(u+o)*f,(c+s)*h,-1,0,0,c*s*h*2,0]},createPerspective:function(t,n,o,u){var s=1/Math.tan(t/2),c=1/(o-u);return[s/n,0,0,0,0,s,0,0,0,0,(u+o)*c,-1,0,0,u*o*c*2,0]},createTranslate2d:function(t,n){var u=o.createIdentityMatrix();return o.reuseTranslate2dCommand(u,t,n),u},reuseTranslate2dCommand:function(t,n,o){t[12]=n,t[13]=o},reuseTranslate3dCommand:function(t,n,o,u){t[12]=n,t[13]=o,t[14]=u},createScale:function(t){var n=o.createIdentityMatrix();return o.reuseScaleCommand(n,t),n},reuseScaleCommand:function(t,n){t[0]=n,t[5]=n},reuseScale3dCommand:function(t,n,o,u){t[0]=n,t[5]=o,t[10]=u},reusePerspectiveCommand:function(t,n){t[11]=-1/n},reuseScaleXCommand:function(t,n){t[0]=n},reuseScaleYCommand:function(t,n){t[5]=n},reuseScaleZCommand:function(t,n){t[10]=n},reuseRotateXCommand:function(t,n){t[5]=Math.cos(n),t[6]=Math.sin(n),t[9]=-Math.sin(n),t[10]=Math.cos(n)},reuseRotateYCommand:function(t,n){t[0]=Math.cos(n),t[2]=-Math.sin(n),t[8]=Math.sin(n),t[10]=Math.cos(n)},reuseRotateZCommand:function(t,n){t[0]=Math.cos(n),t[1]=Math.sin(n),t[4]=-Math.sin(n),t[5]=Math.cos(n)},createRotateZ:function(t){var n=o.createIdentityMatrix();return o.reuseRotateZCommand(n,t),n},reuseSkewXCommand:function(t,n){t[4]=Math.tan(n)},reuseSkewYCommand:function(t,n){t[1]=Math.tan(n)},multiplyInto:function(t,n,o){var u=n[0],s=n[1],c=n[2],v=n[3],f=n[4],h=n[5],M=n[6],l=n[7],C=n[8],p=n[9],x=n[10],T=n[11],y=n[12],S=n[13],D=n[14],P=n[15],q=o[0],X=o[1],Y=o[2],I=o[3];t[0]=q*u+X*f+Y*C+I*y,t[1]=q*s+X*h+Y*p+I*S,t[2]=q*c+X*M+Y*x+I*D,t[3]=q*v+X*l+Y*T+I*P,q=o[4],X=o[5],Y=o[6],I=o[7],t[4]=q*u+X*f+Y*C+I*y,t[5]=q*s+X*h+Y*p+I*S,t[6]=q*c+X*M+Y*x+I*D,t[7]=q*v+X*l+Y*T+I*P,q=o[8],X=o[9],Y=o[10],I=o[11],t[8]=q*u+X*f+Y*C+I*y,t[9]=q*s+X*h+Y*p+I*S,t[10]=q*c+X*M+Y*x+I*D,t[11]=q*v+X*l+Y*T+I*P,q=o[12],X=o[13],Y=o[14],I=o[15],t[12]=q*u+X*f+Y*C+I*y,t[13]=q*s+X*h+Y*p+I*S,t[14]=q*c+X*M+Y*x+I*D,t[15]=q*v+X*l+Y*T+I*P},determinant:function(n){var o=t(n,16),u=o[0],s=o[1],c=o[2],v=o[3],f=o[4],h=o[5],M=o[6],l=o[7],C=o[8],p=o[9],x=o[10],T=o[11],y=o[12],S=o[13],D=o[14],P=o[15];return v*M*p*y-c*l*p*y-v*h*x*y+s*l*x*y+c*h*T*y-s*M*T*y-v*M*C*S+c*l*C*S+v*f*x*S-u*l*x*S-c*f*T*S+u*M*T*S+v*h*C*D-s*l*C*D-v*f*p*D+u*l*p*D+s*f*T*D-u*h*T*D-c*h*C*P+s*M*C*P+c*f*p*P-u*M*p*P-s*f*x*P+u*h*x*P},inverse:function(n){var u=o.determinant(n);if(!u)return n;var s=t(n,16),c=s[0],v=s[1],f=s[2],h=s[3],M=s[4],l=s[5],C=s[6],p=s[7],x=s[8],T=s[9],y=s[10],S=s[11],D=s[12],P=s[13],q=s[14],X=s[15];return[(C*S*P-p*y*P+p*T*q-l*S*q-C*T*X+l*y*X)/u,(h*y*P-f*S*P-h*T*q+v*S*q+f*T*X-v*y*X)/u,(f*p*P-h*C*P+h*l*q-v*p*q-f*l*X+v*C*X)/u,(h*C*T-f*p*T-h*l*y+v*p*y+f*l*S-v*C*S)/u,(p*y*D-C*S*D-p*x*q+M*S*q+C*x*X-M*y*X)/u,(f*S*D-h*y*D+h*x*q-c*S*q-f*x*X+c*y*X)/u,(h*C*D-f*p*D-h*M*q+c*p*q+f*M*X-c*C*X)/u,(f*p*x-h*C*x+h*M*y-c*p*y-f*M*S+c*C*S)/u,(l*S*D-p*T*D+p*x*P-M*S*P-l*x*X+M*T*X)/u,(h*T*D-v*S*D-h*x*P+c*S*P+v*x*X-c*T*X)/u,(v*p*D-h*l*D+h*M*P-c*p*P-v*M*X+c*l*X)/u,(h*l*x-v*p*x-h*M*T+c*p*T+v*M*S-c*l*S)/u,(C*T*D-l*y*D-C*x*P+M*y*P+l*x*q-M*T*q)/u,(v*y*D-f*T*D+f*x*P-c*y*P-v*x*q+c*T*q)/u,(f*l*D-v*C*D-f*M*P+c*C*P+v*M*q-c*l*q)/u,(v*C*x-f*l*x+f*M*T-c*C*T-v*M*y+c*l*y)/u]},transpose:function(t){return[t[0],t[4],t[8],t[12],t[1],t[5],t[9],t[13],t[2],t[6],t[10],t[14],t[3],t[7],t[11],t[15]]},multiplyVectorByMatrix:function(n,o){var u=t(n,4),s=u[0],c=u[1],v=u[2],f=u[3];return[s*o[0]+c*o[4]+v*o[8]+f*o[12],s*o[1]+c*o[5]+v*o[9]+f*o[13],s*o[2]+c*o[6]+v*o[10]+f*o[14],s*o[3]+c*o[7]+v*o[11]+f*o[15]]},v3Length:function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2])},v3Normalize:function(t,n){var u=1/(n||o.v3Length(t));return[t[0]*u,t[1]*u,t[2]*u]},v3Dot:function(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]},v3Combine:function(t,n,o,u){return[o*t[0]+u*n[0],o*t[1]+u*n[1],o*t[2]+u*n[2]]},v3Cross:function(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]},quaternionToDegreesXYZ:function(n,u,s){var c=t(n,4),v=c[0],f=c[1],h=c[2],M=c[3],l=v*v,C=f*f,p=h*h,x=v*f+h*M,T=M*M+l+C+p,y=180/Math.PI;return x>.49999*T?[0,2*Math.atan2(v,M)*y,90]:x<-.49999*T?[0,-2*Math.atan2(v,M)*y,-90]:[o.roundTo3Places(Math.atan2(2*v*M-2*f*h,1-2*l-2*p)*y),o.roundTo3Places(Math.atan2(2*f*M-2*v*h,1-2*C-2*p)*y),o.roundTo3Places(Math.asin(2*v*f+2*h*M)*y)]},roundTo3Places:function(t){var n=t.toString().split('e');return.001*Math.round(n[0]+'e'+(n[1]?+n[1]-3:3))},decomposeMatrix:function(t){n(16===t.length,'Matrix decomposition needs a list of 3d matrix values, received %s',t);var u=[],s=[],c=[],v=[],f=[];if(t[15]){for(var h=[],M=[],l=0;l<4;l++){h.push([]);for(var C=0;C<4;C++){var p=t[4*l+C]/t[15];h[l].push(p),M.push(3===C?0:p)}}if(M[15]=1,o.determinant(M)){if(0!==h[0][3]||0!==h[1][3]||0!==h[2][3]){var x=[h[0][3],h[1][3],h[2][3],h[3][3]],T=o.inverse(M),y=o.transpose(T);u=o.multiplyVectorByMatrix(x,y)}else u[0]=u[1]=u[2]=0,u[3]=1;for(var S=0;S<3;S++)f[S]=h[3][S];for(var D=[],P=0;P<3;P++)D[P]=[h[P][0],h[P][1],h[P][2]];c[0]=o.v3Length(D[0]),D[0]=o.v3Normalize(D[0],c[0]),v[0]=o.v3Dot(D[0],D[1]),D[1]=o.v3Combine(D[1],D[0],1,-v[0]),v[0]=o.v3Dot(D[0],D[1]),D[1]=o.v3Combine(D[1],D[0],1,-v[0]),c[1]=o.v3Length(D[1]),D[1]=o.v3Normalize(D[1],c[1]),v[0]/=c[1],v[1]=o.v3Dot(D[0],D[2]),D[2]=o.v3Combine(D[2],D[0],1,-v[1]),v[2]=o.v3Dot(D[1],D[2]),D[2]=o.v3Combine(D[2],D[1],1,-v[2]),c[2]=o.v3Length(D[2]),D[2]=o.v3Normalize(D[2],c[2]),v[1]/=c[2],v[2]/=c[2];var q,X=o.v3Cross(D[1],D[2]);if(o.v3Dot(D[0],X)<0)for(var Y=0;Y<3;Y++)c[Y]*=-1,D[Y][0]*=-1,D[Y][1]*=-1,D[Y][2]*=-1;return s[0]=.5*Math.sqrt(Math.max(1+D[0][0]-D[1][1]-D[2][2],0)),s[1]=.5*Math.sqrt(Math.max(1-D[0][0]+D[1][1]-D[2][2],0)),s[2]=.5*Math.sqrt(Math.max(1-D[0][0]-D[1][1]+D[2][2],0)),s[3]=.5*Math.sqrt(Math.max(1+D[0][0]+D[1][1]+D[2][2],0)),D[2][1]>D[1][2]&&(s[0]=-s[0]),D[0][2]>D[2][0]&&(s[1]=-s[1]),D[1][0]>D[0][1]&&(s[2]=-s[2]),{rotationDegrees:q=s[0]<.001&&s[0]>=0&&s[1]<.001&&s[1]>=0?[0,0,o.roundTo3Places(180*Math.atan2(D[0][1],D[0][0])/Math.PI)]:o.quaternionToDegreesXYZ(s,h,D),perspective:u,quaternion:s,scale:c,skew:v,translation:f,rotate:q[2],rotateX:q[0],rotateY:q[1],scaleX:c[0],scaleY:c[1],translateX:f[0],translateY:f[1]}}}}};m.exports=o},69,[9,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t={width:void 0,height:void 0};m.exports=function(h,n){return(h=h||t)!==(n=n||t)&&(h.width!==n.width||h.height!==n.height)}},70,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),u=(r(d[2]),r(d[3]),r(d[4]),r(d[5]),(function(){function u(){t(this,u)}return n(u,null,[{key:"validateStyleProp",value:function(t,n,u){}},{key:"validateStyle",value:function(t,n){}},{key:"addValidStylePropTypes",value:function(t){}}]),u})());m.exports=u},71,[19,20,55,65,66,3]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports=function t(n){if(null!==n&&'object'==typeof n){if(!Array.isArray(n))return n;for(var f={},o=0,u=n.length;othis.eventPool.length&&this.eventPool.push(e)}function te(e){e.eventPool=[],e.getPooled=Z,e.release=ee}l(K.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=q)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=q)},persist:function(){this.isPersistent=q},isPersistent:J,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null,this.isPropagationStopped=this.isDefaultPrevented=J,this._dispatchInstances=this._dispatchListeners=null}}),K.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null},K.extend=function(e){function t(){}function n(){return r.apply(this,arguments)}var r=this;t.prototype=r.prototype;var i=new t;return l(i,n.prototype),n.prototype=i,n.prototype.constructor=n,n.Interface=l({},r.Interface,e),n.extend=r.extend,te(n),n},te(K);var ne=K.extend({touchHistory:function(){return null}});function re(e){return"topTouchStart"===e}function ie(e){return"topTouchMove"===e}var ae=["topTouchStart"],oe=["topTouchMove"],le=["topTouchCancel","topTouchEnd"],ue=[],se={touchBank:ue,numberActiveTouches:0,indexOfSingleActiveTouch:-1,mostRecentTimeStamp:0};function ce(e){return e.timeStamp||e.timestamp}function fe(e){return g(null!=(e=e.identifier),"Touch object is missing identifier."),e}function de(e){var t=fe(e),n=ue[t];n?(n.touchActive=!0,n.startPageX=e.pageX,n.startPageY=e.pageY,n.startTimeStamp=ce(e),n.currentPageX=e.pageX,n.currentPageY=e.pageY,n.currentTimeStamp=ce(e),n.previousPageX=e.pageX,n.previousPageY=e.pageY,n.previousTimeStamp=ce(e)):(n={touchActive:!0,startPageX:e.pageX,startPageY:e.pageY,startTimeStamp:ce(e),currentPageX:e.pageX,currentPageY:e.pageY,currentTimeStamp:ce(e),previousPageX:e.pageX,previousPageY:e.pageY,previousTimeStamp:ce(e)},ue[t]=n),se.mostRecentTimeStamp=ce(e)}function pe(e){var t=ue[fe(e)];t?(t.touchActive=!0,t.previousPageX=t.currentPageX,t.previousPageY=t.currentPageY,t.previousTimeStamp=t.currentTimeStamp,t.currentPageX=e.pageX,t.currentPageY=e.pageY,t.currentTimeStamp=ce(e),se.mostRecentTimeStamp=ce(e)):console.error("Cannot record touch move without a touch start.\nTouch Move: %s\n","Touch Bank: %s",he(e),ge())}function me(e){var t=ue[fe(e)];t?(t.touchActive=!1,t.previousPageX=t.currentPageX,t.previousPageY=t.currentPageY,t.previousTimeStamp=t.currentTimeStamp,t.currentPageX=e.pageX,t.currentPageY=e.pageY,t.currentTimeStamp=ce(e),se.mostRecentTimeStamp=ce(e)):console.error("Cannot record touch end without a touch start.\nTouch End: %s\n","Touch Bank: %s",he(e),ge())}function he(e){return JSON.stringify({identifier:e.identifier,pageX:e.pageX,pageY:e.pageY,timestamp:ce(e)})}function ge(){var e=JSON.stringify(ue.slice(0,20));return 20o||(a=o),Oe(a,e,i)}}}),U=function(e){return Ce[e._nativeTag]||null},I=_e,z=function(e){var t=e.stateNode._nativeTag;return void 0===t&&(t=e.stateNode.canonical._nativeTag),g(t,"All native instances should have a tag."),t},ke.injection.injectGlobalResponderHandler({onChange:function(e,t,n){null!==t?s.setJSResponder(t.stateNode._nativeTag,n):s.clearJSResponder()}});var Me=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,We="function"==typeof Symbol&&("function"==typeof Symbol?Symbol.for:"@@for"),je=We?("function"==typeof Symbol?Symbol.for:"@@for")("react.element"):60103,Fe=We?("function"==typeof Symbol?Symbol.for:"@@for")("react.portal"):60106,Be=We?("function"==typeof Symbol?Symbol.for:"@@for")("react.fragment"):60107,He=We?("function"==typeof Symbol?Symbol.for:"@@for")("react.strict_mode"):60108,Ve=We?("function"==typeof Symbol?Symbol.for:"@@for")("react.profiler"):60114,Le=We?("function"==typeof Symbol?Symbol.for:"@@for")("react.provider"):60109,Qe=We?("function"==typeof Symbol?Symbol.for:"@@for")("react.context"):60110,Ye=We?("function"==typeof Symbol?Symbol.for:"@@for")("react.concurrent_mode"):60111,Xe=We?("function"==typeof Symbol?Symbol.for:"@@for")("react.forward_ref"):60112,$e=We?("function"==typeof Symbol?Symbol.for:"@@for")("react.suspense"):60113,Ge=We?("function"==typeof Symbol?Symbol.for:"@@for")("react.memo"):60115,qe=We?("function"==typeof Symbol?Symbol.for:"@@for")("react.lazy"):60116,Je="function"==typeof Symbol&&("function"==typeof Symbol?Symbol.iterator:"@@iterator");function Ke(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=Je&&e[Je]||e["@@iterator"])?e:null}function Ze(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case Ye:return"ConcurrentMode";case Be:return"Fragment";case Fe:return"Portal";case Ve:return"Profiler";case He:return"StrictMode";case $e:return"Suspense"}if("object"==typeof e)switch(e.$$typeof){case Qe:return"Context.Consumer";case Le:return"Context.Provider";case Xe:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case Ge:return Ze(e.type);case qe:if(e=1===e._status?e._result:null)return Ze(e)}return null}function et(e){var t=e;if(e.alternate)for(;t.return;)t=t.return;else{if(0!=(2&t.effectTag))return 1;for(;t.return;)if(0!=(2&(t=t.return).effectTag))return 1}return 3===t.tag?2:3}function tt(e){g(2===et(e),"Unable to find node on an unmounted component.")}function nt(e){var t=e.alternate;if(!t)return g(3!==(t=et(e)),"Unable to find node on an unmounted component."),1===t?null:e;for(var n=e,r=t;;){var i=n.return,a=i?i.alternate:null;if(!i||!a)break;if(i.child===a.child){for(var o=i.child;o;){if(o===n)return tt(i),e;if(o===r)return tt(i),t;o=o.sibling}g(!1,"Unable to find node on an unmounted component.")}if(n.return!==r.return)n=i,r=a;else{o=!1;for(var l=i.child;l;){if(l===n){o=!0,n=i,r=a;break}if(l===r){o=!0,r=i,n=a;break}l=l.sibling}if(!o){for(l=a.child;l;){if(l===n){o=!0,n=a,r=i;break}if(l===r){o=!0,r=a,n=i;break}l=l.sibling}g(o,"Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.")}}g(n.alternate===r,"Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue.")}return g(3===n.tag,"Unable to find node on an unmounted component."),n.stateNode.current===n?e:t}function rt(e){if(!(e=nt(e)))return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}var it={},at=null,ot=0;function lt(e,t,n){if(Array.isArray(t))for(var r=t.length;r--&&0Rt||(e.current=wt[Rt],wt[Rt]=null,Rt--)}function At(e,t){wt[++Rt]=e.current,e.current=t}var Ut={},It={current:Ut},zt={current:!1},Dt=Ut;function Ot(e,t){var n=e.type.contextTypes;if(!n)return Ut;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var i,a={};for(i in n)a[i]=t[i];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function Mt(e){return null!==(e=e.childContextTypes)&&void 0!==e}function Wt(e){Nt(zt),Nt(It)}function jt(e){Nt(zt),Nt(It)}function Ft(e,t,n){g(It.current===Ut,"Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue."),At(It,t),At(zt,n)}function Bt(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var i in r=r.getChildContext())g(i in e,'%s.getChildContext(): key "%s" is not defined in childContextTypes.',Ze(t)||"Unknown",i);return l({},n,r)}function Ht(e){var t=e.stateNode;return t=t&&t.__reactInternalMemoizedMergedChildContext||Ut,Dt=It.current,At(It,t),At(zt,zt.current),!0}function Vt(e,t,n){var r=e.stateNode;g(r,"Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue."),n?(t=Bt(e,t,Dt),r.__reactInternalMemoizedMergedChildContext=t,Nt(zt),Nt(It),At(It,t)):Nt(zt),At(zt,n)}var Lt=null,Qt=null;function Yt(e){return function(t){try{return e(t)}catch(e){}}}function Xt(e){if("undefined"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var t=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(t.isDisabled||!t.supportsFiber)return!0;try{var n=t.inject(e);Lt=Yt(function(e){return t.onCommitFiberRoot(n,e)}),Qt=Yt(function(e){return t.onCommitFiberUnmount(n,e)})}catch(e){}return!0}function $t(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.firstContextDependency=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.effectTag=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childExpirationTime=this.expirationTime=0,this.alternate=null}function Gt(e,t,n,r){return new $t(e,t,n,r)}function qt(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Jt(e){if("function"==typeof e)return qt(e)?1:0;if(void 0!==e&&null!==e){if((e=e.$$typeof)===Xe)return 11;if(e===Ge)return 14}return 2}function Kt(e,t){var n=e.alternate;return null===n?((n=Gt(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.effectTag=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childExpirationTime=e.childExpirationTime,n.expirationTime=e.expirationTime,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,n.firstContextDependency=e.firstContextDependency,n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Zt(e,t,n,r,i,a){var o=2;if(r=e,"function"==typeof e)qt(e)&&(o=1);else if("string"==typeof e)o=5;else e:switch(e){case Be:return en(n.children,i,a,t);case Ye:return tn(n,3|i,a,t);case He:return tn(n,2|i,a,t);case Ve:return(e=Gt(12,n,t,4|i)).elementType=Ve,e.type=Ve,e.expirationTime=a,e;case $e:return(e=Gt(13,n,t,i)).elementType=$e,e.type=$e,e.expirationTime=a,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case Le:o=10;break e;case Qe:o=9;break e;case Xe:o=11;break e;case Ge:o=14;break e;case qe:o=16,r=null;break e}g(!1,"Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",null==e?e:typeof e,"")}return(t=Gt(o,n,t,i)).elementType=e,t.type=r,t.expirationTime=a,t}function en(e,t,n,r){return(e=Gt(7,e,r,t)).expirationTime=n,e}function tn(e,t,n,r){return e=Gt(8,e,r,t),t=0==(1&t)?He:Ye,e.elementType=t,e.type=t,e.expirationTime=n,e}function nn(e,t,n){return(e=Gt(6,e,null,t)).expirationTime=n,e}function rn(e,t,n){return(t=Gt(4,null!==e.children?e.children:[],e.key,t)).expirationTime=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function an(e,t){e.didError=!1;var n=e.earliestPendingTime;0===n?e.earliestPendingTime=e.latestPendingTime=t:nt&&(e.latestPendingTime=t),un(t,e)}function on(e,t){e.didError=!1;var n=e.latestPingedTime;0!==n&&n>=t&&(e.latestPingedTime=0),n=e.earliestPendingTime;var r=e.latestPendingTime;n===t?e.earliestPendingTime=r===t?e.latestPendingTime=0:r:r===t&&(e.latestPendingTime=n),n=e.earliestSuspendedTime,r=e.latestSuspendedTime,0===n?e.earliestSuspendedTime=e.latestSuspendedTime=t:nt&&(e.latestSuspendedTime=t),un(t,e)}function ln(e,t){var n=e.earliestPendingTime;return e=e.earliestSuspendedTime,n>t&&(t=n),e>t&&(t=e),t}function un(e,t){var n=t.earliestSuspendedTime,r=t.latestSuspendedTime,i=t.earliestPendingTime,a=t.latestPingedTime;0===(i=0!==i?i:a)&&(0===e||re&&(e=n),t.nextExpirationTimeToWorkOn=i,t.expirationTime=e}var sn=!1;function cn(e){return{baseState:e,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function fn(e){return{baseState:e.baseState,firstUpdate:e.firstUpdate,lastUpdate:e.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function dn(e){return{expirationTime:e,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function pn(e,t){null===e.lastUpdate?e.firstUpdate=e.lastUpdate=t:(e.lastUpdate.next=t,e.lastUpdate=t)}function mn(e,t){var n=e.alternate;if(null===n){var r=e.updateQueue,i=null;null===r&&(r=e.updateQueue=cn(e.memoizedState))}else r=e.updateQueue,i=n.updateQueue,null===r?null===i?(r=e.updateQueue=cn(e.memoizedState),i=n.updateQueue=cn(n.memoizedState)):r=e.updateQueue=fn(i):null===i&&(i=n.updateQueue=fn(r));null===i||r===i?pn(r,t):null===r.lastUpdate||null===i.lastUpdate?(pn(r,t),pn(i,t)):(pn(r,t),i.lastUpdate=t)}function hn(e,t){var n=e.updateQueue;null===(n=null===n?e.updateQueue=cn(e.memoizedState):gn(e,n)).lastCapturedUpdate?n.firstCapturedUpdate=n.lastCapturedUpdate=t:(n.lastCapturedUpdate.next=t,n.lastCapturedUpdate=t)}function gn(e,t){var n=e.alternate;return null!==n&&t===n.updateQueue&&(t=e.updateQueue=fn(t)),t}function yn(e,t,n,r,i,a){switch(n.tag){case 1:return"function"==typeof(e=n.payload)?e.call(a,r,i):e;case 3:e.effectTag=-2049&e.effectTag|64;case 0:if(null===(i="function"==typeof(e=n.payload)?e.call(a,r,i):e)||void 0===i)break;return l({},r,i);case 2:sn=!0}return r}function vn(e,t,n,r,i){sn=!1;for(var a=(t=gn(e,t)).baseState,o=null,l=0,u=t.firstUpdate,s=a;null!==u;){var c=u.expirationTime;ch?(g=m,m=null):g=m.sibling;var y=d(i,m,l[h],u);if(null===y){null===m&&(m=g);break}e&&m&&null===y.alternate&&t(i,m),o=a(y,o,h),null===c?s=y:c.sibling=y,c=y,m=g}if(h===l.length)return n(i,m),s;if(null===m){for(;hh?(y=m,m=null):y=m.sibling;var b=d(i,m,v.value,u);if(null===b){m||(m=y);break}e&&m&&null===b.alternate&&t(i,m),o=a(b,o,h),null===c?s=b:c.sibling=b,c=b,m=y}if(v.done)return n(i,m),s;if(null===m){for(;!v.done;h++,v=l.next())null!==(v=f(i,v.value,u))&&(o=a(v,o,h),null===c?s=v:c.sibling=v,c=v);return s}for(m=r(i,m);!v.done;h++,v=l.next())null!==(v=p(m,i,h,v.value,u))&&(e&&null!==v.alternate&&m.delete(null===v.key?h:v.key),o=a(v,o,h),null===c?s=v:c.sibling=v,c=v);return e&&m.forEach(function(e){return t(i,e)}),s}return function(e,r,a,l){var u="object"==typeof a&&null!==a&&a.type===Be&&null===a.key;u&&(a=a.props.children);var s="object"==typeof a&&null!==a;if(s)switch(a.$$typeof){case je:e:{for(s=a.key,u=r;null!==u;){if(u.key===s){if(7===u.tag?a.type===Be:u.elementType===a.type){n(e,u.sibling),(r=i(u,a.type===Be?a.props.children:a.props)).ref=Zn(e,u,a),r.return=e,e=r;break e}n(e,u);break}t(e,u),u=u.sibling}a.type===Be?((r=en(a.props.children,e.mode,l,a.key)).return=e,e=r):((l=Zt(a.type,a.key,a.props,null,e.mode,l)).ref=Zn(e,r,a),l.return=e,e=l)}return o(e);case Fe:e:{for(u=a.key;null!==r;){if(r.key===u){if(4===r.tag&&r.stateNode.containerInfo===a.containerInfo&&r.stateNode.implementation===a.implementation){n(e,r.sibling),(r=i(r,a.children||[])).return=e,e=r;break e}n(e,r);break}t(e,r),r=r.sibling}(r=rn(a,e.mode,l)).return=e,e=r}return o(e)}if("string"==typeof a||"number"==typeof a)return a=""+a,null!==r&&6===r.tag?(n(e,r.sibling),(r=i(r,a)).return=e,e=r):(n(e,r),(r=nn(a,e.mode,l)).return=e,e=r),o(e);if(Kn(a))return m(e,r,a,l);if(Ke(a))return h(e,r,a,l);if(s&&er(e,a),void 0===a&&!u)switch(e.tag){case 1:case 0:g(!1,"%s(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.",(l=e.type).displayName||l.name||"Component")}return n(e,r)}}var nr=tr(!0),rr=tr(!1),ir=null,ar=null,or=!1;function lr(e,t){switch(e.tag){case 5:return null!==(t=vt(e.type,e.pendingProps))&&(e.stateNode=t,!0);case 6:return null!==(t=vt(e.pendingProps))&&(e.stateNode=t,!0);default:return!1}}function ur(e){if(or){var t=ar;if(t){var n=t;if(!lr(e,t)){if(!(t=vt())||!lr(e,t))return e.effectTag|=2,or=!1,void(ir=e);var r=ir,i=Gt(5,null,null,0);i.elementType="DELETED",i.type="DELETED",i.stateNode=n,i.return=r,i.effectTag=8,null!==r.lastEffect?(r.lastEffect.nextEffect=i,r.lastEffect=i):r.firstEffect=r.lastEffect=i}ir=e,ar=vt()}else e.effectTag|=2,or=!1,ir=e}}var sr=Me.ReactCurrentOwner;function cr(e,t,n,r){t.child=null===e?rr(t,null,n,r):nr(t,e.child,n,r)}function fr(e,t,n,r,i){n=n.render;var a=t.ref;return wn(t),r=n(r,a),t.effectTag|=1,cr(e,t,r,i),t.child}function dr(e,t,n,r,i,a){if(null===e){var o=n.type;return"function"!=typeof o||qt(o)||void 0!==o.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Zt(n.type,null,r,null,t.mode,a)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=o,pr(e,t,o,r,i,a))}return o=e.child,i=n?br(e,t,n):null!==(t=Tr(e,t,n))?t.sibling:null}return Tr(e,t,n)}switch(t.expirationTime=0,t.tag){case 2:r=t.elementType,null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),e=t.pendingProps;var i=Ot(t,It.current);if(wn(t),i=r(e,i),t.effectTag|=1,"object"==typeof i&&null!==i&&"function"==typeof i.render&&void 0===i.$$typeof){if(t.tag=1,Mt(r)){var a=!0;Ht(t)}else a=!1;t.memoizedState=null!==i.state&&void 0!==i.state?i.state:null;var o=r.getDerivedStateFromProps;"function"==typeof o&&Yn(t,r,o,e),i.updater=Xn,t.stateNode=i,i._reactInternalFiber=t,Jn(t,r,e,n),t=yr(null,t,r,!0,a,n)}else t.tag=0,cr(null,t,i,n),t=t.child;return t;case 16:switch(i=t.elementType,null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),a=t.pendingProps,e=Vn(i),t.type=e,i=t.tag=Jt(e),a=Hn(e,a),o=void 0,i){case 0:o=hr(null,t,e,a,n);break;case 1:o=gr(null,t,e,a,n);break;case 11:o=fr(null,t,e,a,n);break;case 14:o=dr(null,t,e,Hn(e.type,a),r,n);break;default:g(!1,"Element type is invalid. Received a promise that resolves to: %s. Lazy element type must resolve to a class or function.%s",e,"")}return o;case 0:return r=t.type,i=t.pendingProps,hr(e,t,r,i=t.elementType===r?i:Hn(r,i),n);case 1:return r=t.type,i=t.pendingProps,gr(e,t,r,i=t.elementType===r?i:Hn(r,i),n);case 3:return vr(t),g(null!==(r=t.updateQueue),"If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue."),i=null!==(i=t.memoizedState)?i.element:null,vn(t,r,t.pendingProps,null,n),(r=t.memoizedState.element)===i?t=Tr(e,t,n):(cr(e,t,r,n),t=t.child),t;case 5:return Mn(t),null===e&&ur(t),r=t.pendingProps.children,mr(e,t),cr(e,t,r,n),t=t.child;case 6:return null===e&&ur(t),null;case 13:return br(e,t,n);case 4:return Dn(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=nr(t,null,r,n):cr(e,t,r,n),t.child;case 11:return r=t.type,i=t.pendingProps,fr(e,t,r,i=t.elementType===r?i:Hn(r,i),n);case 7:return cr(e,t,t.pendingProps,n),t.child;case 8:case 12:return cr(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,i=t.pendingProps,o=t.memoizedProps,Cn(t,a=i.value),null!==o){var l=o.value;if(0===(a=l===a&&(0!==l||1/l==1/a)||l!=l&&a!=a?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(l,a):1073741823))){if(o.children===i.children&&!zt.current){t=Tr(e,t,n);break e}}else for(null!==(o=t.child)&&(o.return=t);null!==o;){if(null!==(l=o.firstContextDependency))do{if(l.context===r&&0!=(l.observedBits&a)){if(1===o.tag){var u=dn(n);u.tag=2,mn(o,u)}o.expirationTime within is not currently supported.");var p=ft(null,it,o,d.validAttributes);s.createView(f,d.uiViewClassName,a,p),d=new pt(f,d),Pe[f]=c,Ce[f]=o,Sr(d,t,!1,!1),kt(d)&&(t.effectTag|=4),t.stateNode=d,null!==t.ref&&(t.effectTag|=128)}else g(null!==t.stateNode,"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");break;case 6:i&&null!=t.stateNode?Pr(i,t,i.memoizedProps,o):("string"!=typeof o&&g(null!==t.stateNode,"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue."),i=zn(In.current),a=t,g((l=zn(An.current)).isInAParentText,"Text strings must be rendered within a component."),l=xt(),s.createView(l,"RCTRawText",i,{text:o}),Pe[l]=t,a.stateNode=l);break;case 11:break;case 13:if(o=t.memoizedState,0!=(64&t.effectTag)){t.expirationTime=a,Fr=t;break e}o=null!==o,a=null!==i&&null!==i.memoizedState,null!==i&&!o&&a&&(null!==(l=i.child.sibling)&&(null!==(i=t.firstEffect)?(t.firstEffect=l,l.nextEffect=i):(t.firstEffect=t.lastEffect=l,l.nextEffect=null),l.effectTag=8)),(o!==a||0==(1&t.effectTag)&&o)&&(t.effectTag|=4);break;case 7:case 8:case 12:break;case 4:On(),kr(t);break;case 10:_n(t);break;case 9:case 14:break;case 17:Mt(t.type)&&Wt();break;default:g(!1,"Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.")}Fr=null}if(t=e,1===Hr||1!==t.childExpirationTime){for(o=0,a=t.child;null!==a;)l=a.expirationTime,i=a.childExpirationTime,l>o&&(o=l),i>o&&(o=i),a=a.sibling;t.childExpirationTime=o}if(null!==Fr)return Fr;null!==n&&0==(1024&n.effectTag)&&(null===n.firstEffect&&(n.firstEffect=e.firstEffect),null!==e.lastEffect&&(null!==n.lastEffect&&(n.lastEffect.nextEffect=e.firstEffect),n.lastEffect=e.lastEffect),1=p?f=0:(-1===f||p component higher in the tree to provide a loading indicator or placeholder to display."+_t(u))}Lr=!0,s=xn(s,u),o=l;do{switch(o.tag){case 3:u=s,o.effectTag|=2048,o.expirationTime=a,hn(o,a=zr(o,u,a));break e;case 1:if(u=s,l=o.type,c=o.stateNode,0==(64&o.effectTag)&&("function"==typeof l.getDerivedStateFromError||null!==c&&"function"==typeof c.componentDidCatch&&(null===Xr||!Xr.has(c)))){o.effectTag|=2048,o.expirationTime=a,hn(o,a=Dr(o,u,a));break e}}o=o.return}while(null!==o)}Fr=qr(i);continue}r=!0,Oi(t)}}break}if(jr=!1,Pn=En=kn=Wr.currentDispatcher=null,r)Br=null,e.finishedWork=null;else if(null!==Fr)e.finishedWork=null;else{if(g(null!==(r=e.current.alternate),"Finished root should have a work-in-progress. This error is likely caused by a bug in React. Please file an issue."),Br=null,Lr){if(i=e.latestPendingTime,a=e.latestSuspendedTime,o=e.latestPingedTime,0!==i&&it?0:t)):(e.pendingCommitExpirationTime=n,e.finishedWork=r)}}function Zr(e,t){for(var n=e.return;null!==n;){switch(n.tag){case 1:var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Xr||!Xr.has(r)))return mn(n,e=Dr(n,e=xn(t,e),1073741823)),void ri(n,1073741823);break;case 3:return mn(n,e=zr(n,e=xn(t,e),1073741823)),void ri(n,1073741823)}n=n.return}3===e.tag&&(mn(e,n=zr(e,n=xn(t,e),1073741823)),ri(e,1073741823))}function ei(e,t){return jr?e=Yr?1073741823:Hr:1&t.mode?(e=hi?1073741822-10*(1+((1073741822-e+15)/10|0)):1073741822-25*(1+((1073741822-e+500)/25|0)),null!==Br&&e===Hr&&--e):e=1073741823,hi&&(0===fi||e=a){a=i=r,e.didError=!1;var o=e.latestPingedTime;(0===o||o>a)&&(e.latestPingedTime=a),un(a,e)}else an(e,i=ei(i=_i(),t));0!=(1&t.mode)&&e===Br&&Hr===r&&(Br=null),ni(t,i),0==(1&t.mode)&&(ni(n,i),1===n.tag&&null!==n.stateNode&&((t=dn(i)).tag=2,mn(n,t))),0!==(n=e.expirationTime)&&wi(e,n)}function ni(e,t){e.expirationTimeHr&&$r(),an(e,t),jr&&!Yr&&Br===e||wi(e,e.expirationTime),xi>Ti&&(xi=0,g(!1,"Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.")))}var ii=null,ai=null,oi=0,li=void 0,ui=!1,si=null,ci=0,fi=0,di=!1,pi=null,mi=!1,hi=!1,gi=null,yi=mt(),vi=1073741822-(yi/10|0),bi=vi,Ti=50,xi=0,Si=null;function ki(){vi=1073741822-((mt()-yi)/10|0)}function Ei(e,t){if(0!==oi){if(te.expirationTime&&(e.expirationTime=t),ui||mi||(1073741823===t?Ii(1073741823,!1):Ei(0,t))}function Ri(){var e=0,t=null;if(null!==ai)for(var n=ai,r=ii;null!==r;){var i=r.expirationTime;if(0===i){if(g(null!==n&&null!==ai,"Should have a previous and last root. This error is likely caused by a bug in React. Please file an issue."),r===r.nextScheduledRoot){ii=ai=r.nextScheduledRoot=null;break}if(r===ii)ii=i=r.nextScheduledRoot,ai.nextScheduledRoot=i,r.nextScheduledRoot=null;else{if(r===ai){(ai=n).nextScheduledRoot=ii,r.nextScheduledRoot=null;break}n.nextScheduledRoot=r.nextScheduledRoot,r.nextScheduledRoot=null}r=n.nextScheduledRoot}else{if(i>e&&(e=i,t=r),r===ai)break;if(1073741823===e)break;n=r,r=r.nextScheduledRoot}}si=t,ci=e}var Ni=!1;function Ai(){return!!Ni||gt<=mt()&&(Ni=!0)}function Ui(){try{if(!Ai()&&null!==ii){ki();var e=ii;do{var t=e.expirationTime;0!==t&&vi<=t&&(e.nextExpirationTimeToWorkOn=vi),e=e.nextScheduledRoot}while(e!==ii)}Ii(0,!0)}finally{Ni=!1}}function Ii(e,t){if(Ri(),t)for(ki(),bi=vi;null!==si&&0!==ci&&e<=ci&&!(Ni&&vi>ci);)zi(si,ci,vi>ci),Ri(),ki(),bi=vi;else for(;null!==si&&0!==ci&&e<=ci;)zi(si,ci,!1),Ri();if(t&&(oi=0,li=null),0!==ci&&Ei(0,ci),xi=0,Si=null,null!==gi)for(e=gi,gi=null,t=0;t=n&&(null===gi?gi=[r]:gi.push(r),r._defer))return e.finishedWork=t,void(e.expirationTime=0);e.finishedWork=null,e===Si?xi++:(Si=e,xi=0),Yr=jr=!0,g(e.current!==t,"Cannot commit the same tree as before. This is probably a bug related to the return field. This error is likely caused by a bug in React. Please file an issue."),g(0!==(n=e.pendingCommitExpirationTime),"Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue."),e.pendingCommitExpirationTime=0,r=t.expirationTime;var i=t.childExpirationTime;for(r=i>r?i:r,e.didError=!1,0===r?(e.earliestPendingTime=0,e.latestPendingTime=0,e.earliestSuspendedTime=0,e.latestSuspendedTime=0,e.latestPingedTime=0):(0!==(i=e.latestPendingTime)&&(i>r?e.earliestPendingTime=e.latestPendingTime=0:e.earliestPendingTime>r&&(e.earliestPendingTime=e.latestPendingTime)),0===(i=e.earliestSuspendedTime)?an(e,r):ri&&an(e,r)),un(0,e),Wr.current=null,1y?t:y)&&(Xr=null),e.expirationTime=t,e.finishedWork=null}function Oi(e){g(null!==si,"Should be working on a root. This error is likely caused by a bug in React. Please file an issue."),si.expirationTime=0,di||(di=!0,pi=e)}function Mi(e){var t=e._reactInternalFiber;return void 0===t&&("function"==typeof e.render?g(!1,"Unable to find node on an unmounted component."):g(!1,"Argument appears to not be a ReactComponent. Keys: %s",Object.keys(e))),null===(e=rt(t))?null:e.stateNode}function Wi(e,t,n,r){var i=t.current,a=_i();i=ei(a,i),a=t.current;e:if(n){n=n._reactInternalFiber;t:{g(2===et(n)&&1===n.tag,"Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.");var o=n;do{switch(o.tag){case 3:o=o.stateNode.context;break t;case 1:if(Mt(o.type)){o=o.stateNode.__reactInternalMemoizedMergedChildContext;break t}}o=o.return}while(null!==o);g(!1,"Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue."),o=void 0}if(1===n.tag){var l=n.type;if(Mt(l)){n=Bt(n,l,o);break e}}n=o}else n=Ut;return null===t.context?t.context=n:t.pendingContext=n,t=r,(r=dn(i)).payload={element:e},null!==(t=void 0===t?null:t)&&(r.callback=t),mn(a,r),ri(a,i),i}function ji(e,t,n){var r=3=o?(this._iteratedObject=void 0,h(void 0,!0)):(this._nextIndex=u+1,"key"===s?h(u,!1):"value"===s?h(n[u],!1):"key+value"===s?h([u,n[u]],!1):void 0)}},{key:'@@iterator',value:function(){return this}}]),t})(),s=(function(){function t(o){if(n(this,t),'string'!=typeof o)throw new TypeError('Object is not a string');this._iteratedString=o,this._nextIndex=0}return o(t,[{key:"next",value:function(){if(!this instanceof t)throw new TypeError('Object is not a StringIterator');if(null==this._iteratedString)return h(void 0,!0);var n,o=this._nextIndex,u=this._iteratedString,s=u.length;if(o>=s)return this._iteratedString=void 0,h(void 0,!0);var c=u.charCodeAt(o);if(c<55296||c>56319||o+1===s)n=u[o];else{var f=u.charCodeAt(o+1);n=f<56320||f>57343?u[o]:u[o]+u[o+1]}return this._nextIndex=o+n.length,h(n,!1)}},{key:'@@iterator',value:function(){return this}}]),t})();function h(t,n){return{value:t,done:n}}return function(n,o){return'string'==typeof n?new s(n):Array.isArray(n)?new t(n,o||"value"):n[u]()}})();t(s,{KIND_KEY:"key",KIND_VALUE:"value",KIND_KEY_VAL:"key+value",ITERATOR_SYMBOL:u}),m.exports=s},86,[8,19,20]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),s=r(d[2]),u=r(d[3]),o=r(d[4]);m.exports=(function(h){if(!u('Set'))return h.Set;var l=(function(){function s(n){if(t(this,s),null==this||'object'!=typeof this&&'function'!=typeof this)throw new TypeError('Wrong set object type.');if(p(this),null!=n)for(var u,h=o(n);!(u=h.next()).done;)this.add(u.value)}return n(s,[{key:"add",value:function(t){return this._map.set(t,t),this.size=this._map.size,this}},{key:"clear",value:function(){p(this)}},{key:"delete",value:function(t){var n=this._map.delete(t);return this.size=this._map.size,n}},{key:"entries",value:function(){return this._map.entries()}},{key:"forEach",value:function(t){for(var n,s=arguments[1],u=this._map.keys();!(n=u.next()).done;)t.call(s,n.value,n.value,this)}},{key:"has",value:function(t){return this._map.has(t)}},{key:"values",value:function(){return this._map.values()}}]),s})();function p(t){t._map=new s,t.size=t._map.size}return l.prototype[o.ITERATOR_SYMBOL]=l.prototype.values,l.prototype.keys=l.prototype.values,l})(Function('return this')())},87,[19,20,83,82,86]); -__d(function(g,r,i,a,m,e,d){'use strict';if(g.__RCTProfileIsProfiling){var t=r(d[0]);t.installReactHook(),t.setEnabled(!0)}},88,[22]); -__d(function(g,r,i,a,m,e,d){'use strict';var o=r(d[0]);if(o.installConsoleErrorReporter(),!g.__fbDisableExceptionsManager){r(d[1]).setGlobalHandler(function(t,n){try{o.handleException(t,n)}catch(o){throw console.log('Failed to print error: ',o.message),t}})}},89,[90,21]); -__d(function(g,r,i,a,m,e,d){'use strict';var o=0;function n(n,s){var l=r(d[0]).ExceptionsManager;if(l){var c=r(d[1])(n),t=++o,p=null==n.jsEngine?n.message:n.message+", js engine: "+n.jsEngine;s?l.reportFatalException(p,c,t):l.reportSoftException(p,c,t)}}function s(){if(console._errorOriginal.apply(console,arguments),console.reportErrorsAsExceptions)if(arguments[0]&&arguments[0].stack)n(arguments[0],!1);else{var o=r(d[2]),s=Array.prototype.map.call(arguments,o).join(', ');if('"Warning: '===s.slice(0,10))return;var l=new Error('console.error: '+s);l.framesToPop=1,n(l,!1)}}m.exports={handleException:function(o,s){o.message||(o=new Error(o)),console._errorOriginal?console._errorOriginal(o.message):console.error(o.message),n(o,s)},installConsoleErrorReporter:function(){console._errorOriginal||(console._errorOriginal=console.error.bind(console),console.error=s,void 0===console.reportErrorsAsExceptions&&(console.reportErrorsAsExceptions=!0))}}},90,[5,91,24]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports=function(t){if(!t||!t.stack)return[];for(var s=r(d[0]),o=Array.isArray(t.stack)?t.stack:s.parse(t.stack),f='number'==typeof t.framesToPop?t.framesToPop:0;f--;)o.shift();return o}},91,[92]); -__d(function(g,r,i,a,m,e,d){m.exports=r(d[0])},92,[93]); -__d(function(g,r,i,a,m,e,d){var n={parse:function(n){for(var o,t,l=/^\s*at (?:(?:(?:Anonymous function)?|((?:\[object object\])?\S+(?: \[as \S+\])?)) )?\(?((?:file|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i,u=/^(?:\s*([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i,s=/^\s*at (?:((?:\[object object\])?\S+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i,c=n.split('\n'),f=[],b=0,h=c.length;b",lineNumber:+o[4],column:o[5]?+o[5]:null};else if(o=l.exec(c[b]))t={file:o[2],methodName:o[1]||"",lineNumber:+o[3],column:o[4]?+o[4]:null};else{if(!(o=s.exec(c[b])))continue;t={file:o[2],methodName:o[1]||"",lineNumber:+o[3],column:o[4]?+o[4]:null}}f.push(t)}return f}};m.exports=n},93,[]); -__d(function(g,r,i,a,m,e,d){'use strict';r(d[0]).checkVersions()},94,[95]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]).PlatformConstants,n=r(d[1]);function o(t){return t.major+"."+t.minor+"."+t.patch+(null!==t.prerelease?"-"+t.prerelease:'')}e.checkVersions=function(){if(t){var s=t.reactNativeVersion;n.version.major===s.major&&n.version.minor===s.minor||console.error("React Native version mismatch.\n\nJavaScript version: "+o(n.version)+"\nNative version: "+o(s)+"\n\nMake sure that you have rebuilt the native code. If the problem persists try clearing the Watchman and packager caches with `watchman watch-del-all && react-native start --reset-cache`.")}}},95,[5,96]); -__d(function(g,r,i,a,m,e,d){e.version={major:0,minor:58,patch:6,prerelease:null}},96,[]); -__d(function(g,r,i,a,m,e,d){'use strict';(0,r(d[0]).polyfillGlobal)('Promise',function(){return r(d[1])})},97,[81,98]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]);m.exports=t},98,[99]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]);r(d[1]),t.prototype.finally=function(t){return this.then(t,t)},m.exports=t},99,[100,102]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]);m.exports=n;var t=h(!0),o=h(!1),f=h(null),u=h(void 0),c=h(0),l=h('');function h(t){var o=new n(n._61);return o._65=1,o._55=t,o}n.resolve=function(v){if(v instanceof n)return v;if(null===v)return f;if(void 0===v)return u;if(!0===v)return t;if(!1===v)return o;if(0===v)return c;if(''===v)return l;if('object'==typeof v||'function'==typeof v)try{var p=v.then;if('function'==typeof p)return new n(p.bind(v))}catch(t){return new n(function(n,o){o(t)})}return h(v)},n.all=function(t){var o=Array.prototype.slice.call(t);return new n(function(t,f){if(0===o.length)return t([]);var u=o.length;function c(l,h){if(h&&('object'==typeof h||'function'==typeof h)){if(h instanceof n&&h.then===n.prototype.then){for(;3===h._65;)h=h._55;return 1===h._65?c(l,h._55):(2===h._65&&f(h._55),void h.then(function(n){c(l,n)},f))}var v=h.then;if('function'==typeof v)return void new n(v.bind(h)).then(function(n){c(l,n)},f)}o[l]=h,0==--u&&t(o)}for(var l=0;l=0;--h){var f=this.tryEntries[h],s=f.completion;if("root"===f.tryLoc)return u("end");if(f.tryLoc<=this.prev){var l=c.call(f,"catchLoc"),p=c.call(f,"finallyLoc");if(l&&p){if(this.prev=0;--o){var u=this.tryEntries[o];if(u.tryLoc<=this.prev&&c.call(u,"finallyLoc")&&this.prev=0;--n){var o=this.tryEntries[n];if(o.finallyLoc===t)return this.complete(o.completion,o.afterLoc),R(o),x}},catch:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc===t){var c=o.completion;if("throw"===c.type){var u=c.arg;R(o)}return u}}throw new Error("illegal catch attempt")},delegateYield:function(t,o,c){return this.delegate={iterator:q(t),resultName:o,nextLoc:c},"next"===this.method&&(this.arg=n),x}}}function O(t,n,o,c){var u=n&&n.prototype instanceof G?n:G,h=Object.create(u.prototype),f=new Y(c||[]);return h._invoke=T(t,o,f),h}function k(t,n,o){try{return{type:"normal",arg:t.call(n,o)}}catch(t){return{type:"throw",arg:t}}}function G(){}function N(){}function P(){}function F(t){["next","throw","return"].forEach(function(n){t[n]=function(t){return this._invoke(n,t)}})}function S(t){function n(o,u,h,f){var s=k(t[o],t,u);if("throw"!==s.type){var l=s.arg,p=l.value;return p&&"object"==typeof p&&c.call(p,"__await")?Promise.resolve(p.__await).then(function(t){n("next",t,h,f)},function(t){n("throw",t,h,f)}):Promise.resolve(p).then(function(t){l.value=t,h(l)},f)}f(s.arg)}var o;this._invoke=function(t,c){function u(){return new Promise(function(o,u){n(t,c,o,u)})}return o=o?o.then(u,u):u()}}function T(t,n,o){var c=y;return function(u,h){if(c===w)throw new Error("Generator is already running");if(c===L){if("throw"===u)throw h;return z()}for(o.method=u,o.arg=h;;){var f=o.delegate;if(f){var s=I(f,o);if(s){if(s===x)continue;return s}}if("next"===o.method)o.sent=o._sent=o.arg;else if("throw"===o.method){if(c===y)throw c=L,o.arg;o.dispatchException(o.arg)}else"return"===o.method&&o.abrupt("return",o.arg);c=w;var l=k(t,n,o);if("normal"===l.type){if(c=o.done?L:v,l.arg===x)continue;return{value:l.arg,done:o.done}}"throw"===l.type&&(c=L,o.method="throw",o.arg=l.arg)}}}function I(t,o){var c=t.iterator[o.method];if(c===n){if(o.delegate=null,"throw"===o.method){if(t.iterator.return&&(o.method="return",o.arg=n,I(t,o),"throw"===o.method))return x;o.method="throw",o.arg=new TypeError("The iterator does not provide a 'throw' method")}return x}var u=k(c,t.iterator,o.arg);if("throw"===u.type)return o.method="throw",o.arg=u.arg,o.delegate=null,x;var h=u.arg;return h?h.done?(o[t.resultName]=h.value,o.next=t.nextLoc,"return"!==o.method&&(o.method="next",o.arg=n),o.delegate=null,x):h:(o.method="throw",o.arg=new TypeError("iterator result is not an object"),o.delegate=null,x)}function A(t){var n={tryLoc:t[0]};1 in t&&(n.catchLoc=t[1]),2 in t&&(n.finallyLoc=t[2],n.afterLoc=t[3]),this.tryEntries.push(n)}function R(t){var n=t.completion||{};n.type="normal",delete n.arg,t.completion=n}function Y(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(A,this),this.reset(!0)}function q(t){if(t){var o=t[h];if(o)return o.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var u=-1,f=function o(){for(;++u0){var t=h.slice();h=[];for(var n=0;n0}function A(t){v[t]=null,s[t]=null,f[t]=null,p[t]=null}function D(t){if(null!=t){var l=v.indexOf(t);if(-1!==l){A(l);var u=f[l];'setImmediate'!==u&&'requestIdleCallback'!==u&&n.deleteTimer(t)}}}var E,O={setTimeout:function(t,l){for(var u=arguments.length,o=new Array(u>2?u-2:0),c=2;c2?u-2:0),c=2;c1?n-1:0),u=1;u-1&&(I.splice(t,1),y(c,o(),!0)),delete T[c],0===I.length&&n.setSendIdleEvents(!1)},u);T[c]=s}return c},cancelIdleCallback:function(t){D(t);var l=I.indexOf(t);-1!==l&&I.splice(l,1);var u=T[t];u&&(O.clearTimeout(u),delete T[t]),0===I.length&&n.setSendIdleEvents(!1)},clearTimeout:function(t){D(t)},clearInterval:function(t){D(t)},clearImmediate:function(t){D(t);var n=h.indexOf(t);-1!==n&&h.splice(n,1)},cancelAnimationFrame:function(t){D(t)},callTimers:function(n){t(0!==n.length,'Cannot call `callTimers` with an empty list of IDs.'),b=null;for(var l=0;l1)for(var o=1;o0){var l=I.slice();I=[];for(var u=0;u=0,loaded:s,total:n})}},{key:"__didCompleteResponse",value:function(t,s,n){t===this._requestId&&(s&&(''!==this._responseType&&'text'!==this._responseType||(this._response=s),this._hasError=!0,n&&(this._timedOut=!0)),this._clearSubscriptions(),this._requestId=null,this.setReadyState(this.DONE),s?S._interceptor&&S._interceptor.loadingFailed(t,s):S._interceptor&&S._interceptor.loadingFinished(t,this._response.length))}},{key:"_clearSubscriptions",value:function(){(this._subscriptions||[]).forEach(function(t){t&&t.remove()}),this._subscriptions=[]}},{key:"getAllResponseHeaders",value:function(){if(!this.responseHeaders)return null;var t=this.responseHeaders||{};return Object.keys(t).map(function(s){return s+': '+t[s]}).join('\r\n')}},{key:"getResponseHeader",value:function(t){var s=this._lowerCaseResponseHeaders[t.toLowerCase()];return void 0!==s?s:null}},{key:"setRequestHeader",value:function(t,s){if(this.readyState!==this.OPENED)throw new Error('Request has not been opened');this._headers[t.toLowerCase()]=String(s)}},{key:"setTrackingName",value:function(t){return this._trackingName=t,this}},{key:"open",value:function(t,s,n){if(this.readyState!==this.UNSENT)throw new Error('Cannot open, already sending');if(void 0!==n&&!n)throw new Error('Synchronous http requests are not supported');if(!s)throw new Error('Cannot load an empty url');this._method=t.toUpperCase(),this._url=s,this._aborted=!1,this.setReadyState(this.OPENED)}},{key:"send",value:function(s){var n=this;if(this.readyState!==this.OPENED)throw new Error('Request has not been opened');if(this._sent)throw new Error('Request has already been sent');this._sent=!0;var o=this._incrementalEvents||!!this.onreadystatechange||!!this.onprogress;this._subscriptions.push(c.addListener('didSendNetworkData',function(s){return n.__didUploadProgress.apply(n,t(s))})),this._subscriptions.push(c.addListener('didReceiveNetworkResponse',function(s){return n.__didReceiveResponse.apply(n,t(s))})),this._subscriptions.push(c.addListener('didReceiveNetworkData',function(s){return n.__didReceiveData.apply(n,t(s))})),this._subscriptions.push(c.addListener('didReceiveNetworkIncrementalData',function(s){return n.__didReceiveIncrementalData.apply(n,t(s))})),this._subscriptions.push(c.addListener('didReceiveNetworkDataProgress',function(s){return n.__didReceiveDataProgress.apply(n,t(s))})),this._subscriptions.push(c.addListener('didCompleteNetworkResponse',function(s){return n.__didCompleteResponse.apply(n,t(s))}));var h='text';'arraybuffer'===this._responseType&&(h='base64'),'blob'===this._responseType&&(h='blob'),y(this._method,'Request method needs to be defined.'),y(this._url,'Request URL needs to be defined.'),c.sendRequest(this._method,this._trackingName,this._url,this._headers,s,h,o,this.timeout,this.__didCreateRequest.bind(this),this.withCredentials)}},{key:"abort",value:function(){this._aborted=!0,this._requestId&&c.abortRequest(this._requestId),this.readyState===this.UNSENT||this.readyState===this.OPENED&&!this._sent||this.readyState===this.DONE||(this._reset(),this.setReadyState(this.DONE)),this._reset()}},{key:"setResponseHeaders",value:function(t){this.responseHeaders=t||null;var s=t||{};this._lowerCaseResponseHeaders=Object.keys(s).reduce(function(t,n){return t[n.toLowerCase()]=s[n],t},{})}},{key:"setReadyState",value:function(t){this.readyState=t,this.dispatchEvent({type:'readystatechange'}),t===this.DONE&&(this._aborted?this.dispatchEvent({type:'abort'}):this._hasError?this._timedOut?this.dispatchEvent({type:'timeout'}):this.dispatchEvent({type:'error'}):this.dispatchEvent({type:'load'}),this.dispatchEvent({type:'loadend'}))}},{key:"addEventListener",value:function(t,n){'readystatechange'!==t&&'progress'!==t||(this._incrementalEvents=!0),s(p(S.prototype),"addEventListener",this).call(this,t,n)}},{key:"responseType",get:function(){return this._responseType},set:function(t){if(this._sent)throw new Error("Failed to set the 'responseType' property on 'XMLHttpRequest': The response type cannot be set after the request has been sent.");w.hasOwnProperty(t)?(y(w[t]||'document'===t,"The provided value '"+t+"' is unsupported in this environment."),'blob'===t&&y(f.isAvailable,'Native module BlobModule is required for blob support'),this._responseType=t):v(!1,"The provided value '"+t+"' is not a valid 'responseType'.")}},{key:"responseText",get:function(){if(''!==this._responseType&&'text'!==this._responseType)throw new Error("The 'responseText' property is only available if 'responseType' is set to '' or 'text', but it is '"+this._responseType+"'.");return this.readyState0){for(var n=Array(arguments.length),l=0;l0?c-4:c,l=0;l>16&255,y[s++]=h>>8&255,y[s++]=255&h;2===C&&(h=n[t.charCodeAt(l)]<<2|n[t.charCodeAt(l+1)]>>4,y[s++]=255&h);1===C&&(h=n[t.charCodeAt(l)]<<10|n[t.charCodeAt(l+1)]<<4|n[t.charCodeAt(l+2)]>>2,y[s++]=h>>8&255,y[s++]=255&h);return y},e.fromByteArray=function(n){for(var o,h=n.length,u=h%3,c=[],f=0,A=h-u;fA?A:f+16383));1===u?(o=n[h-1],c.push(t[o>>2]+t[o<<4&63]+'==')):2===u&&(o=(n[h-2]<<8)+n[h-1],c.push(t[o>>10]+t[o>>4&63]+t[o<<2&63]+'='));return c.join('')};for(var t=[],n=[],o='undefined'!=typeof Uint8Array?Uint8Array:Array,h='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',u=0,c=h.length;u0)throw new Error('Invalid string. Length must be a multiple of 4');var o=t.indexOf('=');return-1===o&&(o=n),[o,o===n?0:4-o%4]}function A(t,n,o){return 3*(n+o)/4-o}function C(n,o,h){for(var u,c,f=[],A=o;A>18&63]+t[c>>12&63]+t[c>>6&63]+t[63&c]);return f.join('')}n['-'.charCodeAt(0)]=62,n['_'.charCodeAt(0)]=63},122,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),s=(function(){function s(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],o=arguments.length>1?arguments[1]:void 0;t(this,s);var u=r(d[2]);this.data=u.createFromParts(n,o).data}return n(s,[{key:"slice",value:function(t,n){var s=r(d[2]),o=this.data,u=o.offset,l=o.size;return'number'==typeof t&&(t>l&&(t=l),u+=t,l-=t,'number'==typeof n&&(n<0&&(n=this.size+n),l=n-t)),s.createFromOptions({blobId:this.data.blobId,offset:u,size:l})}},{key:"close",value:function(){r(d[2]).release(this.data.blobId),this.data=null}},{key:"data",set:function(t){this._data=t},get:function(){if(!this._data)throw new Error('Blob has been closed and is no longer available');return this._data}},{key:"size",get:function(){return this.data.size}},{key:"type",get:function(){return this.data.type||''}}]),s})();m.exports=s},123,[19,20,124]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),u=r(d[3]),c=r(d[4]),x=r(d[5]).BlobModule;var f=(function(){function f(){n(this,f)}return o(f,null,[{key:"createFromParts",value:function(t,n){var o='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(t){var n=16*Math.random()|0;return('x'==t?n:3&n|8).toString(16)}),c=t.map(function(t){if(t instanceof ArrayBuffer||g.ArrayBufferView&&t instanceof g.ArrayBufferView)throw new Error("Creating blobs from 'ArrayBuffer' and 'ArrayBufferView' are not supported");return t instanceof u?{data:t.data,type:'blob'}:{data:String(t),type:'string'}}),l=c.reduce(function(t,n){return'string'===n.type?t+g.unescape(encodeURI(n.data)).length:t+n.data.size},0);return x.createFromParts(c,o),f.createFromOptions({blobId:o,offset:0,size:l,type:n?n.type:'',lastModified:n?n.lastModified:Date.now()})}},{key:"createFromOptions",value:function(n){return c.register(n.blobId),t(Object.create(u.prototype),{data:n})}},{key:"release",value:function(t){c.unregister(t),c.has(t)||x.release(t)}},{key:"addNetworkingHandler",value:function(){x.addNetworkingHandler()}},{key:"addWebSocketHandler",value:function(t){x.addWebSocketHandler(t)}},{key:"removeWebSocketHandler",value:function(t){x.removeWebSocketHandler(t)}},{key:"sendOverSocket",value:function(t,n){x.sendOverSocket(t.data,n)}}]),f})();f.isAvailable=!!x,m.exports=f},124,[8,19,20,123,125,5]); -__d(function(g,r,i,a,m,e,d){var n={};m.exports={register:function(t){n[t]?n[t]++:n[t]=1},unregister:function(t){n[t]&&(n[t]--,n[t]<=0&&delete n[t])},has:function(t){return n[t]&&n[t]>0}}},125,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),s=r(d[2]),o=r(d[3]),p=(function(){function p(){s(this,p),this._parts=[]}return o(p,[{key:"append",value:function(t,n){this._parts.push([t,n])}},{key:"getParts",value:function(){return this._parts.map(function(s){var o=n(s,2),p=o[0],f=o[1],u={'content-disposition':'form-data; name="'+p+'"'};return'object'==typeof f&&f?('string'==typeof f.name&&(u['content-disposition']+='; filename="'+f.name+'"'),'string'==typeof f.type&&(u['content-type']=f.type),t({},f,{headers:u,fieldName:p})):{string:String(f),headers:u,fieldName:p}})}}]),p})();m.exports=p},126,[44,9,19,20]); -__d(function(g,r,i,a,m,e,d){'use strict';var s=r(d[0]);s&&s.fetch?m.exports=s:m.exports={fetch:fetch,Headers:Headers,Request:Request,Response:Response}},127,[128]); -__d(function(g,r,i,a,m,e,d){!(function(t){'use strict';if(!t.fetch){var o={searchParams:'URLSearchParams'in t,iterable:'Symbol'in t&&'iterator'in Symbol,blob:'FileReader'in t&&'Blob'in t&&(function(){try{return new Blob,!0}catch(t){return!1}})(),formData:'FormData'in t,arrayBuffer:'ArrayBuffer'in t};if(o.arrayBuffer)var n=['[object Int8Array]','[object Uint8Array]','[object Uint8ClampedArray]','[object Int16Array]','[object Uint16Array]','[object Int32Array]','[object Uint32Array]','[object Float32Array]','[object Float64Array]'],s=function(t){return t&&DataView.prototype.isPrototypeOf(t)},h=ArrayBuffer.isView||function(t){return t&&n.indexOf(Object.prototype.toString.call(t))>-1};p.prototype.append=function(t,o){t=y(t),o=l(o);var n=this.map[t];this.map[t]=n?n+','+o:o},p.prototype.delete=function(t){delete this.map[y(t)]},p.prototype.get=function(t){return t=y(t),this.has(t)?this.map[t]:null},p.prototype.has=function(t){return this.map.hasOwnProperty(y(t))},p.prototype.set=function(t,o){this.map[y(t)]=l(o)},p.prototype.forEach=function(t,o){for(var n in this.map)this.map.hasOwnProperty(n)&&t.call(o,this.map[n],n,this)},p.prototype.keys=function(){var t=[];return this.forEach(function(o,n){t.push(n)}),c(t)},p.prototype.values=function(){var t=[];return this.forEach(function(o){t.push(o)}),c(t)},p.prototype.entries=function(){var t=[];return this.forEach(function(o,n){t.push([n,o])}),c(t)},o.iterable&&(p.prototype["function"==typeof Symbol?Symbol.iterator:"@@iterator"]=p.prototype.entries);var f=['DELETE','GET','HEAD','OPTIONS','POST','PUT'];T.prototype.clone=function(){return new T(this,{body:this._bodyInit})},A.call(T.prototype),A.call(P.prototype),P.prototype.clone=function(){return new P(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new p(this.headers),url:this.url})},P.error=function(){var t=new P(null,{status:0,statusText:''});return t.type='error',t};var u=[301,302,303,307,308];P.redirect=function(t,o){if(-1===u.indexOf(o))throw new RangeError('Invalid status code');return new P(null,{status:o,headers:{location:t}})},t.Headers=p,t.Request=T,t.Response=P,t.fetch=function(t,o){return new Promise(function(n,s){var h=new T(t,o),f=new XMLHttpRequest;f.onload=function(){var t,o,s={status:f.status,statusText:f.statusText,headers:(t=f.getAllResponseHeaders()||'',o=new p,t.replace(/\r?\n[\t ]+/g,' ').split(/\r?\n/).forEach(function(t){var n=t.split(':'),s=n.shift().trim();if(s){var h=n.join(':').trim();o.append(s,h)}}),o)};s.url='responseURL'in f?f.responseURL:s.headers.get('X-Request-URL');var h='response'in f?f.response:f.responseText;n(new P(h,s))},f.onerror=function(){s(new TypeError('Network request failed'))},f.ontimeout=function(){s(new TypeError('Network request failed'))},f.open(h.method,h.url,!0),'include'===h.credentials?f.withCredentials=!0:'omit'===h.credentials&&(f.withCredentials=!1),h.headers.forEach(function(t,o){f.setRequestHeader(o,t)}),f.send(void 0===h._bodyInit?null:h._bodyInit)})},t.fetch.polyfill=!0}function y(t){if('string'!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(t))throw new TypeError('Invalid character in header field name');return t.toLowerCase()}function l(t){return'string'!=typeof t&&(t=String(t)),t}function c(t){var n={next:function(){var o=t.shift();return{done:void 0===o,value:o}}};return o.iterable&&(n["function"==typeof Symbol?Symbol.iterator:"@@iterator"]=function(){return n}),n}function p(t){this.map={},t instanceof p?t.forEach(function(t,o){this.append(o,t)},this):Array.isArray(t)?t.forEach(function(t){this.append(t[0],t[1])},this):t&&Object.getOwnPropertyNames(t).forEach(function(o){this.append(o,t[o])},this)}function b(t){if(t.bodyUsed)return Promise.reject(new TypeError('Already read'));t.bodyUsed=!0}function w(t){return new Promise(function(o,n){t.onload=function(){o(t.result)},t.onerror=function(){n(t.error)}})}function _(t){var o=new FileReader,n=w(o);return o.readAsArrayBuffer(t),n}function v(t){for(var o=new Uint8Array(t),n=new Array(o.length),s=0;s-1?s:n),this.mode=o.mode||this.mode||null,this.referrer=null,('GET'===this.method||'HEAD'===this.method)&&h)throw new TypeError('Body not allowed for GET or HEAD requests');this._initBody(h)}function E(t){var o=new FormData;return t.trim().split('&').forEach(function(t){if(t){var n=t.split('='),s=n.shift().replace(/\+/g,' '),h=n.join('=').replace(/\+/g,' ');o.append(decodeURIComponent(s),decodeURIComponent(h))}}),o}function P(t,o){o||(o={}),this.type='default',this.status=void 0===o.status?200:o.status,this.ok=this.status>=200&&this.status<300,this.statusText='statusText'in o?o.statusText:'OK',this.headers=new p(o.headers),this.url=o.url||'',this._initBody(t)}})('undefined'!=typeof self?self:this)},128,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]),n=r(d[2]),o=r(d[3]),c=r(d[4]),l=r(d[5]),u=r(d[6]),b=r(d[7]),h=r(d[8]),y=r(d[9]),f=r(d[10]),v=(r(d[11]),r(d[12])),p=r(d[13]),_=r(d[14]),k=r(d[15]),E=f.WebSocketModule,S=0,I=1,w=2,N=3,O=0,C=(function(b){function f(n,l,u){var b;s(this,f),(b=o(this,c(f).call(this))).CONNECTING=S,b.OPEN=I,b.CLOSING=w,b.CLOSED=N,b.readyState=S,'string'==typeof l&&(l=[l]);var y=u||{},v=y.headers,p=void 0===v?{}:v,_=t(y,["headers"]);if(_&&'string'==typeof _.origin&&(console.warn('Specifying `origin` as a WebSocket connection option is deprecated. Include it under `headers` instead.'),p.origin=_.origin,delete _.origin),Object.keys(_).length>0&&console.warn('Unrecognized WebSocket connection option(s) `'+Object.keys(_).join('`, `')+"`. Did you mean to put these under `headers`?"),Array.isArray(l)||(l=null),!f.isAvailable)throw new Error("Cannot initialize WebSocket module. Native module WebSocketModule is missing.");return b._eventEmitter=new h(E),b._socketId=O++,b._registerEvents(),E.connect(n,l,{headers:p},b._socketId),b}return l(f,b),n(f,[{key:"close",value:function(t,s){this.readyState!==this.CLOSING&&this.readyState!==this.CLOSED&&(this.readyState=this.CLOSING,this._close(t,s))}},{key:"send",value:function(t){if(this.readyState===this.CONNECTING)throw new Error('INVALID_STATE_ERR');if(t instanceof u)return k(y.isAvailable,'Native module BlobModule is required for blob support'),void y.sendOverSocket(t,this._socketId);if('string'!=typeof t){if(!(t instanceof ArrayBuffer||ArrayBuffer.isView(t)))throw new Error('Unsupported data type');E.sendBinary(_(t),this._socketId)}else E.send(t,this._socketId)}},{key:"ping",value:function(){if(this.readyState===this.CONNECTING)throw new Error('INVALID_STATE_ERR');E.ping(this._socketId)}},{key:"_close",value:function(t,s){var n='number'==typeof t?t:1e3,o='string'==typeof s?s:'';E.close(n,o,this._socketId),y.isAvailable&&'blob'===this._binaryType&&y.removeWebSocketHandler(this._socketId)}},{key:"_unregisterEvents",value:function(){this._subscriptions.forEach(function(t){return t.remove()}),this._subscriptions=[]}},{key:"_registerEvents",value:function(){var t=this;this._subscriptions=[this._eventEmitter.addListener('websocketMessage',function(s){if(s.id===t._socketId){var n=s.data;switch(s.type){case'binary':n=p.toByteArray(s.data).buffer;break;case'blob':n=y.createFromOptions(s.data)}t.dispatchEvent(new v('message',{data:n}))}}),this._eventEmitter.addListener('websocketOpen',function(s){s.id===t._socketId&&(t.readyState=t.OPEN,t.dispatchEvent(new v('open')))}),this._eventEmitter.addListener('websocketClosed',function(s){s.id===t._socketId&&(t.readyState=t.CLOSED,t.dispatchEvent(new v('close',{code:s.code,reason:s.reason})),t._unregisterEvents(),t.close())}),this._eventEmitter.addListener('websocketFailed',function(s){s.id===t._socketId&&(t.readyState=t.CLOSED,t.dispatchEvent(new v('error',{message:s.message})),t.dispatchEvent(new v('close',{message:s.message})),t._unregisterEvents(),t.close())})]}},{key:"binaryType",get:function(){return this._binaryType},set:function(t){if('blob'!==t&&'arraybuffer'!==t)throw new Error("binaryType must be either 'blob' or 'arraybuffer'");'blob'!==this._binaryType&&'blob'!==t||(k(y.isAvailable,'Native module BlobModule is required for blob support'),'blob'===t?y.addWebSocketHandler(this._socketId):y.removeWebSocketHandler(this._socketId)),this._binaryType=t}}]),f})(b.apply(void 0,['close','error','message','open']));C.CONNECTING=S,C.OPEN=I,C.CLOSING=w,C.CLOSED=N,C.isAvailable=!!E,m.exports=C},129,[6,19,20,27,30,33,123,113,119,124,5,41,130,122,121,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]);m.exports=function n(o,c){s(this,n),this.type=o.toString(),t(this,c)}},130,[8,19]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),s=r(d[2]),u=r(d[3]),l=r(d[4]),o=r(d[5]),c=r(d[6]),h=(function(h){function f(n,l,o){var h;return t(this,f),c(null!=n&&null!=l,'Failed to construct `File`: Must pass both `parts` and `name` arguments.'),(h=s(this,u(f).call(this,n,o))).data.name=l,h}return l(f,o),n(f,[{key:"name",get:function(){return c(null!=this.data.name,'Files must have a name set.'),this.data.name}},{key:"lastModified",get:function(){return this.data.lastModified||0}}]),f})();m.exports=h},131,[19,20,27,30,33,123,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]),n=r(d[2]),o=r(d[3]),u=r(d[4]),h=r(d[5]),_=(r(d[6]),r(d[7]).FileReaderModule),c=0,y=1,l=2,f=(function(h){function f(){var s;return t(this,f),(s=n(this,o(f).call(this))).EMPTY=c,s.LOADING=y,s.DONE=l,s._aborted=!1,s._subscriptions=[],s._reset(),s}return u(f,h),s(f,[{key:"_reset",value:function(){this._readyState=c,this._error=null,this._result=null}},{key:"_clearSubscriptions",value:function(){this._subscriptions.forEach(function(t){return t.remove()}),this._subscriptions=[]}},{key:"_setReadyState",value:function(t){this._readyState=t,this.dispatchEvent({type:'readystatechange'}),t===l&&(this._aborted?this.dispatchEvent({type:'abort'}):this._error?this.dispatchEvent({type:'error'}):this.dispatchEvent({type:'load'}),this.dispatchEvent({type:'loadend'}))}},{key:"readAsArrayBuffer",value:function(){throw new Error('FileReader.readAsArrayBuffer is not implemented')}},{key:"readAsDataURL",value:function(t){var s=this;this._aborted=!1,_.readAsDataURL(t.data).then(function(t){s._aborted||(s._result=t,s._setReadyState(l))},function(t){s._aborted||(s._error=t,s._setReadyState(l))})}},{key:"readAsText",value:function(t){var s=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:'UTF-8';this._aborted=!1,_.readAsText(t.data,n).then(function(t){s._aborted||(s._result=t,s._setReadyState(l))},function(t){s._aborted||(s._error=t,s._setReadyState(l))})}},{key:"abort",value:function(){this._aborted=!0,this._readyState!==c&&this._readyState!==l&&(this._reset(),this._setReadyState(l)),this._reset()}},{key:"readyState",get:function(){return this._readyState}},{key:"error",get:function(){return this._error}},{key:"result",get:function(){return this._result}}]),f})(h.apply(void 0,['abort','error','load','loadstart','loadend','progress']));f.EMPTY=c,f.LOADING=y,f.DONE=l,m.exports=f},132,[19,20,27,30,33,113,123,5]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),o=r(d[1]),n=(r(d[2]),r(d[3]).BlobModule),u=null;n&&'string'==typeof n.BLOB_URI_SCHEME&&(u=n.BLOB_URI_SCHEME+':','string'==typeof n.BLOB_URI_HOST&&(u+="//"+n.BLOB_URI_HOST+"/"));var f=(function(){function n(){throw t(this,n),new Error('Creating URL objects is not supported yet.')}return o(n,null,[{key:"createObjectURL",value:function(t){if(null===u)throw new Error('Cannot create URL for blob!');return""+u+t.data.blobId+"?offset="+t.data.offset+"&size="+t.size}},{key:"revokeObjectURL",value:function(t){}}]),n})();m.exports=f},133,[19,20,123,5]); -__d(function(g,r,i,a,m,e,d){'use strict';g.alert||(g.alert=function(t){r(d[0]).alert('Alert',''+t)})},134,[135]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),t=r(d[1]),o=r(d[2]),s=(r(d[3]),r(d[4])),l=(r(d[5]),(function(){function n(){t(this,n)}return o(n,null,[{key:"alert",value:function(n,t,o,s,l){u.alert(n,t,o,s)}}]),n})()),u=(function(){function l(){t(this,l)}return o(l,null,[{key:"alert",value:function(t,o,l,u){var c={title:t||'',message:o||''};u&&(c=n({},c,{cancelable:u.cancelable}));var b=l?l.slice(0,3):[{text:'OK'}],f=b.pop(),v=b.pop(),D=b.pop();D&&(c=n({},c,{buttonNeutral:D.text||''})),v&&(c=n({},c,{buttonNegative:v.text||''})),f&&(c=n({},c,{buttonPositive:f.text||''})),s.DialogManagerAndroid.showAlert(c,function(n){return console.warn(n)},function(n,t){n===s.DialogManagerAndroid.buttonClicked?t===s.DialogManagerAndroid.buttonNeutral?D.onPress&&D.onPress():t===s.DialogManagerAndroid.buttonNegative?v.onPress&&v.onPress():t===s.DialogManagerAndroid.buttonPositive&&f.onPress&&f.onPress():n===s.DialogManagerAndroid.dismissed&&u&&u.onDismiss&&u.onDismiss()})}}]),l})();m.exports=l},135,[44,19,20,136,5,41]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),l=r(d[2]).AlertManager,o=(function(){function o(){t(this,o)}return n(o,null,[{key:"alert",value:function(t,n,l,o){if(void 0!==o)return console.warn('AlertIOS.alert() with a 4th "type" parameter is deprecated and will be removed. Use AlertIOS.prompt() instead.'),void this.prompt(t,n,l,o);this.prompt(t,n,l,'default')}},{key:"prompt",value:function(t,n,o){var u=arguments.length>3&&void 0!==arguments[3]?arguments[3]:'plain-text',s=arguments.length>4?arguments[4]:void 0,c=arguments.length>5?arguments[5]:void 0;if('function'!=typeof u){var p,f,v=[],y=[];'function'==typeof o?v=[o]:o instanceof Array&&o.forEach(function(t,n){if(v[n]=t.onPress,'cancel'===t.style?p=String(n):'destructive'===t.style&&(f=String(n)),t.text||n<(o||[]).length-1){var l={};l[n]=t.text||'',y.push(l)}}),l.alertWithArgs({title:t||'',message:n||void 0,buttons:y,type:u||void 0,defaultValue:s,cancelButtonKey:p,destructiveButtonKey:f,keyboardType:c},function(t,n){var l=v[t];l&&l(n)})}else{console.warn("You passed a callback function as the \"type\" argument to AlertIOS.prompt(). React Native is assuming you want to use the deprecated AlertIOS.prompt(title, defaultValue, buttons, callback) signature. The current signature is AlertIOS.prompt(title, message, callbackOrButtons, type, defaultValue, keyboardType) and the old syntax will be removed in a future version.");var h=u;l.alertWithArgs({title:t||'',type:'plain-text',defaultValue:n},function(t,n){h(n)})}}}]),o})();m.exports=o},136,[19,20,5]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]).polyfillObjectProperty,o=g.navigator;void 0===o&&(g.navigator=o={}),t(o,'product',function(){return'ReactNative'}),t(o,'geolocation',function(){return r(d[1])})},137,[81,138]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]).LocationObserver,s=r(d[3]),c=r(d[4]),u=r(d[5]),v=new n(o),f=r(d[6]),l=r(d[7]),h=[],p=!1,C={setRNConfiguration:function(t){o.setConfiguration&&o.setConfiguration(t)},requestAuthorization:function(){o.requestAuthorization()},getCurrentPosition:function(n,u,v){var h,p;return t.async(function(C){for(;;)switch(C.prev=C.next){case 0:if(s('function'==typeof n,'Must provide a valid geo_success callback.'),h=!0,!(f.Version>=23)){C.next=11;break}return C.next=5,t.awrap(l.check(l.PERMISSIONS.ACCESS_FINE_LOCATION));case 5:if(h=C.sent){C.next=11;break}return C.next=9,t.awrap(l.request(l.PERMISSIONS.ACCESS_FINE_LOCATION));case 9:p=C.sent,h=p===l.RESULTS.GRANTED;case 11:h&&o.getCurrentPosition(v||{},n,u||c);case 12:case"end":return C.stop()}},null,this)},watchPosition:function(t,n,s){p||(o.startObserving(s||{}),p=!0);var c=h.length;return h.push([v.addListener('geolocationDidChange',t),n?v.addListener('geolocationError',n):null]),c},clearWatch:function(t){var n=h[t];if(n){n[0].remove();var o=n[1];o&&o.remove(),h[t]=void 0;for(var s=!0,c=0;c=0,o=n&&t.regeneratorRuntime;if(t.regeneratorRuntime=void 0,m.exports=r(d[0]),n)t.regeneratorRuntime=o;else try{delete t.regeneratorRuntime}catch(n){t.regeneratorRuntime=void 0}},140,[141]); -__d(function(g,r,i,a,m,e,d){!(function(t){"use strict";var n,o=Object.prototype,c=o.hasOwnProperty,u="function"==typeof Symbol?Symbol:{},h=u.iterator||"@@iterator",f=u.asyncIterator||"@@asyncIterator",s=u.toStringTag||"@@toStringTag",l="object"==typeof m,p=t.regeneratorRuntime;if(p)l&&(m.exports=p);else{(p=t.regeneratorRuntime=l?m.exports:{}).wrap=O;var y="suspendedStart",v="suspendedYield",w="executing",L="completed",x={},E={};E[h]=function(){return this};var b=Object.getPrototypeOf,_=b&&b(b(q([])));_&&_!==o&&c.call(_,h)&&(E=_);var j=P.prototype=G.prototype=Object.create(E);N.prototype=j.constructor=P,P.constructor=N,P[s]=N.displayName="GeneratorFunction",p.isGeneratorFunction=function(t){var n="function"==typeof t&&t.constructor;return!!n&&(n===N||"GeneratorFunction"===(n.displayName||n.name))},p.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,P):(t.__proto__=P,s in t||(t[s]="GeneratorFunction")),t.prototype=Object.create(j),t},p.awrap=function(t){return{__await:t}},F(S.prototype),S.prototype[f]=function(){return this},p.AsyncIterator=S,p.async=function(t,n,o,c){var u=new S(O(t,n,o,c));return p.isGeneratorFunction(n)?u:u.next().then(function(t){return t.done?t.value:u.next()})},F(j),j[s]="Generator",j[h]=function(){return this},j.toString=function(){return"[object Generator]"},p.keys=function(t){var n=[];for(var o in t)n.push(o);return n.reverse(),function o(){for(;n.length;){var c=n.pop();if(c in t)return o.value=c,o.done=!1,o}return o.done=!0,o}},p.values=q,Y.prototype={constructor:Y,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=n,this.done=!1,this.delegate=null,this.method="next",this.arg=n,this.tryEntries.forEach(R),!t)for(var o in this)"t"===o.charAt(0)&&c.call(this,o)&&!isNaN(+o.slice(1))&&(this[o]=n)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var o=this;function u(c,u){return s.type="throw",s.arg=t,o.next=c,u&&(o.method="next",o.arg=n),!!u}for(var h=this.tryEntries.length-1;h>=0;--h){var f=this.tryEntries[h],s=f.completion;if("root"===f.tryLoc)return u("end");if(f.tryLoc<=this.prev){var l=c.call(f,"catchLoc"),p=c.call(f,"finallyLoc");if(l&&p){if(this.prev=0;--o){var u=this.tryEntries[o];if(u.tryLoc<=this.prev&&c.call(u,"finallyLoc")&&this.prev=0;--n){var o=this.tryEntries[n];if(o.finallyLoc===t)return this.complete(o.completion,o.afterLoc),R(o),x}},catch:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc===t){var c=o.completion;if("throw"===c.type){var u=c.arg;R(o)}return u}}throw new Error("illegal catch attempt")},delegateYield:function(t,o,c){return this.delegate={iterator:q(t),resultName:o,nextLoc:c},"next"===this.method&&(this.arg=n),x}}}function O(t,n,o,c){var u=n&&n.prototype instanceof G?n:G,h=Object.create(u.prototype),f=new Y(c||[]);return h._invoke=T(t,o,f),h}function k(t,n,o){try{return{type:"normal",arg:t.call(n,o)}}catch(t){return{type:"throw",arg:t}}}function G(){}function N(){}function P(){}function F(t){["next","throw","return"].forEach(function(n){t[n]=function(t){return this._invoke(n,t)}})}function S(t){function n(o,u,h,f){var s=k(t[o],t,u);if("throw"!==s.type){var l=s.arg,p=l.value;return p&&"object"==typeof p&&c.call(p,"__await")?Promise.resolve(p.__await).then(function(t){n("next",t,h,f)},function(t){n("throw",t,h,f)}):Promise.resolve(p).then(function(t){l.value=t,h(l)},function(t){return n("throw",t,h,f)})}f(s.arg)}var o;this._invoke=function(t,c){function u(){return new Promise(function(o,u){n(t,c,o,u)})}return o=o?o.then(u,u):u()}}function T(t,n,o){var c=y;return function(u,h){if(c===w)throw new Error("Generator is already running");if(c===L){if("throw"===u)throw h;return z()}for(o.method=u,o.arg=h;;){var f=o.delegate;if(f){var s=I(f,o);if(s){if(s===x)continue;return s}}if("next"===o.method)o.sent=o._sent=o.arg;else if("throw"===o.method){if(c===y)throw c=L,o.arg;o.dispatchException(o.arg)}else"return"===o.method&&o.abrupt("return",o.arg);c=w;var l=k(t,n,o);if("normal"===l.type){if(c=o.done?L:v,l.arg===x)continue;return{value:l.arg,done:o.done}}"throw"===l.type&&(c=L,o.method="throw",o.arg=l.arg)}}}function I(t,o){var c=t.iterator[o.method];if(c===n){if(o.delegate=null,"throw"===o.method){if(t.iterator.return&&(o.method="return",o.arg=n,I(t,o),"throw"===o.method))return x;o.method="throw",o.arg=new TypeError("The iterator does not provide a 'throw' method")}return x}var u=k(c,t.iterator,o.arg);if("throw"===u.type)return o.method="throw",o.arg=u.arg,o.delegate=null,x;var h=u.arg;return h?h.done?(o[t.resultName]=h.value,o.next=t.nextLoc,"return"!==o.method&&(o.method="next",o.arg=n),o.delegate=null,x):h:(o.method="throw",o.arg=new TypeError("iterator result is not an object"),o.delegate=null,x)}function A(t){var n={tryLoc:t[0]};1 in t&&(n.catchLoc=t[1]),2 in t&&(n.finallyLoc=t[2],n.afterLoc=t[3]),this.tryEntries.push(n)}function R(t){var n=t.completion||{};n.type="normal",delete n.arg,t.completion=n}function Y(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(A,this),this.reset(!0)}function q(t){if(t){var o=t[h];if(o)return o.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var u=-1,f=function o(){for(;++u1?n-1:0),c=1;c1?c-1:0),s=1;s2&&void 0!==arguments[2]?arguments[2]:-1;if(0===o)return!0;if(n===f)return!1;if('function'==typeof n&&'function'==typeof f)return!1;if('object'!=typeof n||null===n)return n!==f;if('object'!=typeof f||null===f)return!0;if(n.constructor!==f.constructor)return!0;if(Array.isArray(n)){var u=n.length;if(f.length!==u)return!0;for(var c=0;c=o){s=t;break}t=t.next}while(t!==n);null===s?s=n:s===n&&(n=v,c()),(o=s.previous).next=s.previous=v,v.next=s,v.previous=o}}function v(){if(-1===o&&null!==n&&1===n.priorityLevel){s=!0;try{do{p()}while(null!==n&&1===n.priorityLevel)}finally{s=!1,null!==n?c():f=!1}}}function y(l){s=!0;var o=t;t=l;try{if(l)for(;null!==n;){var u=e.unstable_now();if(!(n.expirationTime<=u))break;do{p()}while(null!==n&&n.expirationTime<=u)}else if(null!==n)do{p()}while(null!==n&&!C())}finally{s=!1,t=o,null!==n?c():f=!1,v()}}var b,w,_=Date,x="function"==typeof setTimeout?setTimeout:void 0,h="function"==typeof clearTimeout?clearTimeout:void 0,k="function"==typeof requestAnimationFrame?requestAnimationFrame:void 0,T="function"==typeof cancelAnimationFrame?cancelAnimationFrame:void 0;function M(n){b=k(function(t){h(w),n(t)}),w=x(function(){T(b),n(e.unstable_now())},100)}if("object"==typeof performance&&"function"==typeof performance.now){var P=performance;e.unstable_now=function(){return P.now()}}else e.unstable_now=function(){return _.now()};var L,A,C,F=null;if("undefined"!=typeof window?F=window:void 0!==g&&(F=g),F&&F._schedMock){var j=F._schedMock;L=j[0],A=j[1],C=j[2],e.unstable_now=j[3]}else if("undefined"==typeof window||"function"!=typeof MessageChannel){var q=null,I=function(n){if(null!==q)try{q(n)}finally{q=null}};L=function(n){null!==q?setTimeout(L,0,n):(q=n,setTimeout(I,0,!1))},A=function(){q=null},C=function(){return!1}}else{"undefined"!=typeof console&&("function"!=typeof k&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),"function"!=typeof T&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));var B=null,D=!1,N=-1,O=!1,U=!1,W=0,Y=33,z=33;C=function(){return W<=e.unstable_now()};var E=new MessageChannel,G=E.port2;E.port1.onmessage=function(){D=!1;var n=B,t=N;B=null,N=-1;var l=e.unstable_now(),o=!1;if(0>=W-l){if(!(-1!==t&&t<=l))return O||(O=!0,M(H)),B=n,void(N=t);o=!0}if(null!==n){U=!0;try{n(o)}finally{U=!1}}};var H=function n(t){if(null!==B){M(n);var l=t-W+z;ll&&(l=8),z=lt?G.postMessage(void 0):O||(O=!0,M(H))},A=function(){B=null,D=!1,N=-1}}e.unstable_ImmediatePriority=1,e.unstable_UserBlockingPriority=2,e.unstable_NormalPriority=3,e.unstable_IdlePriority=5,e.unstable_LowPriority=4,e.unstable_runWithPriority=function(n,t){switch(n){case 1:case 2:case 3:case 4:case 5:break;default:n=3}var u=l,s=o;l=n,o=e.unstable_now();try{return t()}finally{l=u,o=s,v()}},e.unstable_scheduleCallback=function(t,u){var s=-1!==o?o:e.unstable_now();if("object"==typeof u&&null!==u&&"number"==typeof u.timeout)u=s+u.timeout;else switch(l){case 1:u=s+-1;break;case 2:u=s+250;break;case 5:u=s+1073741823;break;case 4:u=s+1e4;break;default:u=s+5e3}if(t={callback:t,priorityLevel:l,expirationTime:u,next:null,previous:null},null===n)n=t.next=t.previous=t,c();else{s=null;var f=n;do{if(f.expirationTime>u){s=f;break}f=f.next}while(f!==n);null===s?s=n:s===n&&(n=t,c()),(u=s.previous).next=s.previous=t,t.next=s,t.previous=u}return t},e.unstable_cancelCallback=function(t){var l=t.next;if(null!==l){if(l===t)n=null;else{t===n&&(n=l);var o=t.previous;o.next=l,l.previous=o}t.next=t.previous=null}},e.unstable_wrapCallback=function(n){var t=l;return function(){var u=l,s=o;l=t,o=e.unstable_now();try{return n.apply(this,arguments)}finally{l=u,o=s,v()}}},e.unstable_getCurrentPriorityLevel=function(){return l},e.unstable_shouldYield=function(){return!t&&(null!==n&&n.expirationTime=s)return t[n];return t[t.length-1]||1}}]),c})();m.exports=c},167,[19,20,51,41,168,3]); -__d(function(g,r,i,a,m,e,d){'use strict';function t(t){switch(t){case.75:return'ldpi';case 1:return'mdpi';case 1.5:return'hdpi';case 2:return'xhdpi';case 3:return'xxhdpi';case 4:return'xxxhdpi'}throw new Error('no such scale')}var n=new Set(['gif','jpeg','jpg','png','svg','webp','xml']);function s(t){var n=t.httpServerLocation;return'/'===n[0]&&(n=n.substr(1)),n}m.exports={getAndroidAssetSuffix:t,getAndroidResourceFolderName:function(s,o){if(!n.has(s.type))return'raw';var u=t(o);if(!u)throw new Error("Don't know which android drawable suffix to use for asset: "+JSON.stringify(s));return'drawable-'+u},getAndroidResourceIdentifier:function(t){return(s(t)+'/'+t.name).toLowerCase().replace(/\//g,'_').replace(/([^a-z0-9_])/g,'').replace(/^assets_/,'')},getBasePath:s}},168,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2])('AndroidProgressBar'),s=n.forwardRef(function(s,f){return n.createElement(o,t({},s,{ref:f}))});s.defaultProps={styleAttr:'Normal',indeterminate:!0,animating:!0},m.exports=s},169,[8,46,159]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),l=r(d[3]),u=r(d[4]),s=r(d[5]),f=r(d[6]),c=r(d[7]),h=r(d[8]),p=r(d[9]),v=r(d[10]),y=r(d[11]),b=r(d[12]),k=r(d[13]);function S(t,n){if(null==t||null==n)return!0;if(t.length!==n.length)return!0;for(var o=0;o must be a child of a '),h.createElement(W,{opacity:E(t),transform:D(t)},this.props.children)}}]),f})(h.Component);F.contextTypes={isInSurface:p.bool.isRequired};var M=(function(s){function f(){return t(this,f),o(this,l(f).apply(this,arguments))}return u(f,s),n(f,[{key:"render",value:function(){var t=this.props,n=[N(t.x,0),N(t.y,0),N(t.width,0),N(t.height,0)],o=b(t);return delete o.x,delete o.y,h.createElement(W,{clipping:n,opacity:E(t),transform:D(o)},this.props.children)}}]),f})(h.Component),P=0,X=1,Y=2,O=3;function q(t,n,o){var l=new s(t);n[o+0]=l.red/255,n[o+1]=l.green/255,n[o+2]=l.blue/255,n[o+3]=l.alpha}function j(t,n,o){var l=0;if('length'in t)for(;lT?(X-=M,Y-=b):f>0&&0!=T&&(X-=f/T*M,Y-=f/T*b),l=X*X+Y*Y,(f=(X=o-t)*M+(Y=u-n)*b)>T?(X-=M,Y-=b):f>0&&0!=T&&(X-=f/T*M,Y-=f/T*b),v=X*X+Y*Y,l<.01&&v<.01)this.onLine(t,n,p,c);else{if(isNaN(l)||isNaN(v))throw new Error('Bad input');var k=.5*(s+o),w=.5*(h+u),_=.5*(s+t),D=.5*(h+n),z=.5*(_+k),C=.5*(D+w),B=.5*(p+o),A=.5*(c+u),L=.5*(B+k),I=.5*(A+w),P=.5*(z+L),N=.5*(C+I);this.onBezierCurve(t,n,_,D,z,C,P,N),this.onBezierCurve(P,N,L,I,B,A,p,c)}},onArc:function(t,n,s,h,o,u,p,c,l,v,X,Y){var f=Y?Y*Math.PI/180:0,M=Math.cos(f),b=Math.sin(f),T=M*p,k=-b*c,w=b*p,_=M*c,D=v-l;D<0&&!X?D+=2*Math.PI:D>0&&X&&(D-=2*Math.PI);for(var z=Math.ceil(Math.abs(D/(Math.PI/2))),C=D/z,B=1.3333333333333333*Math.tan(C/4),A=Math.cos(l),L=Math.sin(l),I=0;Ithis.yy/this.xy?-1:1;return(this.xx<0?this.xy>=0:this.xy<0)&&(x=-x),this.rotate(t-180*Math.atan2(x*this.yx,x*this.xx)/Math.PI,s,h)},scaleTo:function(t,s){var h=Math.sqrt(this.xx*this.xx+this.yx*this.yx);return this.xx/=h,this.yx/=h,h=Math.sqrt(this.yy*this.yy+this.xy*this.xy),this.yy/=h,this.xy/=h,this.scale(t,s)},resizeTo:function(t,s){var h=this.width,x=this.height;return h&&x?this.scaleTo(t/h,s/x):this},inversePoint:function(t,s){var h=this.xx,x=this.yx,y=this.xy,n=this.yy,o=this.x,u=this.y,f=x*y-h*n;return 0==f?null:{x:(n*(o-t)+y*(s-u))/f,y:(h*(u-s)+x*(t-o))/f}},point:function(t,s){return{x:this.xx*t+this.xy*s+this.x,y:this.yx*t+this.yy*s+this.y}}})},175,[173]); -__d(function(g,r,i,a,m,e,d){'use strict';var s=r(d[0]),t=r(d[1]),c={};c.UIView={pointerEvents:!0,accessible:!0,accessibilityActions:!0,accessibilityLabel:!0,accessibilityComponentType:!0,accessibilityLiveRegion:!0,accessibilityRole:!0,accessibilityStates:!0,accessibilityTraits:!0,accessibilityHint:!0,importantForAccessibility:!0,nativeID:!0,testID:!0,renderToHardwareTextureAndroid:!0,shouldRasterizeIOS:!0,onLayout:!0,onAccessibilityAction:!0,onAccessibilityTap:!0,onMagicTap:!0,collapsable:!0,needsOffscreenAlphaCompositing:!0,style:t},c.RCTView=s({},c.UIView,{removeClippedSubviews:!0}),m.exports=c},176,[44,54]); -__d(function(g,r,i,a,m,e,d){"use strict";var t=r(d[0]);m.exports=function(n,u){var c={};return t(c,n),t(c,u),c}},177,[178]); -__d(function(g,r,i,a,m,e,d){"use strict";var t=r(d[0]),c=t.checkMergeObjectArg,n=t.checkMergeIntoObjectArg;m.exports=function(t,o){if(n(t),null!=o)for(var f in c(o),o)Object.prototype.hasOwnProperty.call(o,f)&&(t[f]=o[f])}},178,[179]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=function(t){return'object'!=typeof t||t instanceof Date||null===t},c={MAX_MERGE_DEPTH:36,isTerminal:n,normalizeMergeArg:function(t){return void 0===t||null===t?{}:t},checkMergeArrayArgs:function(n,c){t(Array.isArray(n)&&Array.isArray(c),'Tried to merge arrays, instead got %s and %s.',n,c)},checkMergeObjectArgs:function(t,n){c.checkMergeObjectArg(t),c.checkMergeObjectArg(n)},checkMergeObjectArg:function(c){t(!n(c)&&!Array.isArray(c),'Tried to merge an object, instead got %s.',c)},checkMergeIntoObjectArg:function(c){t(!(n(c)&&'function'!=typeof c||Array.isArray(c)),'Tried to merge into an object, instead got %s.',c)},checkMergeLevel:function(n){t(n<36,"Maximum deep merge depth exceeded. You may be attempting to merge circular structures in an unsupported way.")},checkArrayStrategy:function(n){t(void 0===n||n in c.ArrayStrategies,"You must provide an array strategy to deep merge functions to instruct the deep merge how to resolve merging two arrays.")},ArrayStrategies:{Clobber:'Clobber',Concat:'Concat',IndexByIndex:'IndexByIndex'}};m.exports=c},179,[3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]),o=r(d[2]),n=r(d[3]),l=r(d[4]),c=r(d[5]),u=(r(d[6]),r(d[7])),b=r(d[8]),p=r(d[9]),h=r(d[10]),f=(r(d[11]),r(d[12])),y=r(d[13]),v=(function(t){function b(){return s(this,b),n(this,l(b).apply(this,arguments))}return c(b,t),o(b,[{key:"render",value:function(){var t=this.props,s=t.accessibilityLabel,o=t.color,n=t.onPress,l=t.title,c=t.hasTVPreferredFocus,b=t.disabled,v=t.testID,D=[x.button],C=[x.text];o&&D.push({backgroundColor:o});var k=[];b&&(D.push(x.buttonDisabled),C.push(x.textDisabled),k.push('disabled')),y('string'==typeof l,'The title prop of a Button must be a string');var P=l.toUpperCase(),E=h;return u.createElement(E,{accessibilityLabel:s,accessibilityRole:"button",accessibilityStates:k,hasTVPreferredFocus:c,testID:v,disabled:b,onPress:n},u.createElement(f,{style:D},u.createElement(p,{style:C,disabled:b},P)))}}]),b})(u.Component),x=b.create({button:{elevation:4,backgroundColor:'#2196F3',borderRadius:2},text:t({textAlign:'center',padding:8},{color:'white',fontWeight:'500'}),buttonDisabled:{elevation:0,backgroundColor:'#dfdfdf'},textDisabled:{color:'#a1a1a1'}});m.exports=v},180,[44,19,20,27,30,33,41,46,50,181,194,202,73,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),t=r(d[1]),o=r(d[2]),s=r(d[3]),l=r(d[4]),u=r(d[5]),p=r(d[6]),c=r(d[7]),h=r(d[8]),f=r(d[9]),R=r(d[10]),H=r(d[11]),v=r(d[12]),T=r(d[13]),b=r(d[14]),S=r(d[15]),x=r(d[16]),C={top:20,left:20,right:20,bottom:30},P={validAttributes:c({},R.UIView,{isHighlighted:!0,numberOfLines:!0,ellipsizeMode:!0,allowFontScaling:!0,maxFontSizeMultiplier:!0,disabled:!0,selectable:!0,selectionColor:!0,adjustsFontSizeToFit:!0,minimumFontScale:!0,textBreakStrategy:!0,onTextLayout:!0}),directEventTypes:{topTextLayout:{registrationName:'onTextLayout'}},uiViewClassName:'RCTText'},w=(function(h){function R(){var n,o;t(this,R);for(var u=arguments.length,h=new Array(u),f=0;f4?p-4:0),l=4;l5?b-5:0),k=5;k4?s-4:0),p=4;p10&&this._cancelLongPressDelayTimeout();if(P>t.left-s&&O>t.top-S&&P0,h=c&&c.length>0;return!u&&h?c[0]:u?n[0]:t}}},191,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]);m.exports=function(t){var o,s={};for(o in t instanceof Object&&!Array.isArray(t)||n(!1),t)t.hasOwnProperty(o)&&(s[o]=o);return s}},192,[3]); -__d(function(g,r,i,a,m,e,d){'use strict';function t(t,o){if(null!=t)return t;var n=new Error(void 0!==o?o:'Got unexpected '+t);throw n.framesToPop=1,n}m.exports=t,m.exports.default=t,Object.defineProperty(m.exports,'__esModule',{value:!0})},193,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),o=r(d[1]),s=r(d[2]),n=r(d[3]),p=r(d[4]),c=r(d[5]),l=r(d[6]),h=r(d[7]),u=r(d[8]),b=r(d[9]),f=r(d[10]),R=r(d[11]),y=r(d[12]),P=p.shape({type:p.oneOf(['RippleAndroid']),color:p.number,borderless:p.bool}),S=p.shape({type:p.oneOf(['ThemeAttrAndroid']),attribute:p.string.isRequired}),v=p.oneOfType([P,S]),T={top:20,left:20,right:20,bottom:30},H=f({displayName:'TouchableNativeFeedback',propTypes:o({},h.propTypes,{background:v,hasTVPreferredFocus:p.bool,useForeground:p.bool}),statics:{SelectableBackground:function(){return{type:'ThemeAttrAndroid',attribute:'selectableItemBackground'}},SelectableBackgroundBorderless:function(){return{type:'ThemeAttrAndroid',attribute:'selectableItemBackgroundBorderless'}},Ripple:function(t,o){return{type:'RippleAndroid',color:y(t),borderless:o}},canUseNativeForeground:function(){return s.Version>=23}},mixins:[l.Mixin],getDefaultProps:function(){return{background:this.SelectableBackground()}},getInitialState:function(){return this.touchableGetInitialState()},componentDidMount:function(){R(this.props)},UNSAFE_componentWillReceiveProps:function(t){R(t)},touchableHandleActivePressIn:function(t){this.props.onPressIn&&this.props.onPressIn(t),this._dispatchPressedStateChange(!0),this.pressInLocation&&this._dispatchHotspotUpdate(this.pressInLocation.locationX,this.pressInLocation.locationY)},touchableHandleActivePressOut:function(t){this.props.onPressOut&&this.props.onPressOut(t),this._dispatchPressedStateChange(!1)},touchableHandlePress:function(t){this.props.onPress&&this.props.onPress(t)},touchableHandleLongPress:function(t){this.props.onLongPress&&this.props.onLongPress(t)},touchableGetPressRectOffset:function(){return this.props.pressRetentionOffset||T},touchableGetHitSlop:function(){return this.props.hitSlop},touchableGetHighlightDelayMS:function(){return this.props.delayPressIn},touchableGetLongPressDelayMS:function(){return this.props.delayLongPress},touchableGetPressOutDelayMS:function(){return this.props.delayPressOut},_handleResponderMove:function(t){this.touchableHandleResponderMove(t),this._dispatchHotspotUpdate(t.nativeEvent.locationX,t.nativeEvent.locationY)},_dispatchHotspotUpdate:function(t,o){u.dispatchViewManagerCommand(c.findNodeHandle(this),u.getViewManagerConfig('RCTView').Commands.hotspotUpdate,[t||0,o||0])},_dispatchPressedStateChange:function(t){u.dispatchViewManagerCommand(c.findNodeHandle(this),u.getViewManagerConfig('RCTView').Commands.setPressed,[t])},render:function(){var s,p=n.Children.only(this.props.children),c=p.props.children;l.TOUCH_TARGET_DEBUG&&p.type===b&&(Array.isArray(c)||(c=[c]),c.push(l.renderDebugView({color:'brown',hitSlop:this.props.hitSlop}))),this.props.useForeground&&!H.canUseNativeForeground()&&console.warn("Requested foreground ripple, but it is not available on this version of Android. Consider calling TouchableNativeFeedback.canUseNativeForeground() and using a different Touchable if the result is false.");var h=this.props.useForeground&&H.canUseNativeForeground()?'nativeForegroundAndroid':'nativeBackgroundAndroid',u=o({},p.props,(t(s={},h,this.props.background),t(s,"accessible",!1!==this.props.accessible),t(s,"accessibilityLabel",this.props.accessibilityLabel),t(s,"accessibilityRole",this.props.accessibilityRole),t(s,"accessibilityStates",this.props.accessibilityStates),t(s,"children",c),t(s,"testID",this.props.testID),t(s,"onLayout",this.props.onLayout),t(s,"hitSlop",this.props.hitSlop),t(s,"isTVSelectable",!0),t(s,"hasTVPreferredFocus",this.props.hasTVPreferredFocus),t(s,"onStartShouldSetResponder",this.touchableHandleStartShouldSetResponder),t(s,"onResponderTerminationRequest",this.touchableHandleResponderTerminationRequest),t(s,"onResponderGrant",this.touchableHandleResponderGrant),t(s,"onResponderMove",this._handleResponderMove),t(s,"onResponderRelease",this.touchableHandleResponderRelease),t(s,"onResponderTerminate",this.touchableHandleResponderTerminate),s));return n.cloneElement(p,u)}});m.exports=H},194,[45,44,41,46,59,76,186,195,40,73,196,200,67]); -__d(function(g,r,i,a,m,e,d){'use strict';var s=r(d[0]),t=r(d[1]),o=r(d[2]),n=r(d[3]),c=r(d[4]),p=r(d[5]),l=r(d[6]),h=r(d[7]),u=h.DeprecatedAccessibilityComponentTypes,b=h.DeprecatedAccessibilityRoles,y=h.DeprecatedAccessibilityStates,f=h.DeprecatedAccessibilityTraits,P={top:20,left:20,right:20,bottom:30},R=p({displayName:'TouchableWithoutFeedback',mixins:[n.Mixin],propTypes:{accessible:o.bool,accessibilityLabel:o.node,accessibilityHint:o.string,accessibilityComponentType:o.oneOf(u),accessibilityRole:o.oneOf(b),accessibilityStates:o.arrayOf(o.oneOf(y)),accessibilityTraits:o.oneOfType([o.oneOf(f),o.arrayOf(o.oneOf(f))]),onFocus:o.func,onBlur:o.func,disabled:o.bool,onPress:o.func,onPressIn:o.func,onPressOut:o.func,onLayout:o.func,onLongPress:o.func,nativeID:o.string,testID:o.string,delayPressIn:o.number,delayPressOut:o.number,delayLongPress:o.number,pressRetentionOffset:s,hitSlop:s},getInitialState:function(){return this.touchableGetInitialState()},componentDidMount:function(){l(this.props)},UNSAFE_componentWillReceiveProps:function(s){l(s)},touchableHandlePress:function(s){this.props.onPress&&this.props.onPress(s)},touchableHandleActivePressIn:function(s){this.props.onPressIn&&this.props.onPressIn(s)},touchableHandleActivePressOut:function(s){this.props.onPressOut&&this.props.onPressOut(s)},touchableHandleLongPress:function(s){this.props.onLongPress&&this.props.onLongPress(s)},touchableGetPressRectOffset:function(){return this.props.pressRetentionOffset||P},touchableGetHitSlop:function(){return this.props.hitSlop},touchableGetHighlightDelayMS:function(){return this.props.delayPressIn||0},touchableGetLongPressDelayMS:function(){return 0===this.props.delayLongPress?0:this.props.delayLongPress||500},touchableGetPressOutDelayMS:function(){return this.props.delayPressOut||0},render:function(){var s=t.Children.only(this.props.children),o=s.props.children;return n.TOUCH_TARGET_DEBUG&&s.type===c&&(o=t.Children.toArray(o)).push(n.renderDebugView({color:'red',hitSlop:this.props.hitSlop})),t.cloneElement(s,{accessible:!1!==this.props.accessible,accessibilityLabel:this.props.accessibilityLabel,accessibilityHint:this.props.accessibilityHint,accessibilityComponentType:this.props.accessibilityComponentType,accessibilityRole:this.props.accessibilityRole,accessibilityStates:this.props.accessibilityStates,accessibilityTraits:this.props.accessibilityTraits,nativeID:this.props.nativeID,testID:this.props.testID,onLayout:this.props.onLayout,hitSlop:this.props.hitSlop,onStartShouldSetResponder:this.touchableHandleStartShouldSetResponder,onResponderTerminationRequest:this.touchableHandleResponderTerminationRequest,onResponderGrant:this.touchableHandleResponderGrant,onResponderMove:this.touchableHandleResponderMove,onResponderRelease:this.touchableHandleResponderRelease,onResponderTerminate:this.touchableHandleResponderTerminate,children:o})}});m.exports=R},195,[183,46,59,186,73,196,200,201]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),o=r(d[1]);if(void 0===t)throw Error("create-react-class could not find the React object. If you are using script tags, make sure that React is being loaded before create-react-class.");var c=(new t.Component).updater;m.exports=o(t.Component,t.isValidElement,c)},196,[47,197]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),s='mixins';m.exports=function(p,c,u){var l=[],E={mixins:'DEFINE_MANY',statics:'DEFINE_MANY',propTypes:'DEFINE_MANY',contextTypes:'DEFINE_MANY',childContextTypes:'DEFINE_MANY',getDefaultProps:'DEFINE_MANY_MERGED',getInitialState:'DEFINE_MANY_MERGED',getChildContext:'DEFINE_MANY_MERGED',render:'DEFINE_ONCE',componentWillMount:'DEFINE_MANY',componentDidMount:'DEFINE_MANY',componentWillReceiveProps:'DEFINE_MANY',shouldComponentUpdate:'DEFINE_ONCE',componentWillUpdate:'DEFINE_MANY',componentDidUpdate:'DEFINE_MANY',componentWillUnmount:'DEFINE_MANY',UNSAFE_componentWillMount:'DEFINE_MANY',UNSAFE_componentWillReceiveProps:'DEFINE_MANY',UNSAFE_componentWillUpdate:'DEFINE_MANY',updateComponent:'OVERRIDE_BASE'},f={getDerivedStateFromProps:'DEFINE_MANY_MERGED'},h={displayName:function(t,n){t.displayName=n},mixins:function(t,n){if(n)for(var o=0;o1&&void 0!==arguments[1]?arguments[1]:{}).iterations,o=void 0===t?-1:t,u=!1,s=0;return{start:function(t){n&&0!==o?n._isUsingNativeDriver()?n._startNativeLoop(o):(function c(){var f=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{finished:!0};u||s===o||!1===f.finished?t&&t(f):(s++,n.reset(),n.start(c))})():t&&t({finished:!0})},stop:function(){u=!0,n.stop()},reset:function(){s=0,u=!1,n.reset()},_startNativeLoop:function(){throw new Error('Loops run using the native driver cannot contain Animated.loop animations')},_isUsingNativeDriver:function(){return n._isUsingNativeDriver()}}},event:function(n,t){var u=new o(n,t);return u.__isNative?u:u.__getHandler()},createAnimatedComponent:U,attachNativeEvent:u,forkEvent:function(n,t){return n?n instanceof o?(n.__addListener(t),n):function(){'function'==typeof n&&n.apply(void 0,arguments),t.apply(void 0,arguments)}:t},unforkEvent:function(n,t){n&&n instanceof o&&n.__removeListener(t)},__PropsOnlyForTests:_}},204,[44,205,213,214,215,207,216,217,208,218,221,222,206,223,224,226,228,231]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),s=r(d[2]),v=r(d[3]),o=r(d[4]),c=r(d[5]),_=r(d[3]).shouldUseNativeDriver;function l(t,n,_){var l=[];c(_[0]&&_[0].nativeEvent,'Native driven events only support animated values contained inside `nativeEvent`.'),(function t(n,v){if(n instanceof s)n.__makeNative(),l.push({nativeEventPath:v,animatedValueTag:n.__getNativeTag()});else if('object'==typeof n)for(var o in n)t(n[o],v.concat(o))})(_[0].nativeEvent,[]);var h=o.findNodeHandle(t);return l.forEach(function(t){v.API.addAnimatedEventToView(h,n,t)}),{detach:function(){l.forEach(function(t){v.API.removeAnimatedEventFromView(h,n,t.animatedValueTag)})}}}var h=(function(){function v(n){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t(this,v),this._listeners=[],this._argMapping=n,s.listener&&this.__addListener(s.listener),this._callListeners=this._callListeners.bind(this),this._attachedEvent=null,this.__isNative=_(s)}return n(v,[{key:"__addListener",value:function(t){this._listeners.push(t)}},{key:"__removeListener",value:function(t){this._listeners=this._listeners.filter(function(n){return n!==t})}},{key:"__attach",value:function(t,n){c(this.__isNative,'Only native driven events need to be attached.'),this._attachedEvent=l(t,n,this._argMapping)}},{key:"__detach",value:function(t,n){c(this.__isNative,'Only native driven events need to be detached.'),this._attachedEvent&&this._attachedEvent.detach()}},{key:"__getHandler",value:function(){var t=this;return this.__isNative?this._callListeners:function(){for(var n=arguments.length,v=new Array(n),o=0;oo){if('identity'===f)return c;'clamp'===f&&(c=o)}return u===p?u:n===o?t<=n?u:p:(n===-1/0?c=-c:o===1/0?c-=n:c=(c-n)/(o-n),c=l(c),u===-1/0?c=-c:p===1/0?c+=u:c=c*(p-u)+u,c)}function x(t){var n=_(t);return null===n?t:"rgba("+((4278190080&(n=n||0))>>>24)+", "+((16711680&n)>>>16)+", "+((65280&n)>>>8)+", "+(255&n)/255+")"}var k=/[0-9\.-]+/g;function b(t){var n=t.outputRange;s(n.length>=2,'Bad output range'),C(n=n.map(x));var o=n[0].match(k).map(function(){return[]});n.forEach(function(t){t.match(k).forEach(function(t,n){o[n].push(+t)})});var u,p=n[0].match(k).map(function(n,u){return y(h({},t,{outputRange:o[u]}))}),l='string'==typeof(u=n[0])&&u.startsWith('rgb');return function(t){var o=0;return n[0].replace(k,function(){var n=+p[o++](t),u=l&&o<4?Math.round(n):Math.round(1e3*n)/1e3;return String(u)})}}function C(t){for(var n=t[0].replace(k,''),o=1;o=t);++o);return o-1}function N(t){s(t.length>=2,'inputRange must have at least 2 elements');for(var n=1;n=t[n-1],'inputRange must be monotonically non-decreasing '+t)}function w(t,n){s(n.length>=2,t+' must have at least 2 elements'),s(2!==n.length||n[0]!==-1/0||n[1]!==1/0,t+'cannot be ]-infinity;+infinity[ '+n)}var D=(function(h){function _(n,p){var l;return t(this,_),(l=o(this,u(_).call(this)))._parent=n,l._config=p,l._interpolation=y(p),l}return l(_,f),n(_,[{key:"__makeNative",value:function(){this._parent.__makeNative(),p(u(_.prototype),"__makeNative",this).call(this)}},{key:"__getValue",value:function(){var t=this._parent.__getValue();return s('number'==typeof t,'Cannot interpolate an input which is not a number.'),this._interpolation(t)}},{key:"interpolate",value:function(t){return new _(this,t)}},{key:"__attach",value:function(){this._parent.__addChild(this)}},{key:"__detach",value:function(){this._parent.__removeChild(this),p(u(_.prototype),"__detach",this).call(this)}},{key:"__transformDataType",value:function(t){return t.map(c.transformDataType)}},{key:"__getNativeConfig",value:function(){return{inputRange:this._config.inputRange,outputRange:this.__transformDataType(this._config.outputRange),extrapolateLeft:this._config.extrapolateLeft||this._config.extrapolate||'extend',extrapolateRight:this._config.extrapolateRight||this._config.extrapolate||'extend',type:'interpolation'}}}]),_})();D.__createInterpolation=y,m.exports=D},207,[19,20,27,30,31,33,44,208,210,209,3,57]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),_=r(d[2]),o=r(d[3]),u=(function(){function u(){t(this,u)}return n(u,[{key:"__attach",value:function(){}},{key:"__detach",value:function(){this.__isNative&&null!=this.__nativeTag&&(_.API.dropAnimatedNode(this.__nativeTag),this.__nativeTag=void 0)}},{key:"__getValue",value:function(){}},{key:"__getAnimatedValue",value:function(){return this.__getValue()}},{key:"__addChild",value:function(t){}},{key:"__removeChild",value:function(t){}},{key:"__getChildren",value:function(){return[]}},{key:"__makeNative",value:function(){if(!this.__isNative)throw new Error('This node cannot be made a "native" animated node')}},{key:"__getNativeTag",value:function(){if(_.assertNativeAnimatedModule(),o(this.__isNative,'Attempt to get native tag from node not marked as "native"'),null==this.__nativeTag){var t=_.generateNewNodeTag();_.API.createAnimatedNode(t,this.__getNativeConfig()),this.__nativeTag=t}return this.__nativeTag}},{key:"__getNativeConfig",value:function(){throw new Error('This JS animated node type cannot be used as native animated node')}},{key:"toJSON",value:function(){return this.__getValue()}}]),u})();m.exports=u},208,[19,20,209,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t,n=r(d[0]).NativeAnimatedModule,o=r(d[1]),s=r(d[2]),u=1,c=1,f={createAnimatedNode:function(t,o){A(),n.createAnimatedNode(t,o)},startListeningToAnimatedNodeValue:function(t){A(),n.startListeningToAnimatedNodeValue(t)},stopListeningToAnimatedNodeValue:function(t){A(),n.stopListeningToAnimatedNodeValue(t)},connectAnimatedNodes:function(t,o){A(),n.connectAnimatedNodes(t,o)},disconnectAnimatedNodes:function(t,o){A(),n.disconnectAnimatedNodes(t,o)},startAnimatingNode:function(t,o,s,u){A(),n.startAnimatingNode(t,o,s,u)},stopAnimation:function(t){A(),n.stopAnimation(t)},setAnimatedNodeValue:function(t,o){A(),n.setAnimatedNodeValue(t,o)},setAnimatedNodeOffset:function(t,o){A(),n.setAnimatedNodeOffset(t,o)},flattenAnimatedNodeOffset:function(t){A(),n.flattenAnimatedNodeOffset(t)},extractAnimatedNodeOffset:function(t){A(),n.extractAnimatedNodeOffset(t)},connectAnimatedNodeToView:function(t,o){A(),n.connectAnimatedNodeToView(t,o)},disconnectAnimatedNodeFromView:function(t,o){A(),n.disconnectAnimatedNodeFromView(t,o)},dropAnimatedNode:function(t){A(),n.dropAnimatedNode(t)},addAnimatedEventToView:function(t,o,s){A(),n.addAnimatedEventToView(t,o,s)},removeAnimatedEventFromView:function(t,o,s){A(),n.removeAnimatedEventFromView(t,o,s)}},p={opacity:!0,transform:!0,borderRadius:!0,borderBottomEndRadius:!0,borderBottomLeftRadius:!0,borderBottomRightRadius:!0,borderBottomStartRadius:!0,borderTopEndRadius:!0,borderTopLeftRadius:!0,borderTopRightRadius:!0,borderTopStartRadius:!0,elevation:!0,shadowOpacity:!0,shadowRadius:!0,scaleX:!0,scaleY:!0,translateX:!0,translateY:!0},l={translateX:!0,translateY:!0,scale:!0,scaleX:!0,scaleY:!0,rotate:!0,rotateX:!0,rotateY:!0,perspective:!0},v={inputRange:!0,outputRange:!0,extrapolate:!0,extrapolateRight:!0,extrapolateLeft:!0};function A(){s(n,'Native animated module is not available')}var N=!1;m.exports={API:f,addWhitelistedStyleProp:function(t){p[t]=!0},addWhitelistedTransformProp:function(t){l[t]=!0},addWhitelistedInterpolationParam:function(t){v[t]=!0},validateStyles:function(t){for(var n in t)if(!p.hasOwnProperty(n))throw new Error("Style property '"+n+"' is not supported by native animated module")},validateTransform:function(t){t.forEach(function(t){if(!l.hasOwnProperty(t.property))throw new Error("Property '"+t.property+"' is not supported by native animated module")})},validateInterpolation:function(t){for(var n in t)if(!v.hasOwnProperty(n))throw new Error("Interpolation property '"+n+"' is not supported by native animated module")},generateNewNodeTag:function(){return u++},generateNewAnimationId:function(){return c++},assertNativeAnimatedModule:A,shouldUseNativeDriver:function(t){return t.useNativeDriver&&!n?(N||(console.warn("Animated: `useNativeDriver` is not supported because the native animated module is missing. Falling back to JS-based animation. To resolve this, add `RCTAnimation` module to this app, or remove `useNativeDriver`. More info: https://github.com/facebook/react-native/issues/11094#issuecomment-263240420"),N=!0),!1):t.useNativeDriver||!1},transformDataType:function(t){return'string'!=typeof t?t:/deg$/.test(t)?(parseFloat(t)||0)*Math.PI/180:parseFloat(t)||0},get nativeEventEmitter(){return t||(t=new o(n)),t}}},209,[5,119,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),_=r(d[1]),n=r(d[2]),h=r(d[3]),s=r(d[4]),c=r(d[5]),o=r(d[6]),l=(function(l){function v(){var _;return t(this,v),(_=n(this,h(v).call(this)))._children=[],_}return s(v,c),_(v,[{key:"__makeNative",value:function(){if(!this.__isNative){this.__isNative=!0;var t=this._children,_=Array.isArray(t),n=0;for(t=_?t:t["function"==typeof Symbol?Symbol.iterator:"@@iterator"]();;){var h;if(_){if(n>=t.length)break;h=t[n++]}else{if((n=t.next()).done)break;h=n.value}var s=h;s.__makeNative(),o.API.connectAnimatedNodes(this.__getNativeTag(),s.__getNativeTag())}}}},{key:"__addChild",value:function(t){0===this._children.length&&this.__attach(),this._children.push(t),this.__isNative&&(t.__makeNative(),o.API.connectAnimatedNodes(this.__getNativeTag(),t.__getNativeTag()))}},{key:"__removeChild",value:function(t){var _=this._children.indexOf(t);-1!==_?(this.__isNative&&t.__isNative&&o.API.disconnectAnimatedNodes(this.__getNativeTag(),t.__getNativeTag()),this._children.splice(_,1),0===this._children.length&&this.__detach()):console.warn("Trying to remove a child that doesn't exist")}},{key:"__getChildren",value:function(){return this._children}}]),v})();m.exports=l},210,[19,20,27,30,33,208,209]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),t=r(d[1]),o=r(d[2]),c=(r(d[3]),r(d[4])),s=r(d[5]),u=new t,l={Events:s({interactionStart:!0,interactionComplete:!0}),runAfterInteractions:function(n){var t=[],o=new Promise(function(o){k(),n&&t.push(n),t.push({run:o,name:'resolve '+(n&&n.name||'?')}),h.enqueueTasks(t)});return{then:o.then.bind(o),done:function(){if(o.done)return o.done.apply(o,arguments);console.warn('Tried to call done when not supported by current Promise implementation.')},cancel:function(){h.cancelTasks(t)}}},createInteractionHandle:function(){k();var n=++T;return p.add(n),n},clearInteractionHandle:function(n){c(!!n,'Must provide a handle to clear.'),k(),p.delete(n),v.add(n)},addListener:u.addListener.bind(u),setDeadline:function(n){E=n}},f=new Set,p=new Set,v=new Set,h=new o({onMoreTasks:k}),w=0,T=0,E=-1;function k(){w||(w=E>0?setTimeout(S,0):setImmediate(S))}function S(){w=0;var t=f.size;p.forEach(function(n){return f.add(n)}),v.forEach(function(n){return f.delete(n)});var o=f.size;if(0!==t&&0===o?u.emit(l.Events.interactionComplete):0===t&&0!==o&&u.emit(l.Events.interactionStart),0===o)for(;h.hasTasksToProcess();)if(h.processNext(),E>0&&n.getEventLoopRunningTime()>=E){k();break}p.clear(),v.clear()}m.exports=l},211,[13,35,212,150,3,192]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),u=r(d[1]),s=r(d[2]),n=(r(d[3]),r(d[4])),o=(function(){function o(t){var s=t.onMoreTasks;u(this,o),this._onMoreTasks=s,this._queueStack=[{tasks:[],popable:!1}]}return s(o,[{key:"enqueue",value:function(t){this._getCurrentQueue().push(t)}},{key:"enqueueTasks",value:function(t){var u=this;t.forEach(function(t){return u.enqueue(t)})}},{key:"cancelTasks",value:function(u){this._queueStack=this._queueStack.map(function(s){return t({},s,{tasks:s.tasks.filter(function(t){return-1===u.indexOf(t)})})}).filter(function(t,u){return t.tasks.length>0||0===u})}},{key:"hasTasksToProcess",value:function(){return this._getCurrentQueue().length>0}},{key:"processNext",value:function(){var t=this._getCurrentQueue();if(t.length){var u=t.shift();try{u.gen?this._genPromise(u):u.run?u.run():(n('function'==typeof u,'Expected Function, SimpleTask, or PromiseTask, but got:\n'+JSON.stringify(u,null,2)),u())}catch(t){throw t.message='TaskQueue: Error with task '+(u.name||'')+': '+t.message,t}}}},{key:"_getCurrentQueue",value:function(){var t=this._queueStack.length-1,u=this._queueStack[t];return u.popable&&0===u.tasks.length&&this._queueStack.length>1?(this._queueStack.pop(),this._getCurrentQueue()):u.tasks}},{key:"_genPromise",value:function(t){var u=this;this._queueStack.push({tasks:[],popable:!1});var s=this._queueStack.length-1;t.gen().then(function(){u._queueStack[s].popable=!0,u.hasTasksToProcess()&&u._onMoreTasks()}).catch(function(u){throw u.message="TaskQueue: Error resolving Promise in task "+t.name+": "+u.message,u}).done()}}]),o})();m.exports=o},212,[44,19,20,150,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),_=r(d[1]),n=r(d[2]),h=r(d[3]),u=r(d[4]),s=r(d[5]),o=r(d[6]),l=(r(d[7]),r(d[8])),v=r(d[9]),c=(function(c){function f(_,u){var s;return t(this,f),(s=n(this,h(f).call(this)))._a='number'==typeof _?new l(_):_,s._b='number'==typeof u?new l(u):u,s}return s(f,v),_(f,[{key:"__makeNative",value:function(){this._a.__makeNative(),this._b.__makeNative(),u(h(f.prototype),"__makeNative",this).call(this)}},{key:"__getValue",value:function(){return this._a.__getValue()+this._b.__getValue()}},{key:"interpolate",value:function(t){return new o(this,t)}},{key:"__attach",value:function(){this._a.__addChild(this),this._b.__addChild(this)}},{key:"__detach",value:function(){this._a.__removeChild(this),this._b.__removeChild(this),u(h(f.prototype),"__detach",this).call(this)}},{key:"__getNativeConfig",value:function(){return{type:'addition',input:[this._a.__getNativeTag(),this._b.__getNativeTag()]}}}]),f})();m.exports=c},213,[19,20,27,30,31,33,207,208,206,210]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),_=r(d[1]),n=r(d[2]),u=r(d[3]),h=r(d[4]),s=r(d[5]),l=r(d[6]),v=(r(d[7]),r(d[8])),c=(function(c){function o(_,h,s){var l;return t(this,o),(l=n(this,u(o).call(this)))._a=_,l._min=h,l._max=s,l._value=l._lastValue=l._a.__getValue(),l}return s(o,v),_(o,[{key:"__makeNative",value:function(){this._a.__makeNative(),h(u(o.prototype),"__makeNative",this).call(this)}},{key:"interpolate",value:function(t){return new l(this,t)}},{key:"__getValue",value:function(){var t=this._a.__getValue(),_=t-this._lastValue;return this._lastValue=t,this._value=Math.min(Math.max(this._value+_,this._min),this._max),this._value}},{key:"__attach",value:function(){this._a.__addChild(this)}},{key:"__detach",value:function(){this._a.__removeChild(this),h(u(o.prototype),"__detach",this).call(this)}},{key:"__getNativeConfig",value:function(){return{type:'diffclamp',input:this._a.__getNativeTag(),min:this._min,max:this._max}}}]),o})();m.exports=c},214,[19,20,27,30,31,33,207,208,210]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),_=r(d[1]),n=r(d[2]),h=r(d[3]),s=r(d[4]),o=r(d[5]),u=r(d[6]),l=(r(d[7]),r(d[8])),v=r(d[9]),c=(function(c){function f(_,s){var o;return t(this,f),(o=n(this,h(f).call(this)))._a='number'==typeof _?new l(_):_,o._b='number'==typeof s?new l(s):s,o}return o(f,v),_(f,[{key:"__makeNative",value:function(){this._a.__makeNative(),this._b.__makeNative(),s(h(f.prototype),"__makeNative",this).call(this)}},{key:"__getValue",value:function(){var t=this._a.__getValue(),_=this._b.__getValue();return 0===_&&console.error('Detected division by zero in AnimatedDivision'),t/_}},{key:"interpolate",value:function(t){return new u(this,t)}},{key:"__attach",value:function(){this._a.__addChild(this),this._b.__addChild(this)}},{key:"__detach",value:function(){this._a.__removeChild(this),this._b.__removeChild(this),s(h(f.prototype),"__detach",this).call(this)}},{key:"__getNativeConfig",value:function(){return{type:'division',input:[this._a.__getNativeTag(),this._b.__getNativeTag()]}}}]),f})();m.exports=c},215,[19,20,27,30,31,33,207,208,206,210]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),u=r(d[1]),_=r(d[2]),s=r(d[3]),n=r(d[4]),h=r(d[5]),l=r(d[6]),o=(r(d[7]),r(d[8])),c=(function(c){function v(u,n){var h;return t(this,v),(h=_(this,s(v).call(this)))._a=u,h._modulus=n,h}return h(v,o),u(v,[{key:"__makeNative",value:function(){this._a.__makeNative(),n(s(v.prototype),"__makeNative",this).call(this)}},{key:"__getValue",value:function(){return(this._a.__getValue()%this._modulus+this._modulus)%this._modulus}},{key:"interpolate",value:function(t){return new l(this,t)}},{key:"__attach",value:function(){this._a.__addChild(this)}},{key:"__detach",value:function(){this._a.__removeChild(this),n(s(v.prototype),"__detach",this).call(this)}},{key:"__getNativeConfig",value:function(){return{type:'modulus',input:this._a.__getNativeTag(),modulus:this._modulus}}}]),v})();m.exports=c},216,[19,20,27,30,31,33,207,208,210]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),_=r(d[1]),n=r(d[2]),h=r(d[3]),u=r(d[4]),s=r(d[5]),l=r(d[6]),o=(r(d[7]),r(d[8])),c=r(d[9]),v=(function(v){function f(_,u){var s;return t(this,f),(s=n(this,h(f).call(this)))._a='number'==typeof _?new o(_):_,s._b='number'==typeof u?new o(u):u,s}return s(f,c),_(f,[{key:"__makeNative",value:function(){this._a.__makeNative(),this._b.__makeNative(),u(h(f.prototype),"__makeNative",this).call(this)}},{key:"__getValue",value:function(){return this._a.__getValue()*this._b.__getValue()}},{key:"interpolate",value:function(t){return new l(this,t)}},{key:"__attach",value:function(){this._a.__addChild(this),this._b.__addChild(this)}},{key:"__detach",value:function(){this._a.__removeChild(this),this._b.__removeChild(this),u(h(f.prototype),"__detach",this).call(this)}},{key:"__getNativeConfig",value:function(){return{type:'multiplication',input:[this._a.__getNativeTag(),this._b.__getNativeTag()]}}}]),f})();m.exports=v},217,[19,20,27,30,31,33,207,208,206,210]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),_=r(d[2]),s=r(d[3]),o=r(d[4]),c=r(d[5]),v=r(d[6]),h=r(d[7]).AnimatedEvent,l=r(d[8]),p=r(d[9]),u=r(d[10]),f=r(d[11]),N=r(d[12]),V=(function(V){function w(_,c){var v;return n(this,w),v=s(this,o(w).call(this)),_.style&&(_=t({},_,{style:new p(_.style)})),v._props=_,v._callback=c,v.__attach(),v}return v(w,l),_(w,[{key:"__getValue",value:function(){var t={};for(var n in this._props){var _=this._props[n];_ instanceof l?(!_.__isNative||_ instanceof p)&&(t[n]=_.__getValue()):t[n]=_ instanceof h?_.__getHandler():_}return t}},{key:"__getAnimatedValue",value:function(){var t={};for(var n in this._props){var _=this._props[n];_ instanceof l&&(t[n]=_.__getAnimatedValue())}return t}},{key:"__attach",value:function(){for(var t in this._props){var n=this._props[t];n instanceof l&&n.__addChild(this)}}},{key:"__detach",value:function(){for(var t in this.__isNative&&this._animatedView&&this.__disconnectAnimatedView(),this._props){var n=this._props[t];n instanceof l&&n.__removeChild(this)}c(o(w.prototype),"__detach",this).call(this)}},{key:"update",value:function(){this._callback()}},{key:"__makeNative",value:function(){if(!this.__isNative){for(var t in this.__isNative=!0,this._props){var n=this._props[t];n instanceof l&&n.__makeNative()}this._animatedView&&this.__connectAnimatedView()}}},{key:"setNativeView",value:function(t){this._animatedView!==t&&(this._animatedView=t,this.__isNative&&this.__connectAnimatedView())}},{key:"__connectAnimatedView",value:function(){N(this.__isNative,'Expected node to be marked as "native"');var t=f.findNodeHandle(this._animatedView);N(null!=t,'Unable to locate attached view in the native tree'),u.API.connectAnimatedNodeToView(this.__getNativeTag(),t)}},{key:"__disconnectAnimatedView",value:function(){N(this.__isNative,'Expected node to be marked as "native"');var t=f.findNodeHandle(this._animatedView);N(null!=t,'Unable to locate attached view in the native tree'),u.API.disconnectAnimatedNodeFromView(this.__getNativeTag(),t)}},{key:"__getNativeConfig",value:function(){var t={};for(var n in this._props){var _=this._props[n];_ instanceof l&&(t[n]=_.__getNativeTag())}return{type:'props',props:t}}}]),w})();m.exports=V},218,[44,19,20,27,30,31,33,205,208,219,209,76,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),s=r(d[2]),l=r(d[3]),_=r(d[4]),y=r(d[5]),o=r(d[6]),u=r(d[7]),v=r(d[8]),f=r(d[9]),h=r(d[10]),c=r(d[11]),k=(function(k){function A(s){var y;return n(this,A),y=l(this,_(A).call(this)),(s=c(s)||{}).transform&&(s=t({},s,{transform:new v(s.transform)})),y._style=s,y}return o(A,f),s(A,[{key:"_walkStyleAndGetValues",value:function(t){var n={};for(var s in t){var l=t[s];l instanceof u?l.__isNative||(n[s]=l.__getValue()):l&&!Array.isArray(l)&&'object'==typeof l?n[s]=this._walkStyleAndGetValues(l):n[s]=l}return n}},{key:"__getValue",value:function(){return this._walkStyleAndGetValues(this._style)}},{key:"_walkStyleAndGetAnimatedValues",value:function(t){var n={};for(var s in t){var l=t[s];l instanceof u?n[s]=l.__getAnimatedValue():l&&!Array.isArray(l)&&'object'==typeof l&&(n[s]=this._walkStyleAndGetAnimatedValues(l))}return n}},{key:"__getAnimatedValue",value:function(){return this._walkStyleAndGetAnimatedValues(this._style)}},{key:"__attach",value:function(){for(var t in this._style){var n=this._style[t];n instanceof u&&n.__addChild(this)}}},{key:"__detach",value:function(){for(var t in this._style){var n=this._style[t];n instanceof u&&n.__removeChild(this)}y(_(A.prototype),"__detach",this).call(this)}},{key:"__makeNative",value:function(){for(var t in this._style){var n=this._style[t];n instanceof u&&n.__makeNative()}y(_(A.prototype),"__makeNative",this).call(this)}},{key:"__getNativeConfig",value:function(){var t={};for(var n in this._style)this._style[n]instanceof u&&(t[n]=this._style[n].__getNativeTag());return h.validateStyles(t),{type:'style',style:t}}}]),A})();m.exports=k},219,[44,19,20,27,30,31,33,208,220,210,209,72]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),s=r(d[3]),f=r(d[4]),_=r(d[5]),u=r(d[6]),c=r(d[7]),v=r(d[8]),h=(function(h){function l(n){var f;return t(this,l),(f=o(this,s(l).call(this)))._transforms=n,f}return _(l,c),n(l,[{key:"__makeNative",value:function(){this._transforms.forEach(function(t){for(var n in t){var o=t[n];o instanceof u&&o.__makeNative()}}),f(s(l.prototype),"__makeNative",this).call(this)}},{key:"__getValue",value:function(){return this._transforms.map(function(t){var n={};for(var o in t){var s=t[o];n[o]=s instanceof u?s.__getValue():s}return n})}},{key:"__getAnimatedValue",value:function(){return this._transforms.map(function(t){var n={};for(var o in t){var s=t[o];n[o]=s instanceof u?s.__getAnimatedValue():s}return n})}},{key:"__attach",value:function(){var t=this;this._transforms.forEach(function(n){for(var o in n){var s=n[o];s instanceof u&&s.__addChild(t)}})}},{key:"__detach",value:function(){var t=this;this._transforms.forEach(function(n){for(var o in n){var s=n[o];s instanceof u&&s.__removeChild(t)}}),f(s(l.prototype),"__detach",this).call(this)}},{key:"__getNativeConfig",value:function(){var t=[];return this._transforms.forEach(function(n){for(var o in n){var s=n[o];s instanceof u?t.push({type:'animated',property:o,nodeTag:s.__getNativeTag()}):t.push({type:'static',property:o,value:v.transformDataType(s)})}}),v.validateTransform(t),{type:'transform',transforms:t}}}]),l})();m.exports=h},220,[19,20,27,30,31,33,208,210,209]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),_=r(d[1]),n=r(d[2]),h=r(d[3]),u=r(d[4]),s=r(d[5]),o=r(d[6]),l=(r(d[7]),r(d[8])),c=r(d[9]),v=(function(v){function f(_,u){var s;return t(this,f),(s=n(this,h(f).call(this)))._a='number'==typeof _?new l(_):_,s._b='number'==typeof u?new l(u):u,s}return s(f,c),_(f,[{key:"__makeNative",value:function(){this._a.__makeNative(),this._b.__makeNative(),u(h(f.prototype),"__makeNative",this).call(this)}},{key:"__getValue",value:function(){return this._a.__getValue()-this._b.__getValue()}},{key:"interpolate",value:function(t){return new o(this,t)}},{key:"__attach",value:function(){this._a.__addChild(this),this._b.__addChild(this)}},{key:"__detach",value:function(){this._a.__removeChild(this),this._b.__removeChild(this),u(h(f.prototype),"__detach",this).call(this)}},{key:"__getNativeConfig",value:function(){return{type:'subtraction',input:[this._a.__getNativeTag(),this._b.__getNativeTag()]}}}]),f})();m.exports=v},221,[19,20,27,30,31,33,207,208,206,210]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),_=r(d[2]),s=r(d[3]),o=r(d[4]),u=r(d[5]),l=r(d[6]),h=(r(d[7]),r(d[8])),v=r(d[9]),c=v.generateNewAnimationId,f=v.shouldUseNativeDriver,k=(function(v){function k(t,_,u,l,h){var v;return n(this,k),(v=s(this,o(k).call(this)))._value=t,v._parent=_,v._animationClass=u,v._animationConfig=l,v._useNativeDriver=f(l),v._callback=h,v.__attach(),v}return l(k,h),_(k,[{key:"__makeNative",value:function(){this.__isNative=!0,this._parent.__makeNative(),u(o(k.prototype),"__makeNative",this).call(this),this._value.__makeNative()}},{key:"__getValue",value:function(){return this._parent.__getValue()}},{key:"__attach",value:function(){this._parent.__addChild(this),this._useNativeDriver&&this.__makeNative()}},{key:"__detach",value:function(){this._parent.__removeChild(this),u(o(k.prototype),"__detach",this).call(this)}},{key:"update",value:function(){this._value.animate(new this._animationClass(t({},this._animationConfig,{toValue:this._animationConfig.toValue.__getValue()})),this._callback)}},{key:"__getNativeConfig",value:function(){var n=new this._animationClass(t({},this._animationConfig,{toValue:void 0})).__getNativeAnimationConfig();return{type:'tracking',animationId:c(),animationConfig:n,toValue:this._parent.__getNativeTag(),value:this._value.__getNativeTag()}}}]),k})();m.exports=k},222,[44,19,20,27,30,31,33,206,208,209]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]),n=r(d[2]),u=r(d[3]),l=r(d[4]),f=r(d[5]),o=r(d[6]),y=r(d[7]),h=1,x=(function(x){function c(s){var l;t(this,c),l=n(this,u(c).call(this));var o=s||{x:0,y:0};return'number'==typeof o.x&&'number'==typeof o.y?(l.x=new f(o.x),l.y=new f(o.y)):(y(o.x instanceof f&&o.y instanceof f,"AnimatedValueXY must be initialized with an object of numbers or AnimatedValues."),l.x=o.x,l.y=o.y),l._listeners={},l}return l(c,o),s(c,[{key:"setValue",value:function(t){this.x.setValue(t.x),this.y.setValue(t.y)}},{key:"setOffset",value:function(t){this.x.setOffset(t.x),this.y.setOffset(t.y)}},{key:"flattenOffset",value:function(){this.x.flattenOffset(),this.y.flattenOffset()}},{key:"extractOffset",value:function(){this.x.extractOffset(),this.y.extractOffset()}},{key:"__getValue",value:function(){return{x:this.x.__getValue(),y:this.y.__getValue()}}},{key:"resetAnimation",value:function(t){this.x.resetAnimation(),this.y.resetAnimation(),t&&t(this.__getValue())}},{key:"stopAnimation",value:function(t){this.x.stopAnimation(),this.y.stopAnimation(),t&&t(this.__getValue())}},{key:"addListener",value:function(t){var s=this,n=String(h++),u=function(n){n.value;t(s.__getValue())};return this._listeners[n]={x:this.x.addListener(u),y:this.y.addListener(u)},n}},{key:"removeListener",value:function(t){this.x.removeListener(this._listeners[t].x),this.y.removeListener(this._listeners[t].y),delete this._listeners[t]}},{key:"removeAllListeners",value:function(){this.x.removeAllListeners(),this.y.removeAllListeners(),this._listeners={}}},{key:"getLayout",value:function(){return{left:this.x,top:this.y}}},{key:"getTranslateTransform",value:function(){return[{translateX:this.x},{translateY:this.y}]}}]),c})();m.exports=x},223,[19,20,27,30,33,206,210,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),s=r(d[2]),o=r(d[3]),_=r(d[4]),h=r(d[5]),c=r(d[6]),l=r(d[7]).shouldUseNativeDriver,u=(function(u){function v(n){var _;return t(this,v),(_=s(this,o(v).call(this)))._deceleration=void 0!==n.deceleration?n.deceleration:.998,_._velocity=n.velocity,_._useNativeDriver=l(n),_.__isInteraction=void 0===n.isInteraction||n.isInteraction,_.__iterations=void 0!==n.iterations?n.iterations:1,_}return h(v,c),n(v,[{key:"__getNativeAnimationConfig",value:function(){return{type:'decay',deceleration:this._deceleration,velocity:this._velocity,iterations:this.__iterations}}},{key:"start",value:function(t,n,s,o,_){this.__active=!0,this._lastValue=t,this._fromValue=t,this._onUpdate=n,this.__onEnd=s,this._startTime=Date.now(),this._useNativeDriver?this.__startNativeAnimation(_):this._animationFrame=requestAnimationFrame(this.onUpdate.bind(this))}},{key:"onUpdate",value:function(){var t=Date.now(),n=this._fromValue+this._velocity/(1-this._deceleration)*(1-Math.exp(-(1-this._deceleration)*(t-this._startTime)));this._onUpdate(n),Math.abs(this._lastValue-n)<.1?this.__debouncedOnEnd({finished:!0}):(this._lastValue=n,this.__active&&(this._animationFrame=requestAnimationFrame(this.onUpdate.bind(this))))}},{key:"stop",value:function(){_(o(v.prototype),"stop",this).call(this),this.__active=!1,g.cancelAnimationFrame(this._animationFrame),this.__debouncedOnEnd({finished:!1})}}]),v})();m.exports=u},224,[19,20,27,30,31,33,225,209]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),_=(function(){function _(){t(this,_)}return n(_,[{key:"start",value:function(t,n,o,_,s){}},{key:"stop",value:function(){this.__nativeId&&o.API.stopAnimation(this.__nativeId)}},{key:"__getNativeAnimationConfig",value:function(){throw new Error('This animation type cannot be offloaded to native')}},{key:"__debouncedOnEnd",value:function(t){var n=this.__onEnd;this.__onEnd=null,n&&n(t)}},{key:"__startNativeAnimation",value:function(t){t.__makeNative(),this.__nativeId=o.generateNewAnimationId(),o.API.startAnimatingNode(this.__nativeId,t.__getNativeTag(),this.__getNativeAnimationConfig(),this.__debouncedOnEnd.bind(this))}}]),_})();m.exports=_},225,[19,20,209]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]),n=r(d[2]),o=r(d[3]),h=r(d[4]),_=r(d[5]),l=(r(d[6]),r(d[7]),r(d[8])),f=r(d[9]),c=r(d[10]),u=r(d[11]).shouldUseNativeDriver;function v(t,s){return void 0===t||null===t?s:t}var p=(function(p){function y(s){var h;if(t(this,y),(h=n(this,o(y).call(this)))._overshootClamping=v(s.overshootClamping,!1),h._restDisplacementThreshold=v(s.restDisplacementThreshold,.001),h._restSpeedThreshold=v(s.restSpeedThreshold,.001),h._initialVelocity=v(s.velocity,0),h._lastVelocity=v(s.velocity,0),h._toValue=s.toValue,h._delay=v(s.delay,0),h._useNativeDriver=u(s),h.__isInteraction=void 0===s.isInteraction||s.isInteraction,h.__iterations=void 0!==s.iterations?s.iterations:1,void 0!==s.stiffness||void 0!==s.damping||void 0!==s.mass)c(void 0===s.bounciness&&void 0===s.speed&&void 0===s.tension&&void 0===s.friction,'You can define one of bounciness/speed, tension/friction, or stiffness/damping/mass, but not more than one'),h._stiffness=v(s.stiffness,100),h._damping=v(s.damping,10),h._mass=v(s.mass,1);else if(void 0!==s.bounciness||void 0!==s.speed){c(void 0===s.tension&&void 0===s.friction&&void 0===s.stiffness&&void 0===s.damping&&void 0===s.mass,'You can define one of bounciness/speed, tension/friction, or stiffness/damping/mass, but not more than one');var _=f.fromBouncinessAndSpeed(v(s.bounciness,8),v(s.speed,12));h._stiffness=_.stiffness,h._damping=_.damping,h._mass=1}else{var l=f.fromOrigamiTensionAndFriction(v(s.tension,40),v(s.friction,7));h._stiffness=l.stiffness,h._damping=l.damping,h._mass=1}return c(h._stiffness>0,'Stiffness value must be greater than 0'),c(h._damping>0,'Damping value must be greater than 0'),c(h._mass>0,'Mass value must be greater than 0'),h}return _(y,l),s(y,[{key:"__getNativeAnimationConfig",value:function(){return{type:'spring',overshootClamping:this._overshootClamping,restDisplacementThreshold:this._restDisplacementThreshold,restSpeedThreshold:this._restSpeedThreshold,stiffness:this._stiffness,damping:this._damping,mass:this._mass,initialVelocity:v(this._initialVelocity,this._lastVelocity),toValue:this._toValue,iterations:this.__iterations}}},{key:"start",value:function(t,s,n,o,h){var _=this;if(this.__active=!0,this._startPosition=t,this._lastPosition=this._startPosition,this._onUpdate=s,this.__onEnd=n,this._lastTime=Date.now(),this._frameTime=0,o instanceof y){var l=o.getInternalState();this._lastPosition=l.lastPosition,this._lastVelocity=l.lastVelocity,this._initialVelocity=this._lastVelocity,this._lastTime=l.lastTime}var f=function(){_._useNativeDriver?_.__startNativeAnimation(h):_.onUpdate()};this._delay?this._timeout=setTimeout(f,this._delay):f()}},{key:"getInternalState",value:function(){return{lastPosition:this._lastPosition,lastVelocity:this._lastVelocity,lastTime:this._lastTime}}},{key:"onUpdate",value:function(){var t=Date.now();t>this._lastTime+64&&(t=this._lastTime+64);var s=(t-this._lastTime)/1e3;this._frameTime+=s;var n=this._damping,o=this._mass,h=this._stiffness,_=-this._initialVelocity,l=n/(2*Math.sqrt(h*o)),f=Math.sqrt(h/o),c=f*Math.sqrt(1-l*l),u=this._toValue-this._startPosition,v=0,p=0,y=this._frameTime;if(l<1){var V=Math.exp(-l*f*y);v=this._toValue-V*((_+l*f*u)/c*Math.sin(c*y)+u*Math.cos(c*y)),p=l*f*V*(Math.sin(c*y)*(_+l*f*u)/c+u*Math.cos(c*y))-V*(Math.cos(c*y)*(_+l*f*u)-c*u*Math.sin(c*y))}else{var T=Math.exp(-f*y);v=this._toValue-T*(u+(_+f*u)*y),p=T*(_*(y*f-1)+y*u*(f*f))}if(this._lastTime=t,this._lastPosition=v,this._lastVelocity=p,this._onUpdate(v),this.__active){var b=!1;this._overshootClamping&&0!==this._stiffness&&(b=this._startPositionthis._toValue:v18&&A<=44?p(A):h(A),s(2*M-M*M,v,.01));return{stiffness:n(x),damping:t(B)}}}},227,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t,n=r(d[0]),s=r(d[1]),o=r(d[2]),_=r(d[3]),u=r(d[4]),h=r(d[5]),v=(r(d[6]),r(d[7]),r(d[8])),l=r(d[9]).shouldUseNativeDriver;function c(){if(!t){var n=r(d[10]);t=n.inOut(n.ease)}return t}var f=(function(t){function f(t){var s;return n(this,f),(s=o(this,_(f).call(this)))._toValue=t.toValue,s._easing=void 0!==t.easing?t.easing:c(),s._duration=void 0!==t.duration?t.duration:500,s._delay=void 0!==t.delay?t.delay:0,s.__iterations=void 0!==t.iterations?t.iterations:1,s.__isInteraction=void 0===t.isInteraction||t.isInteraction,s._useNativeDriver=l(t),s}return h(f,v),s(f,[{key:"__getNativeAnimationConfig",value:function(){for(var t=[],n=0;n=this._startTime+this._duration)return 0===this._duration?this._onUpdate(this._toValue):this._onUpdate(this._fromValue+this._easing(1)*(this._toValue-this._fromValue)),void this.__debouncedOnEnd({finished:!0});this._onUpdate(this._fromValue+this._easing((t-this._startTime)/this._duration)*(this._toValue-this._fromValue)),this.__active&&(this._animationFrame=requestAnimationFrame(this.onUpdate.bind(this)))}},{key:"stop",value:function(){u(_(f.prototype),"stop",this).call(this),this.__active=!1,clearTimeout(this._timeout),g.cancelAnimationFrame(this._animationFrame),this.__debouncedOnEnd({finished:!1})}}]),f})();m.exports=f},228,[19,20,27,30,31,33,206,223,225,209,229]); -__d(function(g,r,i,a,m,e,d){'use strict';var n,u=r(d[0]),t=r(d[1]),o=(function(){function o(){u(this,o)}return t(o,null,[{key:"step0",value:function(n){return n>0?1:0}},{key:"step1",value:function(n){return n>=1?1:0}},{key:"linear",value:function(n){return n}},{key:"ease",value:function(u){return n||(n=o.bezier(.42,0,1,1)),n(u)}},{key:"quad",value:function(n){return n*n}},{key:"cubic",value:function(n){return n*n*n}},{key:"poly",value:function(n){return function(u){return Math.pow(u,n)}}},{key:"sin",value:function(n){return 1-Math.cos(n*Math.PI/2)}},{key:"circle",value:function(n){return 1-Math.sqrt(1-n*n)}},{key:"exp",value:function(n){return Math.pow(2,10*(n-1))}},{key:"elastic",value:function(){var n=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:1)*Math.PI;return function(u){return 1-Math.pow(Math.cos(u*Math.PI/2),3)*Math.cos(u*n)}}},{key:"back",value:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1.70158;return function(u){return u*u*((n+1)*u-n)}}},{key:"bounce",value:function(n){if(n<.36363636363636365)return 7.5625*n*n;if(n<.7272727272727273){var u=n-.5454545454545454;return 7.5625*u*u+.75}if(n<.9090909090909091){var t=n-.8181818181818182;return 7.5625*t*t+.9375}var o=n-.9545454545454546;return 7.5625*o*o+.984375}},{key:"bezier",value:function(n,u,t,o){return r(d[2])(n,u,t,o)}},{key:"in",value:function(n){return n}},{key:"out",value:function(n){return function(u){return 1-n(1-u)}}},{key:"inOut",value:function(n){return function(u){return u<.5?n(2*u)/2:1-n(2*(1-u))/2}}}]),o})();m.exports=o},229,[19,20,230]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=4,t=.001,u=1e-7,o=10,f=.1,c='function'==typeof Float32Array;function v(n,t){return 1-3*t+3*n}function s(n,t){return 3*t-6*n}function w(n){return 3*n}function l(n,t,u){return((v(t,u)*n+s(t,u))*n+w(t))*n}function y(n,t,u){return 3*v(t,u)*n*n+2*s(t,u)*n+w(t)}function b(n,t,f,c,v){var s,w,y=0,b=t,h=f;do{(s=l(w=b+(h-b)/2,c,v)-n)>0?h=w:b=w}while(Math.abs(s)>u&&++y=0&&n<=1&&o>=0&&o<=1))throw new Error('bezier x values must be in [0, 1] range');var s=c?new Float32Array(11):new Array(11);if(n!==u||o!==v)for(var w=0;w<11;++w)s[w]=l(w*f,n,o);function A(u){for(var c=0,v=1;10!==v&&s[v]<=u;++v)c+=f;var w=c+(u-s[--v])/(s[v+1]-s[v])*f,l=y(w,n,o);return l>=t?h(u,w,n,o):0===l?w:b(u,c,c+f,n,o)}return function(t){return n===u&&o===v?t:0===t?0:1===t?1:l(A(t),u,v)}}},230,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),s=r(d[3]),p=r(d[4]),c=r(d[5]),_=r(d[6]),h=r(d[7]).AnimatedEvent,v=r(d[8]),l=r(d[9]),u=r(d[10]),f=r(d[11]);m.exports=function(k){f('function'!=typeof k||k.prototype&&k.prototype.isReactComponent,"`createAnimatedComponent` does not support stateless functional components; use a class component instead.");var N=(function(u){function f(t){var o;return n(this,f),(o=s(this,p(f).call(this,t)))._invokeAnimatedPropsCallbackOnMount=!1,o._eventDetachers=[],o._animatedPropsCallback=function(){if(null==o._component)o._invokeAnimatedPropsCallbackOnMount=!0;else if(f.__skipSetNativeProps_FOR_TESTS_ONLY||'function'!=typeof o._component.setNativeProps)o.forceUpdate();else{if(o._propsAnimated.__isNative)throw new Error("Attempting to run JS driven animation on animated node that has been moved to \"native\" earlier by starting an animation with `useNativeDriver: true`");o._component.setNativeProps(o._propsAnimated.__getAnimatedValue())}},o._setComponentRef=o._setComponentRef.bind(_(_(o))),o}return c(f,u),o(f,[{key:"componentWillUnmount",value:function(){this._propsAnimated&&this._propsAnimated.__detach(),this._detachNativeEvents()}},{key:"setNativeProps",value:function(t){this._component.setNativeProps(t)}},{key:"UNSAFE_componentWillMount",value:function(){this._attachProps(this.props)}},{key:"componentDidMount",value:function(){this._invokeAnimatedPropsCallbackOnMount&&(this._invokeAnimatedPropsCallbackOnMount=!1,this._animatedPropsCallback()),this._propsAnimated.setNativeView(this._component),this._attachNativeEvents()}},{key:"_attachNativeEvents",value:function(){var t=this,n=this._component.getScrollableNode?this._component.getScrollableNode():this._component,o=function(o){var s=t.props[o];s instanceof h&&s.__isNative&&(s.__attach(n,o),t._eventDetachers.push(function(){return s.__detach(n,o)}))};for(var s in this.props)o(s)}},{key:"_detachNativeEvents",value:function(){this._eventDetachers.forEach(function(t){return t()}),this._eventDetachers=[]}},{key:"_attachProps",value:function(t){var n=this._propsAnimated;this._propsAnimated=new v(t,this._animatedPropsCallback),n&&n.__detach()}},{key:"UNSAFE_componentWillReceiveProps",value:function(t){this._attachProps(t)}},{key:"componentDidUpdate",value:function(t){this._component!==this._prevComponent&&this._propsAnimated.setNativeView(this._component),this._component===this._prevComponent&&t===this.props||(this._detachNativeEvents(),this._attachNativeEvents())}},{key:"render",value:function(){var n=this._propsAnimated.__getValue();return l.createElement(k,t({},n,{ref:this._setComponentRef,collapsable:!this._propsAnimated.__isNative&&n.collapsable}))}},{key:"_setComponentRef",value:function(t){this._prevComponent=this._component,this._component=t}},{key:"getNode",value:function(){return this._component}}]),f})(l.Component);N.__skipSetNativeProps_FOR_TESTS_ONLY=!1;var y=k.propTypes;return N.propTypes={style:function(t,n,o){if(y)for(var s in u)y[s]||void 0===t[s]||console.warn('You are setting the style `{ '+s+": ... }` as a prop. You should nest it in a style object. E.g. `{ style: { "+s+': ... } }`')}},N}},231,[8,19,20,27,30,33,29,205,218,46,66,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]);m.exports=s(t)},232,[233,231]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),s=r(d[3]),l=r(d[4]),u=r(d[5]),c=r(d[6]),f=r(d[7]),p=r(d[8]),h=r(d[9]),C=r(d[10]),v=r(d[11]),y=r(d[12]),b=c({},C.defaultProps,{numColumns:1}),_=(function(b){function _(t){var l;return n(this,_),(l=o(this,s(_).call(this,t)))._virtualizedListPairs=[],l._captureRef=function(t){l._listRef=t},l._getItem=function(t,n){var o=l.props.numColumns;if(o>1){for(var s=[],u=0;u1?(y(Array.isArray(t),"FlatList: Encountered internal consistency error, expected each item to consist of an array with 1-%s columns; instead, received a single item.",u),t.map(function(t,o){return s(t,n*u+o)}).join(':')):s(t,n)},l._renderItem=function(t){var n=l.props,o=n.renderItem,s=n.numColumns,u=n.columnWrapperStyle;if(s>1){var c=t.item,f=t.index;return y(Array.isArray(c),'Expected array of items with numColumns > 1'),p.createElement(h,{style:v.compose(w.row,u)},c.map(function(n,l){var u=o({item:n,index:f*s+l,separators:t.separators});return u&&p.cloneElement(u,{key:l})}))}return o(t)},l._checkProps(l.props),l.props.viewabilityConfigCallbackPairs?l._virtualizedListPairs=l.props.viewabilityConfigCallbackPairs.map(function(t){return{viewabilityConfig:t.viewabilityConfig,onViewableItemsChanged:l._createOnViewableItemsChanged(t.onViewableItemsChanged)}}):l.props.onViewableItemsChanged&&l._virtualizedListPairs.push({viewabilityConfig:l.props.viewabilityConfig,onViewableItemsChanged:l._createOnViewableItemsChanged(l.props.onViewableItemsChanged)}),l}return u(_,b),l(_,[{key:"scrollToEnd",value:function(t){this._listRef&&this._listRef.scrollToEnd(t)}},{key:"scrollToIndex",value:function(t){this._listRef&&this._listRef.scrollToIndex(t)}},{key:"scrollToItem",value:function(t){this._listRef&&this._listRef.scrollToItem(t)}},{key:"scrollToOffset",value:function(t){this._listRef&&this._listRef.scrollToOffset(t)}},{key:"recordInteraction",value:function(){this._listRef&&this._listRef.recordInteraction()}},{key:"flashScrollIndicators",value:function(){this._listRef&&this._listRef.flashScrollIndicators()}},{key:"getScrollResponder",value:function(){if(this._listRef)return this._listRef.getScrollResponder()}},{key:"getScrollableNode",value:function(){if(this._listRef)return this._listRef.getScrollableNode()}},{key:"setNativeProps",value:function(t){this._listRef&&this._listRef.setNativeProps(t)}}]),l(_,[{key:"componentDidUpdate",value:function(t){y(t.numColumns===this.props.numColumns,"Changing numColumns on the fly is not supported. Change the key prop on FlatList when changing the number of columns to force a fresh render of the component."),y(t.onViewableItemsChanged===this.props.onViewableItemsChanged,'Changing onViewableItemsChanged on the fly is not supported'),y(!f(t.viewabilityConfig,this.props.viewabilityConfig),'Changing viewabilityConfig on the fly is not supported'),y(t.viewabilityConfigCallbackPairs===this.props.viewabilityConfigCallbackPairs,'Changing viewabilityConfigCallbackPairs on the fly is not supported'),this._checkProps(this.props)}},{key:"_checkProps",value:function(t){var n=t.getItem,o=t.getItemCount,s=t.horizontal,l=t.numColumns,u=t.columnWrapperStyle,c=t.onViewableItemsChanged,f=t.viewabilityConfigCallbackPairs;y(!n&&!o,'FlatList does not support custom data formats.'),l>1?y(!s,'numColumns does not support horizontal.'):y(!u,'columnWrapperStyle not supported for single column lists'),y(!(c&&f),"FlatList does not support setting both onViewableItemsChanged and viewabilityConfigCallbackPairs.")}},{key:"_pushMultiColumnViewable",value:function(t,n){var o=this.props,s=o.numColumns,l=o.keyExtractor;n.item.forEach(function(o,u){y(null!=n.index,'Missing index!');var f=n.index*s+u;t.push(c({},n,{item:o,key:l(o,f),index:f}))})}},{key:"_createOnViewableItemsChanged",value:function(t){var n=this;return function(o){var s=n.props.numColumns;if(t)if(s>1){var l=[],u=[];o.viewableItems.forEach(function(t){return n._pushMultiColumnViewable(u,t)}),o.changed.forEach(function(t){return n._pushMultiColumnViewable(l,t)}),t({viewableItems:u,changed:l})}else t(o)}}},{key:"render",value:function(){return p.createElement(C,t({},this.props,{renderItem:this._renderItem,getItem:this._getItem,getItemCount:this._getItemCount,keyExtractor:this._keyExtractor,ref:this._captureRef,viewabilityConfigCallbackPairs:this._virtualizedListPairs}))}}]),_})(p.PureComponent);_.defaultProps=b;var w=v.create({row:{flexDirection:'row'}});m.exports=_},233,[8,19,27,30,20,33,44,155,46,73,234,50,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]),n=r(d[2]),o=r(d[3]),l=r(d[4]),h=r(d[5]),c=r(d[6]),p=r(d[7]),u=r(d[8]),f=r(d[9]),_=r(d[10]),v=r(d[11]),y=r(d[12]),C=r(d[13]),L=r(d[14]),b=r(d[15]),S=r(d[16]),M=r(d[17]),x=r(d[18]),k=r(d[19]),E=(r(d[20]),r(d[21])),I=r(d[22]),R=(r(d[23]),r(d[24]).computeWindowedRenderLimits),w=!1,T='',z=(function(v){function z(t,c){var p;o(this,z),(p=l(this,h(z).call(this,t,c)))._getScrollMetrics=function(){return p._scrollMetrics},p._getOutermostParentListRef=function(){return p._isNestedWithSameOrientation()?p.context.virtualizedList.getOutermostParentListRef():u(u(p))},p._getNestedChildState=function(t){var s=p._nestedChildLists.get(t);return s&&s.state},p._registerAsNestedChild=function(t){var s=p._cellKeysToChildListKeys.get(t.cellKey)||new Set;s.add(t.key),p._cellKeysToChildListKeys.set(t.cellKey,s);var n=p._nestedChildLists.get(t.key);I(!(n&&null!==n.ref),"A VirtualizedList contains a cell which itself contains more than one VirtualizedList of the same orientation as the parent list. You must pass a unique listKey prop to each sibling list."),p._nestedChildLists.set(t.key,{ref:t.ref,state:null}),p._hasInteracted&&t.ref.recordInteraction()},p._unregisterAsNestedChild=function(t){p._nestedChildLists.set(t.key,{ref:null,state:t.state})},p._onUpdateSeparators=function(t,s){t.forEach(function(t){var n=null!=t&&p._cellRefs[t];n&&n.updateSeparatorProps(s)})},p._averageCellLength=0,p._cellKeysToChildListKeys=new Map,p._cellRefs={},p._frames={},p._footerLength=0,p._hasDataChangedSinceEndReached=!0,p._hasInteracted=!1,p._hasMore=!1,p._hasWarned={},p._highestMeasuredFrameIndex=0,p._headerLength=0,p._indicesToKeys=new Map,p._hasDoneInitialScroll=!1,p._nestedChildLists=new Map,p._offsetFromParentVirtualizedList=0,p._prevParentOffset=0,p._scrollMetrics={contentLength:0,dOffset:0,dt:10,offset:0,timestamp:0,velocity:0,visibleLength:0},p._scrollRef=null,p._sentEndForContentLength=0,p._totalCellLength=0,p._totalCellsMeasured=0,p._viewabilityTuples=[],p._captureScrollRef=function(t){p._scrollRef=t},p._defaultRenderScrollComponent=function(t){var n=t.onRefresh;return p._isNestedWithSameOrientation()?y.createElement(x,t):n?(I('boolean'==typeof t.refreshing,'`refreshing` prop must be set as a boolean in order to use `onRefresh`, but got `'+JSON.stringify(t.refreshing)+'`'),y.createElement(b,s({},t,{refreshControl:null==t.refreshControl?y.createElement(L,{refreshing:t.refreshing,onRefresh:n,progressViewOffset:t.progressViewOffset}):t.refreshControl}))):y.createElement(b,t)},p._onCellUnmount=function(t){var s=p._frames[t];s&&(p._frames[t]=n({},s,{inLayout:!1}))},p._onLayout=function(t){p._isNestedWithSameOrientation()?p.measureLayoutRelativeToContainingList():p._scrollMetrics.visibleLength=p._selectLength(t.nativeEvent.layout),p.props.onLayout&&p.props.onLayout(t),p._scheduleCellsToRenderUpdate(),p._maybeCallOnEndReached()},p._onLayoutEmpty=function(t){p.props.onLayout&&p.props.onLayout(t)},p._onLayoutFooter=function(t){p._footerLength=p._selectLength(t.nativeEvent.layout)},p._onLayoutHeader=function(t){p._headerLength=p._selectLength(t.nativeEvent.layout)},p._onContentSizeChange=function(t,s){t>0&&s>0&&null!=p.props.initialScrollIndex&&p.props.initialScrollIndex>0&&!p._hasDoneInitialScroll&&(p.scrollToIndex({animated:!1,index:p.props.initialScrollIndex}),p._hasDoneInitialScroll=!0),p.props.onContentSizeChange&&p.props.onContentSizeChange(t,s),p._scrollMetrics.contentLength=p._selectLength({height:s,width:t}),p._scheduleCellsToRenderUpdate(),p._maybeCallOnEndReached()},p._convertParentScrollMetrics=function(t){var s=t.offset-p._offsetFromParentVirtualizedList,n=t.visibleLength,o=s-p._scrollMetrics.offset;return{visibleLength:n,contentLength:p._scrollMetrics.contentLength,offset:s,dOffset:o}},p._onScroll=function(t){p._nestedChildLists.forEach(function(s){s.ref&&s.ref._onScroll(t)}),p.props.onScroll&&p.props.onScroll(t);var s=t.timeStamp,n=p._selectLength(t.nativeEvent.layoutMeasurement),o=p._selectLength(t.nativeEvent.contentSize),l=p._selectOffset(t.nativeEvent.contentOffset),h=l-p._scrollMetrics.offset;if(p._isNestedWithSameOrientation()){if(0===p._scrollMetrics.contentLength)return;var c=p._convertParentScrollMetrics({visibleLength:n,offset:l});n=c.visibleLength,o=c.contentLength,l=c.offset,h=c.dOffset}var u=p._scrollMetrics.timestamp?Math.max(1,s-p._scrollMetrics.timestamp):1,f=h/u;u>500&&p._scrollMetrics.dt>500&&o>5*n&&!p._hasWarned.perf&&(E("VirtualizedList: You have a large list that is slow to update - make sure your renderItem function renders components that follow React performance best practices like PureComponent, shouldComponentUpdate, etc.",{dt:u,prevDt:p._scrollMetrics.dt,contentLength:o}),p._hasWarned.perf=!0),p._scrollMetrics={contentLength:o,dt:u,dOffset:h,offset:l,timestamp:s,velocity:f,visibleLength:n},p._updateViewableItems(p.props.data),p.props&&(p._maybeCallOnEndReached(),0!==f&&p._fillRateHelper.activate(),p._computeBlankness(),p._scheduleCellsToRenderUpdate())},p._onScrollBeginDrag=function(t){p._nestedChildLists.forEach(function(s){s.ref&&s.ref._onScrollBeginDrag(t)}),p._viewabilityTuples.forEach(function(t){t.viewabilityHelper.recordInteraction()}),p._hasInteracted=!0,p.props.onScrollBeginDrag&&p.props.onScrollBeginDrag(t)},p._onScrollEndDrag=function(t){var s=t.nativeEvent.velocity;s&&(p._scrollMetrics.velocity=p._selectOffset(s)),p._computeBlankness(),p.props.onScrollEndDrag&&p.props.onScrollEndDrag(t)},p._onMomentumScrollEnd=function(t){p._scrollMetrics.velocity=0,p._computeBlankness(),p.props.onMomentumScrollEnd&&p.props.onMomentumScrollEnd(t)},p._updateCellsToRender=function(){var t=p.props,s=t.data,n=t.getItemCount,o=t.onEndReachedThreshold,l=p._isVirtualizationDisabled();p._updateViewableItems(s),s&&p.setState(function(t){var h;if(l){var c=p._scrollMetrics,u=c.contentLength,f=c.offset,_=c.visibleLength,v=u-_-f0)for(var y=h.first,C=h.last,L=y;L<=C;L++){var b=p._indicesToKeys.get(L),S=b&&p._cellKeysToChildListKeys.get(b);if(S){var M=!1,x=S,k=Array.isArray(x),E=0;for(x=k?x:x["function"==typeof Symbol&&"function"==typeof Symbol?Symbol.iterator:"@@iterator"]();;){var I;if(k){if(E>=x.length)break;I=x[E++]}else{if((E=x.next()).done)break;I=E.value}var w=I,T=p._nestedChildLists.get(w);if(T&&T.ref&&T.ref.hasMore()){M=!0;break}}if(M){h.last=L;break}}}return h})},p._createViewToken=function(t,s){var n=p.props,o=n.data,l=n.getItem,h=n.keyExtractor,c=l(o,t);return{index:t,item:c,key:h(c,t),isViewable:s}},p._getFrameMetricsApprox=function(t){var s=p._getFrameMetrics(t);if(s&&s.index===t)return s;var n=p.props.getItemLayout;return I(!n,'Should not have to estimate frames when a measurement metrics function is provided'),{length:p._averageCellLength,offset:p._averageCellLength*t}},p._getFrameMetrics=function(t){var s=p.props,n=s.data,o=s.getItem,l=s.getItemCount,h=s.getItemLayout,c=s.keyExtractor;I(l(n)>t,'Tried to get frame for out of range index '+t);var u=o(n,t),f=u&&p._frames[c(u,t)];return f&&f.index===t||h&&(f=h(n,t)),f},I(!t.onScroll||!t.onScroll.__isNative,"Components based on VirtualizedList must be wrapped with Animated.createAnimatedComponent to support native onScroll events with useNativeDriver"),I(t.windowSize>0,'VirtualizedList: The windowSize prop must be present and set to a value greater than 0.'),p._fillRateHelper=new _(p._getFrameMetrics),p._updateCellsToRenderBatcher=new f(p._updateCellsToRender,p.props.updateCellsBatchingPeriod),p.props.viewabilityConfigCallbackPairs?p._viewabilityTuples=p.props.viewabilityConfigCallbackPairs.map(function(t){return{viewabilityHelper:new k(t.viewabilityConfig),onViewableItemsChanged:t.onViewableItemsChanged}}):p.props.onViewableItemsChanged&&p._viewabilityTuples.push({viewabilityHelper:new k(p.props.viewabilityConfig),onViewableItemsChanged:p.props.onViewableItemsChanged});var v={first:p.props.initialScrollIndex||0,last:Math.min(p.props.getItemCount(p.props.data),(p.props.initialScrollIndex||0)+p.props.initialNumToRender)-1};if(p._isNestedWithSameOrientation()){var C=p.context.virtualizedList.getNestedChildState(p.props.listKey||p._getCellKey());C&&(v=C,p.state=C,p._frames=C.frames)}return p.state=v,p}return p(z,v),c(z,[{key:"scrollToEnd",value:function(t){var s=!t||t.animated,n=this.props.getItemCount(this.props.data)-1,o=this._getFrameMetricsApprox(n),l=Math.max(0,o.offset+o.length+this._footerLength-this._scrollMetrics.visibleLength);this._scrollRef.scrollTo(this.props.horizontal?{x:l,animated:s}:{y:l,animated:s})}},{key:"scrollToIndex",value:function(t){var s=this.props,n=s.data,o=s.horizontal,l=s.getItemCount,h=s.getItemLayout,c=s.onScrollToIndexFailed,p=t.animated,u=t.index,f=t.viewOffset,_=t.viewPosition;if(I(u>=0&&uthis._highestMeasuredFrameIndex)return I(!!c,"scrollToIndex should be used in conjunction with getItemLayout or onScrollToIndexFailed, otherwise there is no way to know the location of offscreen indices or handle failures."),void c({averageItemLength:this._averageCellLength,highestMeasuredFrameIndex:this._highestMeasuredFrameIndex,index:u});var v=this._getFrameMetricsApprox(u),y=Math.max(0,v.offset-(_||0)*(this._scrollMetrics.visibleLength-v.length))-(f||0);this._scrollRef.scrollTo(o?{x:y,animated:p}:{y:y,animated:p})}},{key:"scrollToItem",value:function(t){for(var s=t.item,o=this.props,l=o.data,h=o.getItem,c=(0,o.getItemCount)(l),p=0;p0){w=!1,T='';var E=f?'width':'height',I=this.props.initialScrollIndex?-1:this.props.initialNumToRender-1,R=this.state,z=R.first,O=R.last;this._pushCells(C,b,L,0,I,v);var N=Math.max(I+1,z);if(!_&&z>I+1){var V=!1;if(L.size>0)for(var A=c?1:0,P=N-1;P>I;P--)if(L.has(P+A)){var D=this._getFrameMetricsApprox(I),H=this._getFrameMetricsApprox(P),B=H.offset-D.offset;C.push(y.createElement(x,{key:"$sticky_lead",style:t({},E,B)})),this._pushCells(C,b,L,P,P,v);var U=this._getFrameMetricsApprox(z).offset-(H.offset+H.length);C.push(y.createElement(x,{key:"$sticky_trail",style:t({},E,U)})),V=!0;break}if(!V){var W=this._getFrameMetricsApprox(I),$=this._getFrameMetricsApprox(z).offset-(W.offset+W.length);C.push(y.createElement(x,{key:"$lead_spacer",style:t({},E,$)}))}}if(this._pushCells(C,b,L,N,O,v),!this._hasWarned.keys&&w&&(console.warn("VirtualizedList: missing keys for items, make sure to specify a key property on each item or provide a custom keyExtractor.",T),this._hasWarned.keys=!0),!_&&O=p.length)break;_=p[f++]}else{if((f=p.next()).done)break;_=f.value}var v=_,y=this._nestedChildLists.get(v);y&&y.ref&&y.ref.measureLayoutRelativeToContainingList()}}this._computeBlankness()}},{key:"measureLayoutRelativeToContainingList",value:function(){var t=this;try{M.measureLayout(C.findNodeHandle(this),C.findNodeHandle(this.context.virtualizedList.getOutermostParentListRef()),function(t){console.warn("VirtualizedList: Encountered an error while measuring a list's offset from its containing VirtualizedList.")},function(s,n,o,l){t._offsetFromParentVirtualizedList=t._selectOffset({x:s,y:n}),t._scrollMetrics.contentLength=t._selectLength({width:o,height:l});var h=t._convertParentScrollMetrics(t.context.virtualizedList.getScrollMetrics());t._scrollMetrics.visibleLength=h.visibleLength,t._scrollMetrics.offset=h.offset})}catch(t){console.warn('measureLayoutRelativeToContainingList threw an error',t.stack)}}},{key:"_renderDebugOverlay",value:function(){for(var t=this._scrollMetrics.visibleLength/this._scrollMetrics.contentLength,s=[],n=this.props.getItemCount(this.props.data),o=0;o0){var _=l-this._getFrameMetricsApprox(s).offset;u=u||_<0||c<-2&&_2&&v0&&void 0!==arguments[0]?arguments[0]:{abort:!1};this._taskHandle&&(this._taskHandle.cancel(),t.abort||this._callback(),this._taskHandle=null)}},{key:"schedule",value:function(){var t=this;if(!this._taskHandle){var n=setTimeout(function(){t._taskHandle=l.runAfterInteractions(function(){t._taskHandle=null,t._callback()})},this._delay);this._taskHandle={cancel:function(){return clearTimeout(n)}}}}}]),s})();m.exports=s},235,[19,20,211]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),s=r(d[2]),l=r(d[3]),_=r(d[4]),h=function t(){s(this,t),this.any_blank_count=0,this.any_blank_ms=0,this.any_blank_speed_sum=0,this.mostly_blank_count=0,this.mostly_blank_ms=0,this.pixels_blank=0,this.pixels_sampled=0,this.pixels_scrolled=0,this.total_time_spent=0,this.sample_count=0},o=[],u=10,f=null,c=(function(){function c(t){s(this,c),this._anyBlankStartTime=null,this._enabled=!1,this._info=new h,this._mostlyBlankStartTime=null,this._samplesStartTime=null,this._getFrameMetrics=t,this._enabled=(f||0)>Math.random(),this._resetData()}return n(c,null,[{key:"addListener",value:function(t){return _(null!==f,'Call `FillRateHelper.setSampleRate` before `addListener`.'),o.push(t),{remove:function(){o=o.filter(function(n){return t!==n})}}}},{key:"setSampleRate",value:function(t){f=t}},{key:"setMinSampleCount",value:function(t){u=t}}]),n(c,[{key:"activate",value:function(){this._enabled&&null==this._samplesStartTime&&(this._samplesStartTime=l())}},{key:"deactivateAndFlush",value:function(){if(this._enabled){var n=this._samplesStartTime;if(null!=n)if(this._info.sample_count0&&(k=Math.min(u,Math.max(0,p.offset-h)));for(var b=0,v=n.last,S=this._getFrameMetrics(v);v>=n.first&&(!S||!S.inLayout);)S=this._getFrameMetrics(v),v--;if(S&&v0?(this._anyBlankStartTime=c,this._info.any_blank_speed_sum+=f,this._info.any_blank_count++,this._info.pixels_blank+=T,B>.5&&(this._mostlyBlankStartTime=c,this._info.mostly_blank_count++)):(f<.01||Math.abs(_)<1)&&this.deactivateAndFlush(),B}},{key:"enabled",value:function(){return this._enabled}},{key:"_resetData",value:function(){this._anyBlankStartTime=null,this._info=new h,this._mostlyBlankStartTime=null,this._samplesStartTime=null}}]),c})();m.exports=c},236,[44,20,19,107,110]); -__d(function(g,r,i,a,m,e,d){'use strict';var t,n=r(d[0]),s=r(d[1]),o=r(d[2]),h=r(d[3]),f=r(d[4]),p=r(d[5]),u=(r(d[6]),r(d[7])),v=(r(d[8]).NativeComponent,r(d[9])),c=r(d[10]),l=r(d[11]).getViewManagerConfig('AndroidSwipeRefreshLayout');t=l?l.Constants:{SIZE:{}};var R=v('AndroidSwipeRefreshLayout'),_=(function(t){function v(){var t,n;s(this,v);for(var o=arguments.length,p=new Array(o),u=0;u0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;console.warn('`scrollWithoutAnimationTo` is deprecated. Use `scrollTo` instead'),this.scrollTo({x:n,y:t,animated:!1})},flashScrollIndicators:function(){this.getScrollResponder().scrollResponderFlashScrollIndicators()},_getKeyForIndex:function(t,n){var o=n[t];return o&&o.key},_updateAnimatedNodeAttachment:function(){this._scrollAnimatedValueAttachment&&this._scrollAnimatedValueAttachment.detach(),this.props.stickyHeaderIndices&&this.props.stickyHeaderIndices.length>0&&(this._scrollAnimatedValueAttachment=c.attachNativeEvent(this._scrollViewRef,'onScroll',[{nativeEvent:{contentOffset:{y:this._scrollAnimatedValue}}}]))},_setStickyHeaderRef:function(t,n){n?this._stickyHeaderRefs.set(t,n):this._stickyHeaderRefs.delete(t)},_onStickyHeaderLayout:function(t,n,o){if(this.props.stickyHeaderIndices){var s=h.Children.toArray(this.props.children);if(o===this._getKeyForIndex(t,s)){var l=n.nativeEvent.layout.y;this._headerLayoutYs.set(o,l);var c=this.props.stickyHeaderIndices.indexOf(t),p=this.props.stickyHeaderIndices[c-1];if(null!=p){var u=this._stickyHeaderRefs.get(this._getKeyForIndex(p,s));u&&u.setNextHeaderY(l)}}}},_handleScroll:function(t){'on-drag'===this.props.keyboardDismissMode&&this.state.isTouching&&_(),this.scrollResponderHandleScroll(t)},_handleLayout:function(t){this.props.invertStickyHeaders&&this.setState({layoutHeight:t.nativeEvent.layout.height}),this.props.onLayout&&this.props.onLayout(t)},_handleContentOnLayout:function(t){var n=t.nativeEvent.layout,o=n.width,s=n.height;this.props.onContentSizeChange&&this.props.onContentSizeChange(o,s)},_scrollViewRef:null,_setScrollViewRef:function(t){this._scrollViewRef=t},_innerViewRef:null,_setInnerViewRef:function(t){this._innerViewRef=t},render:function(){var c,p,u=this;this.props.horizontal?(c=o,p=n):(c=t,p=y),H(void 0!==c,'ScrollViewClass must not be undefined'),H(void 0!==p,'ScrollContentContainerViewClass must not be undefined');var S=[this.props.horizontal&&A.contentContainerHorizontal,this.props.contentContainerStyle],R={};this.props.onContentSizeChange&&(R={onLayout:this._handleContentOnLayout});var _=this.props.stickyHeaderIndices,w=_&&_.length>0,T=w&&h.Children.toArray(this.props.children),E=w?T.map(function(t,n){var o=t?_.indexOf(n):-1;if(o>-1){var s=t.key,l=_[o+1];return h.createElement(f,{key:s,ref:function(t){return u._setStickyHeaderRef(s,t)},nextHeaderLayoutY:u._headerLayoutYs.get(u._getKeyForIndex(l,T)),onLayout:function(t){return u._onStickyHeaderLayout(n,t,s)},scrollAnimatedValue:u._scrollAnimatedValue,inverted:u.props.invertStickyHeaders,scrollViewHeight:u.state.layoutHeight},t)}return t}):this.props.children,C=h.createElement(p,s({},R,{ref:this._setInnerViewRef,style:S,removeClippedSubviews:!w&&this.props.removeClippedSubviews,collapsable:!1}),E),x=void 0!==this.props.alwaysBounceHorizontal?this.props.alwaysBounceHorizontal:this.props.horizontal,k=void 0!==this.props.alwaysBounceVertical?this.props.alwaysBounceVertical:!this.props.horizontal,I=!!this.props.DEPRECATED_sendUpdatedChildFrames,z=this.props.horizontal?A.baseHorizontal:A.baseVertical,M=l({},this.props,{alwaysBounceHorizontal:x,alwaysBounceVertical:k,style:[z,this.props.style],onContentSizeChange:null,onLayout:this._handleLayout,onMomentumScrollBegin:this.scrollResponderHandleMomentumScrollBegin,onMomentumScrollEnd:this.scrollResponderHandleMomentumScrollEnd,onResponderGrant:this.scrollResponderHandleResponderGrant,onResponderReject:this.scrollResponderHandleResponderReject,onResponderRelease:this.scrollResponderHandleResponderRelease,onResponderTerminate:this.scrollResponderHandleTerminate,onResponderTerminationRequest:this.scrollResponderHandleTerminationRequest,onScroll:this._handleScroll,onScrollBeginDrag:this.scrollResponderHandleScrollBeginDrag,onScrollEndDrag:this.scrollResponderHandleScrollEndDrag,onScrollShouldSetResponder:this.scrollResponderHandleScrollShouldSetResponder,onStartShouldSetResponder:this.scrollResponderHandleStartShouldSetResponder,onStartShouldSetResponderCapture:this.scrollResponderHandleStartShouldSetResponderCapture,onTouchEnd:this.scrollResponderHandleTouchEnd,onTouchMove:this.scrollResponderHandleTouchMove,onTouchStart:this.scrollResponderHandleTouchStart,onTouchCancel:this.scrollResponderHandleTouchCancel,scrollBarThumbImage:V(this.props.scrollBarThumbImage),scrollEventThrottle:w?1:this.props.scrollEventThrottle,sendMomentumEvents:!(!this.props.onMomentumScrollBegin&&!this.props.onMomentumScrollEnd),DEPRECATED_sendUpdatedChildFrames:I,snapToStart:!1!==this.props.snapToStart,snapToEnd:!1!==this.props.snapToEnd,pagingEnabled:this.props.pagingEnabled||null!=this.props.snapToInterval||null!=this.props.snapToOffsets}),b=this.props.decelerationRate;null!=b&&(M.decelerationRate=v(b));var L=this.props.refreshControl;return L?h.cloneElement(L,{style:M.style},h.createElement(c,s({},M,{style:z,ref:this._setScrollViewRef}),C)):h.createElement(c,s({},M,{ref:this._setScrollViewRef}),C)}}),A=S.create({baseVertical:{flexGrow:1,flexShrink:1,flexDirection:'column',overflow:'scroll'},baseHorizontal:{flexGrow:1,flexShrink:1,flexDirection:'row',overflow:'scroll'},contentContainerHorizontal:{flexDirection:'row'}});m.exports=T},238,[8,44,204,41,46,76,239,244,50,73,245,196,243,72,3,246,159,165]); -__d(function(g,r,i,a,m,e,d){'use strict';var o=r(d[0]),s=r(d[1]),n=r(d[2]),l=r(d[3]),t=r(d[4]),c=r(d[5]),p=r(d[6]),h=r(d[7]),u=r(d[8]),S=r(d[9]),b=r(d[10]).ScrollViewManager,R={Mixin:{_subscriptionKeyboardWillShow:null,_subscriptionKeyboardWillHide:null,_subscriptionKeyboardDidShow:null,_subscriptionKeyboardDidHide:null,scrollResponderMixinGetInitialState:function(){return{isTouching:!1,lastMomentumScrollBeginTime:0,lastMomentumScrollEndTime:0,observedScrollSinceBecomingResponder:!1,becameResponderWhileAnimating:!1}},scrollResponderHandleScrollShouldSetResponder:function(){return this.state.isTouching},scrollResponderHandleStartShouldSetResponder:function(o){var s=t.currentlyFocusedField();return'handled'===this.props.keyboardShouldPersistTaps&&null!=s&&o.target!==s},scrollResponderHandleStartShouldSetResponderCapture:function(o){if(this.scrollResponderIsAnimating())return!0;var s=t.currentlyFocusedField(),n=this.props.keyboardShouldPersistTaps;return!(n&&'never'!==n||null==s||!o.target||t.isTextInput(o.target))},scrollResponderHandleResponderReject:function(){},scrollResponderHandleTerminationRequest:function(){return!this.state.observedScrollSinceBecomingResponder},scrollResponderHandleTouchEnd:function(o){var s=o.nativeEvent;this.state.isTouching=0!==s.touches.length,this.props.onTouchEnd&&this.props.onTouchEnd(o)},scrollResponderHandleTouchCancel:function(o){this.state.isTouching=!1,this.props.onTouchCancel&&this.props.onTouchCancel(o)},scrollResponderHandleResponderRelease:function(o){this.props.onResponderRelease&&this.props.onResponderRelease(o);var s=t.currentlyFocusedField();!0===this.props.keyboardShouldPersistTaps||'always'===this.props.keyboardShouldPersistTaps||null==s||o.target===s||this.state.observedScrollSinceBecomingResponder||this.state.becameResponderWhileAnimating||(this.props.onScrollResponderKeyboardDismissed&&this.props.onScrollResponderKeyboardDismissed(o),t.blurTextInput(s))},scrollResponderHandleScroll:function(o){this.state.observedScrollSinceBecomingResponder=!0,this.props.onScroll&&this.props.onScroll(o)},scrollResponderHandleResponderGrant:function(o){this.state.observedScrollSinceBecomingResponder=!1,this.props.onResponderGrant&&this.props.onResponderGrant(o),this.state.becameResponderWhileAnimating=this.scrollResponderIsAnimating()},scrollResponderHandleScrollBeginDrag:function(o){s.beginScroll(),this.props.onScrollBeginDrag&&this.props.onScrollBeginDrag(o)},scrollResponderHandleScrollEndDrag:function(o){var n=o.nativeEvent.velocity;this.scrollResponderIsAnimating()||n&&(0!==n.x||0!==n.y)||s.endScroll(),this.props.onScrollEndDrag&&this.props.onScrollEndDrag(o)},scrollResponderHandleMomentumScrollBegin:function(o){this.state.lastMomentumScrollBeginTime=u(),this.props.onMomentumScrollBegin&&this.props.onMomentumScrollBegin(o)},scrollResponderHandleMomentumScrollEnd:function(o){s.endScroll(),this.state.lastMomentumScrollEndTime=u(),this.props.onMomentumScrollEnd&&this.props.onMomentumScrollEnd(o)},scrollResponderHandleTouchStart:function(o){this.state.isTouching=!0,this.props.onTouchStart&&this.props.onTouchStart(o)},scrollResponderHandleTouchMove:function(o){this.props.onTouchMove&&this.props.onTouchMove(o)},scrollResponderIsAnimating:function(){return u()-this.state.lastMomentumScrollEndTime<16||this.state.lastMomentumScrollEndTime0){v.push(H),L.push(0),v.push(H+1),L.push(1);var Y=(y||0)-l-o;Y>H&&(v.push(Y,Y+1),L.push(Y-H,Y-H))}}}else{v.push(h),L.push(0);var x=(y||0)-l;x>=h?(v.push(x,x+1),L.push(x-h,x-h)):(v.push(h+1),L.push(1))}var C=this.props.scrollAnimatedValue.interpolate({inputRange:v,outputRange:L}),E=p.Children.only(this.props.children);return p.createElement(c,{collapsable:!1,onLayout:this._onLayout,style:[E.props.style,f.header,{transform:[{translateY:C}]}]},p.cloneElement(E,{style:f.fill,onLayout:void 0}))}}]),h})(p.Component),f=h.create({header:{zIndex:10},fill:{flex:1}});m.exports=v},244,[19,20,27,30,33,204,46,50,73]); -__d(function(g,r,i,a,m,e,d){var o=r(d[0]),n=r(d[1]),l=r(d[2]),t=r(d[3]),u=r(d[4]),c=(function(c){"use strict";function s(){return o(this,s),l(this,t(s).apply(this,arguments))}return u(s,c),n(s,[{key:"scrollTo",value:function(o,n,l){}},{key:"flashScrollIndicators",value:function(){}},{key:"scrollToEnd",value:function(o){}},{key:"scrollWithoutAnimationTo",value:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0],arguments.length>1&&void 0!==arguments[1]&&arguments[1]}},{key:"getScrollResponder",value:function(){}},{key:"getScrollableNode",value:function(){}},{key:"getInnerViewNode",value:function(){}},{key:"scrollResponderScrollNativeHandleToKeyboard",value:function(o,n,l){}},{key:"scrollResponderScrollTo",value:function(o,n,l){}}]),s})(r(d[5]).NativeComponent);m.exports=c},245,[19,20,27,30,33,76]); -__d(function(g,r,i,a,m,e,d){'use strict';r(d[0]);m.exports=function(t){return'normal'===t?.985:'fast'===t?.9:t}},246,[41]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),s=r(d[2]),o=r(d[3]),l=r(d[4]),h=(function(){function h(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{viewAreaCoveragePercentThreshold:0};s(this,h),this._hasInteracted=!1,this._timers=new Set,this._viewableIndices=[],this._viewableItems=new Map,this._config=t}return o(h,[{key:"dispose",value:function(){this._timers.forEach(clearTimeout)}},{key:"computeViewableItems",value:function(t,n,s,o,h){var c=this._config,f=c.itemVisiblePercentThreshold,v=c.viewAreaCoveragePercentThreshold,_=null!=v,b=_?v:f;l(null!=b&&null!=f!=(null!=v),'Must set exactly one of itemVisiblePercentThreshold or viewAreaCoveragePercentThreshold');var y=[];if(0===t)return y;var w=-1,I=h||{first:0,last:t-1},p=I.first,k=I.last;l(k0)w=S,u(_,b,A,V,s,T.length)&&y.push(S);else if(w>=0)break}}return y}},{key:"onUpdate",value:function(t,n,s,o,l,h,u){var c=this;if((!this._config.waitForInteraction||this._hasInteracted)&&0!==t&&o(0)){var f=[];if(t&&(f=this.computeViewableItems(t,n,s,o,u)),this._viewableIndices.length!==f.length||!this._viewableIndices.every(function(t,n){return t===f[n]}))if(this._viewableIndices=f,this._config.minimumViewTime){var v=setTimeout(function(){c._timers.delete(v),c._onUpdateSync(f,h,l)},this._config.minimumViewTime);this._timers.add(v)}else this._onUpdateSync(f,h,l)}}},{key:"resetViewableIndices",value:function(){this._viewableIndices=[]}},{key:"recordInteraction",value:function(){this._hasInteracted=!0}},{key:"_onUpdateSync",value:function(s,o,l){var h=this;s=s.filter(function(t){return h._viewableIndices.includes(t)});var u=this._viewableItems,c=new Map(s.map(function(t){var n=l(t,!0);return[n.key,n]})),f=[],v=c,_=Array.isArray(v),b=0;for(v=_?v:v["function"==typeof Symbol?Symbol.iterator:"@@iterator"]();;){var y;if(_){if(b>=v.length)break;y=v[b++]}else{if((b=v.next()).done)break;y=b.value}var w=n(y,2),I=w[0],p=w[1];u.has(I)||f.push(p)}var k=u,S=Array.isArray(k),T=0;for(k=S?k:k["function"==typeof Symbol?Symbol.iterator:"@@iterator"]();;){var A;if(S){if(T>=k.length)break;A=k[T++]}else{if((T=k.next()).done)break;A=T.value}var V=n(A,2),x=V[0],M=V[1];c.has(x)||f.push(t({},M,{isViewable:!1}))}f.length>0&&(this._viewableItems=c,o({viewableItems:Array.from(c.values()),changed:f,viewabilityConfig:this._config}))}}]),h})();function u(t,n,s,o,l,h){if(f(s,o,l))return!0;var u=c(s,o,l);return 100*(t?u/l:u/h)>=n}function c(t,n,s){var o=Math.min(n,s)-Math.max(t,0);return Math.max(0,o)}function f(t,n,s){return t>=0&&n<=s&&n>t}m.exports=h},247,[44,9,19,20,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]);function s(t,s,f){for(var l=[],o=0,u=0;u=t[c]&&(l[c]=u,o++,c===t.length-1))return n(o===t.length,'bad offsets input, should be in increasing order: %s',JSON.stringify(t)),l;return l}function f(t,n){return n.last-n.first+1-Math.max(0,1+Math.min(n.last,t.last)-Math.max(n.first,t.first))}var l={computeWindowedRenderLimits:function(n,l,o,u){var h=n.data,v=n.getItemCount,c=n.maxToRenderPerBatch,x=n.windowSize,M=v(h);if(0===M)return l;var w=u.offset,b=u.velocity,p=u.visibleLength,C=Math.max(0,w),O=C+p,y=(x-1)*p,L=b>1?'after':b<-1?'before':'none',R=Math.max(0,C-.5*y),S=Math.max(0,O+.5*y);if(o(M-1).offset=_);){var E=z>=c,F=N<=l.first||N>l.last,P=N>J&&(!E||!F),W=T>=l.last||T=N&&N>=0&&T=J&&T<=_&&N<=k.first&&T>=k.last))throw new Error('Bad window calculation '+JSON.stringify({first:N,last:T,itemCount:M,overscanFirst:J,overscanLast:_,visible:k}));return{first:N,last:T}},elementsThatOverlapOffsets:s,newRangeCount:f};m.exports=l},248,[9,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]);m.exports=s(t)},249,[250,231]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),t=r(d[1]),o=r(d[2]),u=r(d[3]),c=r(d[4]),s=r(d[5]),l=r(d[6]),h=r(d[7]),f=r(d[8]),p=(r(d[9]),r(d[10])),b=r(d[11]),v=r(d[12]),y=r(d[13]),S=r(d[14]),w=l.ImageLoader,I=r(d[15]),E=1;var L=t({},c,{style:u(o),source:h.oneOfType([h.shape({uri:h.string,headers:h.objectOf(h.string)}),h.number,h.arrayOf(h.shape({uri:h.string,width:h.number,height:h.number,headers:h.objectOf(h.string)}))]),blurRadius:h.number,defaultSource:h.number,loadingIndicatorSource:h.oneOfType([h.shape({uri:h.string}),h.number]),progressiveRenderingEnabled:h.bool,fadeDuration:h.number,onLoadStart:h.func,onError:h.func,onLoad:h.func,onLoadEnd:h.func,testID:h.string,resizeMethod:h.oneOf(['auto','resize','scale']),resizeMode:h.oneOf(['cover','contain','stretch','repeat','center'])});var O=function(n,t){var o,u,c,l,h=S(n.source),p=S(n.defaultSource),w=S(n.loadingIndicatorSource);if(h&&''===h.uri&&console.warn('source.uri should not be an empty string'),n.src&&console.warn('The component requires a `source` property rather than `src`.'),n.children)throw new Error('The component cannot contain children. If you want to render content on top of the image, consider using the component or absolute positioning.');if(n.defaultSource&&n.loadingIndicatorSource)throw new Error('The component cannot have defaultSource and loadingIndicatorSource at the same time. Please use either defaultSource or loadingIndicatorSource.');if(!h||h.uri||Array.isArray(h)||(h=null),null!=(null==(o=h)?void 0:o.uri)){var E=h,L=E.width,O=E.height;c=v([{width:L,height:O},z.base,n.style]),l=[{uri:h.uri}]}else c=v([z.base,n.style]),l=h;var T=n.onLoadStart,q=n.onLoad,R=n.onLoadEnd,x=n.onError,A=y(n,{style:c,shouldNotifyLoadEvents:!!(T||q||R||x),src:l,headers:null==(u=h)?void 0:u.headers,defaultSrc:p?p.uri:null,loadingIndicatorSrc:w?w.uri:null,ref:t});return f.createElement(b.Consumer,null,function(n){return n?f.createElement(I,A):f.createElement(s,A)})};(O=f.forwardRef(O)).getSize=function(n,t,o){return w.getSize(n).then(function(n){t(n.width,n.height)}).catch(o||function(){console.warn('Failed to get size for image: '+n)})},O.prefetch=function(n,t){var o=E++;return t&&t(o),w.prefetchImage(n,o)},O.abortPrefetch=function(n){w.abortRequest(n)},O.queryCache=function(t){return n.async(function(o){for(;;)switch(o.prev=o.next){case 0:return o.next=2,n.awrap(w.queryCache(t));case 2:return o.abrupt("return",o.sent);case 3:case"end":return o.stop()}},null,this)},O.resolveAssetSource=S,O.propTypes=L;var z=p.create({base:{overflow:'hidden'}});m.exports=O},250,[139,44,55,184,251,253,5,59,46,76,50,74,72,177,165,254]); -__d(function(g,r,i,a,m,e,d){'use strict';var o=r(d[0]),n=r(d[1]),s=r(d[2]),t=r(d[3]),c=r(d[4]),l=r(d[5]),b=r(d[6]),p=b.DeprecatedAccessibilityComponentTypes,f=b.DeprecatedAccessibilityTraits,u=b.DeprecatedAccessibilityRoles,y=b.DeprecatedAccessibilityStates,R=c(l);m.exports=o({accessible:t.bool,accessibilityLabel:t.node,accessibilityHint:t.string,accessibilityActions:t.arrayOf(t.string),accessibilityIgnoresInvertColors:t.bool,accessibilityComponentType:t.oneOf(p),accessibilityRole:t.oneOf(u),accessibilityStates:t.arrayOf(t.oneOf(y)),accessibilityLiveRegion:t.oneOf(['none','polite','assertive']),importantForAccessibility:t.oneOf(['auto','yes','no','no-hide-descendants']),accessibilityTraits:t.oneOfType([t.oneOf(f),t.arrayOf(t.oneOf(f))]),accessibilityViewIsModal:t.bool,accessibilityElementsHidden:t.bool,onAccessibilityAction:t.func,onAccessibilityTap:t.func,onMagicTap:t.func,testID:t.string,nativeID:t.string,onResponderGrant:t.func,onResponderMove:t.func,onResponderReject:t.func,onResponderRelease:t.func,onResponderTerminate:t.func,onResponderTerminationRequest:t.func,onStartShouldSetResponder:t.func,onStartShouldSetResponderCapture:t.func,onMoveShouldSetResponder:t.func,onMoveShouldSetResponderCapture:t.func,hitSlop:n,onLayout:t.func,pointerEvents:t.oneOf(['box-none','none','box-only','auto']),style:R,removeClippedSubviews:t.bool,renderToHardwareTextureAndroid:t.bool,shouldRasterizeIOS:t.bool,collapsable:t.bool,needsOffscreenAlphaCompositing:t.bool},s)},251,[44,183,252,59,184,66,201]); -__d(function(g,r,i,a,m,e,d){'use strict'},252,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0])('RCTImageView');m.exports=t},253,[159]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0])('RCTTextInlineImage');m.exports=t},254,[159]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]);m.exports=s(t)},255,[238,231]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]);m.exports=s(t)},256,[257,231]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]),n=r(d[2]),o=r(d[3]),p=r(d[4]),f=r(d[5]),l=r(d[6]),c=(r(d[7]),r(d[8])),u=(r(d[9]),r(d[10])),R=l({},u.defaultProps,{stickySectionHeadersEnabled:!1}),h=(function(l){function R(){var t,n;s(this,R);for(var f=arguments.length,l=new Array(f),c=0;c=l.data.length+1)n-=l.data.length+1;else return-1===n?{section:l,key:p+':header',index:null,header:!0,trailingSection:this.props.sections[s+1]}:n===l.data.length?{section:l,key:p+':footer',index:null,header:!1,trailingSection:this.props.sections[s+1]}:{section:l,key:p+':'+(l.keyExtractor||o)(l.data[n],n),index:n,leadingItem:l.data[n-1],leadingSection:this.props.sections[s-1],trailingItem:l.data[n+1],trailingSection:this.props.sections[s+1]}}}},{key:"_getSeparatorComponent",value:function(t,n){if(!(n=n||this._subExtractor(t)))return null;var o=n.section.ItemSeparatorComponent||this.props.ItemSeparatorComponent,s=this.props.SectionSeparatorComponent,l=t===this.state.childProps.getItemCount()-1,p=n.index===n.section.data.length-1;return s&&p?s:!o||p||l?null:o}}]),I})(h.PureComponent);I.defaultProps=n({},S.defaultProps,{data:[]});var _=(function(t){function u(){var t,p;o(this,u);for(var c=arguments.length,h=new Array(c),f=0;f=21&&this.props.statusBarBackgroundColor,l=c.createElement(C,{style:[L.drawerSubview,{width:this.props.drawerWidth,backgroundColor:this.props.drawerBackgroundColor}],collapsable:!1},this.props.renderNavigationView(),u&&c.createElement(C,{style:L.drawerStatusBar})),p=c.createElement(C,{style:L.mainSubview,collapsable:!1},u&&c.createElement(f,{translucent:!0,backgroundColor:this.props.statusBarBackgroundColor}),u&&c.createElement(C,{style:[L.statusBar,{backgroundColor:this.props.statusBarBackgroundColor}]}),this.props.children);return c.createElement(S,t({},s,{ref:this._nativeRef,drawerWidth:this.props.drawerWidth,drawerPosition:this.props.drawerPosition,drawerLockMode:this.props.drawerLockMode,style:[L.base,this.props.style],onDrawerSlide:this._onDrawerSlide,onDrawerOpen:this._onDrawerOpen,onDrawerClose:this._onDrawerClose,onDrawerStateChanged:this._onDrawerStateChanged}),p,l)}},{key:"openDrawer",value:function(){v.dispatchViewManagerCommand(this._getDrawerLayoutHandle(),v.getViewManagerConfig('AndroidDrawerLayout').Commands.openDrawer,null)}},{key:"closeDrawer",value:function(){v.dispatchViewManagerCommand(this._getDrawerLayoutHandle(),v.getViewManagerConfig('AndroidDrawerLayout').Commands.closeDrawer,null)}},{key:"_getDrawerLayoutHandle",value:function(){return h.findNodeHandle(this._nativeRef.current)}},{key:"blur",value:function(){y(this._nativeRef.current).blur()}},{key:"focus",value:function(){y(this._nativeRef.current).focus()}},{key:"measure",value:function(t){y(this._nativeRef.current).measure(t)}},{key:"measureInWindow",value:function(t){y(this._nativeRef.current).measureInWindow(t)}},{key:"measureLayout",value:function(t,o,n){y(this._nativeRef.current).measureLayout(t,o,n)}},{key:"setNativeProps",value:function(t){y(this._nativeRef.current).setNativeProps(t)}}]),k})(c.Component);B.positions=k.DrawerPosition,B.defaultProps={drawerBackgroundColor:'white'};var L=D.create({base:{flex:1,elevation:16},mainSubview:{position:'absolute',top:0,left:0,right:0,bottom:0},drawerSubview:{position:'absolute',top:0,bottom:0},statusBar:{height:f.currentHeight},drawerStatusBar:{position:'absolute',top:0,left:0,right:0,height:f.currentHeight,backgroundColor:'rgba(0, 0, 0, 0.251)'}});m.exports=B},265,[8,6,19,20,27,30,33,41,46,76,266,50,40,73,193,243,159]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),l=r(d[2]),o=r(d[3]),u=r(d[4]),s=r(d[5]),c=r(d[6]),p=(r(d[7]),r(d[8])),k=r(d[9]).StatusBarManager;function v(t){return{backgroundColor:null!=t.backgroundColor?{value:t.backgroundColor,animated:t.animated}:null,barStyle:null!=t.barStyle?{value:t.barStyle,animated:t.animated}:null,translucent:t.translucent,hidden:null!=t.hidden?{value:t.hidden,animated:t.animated,transition:t.showHideTransition}:null,networkActivityIndicatorVisible:t.networkActivityIndicatorVisible}}var y=(function(c){function y(){var n,u;t(this,y);for(var c=arguments.length,v=new Array(c),_=0;_ is only supported on iOS.'),0===p.Children.count(this.props.children)?null:p.createElement(l,{style:[this.props.style,y.container],nativeID:this.props.nativeID,backgroundColor:this.props.backgroundColor},this.props.children)}}]),h})(p.Component),y=u.create({container:{position:'absolute'}});m.exports=h},271,[19,20,27,30,33,56,41,46,50,159]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),o=r(d[1]),n=r(d[2]),s=r(d[3]),u=r(d[4]),l=r(d[5]),h=r(d[6]),c=r(d[7]),y=r(d[8]),f=(r(d[9]),r(d[10])),b=r(d[11]),p=r(d[12]),v=(function(v){function _(){var t,o;n(this,_);for(var s=arguments.length,h=new Array(s),c=0;c=this._prevRenderedRowsCount&&l.rowShouldUpdate(v,I),D=s.createElement(u,{key:'r_'+P,shouldUpdate:!!F,render:this.props.renderRow.bind(null,l.getRowData(v,I),b,L,this._onRowHighlighted)});if(n.push(D),C++,this.props.renderSeparator&&(I!==E.length-1||v===h.length-1)){var N=this.state.highlightedRow.sectionID===b&&(this.state.highlightedRow.rowID===L||this.state.highlightedRow.rowID===E[I+1]),A=this.props.renderSeparator(b,L,N);A&&(n.push(s.createElement(R,{key:'s_'+P},A)),C++)}if(++c===this.state.curRenderedRowsCount)break}if(c>=this.state.curRenderedRowsCount)break}var H=this.props,z=H.renderScrollComponent,V=o(H,["renderScrollComponent"]);return V.scrollEventThrottle||(V.scrollEventThrottle=50),void 0===V.removeClippedSubviews&&(V.removeClippedSubviews=!0),t(V,{onScroll:this._onScroll,stickyHeaderIndices:this.props.stickyHeaderIndices.concat(p),onKeyboardWillShow:void 0,onKeyboardWillHide:void 0,onKeyboardDidShow:void 0,onKeyboardDidHide:void 0}),_(z(V),{ref:this._setScrollComponentRef,onContentSizeChange:this._onContentSizeChange,onLayout:this._onLayout,DEPRECATED_sendUpdatedChildFrames:void 0!==typeof V.onChangeVisibleRows},w,n,S)},_requestAnimationFrame:function(t){var o=this,n=requestAnimationFrame(function(){o._rafIds=o._rafIds.filter(function(t){return t!==n}),t()});this._rafIds.push(n)},_measureAndUpdateScrollProps:function(){var t=this.getScrollResponder();t&&t.getInnerViewNode&&h&&h.calculateChildFrames&&h.calculateChildFrames(l.findNodeHandle(t),this._updateVisibleRows)},_setScrollComponentRef:function(t){this._scrollComponent=t},_onContentSizeChange:function(t,o){var n=this.props.horizontal?t:o;n!==this.scrollProperties.contentLength&&(this.scrollProperties.contentLength=n,this._updateVisibleRows(),this._renderMoreRowsIfNeeded()),this.props.onContentSizeChange&&this.props.onContentSizeChange(t,o)},_onLayout:function(t){var o=t.nativeEvent.layout,n=o.width,s=o.height,l=this.props.horizontal?n:s;l!==this.scrollProperties.visibleLength&&(this.scrollProperties.visibleLength=l,this._updateVisibleRows(),this._renderMoreRowsIfNeeded()),this.props.onLayout&&this.props.onLayout(t)},_maybeCallOnEndReached:function(t){return!!(this.props.onEndReached&&this.scrollProperties.contentLength!==this._sentEndForContentLength&&this._getDistanceFromEnd(this.scrollProperties)h||Pthis.props.onEndReachedThreshold&&(this._sentEndForContentLength=null),this.props.onScroll&&this.props.onScroll(t)}});m.exports=C},273,[8,6,274,275,41,46,76,5,238,239,277,73,278,196,276,177,110,3]); -__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]),o=r(d[2]),u=r(d[3]),l=r(d[4]),c=r(d[5]),s=r(d[6]),f=(function(c){"use strict";function s(){return n(this,s),o(this,u(s).apply(this,arguments))}return l(s,c),t(s,[{key:"setNativeProps",value:function(n){}},{key:"flashScrollIndicators",value:function(){}},{key:"getScrollResponder",value:function(){}},{key:"getScrollableNode",value:function(){}},{key:"getMetrics",value:function(){}},{key:"scrollTo",value:function(){}},{key:"scrollToEnd",value:function(n){}}]),s})(c.Component);f.DataSource=s,m.exports=f},274,[19,20,27,30,33,46,275]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),s=r(d[2]),o=r(d[3]),h=r(d[4]),c=r(d[5]);function u(t,n,s){return t[n][s]}function l(t,n){return t[n]}var w=(function(){function h(t){n(this,h),o(t&&'function'==typeof t.rowHasChanged,'Must provide a rowHasChanged function.'),this._rowHasChanged=t.rowHasChanged,this._getRowData=t.getRowData||u,this._sectionHeaderHasChanged=t.sectionHeaderHasChanged,this._getSectionHeaderData=t.getSectionHeaderData||l,this._dataBlob=null,this._dirtyRows=[],this._dirtySections=[],this._cachedRowCount=0,this.rowIdentities=[],this.sectionIdentities=[]}return s(h,[{key:"cloneWithRows",value:function(n,s){var o=s?[t(s)]:null;return this._sectionHeaderHasChanged||(this._sectionHeaderHasChanged=function(){return!1}),this.cloneWithRowsAndSections({s1:n},['s1'],o)}},{key:"cloneWithRowsAndSections",value:function(t,n,s){o('function'==typeof this._sectionHeaderHasChanged,'Must provide a sectionHeaderHasChanged function with section data.'),o(!n||!s||n.length===s.length,'row and section ids lengths must be the same');var c=new h({getRowData:this._getRowData,getSectionHeaderData:this._getSectionHeaderData,rowHasChanged:this._rowHasChanged,sectionHeaderHasChanged:this._sectionHeaderHasChanged});return c._dataBlob=t,c.sectionIdentities=n||Object.keys(t),s?c.rowIdentities=s:(c.rowIdentities=[],c.sectionIdentities.forEach(function(n){c.rowIdentities.push(Object.keys(t[n]))})),c._cachedRowCount=_(c.rowIdentities),c._calculateDirtyArrays(this._dataBlob,this.sectionIdentities,this.rowIdentities),c}},{key:"getRowCount",value:function(){return this._cachedRowCount}},{key:"getRowAndSectionCount",value:function(){return this._cachedRowCount+this.sectionIdentities.length}},{key:"rowShouldUpdate",value:function(t,n){var s=this._dirtyRows[t][n];return c(void 0!==s,'missing dirtyBit for section, row: '+t+', '+n),s}},{key:"getRowData",value:function(t,n){var s=this.sectionIdentities[t],o=this.rowIdentities[t][n];return c(void 0!==s&&void 0!==o,'rendering invalid section, row: '+t+', '+n),this._getRowData(this._dataBlob,s,o)}},{key:"getRowIDForFlatIndex",value:function(t){for(var n=t,s=0;s=this.rowIdentities[s].length))return this.rowIdentities[s][n];n-=this.rowIdentities[s].length}return null}},{key:"getSectionIDForFlatIndex",value:function(t){for(var n=t,s=0;s=this.rowIdentities[s].length))return this.sectionIdentities[s];n-=this.rowIdentities[s].length}return null}},{key:"getSectionLengths",value:function(){for(var t=[],n=0;n2?p-2:0),y=2;y=0){var o=h.Children.toArray(c.props.children)[s].props.value;c.props.onValueChange(o,s)}else c.props.onValueChange(null,s)}c._lastNativePosition=t.nativeEvent.position,c.forceUpdate()};var u=c._stateFromProps(t);return c.state=s({},u,{initialSelectedIndex:u.selectedIndex}),c}return c(f,u),n(f,[{key:"UNSAFE_componentWillReceiveProps",value:function(t){this.setState(this._stateFromProps(t))}},{key:"render",value:function(){var s="dropdown"===this.props.mode?_:k,o={enabled:this.props.enabled,items:this.state.items,mode:this.props.mode,onSelect:this._onChange,prompt:this.props.prompt,selected:this.state.initialSelectedIndex,testID:this.props.testID,style:[I.pickerAndroid,this.props.style],accessibilityLabel:this.props.accessibilityLabel};return h.createElement(s,t({ref:"picker"},o))}},{key:"componentDidMount",value:function(){this._lastNativePosition=this.state.initialSelectedIndex}},{key:"componentDidUpdate",value:function(){this.refs.picker&&this.state.selectedIndex!==this._lastNativePosition&&(this.refs.picker.setNativeProps({selected:this.state.selectedIndex}),this._lastNativePosition=this.state.selectedIndex)}}]),f})(h.Component),I=u.create({pickerAndroid:{height:50}});m.exports=P},285,[8,44,19,20,27,30,33,46,50,67,159]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports=r(d[0])},286,[280]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),s=r(d[3]),c=r(d[4]),u=r(d[5]),l=r(d[6]),f=r(d[7]),h=r(d[8]),p=(function(l){function p(){return t(this,p),o(this,s(p).apply(this,arguments))}return c(p,l),n(p,[{key:"render",value:function(){return u.createElement(h,{style:[y.dummy,this.props.style]},u.createElement(f,{style:y.text},"ProgressViewIOS is not supported on this platform!"))}}]),p})(u.Component),y=l.create({dummy:{width:120,height:20,backgroundColor:'#ffbcbc',borderWidth:1,borderColor:'red',alignItems:'center',justifyContent:'center'},text:{color:'#333333',margin:5,fontSize:10}});m.exports=p},287,[19,20,27,30,33,46,50,181,73]); -__d(function(g,r,i,a,m,e,d){r(d[0]);var t,n=r(d[1]),u=r(d[2]),s=r(d[3]),o=r(d[4]),p=r(d[5]),l=r(d[6]),c=(r(d[7]),r(d[8])),f=r(d[9]);r(d[10]);t=(function(t){"use strict";function h(){return u(this,h),o(this,p(h).apply(this,arguments))}return l(h,t),s(h,[{key:"render",value:function(){var t=this.props,u=(t.emulateUnlessSupported,n(t,["emulateUnlessSupported"]));return c.createElement(f,u)}}]),h})(c.Component),m.exports=t},288,[8,6,19,20,27,30,33,41,46,73,159]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),s=r(d[3]),c=r(d[4]),u=r(d[5]),l=r(d[6]),f=r(d[7]),h=r(d[8]),p=(function(l){function p(){return t(this,p),o(this,s(p).apply(this,arguments))}return c(p,l),n(p,[{key:"render",value:function(){return u.createElement(h,{style:[y.dummy,this.props.style]},u.createElement(f,{style:y.text},"SegmentedControlIOS is not supported on this platform!"))}}]),p})(u.Component),y=l.create({dummy:{width:120,height:50,backgroundColor:'#ffbcbc',borderWidth:1,borderColor:'red',alignItems:'center',justifyContent:'center'},text:{color:'#333333',margin:5,fontSize:10}});m.exports=p},289,[19,20,27,30,33,46,50,181,73]); -__d(function(g,r,i,a,m,e,d){'use strict';var n,t=r(d[0]),o=(r(d[1]),r(d[2]),r(d[3])),l=r(d[4]),u=r(d[5])('RCTSlider'),s=o.forwardRef(function(s,v){var f=l.compose(n.slider,s.style),c=s.onValueChange&&function(n){var t;t=null!=n.nativeEvent.fromUser&&n.nativeEvent.fromUser,s.onValueChange&&t&&s.onValueChange(n.nativeEvent.value)},p=c,C=s.onSlidingComplete&&function(n){s.onSlidingComplete&&s.onSlidingComplete(n.nativeEvent.value)};return o.createElement(u,t({},s,{ref:v,style:f,onChange:p,onSlidingComplete:C,onValueChange:c,enabled:!s.disabled,onStartShouldSetResponder:function(){return!0},onResponderTerminationRequest:function(){return!1}}))});s.defaultProps={disabled:!1,value:0,minimumValue:0,maximumValue:1,step:0},n=l.create({slider:{}}),m.exports=s},290,[8,76,41,46,50,159]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports=r(d[0])},291,[280]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),o=r(d[1]),t=r(d[2]),l=r(d[3]),u=r(d[4]),h=r(d[5]),s=r(d[6]),C=r(d[7]),c=(r(d[8]),r(d[9])),p=(r(d[10]),(function(p){function _(){var n,o;t(this,_);for(var l=arguments.length,s=new Array(l),C=0;C0}},{key:"_swipeFullSpeed",value:function(n){this.state.currentLeft.setValue(this._previousLeft+n.dx)}},{key:"_swipeSlowSpeed",value:function(n){this.state.currentLeft.setValue(this._previousLeft+n.dx/4)}},{key:"_isSwipingExcessivelyRightFromClosedPosition",value:function(n){var t=w?-n.dx:n.dx;return this._isSwipingRightFromClosed(n)&&t>120}},{key:"_animateTo",value:function(n){var t=this,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:300,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:f;u.timing(this.state.currentLeft,{duration:o,toValue:n,useNativeDriver:!0}).start(function(){t._previousLeft=n,s()})}},{key:"_animateToOpenPosition",value:function(){var n,t=null!=(n=this.props.maxSwipeDistance)?n:0,o=w?-t:t;this._animateTo(-o)}},{key:"_animateToOpenPositionWith",value:function(n,t){var o;n=n>.3?n:.3;var s=null!=(o=this.props.maxSwipeDistance)?o:0,p=Math.abs((s-Math.abs(t))/n),u=w?-s:s;this._animateTo(-u,p)}},{key:"_animateToClosedPosition",value:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:300;this._animateTo(R,n)}},{key:"_animateBounceBack",value:function(n){var t=w?-30:30;this._animateTo(-t,n,this._animateToClosedPositionDuringBounce)}},{key:"_isValidSwipe",value:function(n){var t;return!(null!=(t=this.props.preventSwipeRight)&&t&&this._previousLeft===R&&n.dx>0)&&Math.abs(n.dx)>10}},{key:"_shouldAnimateRemainder",value:function(n){var t,o=null!=(t=this.props.swipeThreshold)?t:30;return Math.abs(n.dx)>o||n.vx>.3}}]),_})(c.Component),y=_.create({slideOutContainer:{bottom:0,left:0,position:'absolute',right:0,top:0}});m.exports=P},295,[19,20,27,30,33,203,283,296,46,50,73,39]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),o=r(d[1]),t=o.currentCentroidXOfTouchesChangedAfter,u=o.currentCentroidYOfTouchesChangedAfter,s=o.previousCentroidXOfTouchesChangedAfter,c=o.previousCentroidYOfTouchesChangedAfter,p=o.currentCentroidX,v=o.currentCentroidY,h={_initializeGestureState:function(n){n.moveX=0,n.moveY=0,n.x0=0,n.y0=0,n.dx=0,n.dy=0,n.vx=0,n.vy=0,n.numberActiveTouches=0,n._accountsForMovesUpTo=0},_updateGestureStateOnMove:function(n,o){n.numberActiveTouches=o.numberActiveTouches,n.moveX=t(o,n._accountsForMovesUpTo),n.moveY=u(o,n._accountsForMovesUpTo);var p=n._accountsForMovesUpTo,v=s(o,p),h=t(o,p),l=c(o,p),S=u(o,p),R=n.dx+(h-v),T=n.dy+(S-l),f=o.mostRecentTimeStamp-n._accountsForMovesUpTo;n.vx=(R-n.dx)/f,n.vy=(T-n.dy)/f,n.dx=R,n.dy=T,n._accountsForMovesUpTo=o.mostRecentTimeStamp},create:function(o){var t={handle:null},u={stateID:Math.random(),moveX:0,moveY:0,x0:0,y0:0,dx:0,dy:0,vx:0,vy:0,numberActiveTouches:0,_accountsForMovesUpTo:0};return{panHandlers:{onStartShouldSetResponder:function(n){return null!=o.onStartShouldSetPanResponder&&o.onStartShouldSetPanResponder(n,u)},onMoveShouldSetResponder:function(n){return null!=o.onMoveShouldSetPanResponder&&o.onMoveShouldSetPanResponder(n,u)},onStartShouldSetResponderCapture:function(n){return 1===n.nativeEvent.touches.length&&h._initializeGestureState(u),u.numberActiveTouches=n.touchHistory.numberActiveTouches,null!=o.onStartShouldSetPanResponderCapture&&o.onStartShouldSetPanResponderCapture(n,u)},onMoveShouldSetResponderCapture:function(n){var t=n.touchHistory;return u._accountsForMovesUpTo!==t.mostRecentTimeStamp&&(h._updateGestureStateOnMove(u,t),!!o.onMoveShouldSetPanResponderCapture&&o.onMoveShouldSetPanResponderCapture(n,u))},onResponderGrant:function(s){return t.handle||(t.handle=n.createInteractionHandle()),u.x0=p(s.touchHistory),u.y0=v(s.touchHistory),u.dx=0,u.dy=0,o.onPanResponderGrant&&o.onPanResponderGrant(s,u),null==o.onShouldBlockNativeResponder||o.onShouldBlockNativeResponder(s,u)},onResponderReject:function(n){l(t,o.onPanResponderReject,n,u)},onResponderRelease:function(n){l(t,o.onPanResponderRelease,n,u),h._initializeGestureState(u)},onResponderStart:function(n){var t=n.touchHistory;u.numberActiveTouches=t.numberActiveTouches,o.onPanResponderStart&&o.onPanResponderStart(n,u)},onResponderMove:function(n){var t=n.touchHistory;u._accountsForMovesUpTo!==t.mostRecentTimeStamp&&(h._updateGestureStateOnMove(u,t),o.onPanResponderMove&&o.onPanResponderMove(n,u))},onResponderEnd:function(n){var s=n.touchHistory;u.numberActiveTouches=s.numberActiveTouches,l(t,o.onPanResponderEnd,n,u)},onResponderTerminate:function(n){l(t,o.onPanResponderTerminate,n,u),h._initializeGestureState(u)},onResponderTerminationRequest:function(n){return null==o.onPanResponderTerminationRequest||o.onPanResponderTerminationRequest(n,u)}},getInteractionHandle:function(){return t.handle}}}};function l(o,t,u,s){o.handle&&(n.clearInteractionHandle(o.handle),o.handle=null),t&&t(u,s)}m.exports=h},296,[211,297]); -__d(function(g,r,i,a,m,e,d){var n={centroidDimension:function(t,o,u,c){var f=t.touchBank,s=0,h=0,v=1===t.numberActiveTouches?t.touchBank[t.indexOfSingleActiveTouch]:null;if(null!==v)v.touchActive&&v.currentTimeStamp>o&&(s+=c&&u?v.currentPageX:c&&!u?v.currentPageY:!c&&u?v.previousPageX:v.previousPageY,h=1);else for(var C=0;C=o){s+=c&&u?l.currentPageX:c&&!u?l.currentPageY:!c&&u?l.previousPageX:l.previousPageY,h++}}return h>0?s/h:n.noCentroid},currentCentroidXOfTouchesChangedAfter:function(t,o){return n.centroidDimension(t,o,!0,!0)},currentCentroidYOfTouchesChangedAfter:function(t,o){return n.centroidDimension(t,o,!1,!0)},previousCentroidXOfTouchesChangedAfter:function(t,o){return n.centroidDimension(t,o,!0,!1)},previousCentroidYOfTouchesChangedAfter:function(t,o){return n.centroidDimension(t,o,!1,!1)},currentCentroidX:function(t){return n.centroidDimension(t,0,!0,!0)},currentCentroidY:function(t){return n.centroidDimension(t,0,!1,!0)},noCentroid:-1};m.exports=n},297,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),s=r(d[3]),u=r(d[4]),c=r(d[5]),l=r(d[6]),p=r(d[7]),S=r(d[8]),f=r(d[9]),w=(function(w){function h(t,u){var c;return n(this,h),(c=o(this,s(h).call(this,t,u)))._listViewRef=null,c._shouldBounceFirstRowOnMount=!1,c._onScroll=function(t){c.props.dataSource.getOpenRowID()&&c.setState({dataSource:c.state.dataSource.setOpenRowID(null)}),c.props.onScroll&&c.props.onScroll(t)},c._renderRow=function(t,n,o){var s=c.props.renderQuickActions(t,n,o);if(!s)return c.props.renderRow(t,n,o);var u=!1;return c._shouldBounceFirstRowOnMount&&(c._shouldBounceFirstRowOnMount=!1,u=o===c.props.dataSource.getFirstRowID()),p.createElement(f,{slideoutView:s,isOpen:t.id===c.props.dataSource.getOpenRowID(),maxSwipeDistance:c._getMaxSwipeDistance(t,n,o),key:o,onOpen:function(){return c._onOpen(t.id)},onClose:function(){return c._onClose(t.id)},onSwipeEnd:function(){return c._setListViewScrollable(!0)},onSwipeStart:function(){return c._setListViewScrollable(!1)},shouldBounceOnMount:u},c.props.renderRow(t,n,o))},c._shouldBounceFirstRowOnMount=c.props.bounceFirstRowOnMount,c.state={dataSource:c.props.dataSource},c}return c(h,w),u(h,null,[{key:"getNewDataSource",value:function(){return new S({getRowData:function(t,n,o){return t[n][o]},getSectionHeaderData:function(t,n){return t[n]},rowHasChanged:function(t,n){return t!==n},sectionHeaderHasChanged:function(t,n){return t!==n}})}}]),u(h,[{key:"UNSAFE_componentWillReceiveProps",value:function(t){this.state.dataSource.getDataSource()!==t.dataSource.getDataSource()&&this.setState({dataSource:t.dataSource})}},{key:"render",value:function(){var n=this;return p.createElement(l,t({},this.props,{ref:function(t){n._listViewRef=t},dataSource:this.state.dataSource.getDataSource(),onScroll:this._onScroll,renderRow:this._renderRow}))}},{key:"_setListViewScrollable",value:function(t){this._listViewRef&&'function'==typeof this._listViewRef.setNativeProps&&this._listViewRef.setNativeProps({scrollEnabled:t})}},{key:"getScrollResponder",value:function(){if(this._listViewRef&&'function'==typeof this._listViewRef.getScrollResponder)return this._listViewRef.getScrollResponder()}},{key:"_getMaxSwipeDistance",value:function(t,n,o){return'function'==typeof this.props.maxSwipeDistance?this.props.maxSwipeDistance(t,n,o):this.props.maxSwipeDistance}},{key:"_onOpen",value:function(t){this.setState({dataSource:this.state.dataSource.setOpenRowID(t)})}},{key:"_onClose",value:function(t){this.setState({dataSource:this.state.dataSource.setOpenRowID(null)})}}]),h})(p.Component);w.defaultProps={bounceFirstRowOnMount:!1,renderQuickActions:function(){return null}},m.exports=w},298,[8,19,27,30,20,33,273,46,299,295]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),s=(function(){function s(n){var h=this;t(this,s),this._dataSource=new o({getRowData:n.getRowData,getSectionHeaderData:n.getSectionHeaderData,rowHasChanged:function(t,o){return t.id!==h._previousOpenRowID&&o.id===h._openRowID||t.id===h._previousOpenRowID&&o.id!==h._openRowID||n.rowHasChanged(t,o)},sectionHeaderHasChanged:n.sectionHeaderHasChanged})}return n(s,[{key:"cloneWithRowsAndSections",value:function(t,n,o){return this._dataSource=this._dataSource.cloneWithRowsAndSections(t,n,o),this._dataBlob=t,this.rowIdentities=this._dataSource.rowIdentities,this.sectionIdentities=this._dataSource.sectionIdentities,this}},{key:"getDataSource",value:function(){return this._dataSource}},{key:"getOpenRowID",value:function(){return this._openRowID}},{key:"getFirstRowID",value:function(){return this.rowIdentities?this.rowIdentities[0]&&this.rowIdentities[0][0]:Object.keys(this._dataBlob)[0]}},{key:"getLastRowID",value:function(){if(this.rowIdentities&&this.rowIdentities.length){var t=this.rowIdentities[this.rowIdentities.length-1];if(t&&t.length)return t[t.length-1]}return Object.keys(this._dataBlob)[this._dataBlob.length-1]}},{key:"setOpenRowID",value:function(t){return this._previousOpenRowID=this._openRowID,this._openRowID=t,this._dataSource=this._dataSource.cloneWithRowsAndSections(this._dataBlob,this.sectionIdentities,this.rowIdentities),this}}]),s})();m.exports=s},299,[19,20,275]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),s=r(d[3]),u=r(d[4]),c=r(d[5]),l=r(d[6]),p=r(d[7]),f=r(d[8]),v=!1,b=(function(l){function p(){return t(this,p),o(this,s(p).apply(this,arguments))}return u(p,l),n(p,[{key:"componentDidMount",value:function(){v||(console.warn("TabBarIOS and TabBarItemIOS are deprecated and will be removed in a future release. Please use react-native-tab-view instead."),v=!0)}},{key:"render",value:function(){return c.createElement(f,{style:[this.props.style,h.tabGroup]},this.props.children)}}]),p})(c.Component);b.Item=p;var h=l.create({tabGroup:{flex:1}});m.exports=b},300,[19,20,27,30,33,46,50,301,73]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),s=r(d[3]),l=r(d[4]),u=r(d[5]),c=r(d[6]),p=r(d[7]),b=!1,h=(function(p){function h(){return t(this,h),o(this,s(h).apply(this,arguments))}return l(h,p),n(h,[{key:"componentDidMount",value:function(){b||(console.warn("TabBarIOS and TabBarItemIOS are deprecated and will be removed in a future release. Please use react-native-tab-view instead."),b=!0)}},{key:"render",value:function(){return this.props.selected?u.createElement(c,{style:[this.props.style,f.tab]},this.props.children):u.createElement(c,null)}}]),h})(u.Component),f=p.create({tab:{top:0,right:0,bottom:0,left:0,borderColor:'red',borderWidth:1}});m.exports=h},301,[19,20,27,30,33,46,73,50]); -__d(function(g,r,i,a,m,e,d){'use strict';var t,n=r(d[0]),s=r(d[1]),o=r(d[2]),l=r(d[3]),c=r(d[4]),u=r(d[5]),p=r(d[6]),h=r(d[7]),f=r(d[8]),b=r(d[9]),y=r(d[10]),v=r(d[11]),_=(r(d[12]),r(d[13])),S=r(d[14]),C=r(d[15]),x=r(d[16]),T=r(d[17]),I=r(d[18]),F=r(d[19]),R=r(d[20]),N=r(d[21]),E=r(d[22]),L=r(d[23]),D=r(d[24]),O=r(d[25]);r(d[26]);t=O('AndroidTextInput');var A=['phoneNumber','link','address','calendarEvent','none','all'],P=E({displayName:'TextInput',statics:{State:{currentlyFocusedField:F.currentlyFocusedField,focusTextInput:F.focusTextInput,blurTextInput:F.blurTextInput}},propTypes:p({},f,{autoCapitalize:_.oneOf(['none','sentences','words','characters']),autoCorrect:_.bool,spellCheck:_.bool,autoFocus:_.bool,allowFontScaling:_.bool,maxFontSizeMultiplier:_.number,editable:_.bool,keyboardType:_.oneOf(['default','email-address','numeric','phone-pad','number-pad','ascii-capable','numbers-and-punctuation','url','name-phone-pad','decimal-pad','twitter','web-search','visible-password']),keyboardAppearance:_.oneOf(['default','light','dark']),returnKeyType:_.oneOf(['done','go','next','search','send','none','previous','default','emergency-call','google','join','route','yahoo']),returnKeyLabel:_.string,maxLength:_.number,numberOfLines:_.number,disableFullscreenUI:_.bool,enablesReturnKeyAutomatically:_.bool,multiline:_.bool,textBreakStrategy:_.oneOf(['simple','highQuality','balanced']),onBlur:_.func,onFocus:_.func,onChange:_.func,onChangeText:_.func,onContentSizeChange:_.func,onTextInput:_.func,onEndEditing:_.func,onSelectionChange:_.func,onSubmitEditing:_.func,onKeyPress:_.func,onLayout:_.func,onScroll:_.func,placeholder:_.string,placeholderTextColor:h,scrollEnabled:_.bool,secureTextEntry:_.bool,selectionColor:h,selectionState:_.instanceOf(b),selection:_.shape({start:_.number.isRequired,end:_.number}),value:_.string,defaultValue:_.string,clearButtonMode:_.oneOf(['never','while-editing','unless-editing','always']),clearTextOnFocus:_.bool,selectTextOnFocus:_.bool,blurOnSubmit:_.bool,style:T.propTypes.style,underlineColorAndroid:h,inlineImageLeft:_.string,inlineImagePadding:_.number,dataDetectorTypes:_.oneOfType([_.oneOf(A),_.arrayOf(_.oneOf(A))]),caretHidden:_.bool,contextMenuHidden:_.bool,inputAccessoryViewID:_.string,textContentType:_.oneOf(['none','URL','addressCity','addressCityAndState','addressState','countryName','creditCardNumber','emailAddress','familyName','fullStreetAddress','givenName','jobTitle','location','middleName','name','namePrefix','nameSuffix','nickname','organizationName','postalCode','streetAddressLine1','streetAddressLine2','sublocality','telephoneNumber','username','password','newPassword','oneTimeCode'])}),getDefaultProps:function(){return{allowFontScaling:!0,underlineColorAndroid:'transparent'}},mixins:[v],isFocused:function(){return F.currentlyFocusedField()===C.findNodeHandle(this._inputRef)},_inputRef:void 0,_focusSubscription:void 0,_lastNativeText:void 0,_lastNativeSelection:void 0,_rafId:null,componentDidMount:function(){var t=this;this._lastNativeText=this.props.value;var n=C.findNodeHandle(this._inputRef);null!=n&&F.registerInput(n),this.context.focusEmitter?(this._focusSubscription=this.context.focusEmitter.addListener('focus',function(n){t===n?t._rafId=requestAnimationFrame(t.focus):t.isFocused()&&t.blur()}),this.props.autoFocus&&this.context.onFocusRequested(this)):this.props.autoFocus&&(this._rafId=requestAnimationFrame(this.focus))},componentWillUnmount:function(){this._focusSubscription&&this._focusSubscription.remove(),this.isFocused()&&this.blur();var t=C.findNodeHandle(this._inputRef);null!=t&&F.unregisterInput(t),null!=this._rafId&&cancelAnimationFrame(this._rafId)},contextTypes:{onFocusRequested:_.func,focusEmitter:_.instanceOf(y)},clear:function(){this.setNativeProps({text:''})},render:function(){var t;return t=this._renderAndroid(),S.createElement(I.Provider,{value:!0},t)},_getText:function(){return'string'==typeof this.props.value?this.props.value:'string'==typeof this.props.defaultValue?this.props.defaultValue:''},_setNativeRef:function(t){this._inputRef=t},_renderIOSLegacy:function(){var t,n=u({},this.props);if(n.style=[this.props.style],n.selection&&null==n.selection.end&&(n.selection={start:n.selection.start,end:n.selection.start}),n.multiline){var s=n.children,o=0;S.Children.forEach(s,function(){return++o}),D(!(n.value&&o),'Cannot specify both value and children.'),o>=1&&(s=S.createElement(T,{style:n.style,allowFontScaling:n.allowFontScaling,maxFontSizeMultiplier:n.maxFontSizeMultiplier},s)),n.inputView&&(s=[s,n.inputView]),n.style.unshift(B.multilineInput),t=S.createElement(void 0,u({ref:this._setNativeRef},n,{children:s,onFocus:this._onFocus,onBlur:this._onBlur,onChange:this._onChange,onContentSizeChange:this.props.onContentSizeChange,onSelectionChange:this._onSelectionChange,onTextInput:this._onTextInput,onSelectionChangeShouldSetResponder:L.thatReturnsTrue,text:this._getText(),dataDetectorTypes:this.props.dataDetectorTypes,onScroll:this._onScroll}))}else t=S.createElement(void 0,u({ref:this._setNativeRef},n,{onFocus:this._onFocus,onBlur:this._onBlur,onChange:this._onChange,onSelectionChange:this._onSelectionChange,onSelectionChangeShouldSetResponder:L.thatReturnsTrue,text:this._getText()}));return S.createElement(R,{onLayout:n.onLayout,onPress:this._onPress,rejectResponderTermination:!0,accessible:n.accessible,accessibilityLabel:n.accessibilityLabel,accessibilityRole:n.accessibilityRole,accessibilityStates:n.accessibilityStates,nativeID:this.props.nativeID,testID:n.testID},t)},_renderIOS:function(){var t=u({},this.props);t.style=[this.props.style],t.selection&&null==t.selection.end&&(t.selection={start:t.selection.start,end:t.selection.start});var n=void t.multiline;t.multiline&&t.style.unshift(B.multilineInput);var s=S.createElement(n,u({ref:this._setNativeRef},t,{onFocus:this._onFocus,onBlur:this._onBlur,onChange:this._onChange,onContentSizeChange:this.props.onContentSizeChange,onSelectionChange:this._onSelectionChange,onTextInput:this._onTextInput,onSelectionChangeShouldSetResponder:L.thatReturnsTrue,text:this._getText(),dataDetectorTypes:this.props.dataDetectorTypes,onScroll:this._onScroll}));return S.createElement(R,{onLayout:t.onLayout,onPress:this._onPress,rejectResponderTermination:!0,accessible:t.accessible,accessibilityLabel:t.accessibilityLabel,accessibilityRole:t.accessibilityRole,accessibilityStates:t.accessibilityStates,nativeID:this.props.nativeID,testID:t.testID},s)},_renderAndroid:function(){var n=u({},this.props);n.style=[this.props.style],n.autoCapitalize=N.getViewManagerConfig('AndroidTextInput').Constants.AutoCapitalizationType[n.autoCapitalize||'sentences'];var s=this.props.children,o=0;S.Children.forEach(s,function(){return++o}),D(!(this.props.value&&o),'Cannot specify both value and children.'),o>1&&(s=S.createElement(T,null,s)),n.selection&&null==n.selection.end&&(n.selection={start:n.selection.start,end:n.selection.start});var l=S.createElement(t,u({ref:this._setNativeRef},n,{mostRecentEventCount:0,onFocus:this._onFocus,onBlur:this._onBlur,onChange:this._onChange,onSelectionChange:this._onSelectionChange,onTextInput:this._onTextInput,text:this._getText(),children:s,disableFullscreenUI:this.props.disableFullscreenUI,textBreakStrategy:this.props.textBreakStrategy,onScroll:this._onScroll}));return S.createElement(R,{onLayout:n.onLayout,onPress:this._onPress,accessible:this.props.accessible,accessibilityLabel:this.props.accessibilityLabel,accessibilityRole:this.props.accessibilityRole,accessibilityStates:this.props.accessibilityStates,nativeID:this.props.nativeID,testID:this.props.testID},l)},_onFocus:function(t){this.props.onFocus&&this.props.onFocus(t),this.props.selectionState&&this.props.selectionState.focus()},_onPress:function(t){(this.props.editable||void 0===this.props.editable)&&this.focus()},_onChange:function(t){this._inputRef&&this._inputRef.setNativeProps&&this._inputRef.setNativeProps({mostRecentEventCount:t.nativeEvent.eventCount});var n=t.nativeEvent.text;this.props.onChange&&this.props.onChange(t),this.props.onChangeText&&this.props.onChangeText(n),this._inputRef&&(this._lastNativeText=n,this.forceUpdate())},_onSelectionChange:function(t){this.props.onSelectionChange&&this.props.onSelectionChange(t),this._inputRef&&(this._lastNativeSelection=t.nativeEvent.selection,(this.props.selection||this.props.selectionState)&&this.forceUpdate())},componentDidUpdate:function(){var t={};this._lastNativeText!==this.props.value&&'string'==typeof this.props.value&&(t.text=this.props.value);var n=this.props.selection;this._lastNativeSelection&&n&&(this._lastNativeSelection.start!==n.start||this._lastNativeSelection.end!==n.end)&&(t.selection=this.props.selection),Object.keys(t).length>0&&this._inputRef&&this._inputRef.setNativeProps&&this._inputRef.setNativeProps(t),this.props.selectionState&&n&&this.props.selectionState.update(n.start,n.end)},_onBlur:function(t){this.blur(),this.props.onBlur&&this.props.onBlur(t),this.props.selectionState&&this.props.selectionState.blur()},_onTextInput:function(t){this.props.onTextInput&&this.props.onTextInput(t)},_onScroll:function(t){this.props.onScroll&&this.props.onScroll(t)}}),w=((function(t){function u(){return n(this,u),o(this,l(u).apply(this,arguments))}c(u,t),s(u,[{key:"clear",value:function(){}},{key:"isFocused",value:function(){}}])})(C.NativeComponent),P),B=x.create({multilineInput:{paddingTop:5}});m.exports=w},302,[19,20,27,30,33,8,44,56,251,303,35,261,41,59,46,76,50,181,74,156,195,40,196,39,3,159,110]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]),f=r(d[2]),u=(function(){function f(s,u){t(this,f),this._anchorOffset=s,this._focusOffset=u,this._hasFocus=!1}return s(f,[{key:"update",value:function(t,s){this._anchorOffset===t&&this._focusOffset===s||(this._anchorOffset=t,this._focusOffset=s,this.emit('update'))}},{key:"constrainLength",value:function(t){this.update(Math.min(this._anchorOffset,t),Math.min(this._focusOffset,t))}},{key:"focus",value:function(){this._hasFocus||(this._hasFocus=!0,this.emit('focus'))}},{key:"blur",value:function(){this._hasFocus&&(this._hasFocus=!1,this.emit('blur'))}},{key:"hasFocus",value:function(){return this._hasFocus}},{key:"isCollapsed",value:function(){return this._anchorOffset===this._focusOffset}},{key:"isBackward",value:function(){return this._anchorOffset>this._focusOffset}},{key:"getAnchorOffset",value:function(){return this._hasFocus?this._anchorOffset:null}},{key:"getFocusOffset",value:function(){return this._hasFocus?this._focusOffset:null}},{key:"getStartOffset",value:function(){return this._hasFocus?Math.min(this._anchorOffset,this._focusOffset):null}},{key:"getEndOffset",value:function(){return this._hasFocus?Math.max(this._anchorOffset,this._focusOffset):null}},{key:"overlaps",value:function(t,s){return this.hasFocus()&&this.getStartOffset()<=s&&t<=this.getEndOffset()}}]),f})();f(u,{blur:!0,focus:!0,update:!0}),m.exports=u},303,[19,20,304]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),s=r(d[2]),_=r(d[3]),o=r(d[4]),v=r(d[5])({__types:!0});var E={emit:function(t,n,s,_,o,v,E){return this.__getEventEmitter().emit(t,n,s,_,o,v,E)},emitAndHold:function(t,n,s,_,o,v,E){return this.__getEventEmitter().emitAndHold(t,n,s,_,o,v,E)},addListener:function(t,n,s){return this.__getEventEmitter().addListener(t,n,s)},once:function(t,n,s){return this.__getEventEmitter().once(t,n,s)},addRetroactiveListener:function(t,n,s){return this.__getEventEmitter().addRetroactiveListener(t,n,s)},addListenerMap:function(t,n){return this.__getEventEmitter().addListenerMap(t,n)},addRetroactiveListenerMap:function(t,n){return this.__getEventEmitter().addListenerMap(t,n)},removeAllListeners:function(){this.__getEventEmitter().removeAllListeners()},removeCurrentListener:function(){this.__getEventEmitter().removeCurrentListener()},releaseHeldEventType:function(t){this.__getEventEmitter().releaseHeldEventType(t)},__getEventEmitter:function(){if(!this.__eventEmitter){var t=new n,o=new _;this.__eventEmitter=new s(t,o)}return this.__eventEmitter}};m.exports=function(n,s){o(s,'Must supply set of valid event types');var _=n.prototype||n;o(!_.__eventEmitter,'An active emitter is already mixed in');var u=n.constructor;u&&o(u===Object||u===Function,'Mix EventEmitter into a class, not an instance'),_.hasOwnProperty(v)?t(_.__types,s):_.__types?_.__types=t({},_.__types,s):_.__types=s,t(_,E)}},304,[8,35,305,306,3,307]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),s=(function(){function s(n,l){t(this,s),this._emitter=n,this._eventHolder=l,this._currentEventToken=null,this._emittingHeldEvents=!1}return n(s,[{key:"addListener",value:function(t,n,s){return this._emitter.addListener(t,n,s)}},{key:"once",value:function(t,n,s){return this._emitter.once(t,n,s)}},{key:"addRetroactiveListener",value:function(t,n,s){var l=this._emitter.addListener(t,n,s);return this._emittingHeldEvents=!0,this._eventHolder.emitToListener(t,n,s),this._emittingHeldEvents=!1,l}},{key:"removeAllListeners",value:function(t){this._emitter.removeAllListeners(t)}},{key:"removeCurrentListener",value:function(){this._emitter.removeCurrentListener()}},{key:"listeners",value:function(t){return this._emitter.listeners(t)}},{key:"emit",value:function(t){for(var n,s=arguments.length,l=new Array(s>1?s-1:0),o=1;o1?l-1:0),u=1;u1?v-1:0),u=1;u. Was '+t.type.displayName),u.createElement(t.type,o)})},l._onPageScroll=function(t){l.props.onPageScroll&&l.props.onPageScroll(t),'on-drag'===l.props.keyboardDismissMode&&f()},l._onPageScrollStateChanged=function(t){l.props.onPageScrollStateChanged&&l.props.onPageScrollStateChanged(t.nativeEvent.pageScrollState)},l._onPageSelected=function(t){l.props.onPageSelected&&l.props.onPageSelected(t)},l.setPage=function(t){S.dispatchViewManagerCommand(P.findNodeHandle(h(h(l))),S.getViewManagerConfig('AndroidViewPager').Commands.setPage,[t])},l.setPageWithoutAnimation=function(t){S.dispatchViewManagerCommand(P.findNodeHandle(h(h(l))),S.getViewManagerConfig('AndroidViewPager').Commands.setPageWithoutAnimation,[t])},l}return c(v,C),l(v,[{key:"componentDidMount",value:function(){null!=this.props.initialPage&&this.setPageWithoutAnimation(this.props.initialPage)}},{key:"render",value:function(){return u.createElement(y,t({},this.props,{ref:w,style:this.props.style,onPageScroll:this._onPageScroll,onPageScrollStateChanged:this._onPageScrollStateChanged,onPageSelected:this._onPageSelected,children:this._childrenWithOverridenStyle()}))}}]),v})(u.Component);m.exports=C},311,[8,44,19,20,27,30,33,29,46,76,40,243,159]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),s=r(d[3]),l=r(d[4]),p=r(d[5]),c=r(d[6]),h=r(d[7]),u=r(d[8]),b=r(d[9]),v=r(d[10]),f=r(d[11]),w=r(d[12]),E=r(d[13]),C=r(d[14]),S=r(d[15]),y=r(d[16]),L=r(d[17]),V=r(d[18]),R=r(d[19]),F=r(d[20]),I='webview',M=V({IDLE:null,LOADING:null,ERROR:null}),W=function(){return f.createElement(S,{style:T.loadingView},f.createElement(h,{style:T.loadingProgressBar}))},D=(function(t){function h(){var t,n;o(this,h);for(var s=arguments.length,c=new Array(s),u=0;u=n.length)break;f=n[c++]}else{if((c=n.next()).done)break;f=c.value}var x=t(f,2),_=x[0],b=x[1];o[_]=b()}var y={},S=s._fileSources,v=Array.isArray(S),p=0;for(S=v?S:S["function"==typeof Symbol?Symbol.iterator:"@@iterator"]();;){var k;if(v){if(p>=S.length)break;k=S[p++]}else{if((p=S.next()).done)break;k=p.value}var D=t(k,2),E=D[0],h=D[1];y[E]=h()}l('BugReporting extraData:',o);var B=r(d[6]).BugReporting;B&&B.setExtraData&&B.setExtraData(o,y);var R=r(d[6]).RedBox;return R&&R.setExtraData&&R.setExtraData(o,'From BugReporting.js'),{extras:o,files:y}}}]),s})();s._extraSources=new Map,s._fileSources=new Map,s._subscription=null,s._redboxSubscription=null,m.exports=s},317,[9,19,20,26,150,318,5]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports=function(){try{return"React tree dumps have been temporarily disabled while React is upgraded to Fiber."}catch(t){return'Failed to dump react tree: '+t}}},318,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=[],t={name:'default'},c={setActiveScene:function(c){t=c,n.forEach(function(n){return n(t)})},getActiveScene:function(){return t},addActiveSceneChangedListener:function(t){return n.push(t),{remove:function(){n=n.filter(function(n){return t!==n})}}}};m.exports=c},319,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),l=r(d[3]),c=r(d[4]);r(d[5]),m.exports=function(p,u,s,v,E,_){c(s,'Expect to have a valid rootTag, instead got ',s);var f=o.createElement(n,{rootTag:s,WrapperComponent:v},o.createElement(p,t({},u,{rootTag:s})),!0===E&&!0===_?o.createElement(l,null):null);if(null!=p.prototype&&!0===p.prototype.unstable_isAsyncReactComponent){var y=o.unstable_ConcurrentMode;f=o.createElement(y,null,f)}E?r(d[6]).render(f,s):r(d[7]).render(f,s)}},320,[8,282,46,321,3,322,323,76]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),c=r(d[3]);var f=n.create({container:{alignItems:'center',justifyContent:'center',backgroundColor:'rgba(0,0,0, 0.25)',position:'absolute',top:0,right:0,padding:2},text:{fontSize:6,color:'#ffffff'}});m.exports=function(){return t.createElement(c,{style:f.container},t.createElement(o,{style:f.text},"FABRIC"))}},321,[46,50,181,73]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]).DeviceEventManager,t=[];r(d[1]).addListener('hardwareBackPress',function(){for(var n=t.length-1;n>=0;n--)if(t[n]())return;s.exitApp()});var s={exitApp:function(){n.invokeDefaultBackPressHandler()},addEventListener:function(n,f){return-1===t.indexOf(f)&&t.push(f),{remove:function(){return s.removeEventListener(n,f)}}},removeEventListener:function(n,s){-1!==t.indexOf(s)&&t.splice(t.indexOf(s),1)}};m.exports=s},322,[5,26]); -__d(function(g,r,i,a,m,e,d){'use strict';var t,c=r(d[0]);t=r(d[1]),c.registerCallableModule('ReactFabric',t),m.exports=t},323,[13,324]); -__d(function(e,t,n,r,i,o,a){"use strict";var l=t(a[0]);t(a[1]);var u=t(a[2]),s=t(a[3]),c=t(a[4]),f=t(a[5]),d=t(a[6]),p=t(a[7]),m=t(a[8]),h=(t(a[9]),t(a[10]));function g(e,t,n,r,i,o,a,l){if(!e){if(e=void 0,void 0===t)e=Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,i,o,a,l],s=0;(e=Error(t.replace(/%s/g,function(){return u[s++]}))).name="Invariant Violation"}throw e.framesToPop=1,e}}function y(e,t,n,r,i,o,a,l,u){var s=Array.prototype.slice.call(arguments,3);try{t.apply(n,s)}catch(e){this.onError(e)}}var v=!1,b=null,T=!1,x=null,S={onError:function(e){v=!0,b=e}};function k(e,t,n,r,i,o,a,l,u){v=!1,b=null,y.apply(S,arguments)}function P(e,t,n,r,i,o,a,l,u){if(k.apply(this,arguments),v){if(v){var s=b;v=!1,b=null}else g(!1,"clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue."),s=void 0;T||(T=!0,x=s)}}var E=null,C={};function w(){if(E)for(var e in C){var t=C[e],n=E.indexOf(e);if(g(-1this.eventPool.length&&this.eventPool.push(e)}function te(e){e.eventPool=[],e.getPooled=Z,e.release=ee}l(K.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=q)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=q)},persist:function(){this.isPersistent=q},isPersistent:J,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null,this.isPropagationStopped=this.isDefaultPrevented=J,this._dispatchInstances=this._dispatchListeners=null}}),K.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null},K.extend=function(e){function t(){}function n(){return r.apply(this,arguments)}var r=this;t.prototype=r.prototype;var i=new t;return l(i,n.prototype),n.prototype=i,n.prototype.constructor=n,n.Interface=l({},r.Interface,e),n.extend=r.extend,te(n),n},te(K);var ne=K.extend({touchHistory:function(){return null}});function re(e){return"topTouchStart"===e}function ie(e){return"topTouchMove"===e}var oe=["topTouchStart"],ae=["topTouchMove"],le=["topTouchCancel","topTouchEnd"],ue=[],se={touchBank:ue,numberActiveTouches:0,indexOfSingleActiveTouch:-1,mostRecentTimeStamp:0};function ce(e){return e.timeStamp||e.timestamp}function fe(e){return g(null!=(e=e.identifier),"Touch object is missing identifier."),e}function de(e){var t=fe(e),n=ue[t];n?(n.touchActive=!0,n.startPageX=e.pageX,n.startPageY=e.pageY,n.startTimeStamp=ce(e),n.currentPageX=e.pageX,n.currentPageY=e.pageY,n.currentTimeStamp=ce(e),n.previousPageX=e.pageX,n.previousPageY=e.pageY,n.previousTimeStamp=ce(e)):(n={touchActive:!0,startPageX:e.pageX,startPageY:e.pageY,startTimeStamp:ce(e),currentPageX:e.pageX,currentPageY:e.pageY,currentTimeStamp:ce(e),previousPageX:e.pageX,previousPageY:e.pageY,previousTimeStamp:ce(e)},ue[t]=n),se.mostRecentTimeStamp=ce(e)}function pe(e){var t=ue[fe(e)];t?(t.touchActive=!0,t.previousPageX=t.currentPageX,t.previousPageY=t.currentPageY,t.previousTimeStamp=t.currentTimeStamp,t.currentPageX=e.pageX,t.currentPageY=e.pageY,t.currentTimeStamp=ce(e),se.mostRecentTimeStamp=ce(e)):console.error("Cannot record touch move without a touch start.\nTouch Move: %s\n","Touch Bank: %s",he(e),ge())}function me(e){var t=ue[fe(e)];t?(t.touchActive=!1,t.previousPageX=t.currentPageX,t.previousPageY=t.currentPageY,t.previousTimeStamp=t.currentTimeStamp,t.currentPageX=e.pageX,t.currentPageY=e.pageY,t.currentTimeStamp=ce(e),se.mostRecentTimeStamp=ce(e)):console.error("Cannot record touch end without a touch start.\nTouch End: %s\n","Touch Bank: %s",he(e),ge())}function he(e){return JSON.stringify({identifier:e.identifier,pageX:e.pageX,pageY:e.pageY,timestamp:ce(e)})}function ge(){var e=JSON.stringify(ue.slice(0,20));return 20 component."),n=mt,mt+=2,{node:m.createNode(n,"RCTRawText",t,{text:e},r)}}var yt=setTimeout,vt=clearTimeout;function bt(e){var t=e.node,n=tt(null,$e,{style:{display:"none"}},e.canonical.viewConfig.validAttributes);return{node:m.cloneNodeWithNewProps(t,n),canonical:e.canonical}}function Tt(e,t,n){var r=e.canonical.viewConfig;return t=e.node,n=tt(null,l({},n,{style:[n.style,{display:"none"}]}),n,r.validAttributes),{node:m.cloneNodeWithNewProps(t,n),canonical:e.canonical}}var xt=/^(.*)[\\\/]/;function St(e){var t="";do{e:switch(e.tag){case 3:case 4:case 6:case 7:case 10:case 9:var n="";break e;default:var r=e._debugOwner,i=e._debugSource,o=Be(e.type);n=null,r&&(n=Be(r.type)),r=o,o="",i?o=" (at "+i.fileName.replace(xt,"")+":"+i.lineNumber+")":n&&(o=" (created by "+n+")"),n="\n in "+(r||"Unknown")+o}t+=n,e=e.return}while(e);return t}new Set;var kt=[],Pt=-1;function Et(e){0>Pt||(e.current=kt[Pt],kt[Pt]=null,Pt--)}function Ct(e,t){kt[++Pt]=e.current,e.current=t}var wt={},Rt={current:wt},_t={current:!1},Nt=wt;function Ut(e,t){var n=e.type.contextTypes;if(!n)return wt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var i,o={};for(i in n)o[i]=t[i];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function At(e){return null!==(e=e.childContextTypes)&&void 0!==e}function It(e){Et(_t),Et(Rt)}function zt(e){Et(_t),Et(Rt)}function Dt(e,t,n){g(Rt.current===wt,"Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue."),Ct(Rt,t),Ct(_t,n)}function Wt(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var i in r=r.getChildContext())g(i in e,'%s.getChildContext(): key "%s" is not defined in childContextTypes.',Be(t)||"Unknown",i);return l({},n,r)}function Mt(e){var t=e.stateNode;return t=t&&t.__reactInternalMemoizedMergedChildContext||wt,Nt=Rt.current,Ct(Rt,t),Ct(_t,_t.current),!0}function Ot(e,t,n){var r=e.stateNode;g(r,"Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue."),n?(t=Wt(e,t,Nt),r.__reactInternalMemoizedMergedChildContext=t,Et(_t),Et(Rt),Ct(Rt,t)):Et(_t),Ct(_t,n)}var jt=null,Ft=null;function Ht(e){return function(t){try{return e(t)}catch(e){}}}function Bt(e){if("undefined"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var t=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(t.isDisabled||!t.supportsFiber)return!0;try{var n=t.inject(e);jt=Ht(function(e){return t.onCommitFiberRoot(n,e)}),Ft=Ht(function(e){return t.onCommitFiberUnmount(n,e)})}catch(e){}return!0}function Lt(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.firstContextDependency=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.effectTag=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childExpirationTime=this.expirationTime=0,this.alternate=null}function Qt(e,t,n,r){return new Lt(e,t,n,r)}function Yt(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Vt(e){if("function"==typeof e)return Yt(e)?1:0;if(void 0!==e&&null!==e){if((e=e.$$typeof)===We)return 11;if(e===Oe)return 14}return 2}function Xt(e,t){var n=e.alternate;return null===n?((n=Qt(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.effectTag=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childExpirationTime=e.childExpirationTime,n.expirationTime=e.expirationTime,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,n.firstContextDependency=e.firstContextDependency,n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function $t(e,t,n,r,i,o){var a=2;if(r=e,"function"==typeof e)Yt(e)&&(a=1);else if("string"==typeof e)a=5;else e:switch(e){case Ne:return Gt(n.children,i,o,t);case De:return qt(n,3|i,o,t);case Ue:return qt(n,2|i,o,t);case Ae:return(e=Qt(12,n,t,4|i)).elementType=Ae,e.type=Ae,e.expirationTime=o,e;case Me:return(e=Qt(13,n,t,i)).elementType=Me,e.type=Me,e.expirationTime=o,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case Ie:a=10;break e;case ze:a=9;break e;case We:a=11;break e;case Oe:a=14;break e;case je:a=16,r=null;break e}g(!1,"Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",null==e?e:typeof e,"")}return(t=Qt(a,n,t,i)).elementType=e,t.type=r,t.expirationTime=o,t}function Gt(e,t,n,r){return(e=Qt(7,e,r,t)).expirationTime=n,e}function qt(e,t,n,r){return e=Qt(8,e,r,t),t=0==(1&t)?Ue:De,e.elementType=t,e.type=t,e.expirationTime=n,e}function Jt(e,t,n){return(e=Qt(6,e,null,t)).expirationTime=n,e}function Kt(e,t,n){return(t=Qt(4,null!==e.children?e.children:[],e.key,t)).expirationTime=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Zt(e,t){e.didError=!1;var n=e.earliestPendingTime;0===n?e.earliestPendingTime=e.latestPendingTime=t:nt&&(e.latestPendingTime=t),nn(t,e)}function en(e,t){e.didError=!1;var n=e.latestPingedTime;0!==n&&n>=t&&(e.latestPingedTime=0),n=e.earliestPendingTime;var r=e.latestPendingTime;n===t?e.earliestPendingTime=r===t?e.latestPendingTime=0:r:r===t&&(e.latestPendingTime=n),n=e.earliestSuspendedTime,r=e.latestSuspendedTime,0===n?e.earliestSuspendedTime=e.latestSuspendedTime=t:nt&&(e.latestSuspendedTime=t),nn(t,e)}function tn(e,t){var n=e.earliestPendingTime;return e=e.earliestSuspendedTime,n>t&&(t=n),e>t&&(t=e),t}function nn(e,t){var n=t.earliestSuspendedTime,r=t.latestSuspendedTime,i=t.earliestPendingTime,o=t.latestPingedTime;0===(i=0!==i?i:o)&&(0===e||re&&(e=n),t.nextExpirationTimeToWorkOn=i,t.expirationTime=e}var rn=!1;function on(e){return{baseState:e,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function an(e){return{baseState:e.baseState,firstUpdate:e.firstUpdate,lastUpdate:e.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function ln(e){return{expirationTime:e,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function un(e,t){null===e.lastUpdate?e.firstUpdate=e.lastUpdate=t:(e.lastUpdate.next=t,e.lastUpdate=t)}function sn(e,t){var n=e.alternate;if(null===n){var r=e.updateQueue,i=null;null===r&&(r=e.updateQueue=on(e.memoizedState))}else r=e.updateQueue,i=n.updateQueue,null===r?null===i?(r=e.updateQueue=on(e.memoizedState),i=n.updateQueue=on(n.memoizedState)):r=e.updateQueue=an(i):null===i&&(i=n.updateQueue=an(r));null===i||r===i?un(r,t):null===r.lastUpdate||null===i.lastUpdate?(un(r,t),un(i,t)):(un(r,t),i.lastUpdate=t)}function cn(e,t){var n=e.updateQueue;null===(n=null===n?e.updateQueue=on(e.memoizedState):fn(e,n)).lastCapturedUpdate?n.firstCapturedUpdate=n.lastCapturedUpdate=t:(n.lastCapturedUpdate.next=t,n.lastCapturedUpdate=t)}function fn(e,t){var n=e.alternate;return null!==n&&t===n.updateQueue&&(t=e.updateQueue=an(t)),t}function dn(e,t,n,r,i,o){switch(n.tag){case 1:return"function"==typeof(e=n.payload)?e.call(o,r,i):e;case 3:e.effectTag=-2049&e.effectTag|64;case 0:if(null===(i="function"==typeof(e=n.payload)?e.call(o,r,i):e)||void 0===i)break;return l({},r,i);case 2:rn=!0}return r}function pn(e,t,n,r,i){rn=!1;for(var o=(t=fn(e,t)).baseState,a=null,l=0,u=t.firstUpdate,s=o;null!==u;){var c=u.expirationTime;ch?(g=m,m=null):g=m.sibling;var y=d(i,m,l[h],u);if(null===y){null===m&&(m=g);break}e&&m&&null===y.alternate&&t(i,m),a=o(y,a,h),null===c?s=y:c.sibling=y,c=y,m=g}if(h===l.length)return n(i,m),s;if(null===m){for(;hh?(y=m,m=null):y=m.sibling;var b=d(i,m,v.value,u);if(null===b){m||(m=y);break}e&&m&&null===b.alternate&&t(i,m),a=o(b,a,h),null===c?s=b:c.sibling=b,c=b,m=y}if(v.done)return n(i,m),s;if(null===m){for(;!v.done;h++,v=l.next())null!==(v=f(i,v.value,u))&&(a=o(v,a,h),null===c?s=v:c.sibling=v,c=v);return s}for(m=r(i,m);!v.done;h++,v=l.next())null!==(v=p(m,i,h,v.value,u))&&(e&&null!==v.alternate&&m.delete(null===v.key?h:v.key),a=o(v,a,h),null===c?s=v:c.sibling=v,c=v);return e&&m.forEach(function(e){return t(i,e)}),s}return function(e,r,o,l){var u="object"==typeof o&&null!==o&&o.type===Ne&&null===o.key;u&&(o=o.props.children);var s="object"==typeof o&&null!==o;if(s)switch(o.$$typeof){case Re:e:{for(s=o.key,u=r;null!==u;){if(u.key===s){if(7===u.tag?o.type===Ne:u.elementType===o.type){n(e,u.sibling),(r=i(u,o.type===Ne?o.props.children:o.props)).ref=$n(e,u,o),r.return=e,e=r;break e}n(e,u);break}t(e,u),u=u.sibling}o.type===Ne?((r=Gt(o.props.children,e.mode,l,o.key)).return=e,e=r):((l=$t(o.type,o.key,o.props,null,e.mode,l)).ref=$n(e,r,o),l.return=e,e=l)}return a(e);case _e:e:{for(u=o.key;null!==r;){if(r.key===u){if(4===r.tag&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),(r=i(r,o.children||[])).return=e,e=r;break e}n(e,r);break}t(e,r),r=r.sibling}(r=Kt(o,e.mode,l)).return=e,e=r}return a(e)}if("string"==typeof o||"number"==typeof o)return o=""+o,null!==r&&6===r.tag?(n(e,r.sibling),(r=i(r,o)).return=e,e=r):(n(e,r),(r=Jt(o,e.mode,l)).return=e,e=r),a(e);if(Xn(o))return m(e,r,o,l);if(He(o))return h(e,r,o,l);if(s&&Gn(e,o),void 0===o&&!u)switch(e.tag){case 1:case 0:g(!1,"%s(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.",(l=e.type).displayName||l.name||"Component")}return n(e,r)}}var Jn=qn(!0),Kn=qn(!1),Zn=null,er=null,tr=!1;function nr(e,t){switch(e.tag){case 5:return null!==(t=pt(e.type,e.pendingProps))&&(e.stateNode=t,!0);case 6:return null!==(t=pt(e.pendingProps))&&(e.stateNode=t,!0);default:return!1}}function rr(e){if(tr){var t=er;if(t){var n=t;if(!nr(e,t)){if(!(t=pt())||!nr(e,t))return e.effectTag|=2,tr=!1,void(Zn=e);var r=Zn,i=Qt(5,null,null,0);i.elementType="DELETED",i.type="DELETED",i.stateNode=n,i.return=r,i.effectTag=8,null!==r.lastEffect?(r.lastEffect.nextEffect=i,r.lastEffect=i):r.firstEffect=r.lastEffect=i}Zn=e,er=pt()}else e.effectTag|=2,tr=!1,Zn=e}}var ir=Ce.ReactCurrentOwner;function or(e,t,n,r){t.child=null===e?Kn(t,null,n,r):Jn(t,e.child,n,r)}function ar(e,t,n,r,i){n=n.render;var o=t.ref;return kn(t),r=n(r,o),t.effectTag|=1,or(e,t,r,i),t.child}function lr(e,t,n,r,i,o){if(null===e){var a=n.type;return"function"!=typeof a||Yt(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=$t(n.type,null,r,null,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,ur(e,t,a,r,i,o))}return a=e.child,i=n?mr(e,t,n):null!==(t=hr(e,t,n))?t.sibling:null}return hr(e,t,n)}switch(t.expirationTime=0,t.tag){case 2:r=t.elementType,null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),e=t.pendingProps;var i=Ut(t,Rt.current);if(kn(t),i=r(e,i),t.effectTag|=1,"object"==typeof i&&null!==i&&"function"==typeof i.render&&void 0===i.$$typeof){if(t.tag=1,At(r)){var o=!0;Mt(t)}else o=!1;t.memoizedState=null!==i.state&&void 0!==i.state?i.state:null;var a=r.getDerivedStateFromProps;"function"==typeof a&&Hn(t,r,a,e),i.updater=Bn,t.stateNode=i,i._reactInternalFiber=t,Vn(t,r,e,n),t=dr(null,t,r,!0,o,n)}else t.tag=0,or(null,t,i,n),t=t.child;return t;case 16:switch(i=t.elementType,null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),o=t.pendingProps,e=On(i),t.type=e,i=t.tag=Vt(e),o=Mn(e,o),a=void 0,i){case 0:a=cr(null,t,e,o,n);break;case 1:a=fr(null,t,e,o,n);break;case 11:a=ar(null,t,e,o,n);break;case 14:a=lr(null,t,e,Mn(e.type,o),r,n);break;default:g(!1,"Element type is invalid. Received a promise that resolves to: %s. Lazy element type must resolve to a class or function.%s",e,"")}return a;case 0:return r=t.type,i=t.pendingProps,cr(e,t,r,i=t.elementType===r?i:Mn(r,i),n);case 1:return r=t.type,i=t.pendingProps,fr(e,t,r,i=t.elementType===r?i:Mn(r,i),n);case 3:return pr(t),g(null!==(r=t.updateQueue),"If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue."),i=null!==(i=t.memoizedState)?i.element:null,pn(t,r,t.pendingProps,null,n),(r=t.memoizedState.element)===i?t=hr(e,t,n):(or(e,t,r,n),t=t.child),t;case 5:return An(t),null===e&&rr(t),r=t.pendingProps.children,sr(e,t),or(e,t,r,n),t=t.child;case 6:return null===e&&rr(t),null;case 13:return mr(e,t,n);case 4:return Nn(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Jn(t,null,r,n):or(e,t,r,n),t.child;case 11:return r=t.type,i=t.pendingProps,ar(e,t,r,i=t.elementType===r?i:Mn(r,i),n);case 7:return or(e,t,t.pendingProps,n),t.child;case 8:case 12:return or(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,i=t.pendingProps,a=t.memoizedProps,xn(t,o=i.value),null!==a){var l=a.value;if(0===(o=l===o&&(0!==l||1/l==1/o)||l!=l&&o!=o?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(l,o):1073741823))){if(a.children===i.children&&!_t.current){t=hr(e,t,n);break e}}else for(null!==(a=t.child)&&(a.return=t);null!==a;){if(null!==(l=a.firstContextDependency))do{if(l.context===r&&0!=(l.observedBits&o)){if(1===a.tag){var u=ln(n);u.tag=2,sn(a,u)}a.expirationTime within is not currently supported."),l=tt(null,$e,a,f.validAttributes),o=m.createNode(i,f.uiViewClassName,o,l,c),a=new ht(i,f,a),yr(a={node:o,canonical:a},t,!1,!1),t.stateNode=a,null!==t.ref&&(t.effectTag|=128)}else g(null!==t.stateNode,"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");break;case 6:i&&null!=t.stateNode?Tr(i,t,i.memoizedProps,a):("string"!=typeof a&&g(null!==t.stateNode,"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue."),i=_n(Rn.current),o=_n(Cn.current),t.stateNode=gt(a,i,o,t));break;case 11:break;case 13:if(a=t.memoizedState,0!=(64&t.effectTag)){t.expirationTime=o,Ar=t;break e}a=null!==a,o=null!==i&&null!==i.memoizedState,null!==i&&!a&&o&&(null!==(i=i.child.sibling)&&(null!==(f=t.firstEffect)?(t.firstEffect=i,i.nextEffect=f):(t.firstEffect=t.lastEffect=i,i.nextEffect=null),i.effectTag=8)),(a!==o||0==(1&t.effectTag)&&a)&&(t.effectTag|=4);break;case 7:case 8:case 12:break;case 4:Un(),vr(t);break;case 10:Sn(t);break;case 9:case 14:break;case 17:At(t.type)&&It();break;default:g(!1,"Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.")}Ar=null}if(t=e,1===zr||1!==t.childExpirationTime){for(a=0,i=t.child;null!==i;)o=i.expirationTime,f=i.childExpirationTime,o>a&&(a=o),f>a&&(a=f),i=i.sibling;t.childExpirationTime=a}if(null!==Ar)return Ar;null!==n&&0==(1024&n.effectTag)&&(null===n.firstEffect&&(n.firstEffect=e.firstEffect),null!==e.lastEffect&&(null!==n.lastEffect&&(n.lastEffect.nextEffect=e.firstEffect),n.lastEffect=e.lastEffect),1=p?f=0:(-1===f||p component higher in the tree to provide a loading indicator or placeholder to display."+St(u))}Wr=!0,s=gn(s,u),a=l;do{switch(a.tag){case 3:u=s,a.effectTag|=2048,a.expirationTime=o,cn(a,o=Cr(a,u,o));break e;case 1:if(u=s,l=a.type,c=a.stateNode,0==(64&a.effectTag)&&("function"==typeof l.getDerivedStateFromError||null!==c&&"function"==typeof c.componentDidCatch&&(null===jr||!jr.has(c)))){a.effectTag|=2048,a.expirationTime=o,cn(a,o=wr(a,u,o));break e}}a=a.return}while(null!==a)}Ar=Br(i);continue}r=!0,Ri(t)}}break}if(Ur=!1,Tn=bn=vn=Nr.currentDispatcher=null,r)Ir=null,e.finishedWork=null;else if(null!==Ar)e.finishedWork=null;else{if(g(null!==(r=e.current.alternate),"Finished root should have a work-in-progress. This error is likely caused by a bug in React. Please file an issue."),Ir=null,Wr){if(i=e.latestPendingTime,o=e.latestSuspendedTime,a=e.latestPingedTime,0!==i&&it?0:t)):(e.pendingCommitExpirationTime=n,e.finishedWork=r)}}function Yr(e,t){for(var n=e.return;null!==n;){switch(n.tag){case 1:var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===jr||!jr.has(r)))return sn(n,e=wr(n,e=gn(t,e),1073741823)),void Gr(n,1073741823);break;case 3:return sn(n,e=Cr(n,e=gn(t,e),1073741823)),void Gr(n,1073741823)}n=n.return}3===e.tag&&(sn(e,n=Cr(e,n=gn(t,e),1073741823)),Gr(e,1073741823))}function Vr(e,t){return Ur?e=Or?1073741823:zr:1&t.mode?(e=li?1073741822-10*(1+((1073741822-e+15)/10|0)):1073741822-25*(1+((1073741822-e+500)/25|0)),null!==Ir&&e===zr&&--e):e=1073741823,li&&(0===ri||e=o){o=i=r,e.didError=!1;var a=e.latestPingedTime;(0===a||a>o)&&(e.latestPingedTime=o),nn(o,e)}else Zt(e,i=Vr(i=bi(),t));0!=(1&t.mode)&&e===Ir&&zr===r&&(Ir=null),$r(t,i),0==(1&t.mode)&&($r(n,i),1===n.tag&&null!==n.stateNode&&((t=ln(i)).tag=2,sn(n,t))),0!==(n=e.expirationTime)&&Ti(e,n)}function $r(e,t){e.expirationTimezr&&Fr(),Zt(e,t),Ur&&!Or&&Ir===e||Ti(e,e.expirationTime),pi>di&&(pi=0,g(!1,"Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.")))}var qr=null,Jr=null,Kr=0,Zr=void 0,ei=!1,ti=null,ni=0,ri=0,ii=!1,oi=null,ai=!1,li=!1,ui=null,si=nt(),ci=1073741822-(si/10|0),fi=ci,di=50,pi=0,mi=null;function hi(){ci=1073741822-((nt()-si)/10|0)}function gi(e,t){if(0!==Kr){if(te.expirationTime&&(e.expirationTime=t),ei||ai||(1073741823===t?Ei(1073741823,!1):gi(0,t))}function xi(){var e=0,t=null;if(null!==Jr)for(var n=Jr,r=qr;null!==r;){var i=r.expirationTime;if(0===i){if(g(null!==n&&null!==Jr,"Should have a previous and last root. This error is likely caused by a bug in React. Please file an issue."),r===r.nextScheduledRoot){qr=Jr=r.nextScheduledRoot=null;break}if(r===qr)qr=i=r.nextScheduledRoot,Jr.nextScheduledRoot=i,r.nextScheduledRoot=null;else{if(r===Jr){(Jr=n).nextScheduledRoot=qr,r.nextScheduledRoot=null;break}n.nextScheduledRoot=r.nextScheduledRoot,r.nextScheduledRoot=null}r=n.nextScheduledRoot}else{if(i>e&&(e=i,t=r),r===Jr)break;if(1073741823===e)break;n=r,r=r.nextScheduledRoot}}ti=t,ni=e}var Si=!1;function ki(){return!!Si||it<=nt()&&(Si=!0)}function Pi(){try{if(!ki()&&null!==qr){hi();var e=qr;do{var t=e.expirationTime;0!==t&&ci<=t&&(e.nextExpirationTimeToWorkOn=ci),e=e.nextScheduledRoot}while(e!==qr)}Ei(0,!0)}finally{Si=!1}}function Ei(e,t){if(xi(),t)for(hi(),fi=ci;null!==ti&&0!==ni&&e<=ni&&!(Si&&ci>ni);)Ci(ti,ni,ci>ni),xi(),hi(),fi=ci;else for(;null!==ti&&0!==ni&&e<=ni;)Ci(ti,ni,!1),xi();if(t&&(Kr=0,Zr=null),0!==ni&&gi(0,ni),pi=0,mi=null,null!==ui)for(e=ui,ui=null,t=0;t=n&&(null===ui?ui=[r]:ui.push(r),r._defer))return e.finishedWork=t,void(e.expirationTime=0);e.finishedWork=null,e===mi?pi++:(mi=e,pi=0),Or=Ur=!0,g(e.current!==t,"Cannot commit the same tree as before. This is probably a bug related to the return field. This error is likely caused by a bug in React. Please file an issue."),g(0!==(n=e.pendingCommitExpirationTime),"Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue."),e.pendingCommitExpirationTime=0,r=t.expirationTime;var i=t.childExpirationTime;for(r=i>r?i:r,e.didError=!1,0===r?(e.earliestPendingTime=0,e.latestPendingTime=0,e.earliestSuspendedTime=0,e.latestSuspendedTime=0,e.latestPingedTime=0):(0!==(i=e.latestPendingTime)&&(i>r?e.earliestPendingTime=e.latestPendingTime=0:e.earliestPendingTime>r&&(e.earliestPendingTime=e.latestPendingTime)),0===(i=e.earliestSuspendedTime)?Zt(e,r):ri&&Zt(e,r)),nn(0,e),Nr.current=null,1k?t:k)&&(jr=null),e.expirationTime=t,e.finishedWork=null}function Ri(e){g(null!==ti,"Should be working on a root. This error is likely caused by a bug in React. Please file an issue."),ti.expirationTime=0,ii||(ii=!0,oi=e)}function _i(e){var t=e._reactInternalFiber;return void 0===t&&("function"==typeof e.render?g(!1,"Unable to find node on an unmounted component."):g(!1,"Argument appears to not be a ReactComponent. Keys: %s",Object.keys(e))),null===(e=Ve(t))?null:e.stateNode}function Ni(e,t,n,r){var i=t.current,o=bi();i=Vr(o,i),o=t.current;e:if(n){n=n._reactInternalFiber;t:{g(2===Le(n)&&1===n.tag,"Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.");var a=n;do{switch(a.tag){case 3:a=a.stateNode.context;break t;case 1:if(At(a.type)){a=a.stateNode.__reactInternalMemoizedMergedChildContext;break t}}a=a.return}while(null!==a);g(!1,"Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue."),a=void 0}if(1===n.tag){var l=n.type;if(At(l)){n=Wt(n,l,a);break e}}n=a}else n=wt;return null===t.context?t.context=n:t.pendingContext=n,t=r,(r=ln(i)).payload={element:e},null!==(t=void 0===t?null:t)&&(r.callback=t),sn(o,r),Gr(o,i),i}function Ui(e,t,n){var r=3=0&&(s='video'),n.saveToCameraRoll(o,s)}},{key:"getPhotos",value:function(o){if(arguments.length>1){console.warn('CameraRoll.getPhotos(tag, success, error) is deprecated. Use the returned Promise instead');var t=arguments[1],s=arguments[2]||function(){};n.getPhotos(o).then(t,s)}return n.getPhotos(o)}}]),s})());c.GroupTypesOptions=h,c.AssetTypeOptions=p,m.exports=c},328,[19,20,59,5,185,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]).Clipboard;m.exports={getString:function(){return t.getString()},setString:function(n){t.setString(n)}}},329,[5]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),c=r(d[3]).DatePickerAndroid;function u(t,n){var o=t[n];'object'==typeof o&&'function'==typeof o.getMonth&&(t[n]=o.getTime())}var s=(function(){function s(){n(this,s)}return o(s,null,[{key:"open",value:function(n){return t.async(function(t){for(;;)switch(t.prev=t.next){case 0:return n&&(u(n,'date'),u(n,'minDate'),u(n,'maxDate')),t.abrupt("return",c.open(n));case 3:case"end":return t.stop()}},null,this)}},{key:"dateSetAction",get:function(){return'dateSetAction'}},{key:"dismissedAction",get:function(){return'dismissedAction'}}]),s})();m.exports=s},330,[139,19,20,5]); -__d(function(g,r,i,a,m,e,d){'use strict';var o=r(d[0]),n=r(d[1]).ImagePickerIOS,c={canRecordVideos:function(o){return n.canRecordVideos(o)},canUseCamera:function(o){return n.canUseCamera(o)},openCameraDialog:function(c,t,s){return c=o({videoMode:!1},c),n.openCameraDialog(c,t,s)},openSelectDialog:function(c,t,s){return c=o({showImages:!0,showVideos:!1},c),n.openSelectDialog(c,t,s)}};m.exports=c},331,[44,5]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),t=r(d[1]),u=r(d[2]),o=r(d[3]),s=r(d[4]),l=r(d[5]),v=r(d[6]),L=(r(d[7]),r(d[8])),c=v.IntentAndroid,R=(function(v){function R(){return n(this,R),u(this,o(R).call(this,c))}return s(R,l),t(R,[{key:"addEventListener",value:function(n,t){this.addListener(n,t)}},{key:"removeEventListener",value:function(n,t){this.removeListener(n,t)}},{key:"openURL",value:function(n){return this._validateURL(n),c.openURL(n)}},{key:"canOpenURL",value:function(n){return this._validateURL(n),c.canOpenURL(n)}},{key:"getInitialURL",value:function(){return c.getInitialURL()}},{key:"_validateURL",value:function(n){L('string'==typeof n,'Invalid URL: should be a string. Was: '+n),L(n,'Invalid URL: cannot be empty')}}]),R})();m.exports=new R},332,[19,20,27,30,33,119,5,41,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var n,t=r(d[0]),o=r(d[1]),c=(r(d[2]),o.NetInfo),f=new t(c),u=new Map;function s(n){return'none'!==n.type&&'unknown'!==n.type}n=function(n){return'NONE'!==n&&'UNKNOWN'!==n};var v=new Map,C={addEventListener:function(n,t){var o;if('connectionChange'===n)o=f.addListener("networkStatusDidChange",function(n){t({type:n.connectionType,effectiveType:n.effectiveConnectionType})});else{if('change'!==n)return console.warn('Trying to subscribe to unknown event: "'+n+'"'),{remove:function(){}};console.warn('NetInfo\'s "change" event is deprecated. Listen to the "connectionChange" event instead.'),o=f.addListener("networkStatusDidChange",function(n){t(n.network_info)})}return u.set(t,o),{remove:function(){return C.removeEventListener(n,t)}}},removeEventListener:function(n,t){var o=u.get(t);o&&(o.remove(),u.delete(t))},fetch:function(){return console.warn('NetInfo.fetch() is deprecated. Use NetInfo.getConnectionInfo() instead.'),c.getCurrentConnectivity().then(function(n){return n.network_info})},getConnectionInfo:function(){return c.getCurrentConnectivity().then(function(n){return{type:n.connectionType,effectiveType:n.effectiveConnectionType}})},isConnected:{addEventListener:function(t,o){var c=function(c){'change'===t?o(n(c)):'connectionChange'===t&&o(s(c))};return v.set(o,c),C.addEventListener(t,c),{remove:function(){return C.isConnected.removeEventListener(t,o)}}},removeEventListener:function(n,t){var o=v.get(t);C.removeEventListener(n,o),v.delete(t)},fetch:function(){return C.getConnectionInfo().then(s)}},isConnectionExpensive:function(){return c.isConnectionMetered()}};m.exports=C},333,[119,5,41]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),o=r(d[1]),n=r(d[2]),c=r(d[3]).PushNotificationManager,l=r(d[4]),s=new n(c),u=new Map,f=(function(){function n(o){var c=this;t(this,n),this._data={},this._remoteNotificationCompleteCallbackCalled=!1,this._isRemote=o.remote,this._isRemote&&(this._notificationId=o.notificationId),o.remote?Object.keys(o).forEach(function(t){var n=o[t];'aps'===t?(c._alert=n.alert,c._sound=n.sound,c._badgeCount=n.badge,c._category=n.category,c._contentAvailable=n['content-available'],c._threadID=n['thread-id']):c._data[t]=n}):(this._badgeCount=o.applicationIconBadgeNumber,this._sound=o.soundName,this._alert=o.alertBody,this._data=o.userInfo,this._category=o.category)}return o(n,null,[{key:"presentLocalNotification",value:function(t){c.presentLocalNotification(t)}},{key:"scheduleLocalNotification",value:function(t){c.scheduleLocalNotification(t)}},{key:"cancelAllLocalNotifications",value:function(){c.cancelAllLocalNotifications()}},{key:"removeAllDeliveredNotifications",value:function(){c.removeAllDeliveredNotifications()}},{key:"getDeliveredNotifications",value:function(t){c.getDeliveredNotifications(t)}},{key:"removeDeliveredNotifications",value:function(t){c.removeDeliveredNotifications(t)}},{key:"setApplicationIconBadgeNumber",value:function(t){c.setApplicationIconBadgeNumber(t)}},{key:"getApplicationIconBadgeNumber",value:function(t){c.getApplicationIconBadgeNumber(t)}},{key:"cancelLocalNotifications",value:function(t){c.cancelLocalNotifications(t)}},{key:"getScheduledLocalNotifications",value:function(t){c.getScheduledLocalNotifications(t)}},{key:"addEventListener",value:function(t,o){var c;l('notification'===t||'register'===t||'registrationError'===t||'localNotification'===t,'PushNotificationIOS only supports `notification`, `register`, `registrationError`, and `localNotification` events'),'notification'===t?c=s.addListener("remoteNotificationReceived",function(t){o(new n(t))}):'localNotification'===t?c=s.addListener("localNotificationReceived",function(t){o(new n(t))}):'register'===t?c=s.addListener("remoteNotificationsRegistered",function(t){o(t.deviceToken)}):'registrationError'===t&&(c=s.addListener("remoteNotificationRegistrationError",function(t){o(t)})),u.set(t,c)}},{key:"removeEventListener",value:function(t,o){l('notification'===t||'register'===t||'registrationError'===t||'localNotification'===t,'PushNotificationIOS only supports `notification`, `register`, `registrationError`, and `localNotification` events');var n=u.get(t);n&&(n.remove(),u.delete(t))}},{key:"requestPermissions",value:function(t){var o={};return o=t?{alert:!!t.alert,badge:!!t.badge,sound:!!t.sound}:{alert:!0,badge:!0,sound:!0},c.requestPermissions(o)}},{key:"abandonPermissions",value:function(){c.abandonPermissions()}},{key:"checkPermissions",value:function(t){l('function'==typeof t,'Must provide a valid callback'),c.checkPermissions(t)}},{key:"getInitialNotification",value:function(){return c.getInitialNotification().then(function(t){return t&&new n(t)})}}]),o(n,[{key:"finish",value:function(t){this._isRemote&&this._notificationId&&!this._remoteNotificationCompleteCallbackCalled&&(this._remoteNotificationCompleteCallbackCalled=!0,c.onFinishRemoteNotification(this._notificationId,t))}},{key:"getMessage",value:function(){return this._alert}},{key:"getSound",value:function(){return this._sound}},{key:"getCategory",value:function(){return this._category}},{key:"getAlert",value:function(){return this._alert}},{key:"getContentAvailable",value:function(){return this._contentAvailable}},{key:"getBadgeCount",value:function(){return this._badgeCount}},{key:"getData",value:function(){return this._data}},{key:"getThreadID",value:function(){return this._threadID}}]),n})();f.FetchResult={NewData:'UIBackgroundFetchResultNewData',NoData:'UIBackgroundFetchResultNoData',ResultFailed:'UIBackgroundFetchResultFailed'},m.exports=f},334,[19,20,119,5,3]); -__d(function(g,r,i,a,m,e,d){'use strict';var n={get:function(n){return console.warn('Settings is not yet supported on Android'),null},set:function(n){console.warn('Settings is not yet supported on Android')},watchKeys:function(n,t){return console.warn('Settings is not yet supported on Android'),-1},clearWatch:function(n){console.warn('Settings is not yet supported on Android')}};m.exports=n},335,[]); -__d(function(g,r,i,a,m,e,d){'use strict';r(d[0]);var t=r(d[1]),n=r(d[2]),o=(r(d[3]),r(d[4])),s=(r(d[5]),r(d[6])),l=(s.ActionSheetManager,s.ShareModule),u=(function(){function s(){t(this,s)}return n(s,null,[{key:"share",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return o('object'==typeof t&&null!==t,'Content to share must be a valid object'),o('string'==typeof t.url||'string'==typeof t.message,'At least one of URL and message is required'),o('object'==typeof n&&null!==n,'Options must be a valid object'),o(!t.title||'string'==typeof t.title,'Invalid title: title should be a string.'),l.share(t,n.dialogTitle)}},{key:"sharedAction",get:function(){return'sharedAction'}},{key:"dismissedAction",get:function(){return'dismissedAction'}}]),s})();m.exports=u},336,[44,19,20,41,3,67,5]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]);m.exports=new t('StatusBarManager')},337,[119]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),t=r(d[1]),s=r(d[2]),c=r(d[3]).TimePickerAndroid,o=(function(){function o(){t(this,o)}return s(o,null,[{key:"open",value:function(t){return n.async(function(n){for(;;)switch(n.prev=n.next){case 0:return n.abrupt("return",c.open(t));case 1:case"end":return n.stop()}},null,this)}}]),o})();o.timeSetAction='timeSetAction',o.dismissedAction='dismissedAction',m.exports=o},338,[139,19,20,5]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]).Vibration;r(d[1]);var n={vibrate:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:400,o=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if('number'==typeof n)t.vibrate(n);else{if(!Array.isArray(n))throw new Error('Vibration pattern should be a number or array');t.vibrateByPattern(n,o?0:-1)}},cancel:function(){t.cancel()}};m.exports=n},339,[5,41]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n={vibrate:function(){t(!1,'VibrationIOS is deprecated, and will be removed. Use Vibration instead.')}};m.exports=n},340,[110]); -__d(function(g,r,i,a,m,e,d){'use strict';var n,t=r(d[0]),u=r(d[1]),l=r(d[2]),o=r(d[3]),s=r(d[4]);n=(function(n){function c(){return t(this,c),l(this,o(c).apply(this,arguments))}return s(c,n),u(c,[{key:"render",value:function(){return null}}],[{key:"ignoreWarnings",value:function(n){}},{key:"install",value:function(){}},{key:"uninstall",value:function(){}}]),c})(r(d[5]).Component),m.exports=n},341,[19,20,27,30,33,46]); -__d(function(g,r,i,a,m,e,d){var n=r(d[0]),o=r(d[1]);m.exports=function(t,f){return'number'!=typeof t&&'window'!==t&&(t=n.findNodeHandle(t)||'window'),o.__takeSnapshot(t,f)}},342,[76,40]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),s=n.shape({x:n.number,y:n.number});m.exports=s},343,[59]); -__d(function(o,e,n,d,m,a,l){m.exports={name:"PolyvVodRnDemo",displayName:"PolyvVodRnDemo"}},344,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),u=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=u(r(d[2])),l=u(r(d[3])),f=u(r(d[4])),o=u(r(d[5])),c=u(r(d[6])),v=t(r(d[7])),p=u(r(d[8])),s=(function(t){function u(){return(0,n.default)(this,u),(0,f.default)(this,(0,o.default)(u).apply(this,arguments))}return(0,c.default)(u,t),(0,l.default)(u,[{key:"render",value:function(){return v.default.createElement(p.default,null)}}]),u})(v.Component);e.default=s},345,[346,1,19,20,27,30,33,47,347]); -__d(function(g,r,i,a,m,e,d){m.exports=function(t){if(t&&t.__esModule)return t;var o={};if(null!=t)for(var n in t)if(Object.prototype.hasOwnProperty.call(t,n)){var c=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(t,n):{};c.get||c.set?Object.defineProperty(o,n,c):o[n]=t[n]}return o.default=t,o}},346,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=(r(d[1])(r(d[2])),r(d[3])),l=t(r(d[4])),o=t(r(d[5])),u=t(r(d[6])),c=(0,n.createStackNavigator)({OnlineList:l.default,VideoPlayer:o.default,downloadList:u.default},{initialRouteName:"OnlineList"}),f=(0,n.createAppContainer)(c);m.exports=f},347,[1,346,47,348,495,533,535]); -__d(function(g,r,i,a,m,e,d){m.exports={get createAppContainer(){return r(d[0]).createAppContainer},get createNavigationContainer(){return console.warn('`createNavigationContainer()` has been deprecated, please use `createAppContainer()` instead. You can also import createAppContainer directly from @react-navigation/native'),r(d[0]).createAppContainer},get createKeyboardAwareNavigator(){return r(d[0]).createKeyboardAwareNavigator},get createNavigationAwareScrollable(){return r(d[0]).createNavigationAwareScrollable},get ScrollView(){return r(d[0]).ScrollView},get FlatList(){return r(d[0]).FlatList},get SectionList(){return r(d[0]).SectionList},get ResourceSavingSceneView(){return r(d[0]).ResourceSavingSceneView},get SafeAreaView(){return r(d[0]).SafeAreaView},get withOrientation(){return r(d[0]).withOrientation},get createNavigator(){return r(d[1]).createNavigator},get StateUtils(){return r(d[1]).StateUtils},get getNavigation(){return r(d[1]).getNavigation},get NavigationContext(){return r(d[1]).NavigationContext},get NavigationProvider(){return r(d[1]).NavigationProvider},get NavigationConsumer(){return r(d[1]).NavigationConsumer},get NavigationActions(){return r(d[1]).NavigationActions},get StackActions(){return r(d[1]).StackActions},get StackRouter(){return r(d[1]).StackRouter},get TabRouter(){return r(d[1]).TabRouter},get SwitchRouter(){return r(d[1]).SwitchRouter},get createConfigGetter(){return r(d[1]).StackAcreateConfigGetterctions},get getScreenForRouteName(){return r(d[1]).getScreenForRouteName},get validateRouteConfigMap(){return r(d[1]).validateRouteConfigMap},get getActiveChildNavigationOptions(){return r(d[1]).getActiveChildNavigationOptions},get pathUtils(){return r(d[1]).pathUtils},get SceneView(){return r(d[1]).SceneView},get SwitchView(){return r(d[1]).SwitchView},get NavigationEvents(){return r(d[1]).NavigationEvents},get withNavigation(){return r(d[1]).withNavigation},get withNavigationFocus(){return r(d[1]).withNavigationFocus},get createStackNavigator(){return r(d[2]).createStackNavigator},get createSwitchNavigator(){return r(d[1]).createSwitchNavigator},get createBottomTabNavigator(){return r(d[3]).createBottomTabNavigator},get createMaterialTopTabNavigator(){return r(d[3]).createMaterialTopTabNavigator},get createDrawerNavigator(){return r(d[4]).createDrawerNavigator},get DrawerRouter(){return r(d[4]).DrawerRouter},get DrawerActions(){return r(d[4]).DrawerActions},get Transitioner(){return console.warn('Importing the stack Transitioner directly from react-navigation is now deprecated. Instead, import { Transitioner } from "react-navigation-stack";'),r(d[2]).Transitioner},get StackView(){return r(d[2]).StackView},get StackViewCard(){return r(d[2]).StackViewCard},get StackViewTransitionConfigs(){return r(d[2]).StackViewTransitionConfigs},get Header(){return r(d[2]).Header},get HeaderTitle(){return r(d[2]).HeaderTitle},get HeaderBackButton(){return r(d[2]).HeaderBackButton},get HeaderStyleInterpolator(){return r(d[2]).HeaderStyleInterpolator},get DrawerView(){return r(d[4]).DrawerView},get DrawerItems(){return r(d[4]).DrawerNavigatorItems},get DrawerSidebar(){return r(d[4]).DrawerSidebar},get BottomTabBar(){return r(d[3]).BottomTabBar},get MaterialTopTabBar(){return r(d[3]).MaterialTopTabBar}}},348,[349,352,422,464,484]); -__d(function(g,r,i,a,m,e,d){m.exports={get createAppContainer(){return r(d[0]).default},get createKeyboardAwareNavigator(){return r(d[1]).default},get createNavigationAwareScrollable(){return r(d[2]).default},get withOrientation(){return r(d[3]).default},get ResourceSavingSceneView(){return r(d[4]).default},get SafeAreaView(){return r(d[5]).default},get ScrollView(){return r(d[6]).ScrollView},get FlatList(){return r(d[6]).FlatList},get SectionList(){return r(d[6]).SectionList}}},349,[350,397,398,402,403,404,407]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e._TESTING_ONLY_reset_container_count=function(){0},e.default=function(t){var k=(function(_){function k(n){var l;return(0,s.default)(this,k),(l=(0,u.default)(this,(0,c.default)(k).call(this,n))).subs=null,l._actionEventSubscribers=new Set,l._handleOpenURL=function(n){var o=n.url,s=l.props,u=s.enableURLHandling,c=s.uriPrefix;if(!1!==u){var p=y(o,c);if(p){var v=p.path,f=p.params,h=t.router.getActionForPathAndParams(v,f);h&&l.dispatch(h)}}},l._persistNavigationState=function(t){var n;return o.default.async(function(s){for(;;)switch(s.prev=s.next){case 0:if(n=l.props.persistenceKey){s.next=3;break}return s.abrupt("return");case 3:return s.next=5,o.default.awrap(h.AsyncStorage.setItem(n,JSON.stringify(t)));case 5:case"end":return s.stop()}},null,this)},l.dispatch=function(n){if(l.props.navigation)return l.props.navigation.dispatch(n);l._navState=l._navState||l.state.nav;var o=l._navState;(0,b.default)(o,'should be set in constructor if stateful');var s=t.router.getStateForAction(n,o),u=null===s?o:s,c=function(){l._actionEventSubscribers.forEach(function(t){return t({type:'action',action:n,state:u,lastState:o})})};return null===s?(c(),!0):u!==o?(l._navState=u,l.setState({nav:u},function(){l._onNavigationStateChange(o,u,n),c(),l._persistNavigationState(u)}),!0):(c(),!1)},l._getScreenProps=function(){return l.props.screenProps},A(n),l._initialAction=S.NavigationActions.init(),l._isStateful()&&(l.subs=h.BackHandler.addEventListener('hardwareBackPress',function(){if(l._isMounted)return l.dispatch(S.NavigationActions.back());l.subs&&l.subs.remove()})),l.state={nav:l._isStateful()&&!n.persistenceKey?t.router.getStateForAction(l._initialAction):null},l}return(0,p.default)(k,_),(0,l.default)(k,null,[{key:"getDerivedStateFromProps",value:function(t){return A(t),null}}]),(0,l.default)(k,[{key:"_renderLoading",value:function(){return this.props.renderLoadingExperimental?this.props.renderLoadingExperimental():null}},{key:"_isStateful",value:function(){return N(this.props)}},{key:"_validateProps",value:function(t){if(!this._isStateful()){t.navigation,t.screenProps;var n=(0,v.default)(t,["navigation","screenProps"]),o=Object.keys(n);if(0!==o.length)throw new Error("This navigator has both navigation and container props, so it is unclear if it should own its own state. Remove props: \""+o.join(', ')+"\" if the navigator should get its state from the navigation prop. If the navigator should maintain its own state, do not pass a navigation prop.")}}},{key:"_onNavigationStateChange",value:function(t,n,o){void 0===this.props.onNavigationStateChange&&this._isStateful()&&process.env.REACT_NAV_LOGGING?console.group?(console.group('Navigation Dispatch: '),console.log('Action: ',o),console.log('New State: ',n),console.log('Last State: ',t),console.groupEnd()):console.log('Navigation Dispatch: ',{action:o,newState:n,lastState:t}):'function'==typeof this.props.onNavigationStateChange&&this.props.onNavigationStateChange(t,n,o)}},{key:"componentDidUpdate",value:function(){this._navState===this.state.nav&&(this._navState=null)}},{key:"componentDidMount",value:function(){var n,s,u,c,l,p,v,f,_,S,b,N,A,k,L=this;return o.default.async(function(E){for(;;)switch(E.prev=E.next){case 0:if(this._isMounted=!0,this._isStateful()){E.next=3;break}return E.abrupt("return");case 3:if(0,h.Linking.addEventListener('url',this._handleOpenURL),n=this.props,s=n.persistenceKey,u=n.uriPrefix,c=n.enableURLHandling,l=null,p=null,!1===c){E.next=20;break}if(E.t0=s,!E.t0){E.next=15;break}return E.next=14,o.default.awrap(h.AsyncStorage.getItem(s));case 14:E.t0=E.sent;case 15:return p=E.t0,E.next=18,o.default.awrap(h.Linking.getInitialURL());case 18:v=E.sent,l=v&&y(v,u);case 20:if(f=this._initialAction,(_=this.state.nav)||(process.env.REACT_NAV_LOGGING&&console.log('Init new Navigation State'),_=t.router.getStateForAction(f)),p)try{_=JSON.parse(p),w=!0}catch(t){}if(l&&(b=(S=l).path,N=S.params,(A=t.router.getActionForPathAndParams(b,N))&&(process.env.REACT_NAV_LOGGING&&console.log('Applying Navigation Action for Initial URL:',l),f=A,_=t.router.getStateForAction(A,_))),k=function(){return L._actionEventSubscribers.forEach(function(t){return t({type:'action',action:f,state:L.state.nav,lastState:null})})},_!==this.state.nav){E.next=29;break}return k(),E.abrupt("return");case 29:this.setState({nav:_},function(){w=!1,k()});case 30:case"end":return E.stop()}},null,this)}},{key:"componentDidCatch",value:function(t){if(!w)throw t;w=!1,console.warn('Uncaught exception while starting app from persisted navigation state! Trying to render again with a fresh navigation state..'),this.dispatch(S.NavigationActions.init())}},{key:"componentWillUnmount",value:function(){this._isMounted=!1,h.Linking.removeEventListener('url',this._handleOpenURL),this.subs&&this.subs.remove(),this._isStateful()&&0}},{key:"render",value:function(){var o=this,s=this.props.navigation;if(this._isStateful()){var u=this.state.nav;if(!u)return this._renderLoading();this._navigation&&this._navigation.state===u||(this._navigation=(0,S.getNavigation)(t.router,u,this.dispatch,this._actionEventSubscribers,this._getScreenProps,function(){return o._navigation})),s=this._navigation}return(0,b.default)(s,'failed to get navigation'),f.default.createElement(S.NavigationProvider,{value:s},f.default.createElement(t,(0,n.default)({},this.props,{navigation:s})))}}]),k})(f.default.Component);return k.router=t.router,k.navigationOptions=null,(0,_.polyfill)(k)};var n=t(r(d[1])),o=t(r(d[2])),s=t(r(d[3])),u=t(r(d[4])),c=t(r(d[5])),l=t(r(d[6])),p=t(r(d[7])),v=t(r(d[8])),f=t(r(d[9])),h=r(d[10]),_=r(d[11]),S=r(d[12]),b=t(r(d[13])),y=(t(r(d[14])),S.pathUtils.urlToPathAndParams);function N(t){return!t.navigation}function A(t){if(!N(t)){t.navigation,t.screenProps;var n=(0,v.default)(t,["navigation","screenProps"]),o=Object.keys(n);if(0!==o.length)throw new Error("This navigator has both navigation and container props, so it is unclear if it should own its own state. Remove props: \""+o.join(', ')+"\" if the navigator should get its state from the navigation prop. If the navigator should maintain its own state, do not pass a navigation prop.")}}var w=!1},350,[1,8,139,19,27,30,20,33,6,47,2,351,352,395,396]); -__d(function(g,r,i,a,m,e,d){'use strict';function t(){var t=this.constructor.getDerivedStateFromProps(this.props,this.state);null!==t&&void 0!==t&&this.setState(t)}function n(t){this.setState(function(n){var o=this.constructor.getDerivedStateFromProps(t,n);return null!==o&&void 0!==o?o:null}.bind(this))}function o(t,n){try{var o=this.props,p=this.state;this.props=t,this.state=n,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(o,p)}finally{this.props=o,this.state=p}}Object.defineProperty(e,'__esModule',{value:!0}),t.__suppressDeprecationWarning=!0,n.__suppressDeprecationWarning=!0,o.__suppressDeprecationWarning=!0,e.polyfill=function(p){var l=p.prototype;if(!l||!l.isReactComponent)throw new Error('Can only polyfill class components');if('function'!=typeof p.getDerivedStateFromProps&&'function'!=typeof l.getSnapshotBeforeUpdate)return p;var s=null,c=null,f=null;if('function'==typeof l.componentWillMount?s='componentWillMount':'function'==typeof l.UNSAFE_componentWillMount&&(s='UNSAFE_componentWillMount'),'function'==typeof l.componentWillReceiveProps?c='componentWillReceiveProps':'function'==typeof l.UNSAFE_componentWillReceiveProps&&(c='UNSAFE_componentWillReceiveProps'),'function'==typeof l.componentWillUpdate?f='componentWillUpdate':'function'==typeof l.UNSAFE_componentWillUpdate&&(f='UNSAFE_componentWillUpdate'),null!==s||null!==c||null!==f){var u=p.displayName||p.name,h='function'==typeof p.getDerivedStateFromProps?'getDerivedStateFromProps()':'getSnapshotBeforeUpdate()';throw Error('Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n'+u+' uses '+h+' but also contains the following legacy lifecycles:'+(null!==s?'\n '+s:'')+(null!==c?'\n '+c:'')+(null!==f?'\n '+f:'')+"\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://fb.me/react-async-component-lifecycle-hooks")}if('function'==typeof p.getDerivedStateFromProps&&(l.componentWillMount=t,l.componentWillReceiveProps=n),'function'==typeof l.getSnapshotBeforeUpdate){if('function'!=typeof l.componentDidUpdate)throw new Error('Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype');l.componentWillUpdate=o;var y=l.componentDidUpdate;l.componentDidUpdate=function(t,n,o){var p=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:o;y.call(this,t,n,p)}}return p}},351,[]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports={get StateUtils(){return r(d[0]).default},get getNavigation(){return r(d[1]).default},get createNavigator(){return r(d[2]).default},get NavigationContext(){return r(d[3]).default},get NavigationProvider(){return r(d[3]).default.Provider},get NavigationConsumer(){return r(d[3]).default.Consumer},get createSwitchNavigator(){return r(d[4]).default},get NavigationActions(){return r(d[5]).default},get StackActions(){return r(d[6]).default},get StackRouter(){return r(d[7]).default},get TabRouter(){return r(d[8]).default},get SwitchRouter(){return r(d[9]).default},get createConfigGetter(){return r(d[10]).default},get getScreenForRouteName(){return r(d[11]).default},get validateRouteConfigMap(){return r(d[12]).default},get getActiveChildNavigationOptions(){return r(d[13]).default},get pathUtils(){return r(d[14])},get SceneView(){return r(d[15]).default},get SwitchView(){return r(d[16]).default},get NavigationEvents(){return r(d[17]).default},get withNavigation(){return r(d[18]).default},get withNavigationFocus(){return r(d[19]).default}}},352,[353,355,362,363,369,357,376,386,388,370,374,371,377,390,378,385,384,391,392,394]); -__d(function(g,r,i,a,m,e,d){'use strict';Object.defineProperty(e,"__esModule",{value:!0});var n,t=Object.assign||function(n){for(var t=1;t3&&void 0!==arguments[3]&&arguments[3],f=s.indexOf(n,t),l=o?n.index:f,c=s.replaceAtIndex(n,f,u);return c.index=l,c},replaceAtIndex:function(n,u,s){if((0,o.default)(!!n.routes[u],'invalid index %s for replacing route %s',u,s.key),n.routes[u]===s&&u===n.index)return n;var f=n.routes.slice();return f[u]=s,t({},n,{index:u,routes:f})},reset:function(n,u,s){(0,o.default)(u.length&&Array.isArray(u),'invalid routes to replace');var f=void 0===s?u.length-1:s;if(n.routes.length===u.length&&n.index===f){if(n.routes.every(function(n,t){return u[t]===n}))return n}return(0,o.default)(!!u[f],'invalid index %s to reset',f),t({},n,{index:f,routes:u})}};e.default=s},353,[354]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=function(){};'production'!==process.env&&(n=function(n){if(void 0===n)throw new Error('invariant requires an error message argument')}),m.exports=function(o,t,s,f,u,c,v,l){if(n(t),!o){var p;if(void 0===t)p=new Error('Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.');else{var w=[s,f,u,c,v,l],h=0;(p=new Error(t.replace(/%s/g,function(){return w[h++]}))).name='Invariant Violation'}throw p.framesToPop=1,p}}},354,[]); -__d(function(g,r,i,a,m,e,d){'use strict';Object.defineProperty(e,"__esModule",{value:!0});var t=Object.assign||function(t){for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{};return{type:t,key:n.key,immediate:n.immediate}},init:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o={type:n};return t.params&&(o.params=t.params),o},navigate:function(t){var n={type:"Navigation/NAVIGATE",routeName:t.routeName};return t.params&&(n.params=t.params),t.action&&(n.action=t.action),t.key&&(n.key=t.key),n},setParams:function(t){return{type:"Navigation/SET_PARAMS",key:t.key,params:t.params}}}},357,[]); -__d(function(g,r,i,a,m,e,d){'use strict';Object.defineProperty(e,"__esModule",{value:!0});var t=Object.assign||function(t){for(var n=1;n2&&void 0!==arguments[2]?arguments[2]:'didBlur',c=new Set,l=new Set,s=new Set,f=new Set,w=new Set,v=new Set,F=function(){[c,l,s,f,w,v].forEach(function(t){return t.clear()}),h.forEach(function(t){return t&&t.remove()})},B=function(t){switch(t){case'action':return c;case'willFocus':return l;case'didFocus':return s;case'willBlur':return f;case'didBlur':return w;case'refocus':return v;default:return null}},y=function(n,o){var u=t({},o,{type:n}),c=B(n);c&&c.forEach(function(t){t(u)})},p=u,h=['willFocus','didFocus','willBlur','didBlur','refocus','action'].map(function(t){return n(t,function(n){if('refocus'!==t){var u=n.state,c=n.lastState,l=n.action,s=c&&c.routes,f=u&&u.routes,w=f&&f[u.index].key,v=w===o,B=s&&s.find(function(t){return t.key===o}),h=f&&f.find(function(t){return t.key===o}),S={context:o+":"+l.type+"_"+(n.context||'Root'),state:h,lastState:B,action:l,type:t},_=!!u&&u.isTransitioning,E=p;'didBlur'===p&&('willFocus'===t&&v?y(p='willFocus',S):'action'===t&&v&&y(p='willFocus',S)),'willFocus'===p&&('didFocus'===t&&v&&!_?y(p='didFocus',S):'action'===t&&v&&!_&&y(p='didFocus',S)),'didFocus'===p&&(v?'willBlur'===t?y(p='willBlur',S):'action'===t&&'didFocus'===E&&y('action',S):y(p='willBlur',S)),'willBlur'===p&&('action'!==t||v||_?'didBlur'===t?y(p='didBlur',S):'action'===t&&v&&!_?y(p='didFocus',S):'action'===t&&v&&_&&y(p='willFocus',S):y(p='didBlur',S)),'didBlur'!==p||h||F()}else y(t,n)})});return{addListener:function(t,n){var o=B(t);if(!o)throw new Error("Invalid event name \""+t+"\"");o.add(n);return{remove:function(){o.delete(n)}}},emit:function(t,n){'refocus'===t?y(t,n):console.error("navigation.emit only supports the 'refocus' event currently.")}}}},359,[]); -__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,o){return t.childRouters&&t.childRouters[o]?t.childRouters[o]:t.getComponentForRouteName(o).router}},360,[]); -__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){if(!t)return{};var n=t._childrenNavigation||(t._childrenNavigation={}),u=t.state.routes.map(function(t){return t.key});return Object.keys(n).forEach(function(c){u.includes(c)||t.state.isTransitioning||delete n[c]}),t._childrenNavigation}},361,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),s=r(d[3]),p=r(d[4]);Object.defineProperty(e,"__esModule",{value:!0});var c=Object.assign||function(t){for(var n=1;n1&&void 0!==arguments[1]?arguments[1]:{},o=(0,u.default)(f,l);return(0,t.default)(n.default,o,l)}},369,[362,370,384]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0});var n=Object.assign||function(t){for(var n=1;n1&&void 0!==arguments[1]?arguments[1]:{};(0,c.default)(y);var h=x.order||Object.keys(y),A=x.getCustomActionCreators||p,P=x.initialRouteParams,N=x.initialRouteName||h[0],O=x.backBehavior||'none',S=!x.hasOwnProperty('resetOnBlur')||x.resetOnBlur,k=h.indexOf(N);if(-1===k)throw new Error("Invalid initialRouteName '"+N+"'.Should be one of "+h.map(function(t){return"\""+t+"\""}).join(', '));var F={};function C(t,o){var u=y[t];return u&&u.params?n({},u.params,o):o}h.forEach(function(t){F[t]=null;var n=(0,u.default)(y,t);n.router&&(F[t]=n.router)});var K=(0,v.createPathParser)(F,y,x),R=K.getPathAndParamsForRoute,T=K.getActionForPathAndParams;function _(t){var o=C(t,t===N?P:void 0),u=F[t];if(u){var s=f.default.init();return n({},u.getStateForAction(s),{key:t,routeName:t,params:o})}return{key:t,routeName:t,params:o}}function E(o,u,s){var l=s;if(u&&u.index!==s.index&&S){var c=u.routes[u.index].routeName,v=t(s.routes);v[u.index]=_(c),l=n({},s,{routes:v})}return(function(s){if('history'!==O)return s;var l=u.routeKeyHistory;if(o.type===f.default.NAVIGATE){l=t(u.routeKeyHistory);var c=s.routes[s.index].key;(l=l.filter(function(t){return t!==c})).push(c)}else o.type===f.default.BACK&&(l=t(u.routeKeyHistory)).pop();return n({},s,{routeKeyHistory:l})})(l)}function H(){var t=h.map(_),n={routes:t,index:k,isTransitioning:!1};if('history'===O){var o=t[k].key;n.routeKeyHistory=[o]}return n}return{childRouters:F,getActionCreators:function(t,n){return A(t,n)},getStateForAction:function(o,u){var s=u?n({},u):u,c=u||H(),v=c.index;if(o.type===f.default.INIT){var y=o.params;y&&(c.routes=c.routes.map(function(t){return n({},t,{params:n({},t.params,y,t.routeName===N?P:null)})}))}var p=c.routes[c.index],x=F[h[c.index]];if(x){var A=x.getStateForAction(o,p);if(!A&&u)return null;if(A&&A!==p){var S=t(c.routes);return S[c.index]=A,E(o,s,n({},c,{routes:S}))}}var C=null==o.key||o.key===p.key;if(o.type===f.default.BACK)if(C&&'initialRoute'===O)v=k;else if(C&&'order'===O)v=Math.max(0,v-1);else{if(!(C&&'history'===O&&c.routeKeyHistory.length>1))return c;var K=c.routeKeyHistory[c.routeKeyHistory.length-2];v=h.indexOf(K)}var R=!1;if(o.type===f.default.NAVIGATE&&(R=!!h.find(function(t,n){return t===o.routeName&&(v=n,!0)}))){var T=c.routes[v],_=F[o.routeName],b=T;if(o.action&&_){var I=_.getStateForAction(o.action,T);I&&(b=I)}if(o.params&&(b=n({},b,{params:n({},b.params||{},o.params)})),b!==T){var M=t(c.routes);M[v]=b;var j=n({},c,{routes:M,index:v});return E(o,s,j)}if(b===T&&c.index===v&&s)return null}if(o.type===f.default.SET_PARAMS){var w=o.key,B=c.routes.find(function(t){return t.key===w});if(B){var G=n({},B.params,o.params),V=t(c.routes);return V[c.routes.indexOf(B)]=n({},B,{params:G}),E(o,s,n({},c,{routes:V}))}}if(v!==c.index)return E(o,s,n({},c,{index:v}));if(R&&!u)return c;if(R)return n({},c);var L,q=c.index,z=c.routes;return h.find(function(n,u){var s=F[n];if(u===q)return!1;var f=z[u];return s&&(f=s.getStateForAction(o,f)),f?f!==z[u]&&((z=t(z))[u]=f,q=u,!0):(q=u,!0)}),L=o.type,[f.default.SET_PARAMS,l.default.COMPLETE_TRANSITION].includes(L)&&(q=c.index),q!==c.index||z!==c.routes?E(o,s,n({},c,{index:q,routes:z})):c},getComponentForState:function(t){var n=t.routes[t.index].routeName;(0,o.default)(n,"There is no route defined for index "+t.index+". Check that\n that you passed in a navigation state with a valid tab/screen index.");var s=F[n];return s?s.getComponentForState(t.routes[t.index]):(0,u.default)(y,n)},getComponentForRouteName:function(t){return(0,u.default)(y,t)},getPathAndParamsForState:function(t){var n=t.routes[t.index];return R(n)},getActionForPathAndParams:function(t,n){return T(t,n)},getScreenOptions:(0,s.default)(y,x.defaultNavigationOptions)}}},370,[15,354,371,374,357,376,377,378]); -__d(function(g,r,i,a,m,e,d){'use strict';Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(n,u){var f=n[u];if(!f)throw new Error("There is no route defined for key "+u+".\nMust be one of: "+Object.keys(n).map(function(n){return"'"+n+"'"}).join(','));if(f.screen)return f.screen;if('function'==typeof f.getScreen){var c=f.getScreen();return(0,o.default)((0,t.isValidElementType)(c),"The getScreen defined for route '"+u+" didn't return a valid screen or navigator.\n\nPlease pass it like this:\n"+u+": {\n getScreen: () => require('./MyScreen').default\n}"),c}return f};var n,t=r(d[0]),u=r(d[1]),o=(n=u)&&n.__esModule?n:{default:n}},371,[372,354]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports=r(d[0])},372,[373]); -__d(function(g,r,i,a,m,e,d){'use strict';Object.defineProperty(e,"__esModule",{value:!0});var o="function"==typeof Symbol&&("function"==typeof Symbol?Symbol.for:"@@for"),t=o?("function"==typeof Symbol?Symbol.for:"@@for")("react.element"):60103,n=o?("function"==typeof Symbol?Symbol.for:"@@for")("react.portal"):60106,f=o?("function"==typeof Symbol?Symbol.for:"@@for")("react.fragment"):60107,c=o?("function"==typeof Symbol?Symbol.for:"@@for")("react.strict_mode"):60108,y=o?("function"==typeof Symbol?Symbol.for:"@@for")("react.profiler"):60114,u=o?("function"==typeof Symbol?Symbol.for:"@@for")("react.provider"):60109,l=o?("function"==typeof Symbol?Symbol.for:"@@for")("react.context"):60110,s=o?("function"==typeof Symbol?Symbol.for:"@@for")("react.async_mode"):60111,p=o?("function"==typeof Symbol?Symbol.for:"@@for")("react.concurrent_mode"):60111,b=o?("function"==typeof Symbol?Symbol.for:"@@for")("react.forward_ref"):60112,S=o?("function"==typeof Symbol?Symbol.for:"@@for")("react.suspense"):60113,$=o?("function"==typeof Symbol?Symbol.for:"@@for")("react.memo"):60115,M=o?("function"==typeof Symbol?Symbol.for:"@@for")("react.lazy"):60116;function C(o){if("object"==typeof o&&null!==o){var C=o.$$typeof;switch(C){case t:switch(o=o.type){case s:case p:case f:case y:case c:case S:return o;default:switch(o=o&&o.$$typeof){case l:case b:case u:return o;default:return C}}case M:case $:case n:return C}}}function _(o){return C(o)===p}e.typeOf=C,e.AsyncMode=s,e.ConcurrentMode=p,e.ContextConsumer=l,e.ContextProvider=u,e.Element=t,e.ForwardRef=b,e.Fragment=f,e.Lazy=M,e.Memo=$,e.Portal=n,e.Profiler=y,e.StrictMode=c,e.Suspense=S,e.isValidElementType=function(o){return"string"==typeof o||"function"==typeof o||o===f||o===p||o===y||o===c||o===S||"object"==typeof o&&null!==o&&(o.$$typeof===M||o.$$typeof===$||o.$$typeof===u||o.$$typeof===l||o.$$typeof===b)},e.isAsyncMode=function(o){return _(o)||C(o)===s},e.isConcurrentMode=_,e.isContextConsumer=function(o){return C(o)===l},e.isContextProvider=function(o){return C(o)===u},e.isElement=function(o){return"object"==typeof o&&null!==o&&o.$$typeof===t},e.isForwardRef=function(o){return C(o)===b},e.isFragment=function(o){return C(o)===f},e.isLazy=function(o){return C(o)===M},e.isMemo=function(o){return C(o)===$},e.isPortal=function(o){return C(o)===n},e.isProfiler=function(o){return C(o)===y},e.isStrictMode=function(o){return C(o)===c},e.isSuspense=function(o){return C(o)===S}},373,[]); -__d(function(g,r,i,a,m,e,d){'use strict';Object.defineProperty(e,"__esModule",{value:!0});var t=Object.assign||function(t){for(var n=1;n state...','}','','with:','({ navigation }) => ({',' title: navigation.state...','})'].join('\n'));if(f&&'function'==typeof o[f])throw new Error(["`"+f+"` cannot be defined as a function in navigation options for `"+c.routeName+"` screen. \n",'Try replacing the following:','{'," "+f+": ({ state }) => ({",' key: state...',' })','}','','with:','({ navigation }) => ({'," "+f+"Key: navigation.state...",'})'].join('\n'));if(f&&'object'==typeof o[f])throw new Error(["Invalid key `"+f+"` defined in navigation options for `"+c.routeName+"` screen.",'\n','Try replacing the following navigation options:','{'," "+f+": {"].concat(n(Object.keys(o[f]).map(function(n){return" "+n+": ...,"})),[' },','}','\n','with:','{'],n(Object.keys(o[f]).map(function(n){return" "+(f+n[0].toUpperCase()+n.slice(1))+": ...,"})),['}']).join('\n'))}},375,[15]); -__d(function(g,r,i,a,m,e,d){'use strict';Object.defineProperty(e,"__esModule",{value:!0});var t=Object.assign||function(t){for(var n=1;n0,'Please specify at least one route when configuring a navigator.'),t.forEach(function(t){var c=n[t],l=u(c);if(!l||!(0,o.isValidElementType)(l)&&!c.getScreen)throw new Error("The component for route '"+t+"' must be a React component. For example:\n\nimport MyScreen from './MyScreen';\n...\n"+t+": MyScreen,\n}\n\nYou can also use a navigator:\n\nimport MyNavigator from './MyNavigator';\n...\n"+t+": MyNavigator,\n}");if(c.screen&&c.getScreen)throw new Error("Route '"+t+"' should declare a screen or a getScreen, not both.")})}},377,[372,354]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.createPathParser=e.urlToPathAndParams=e.getParamsFromPath=void 0;var n=Object.assign||function(t){for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:'',o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},u=p,c=Array.isArray(u),f=0;for(u=c?u:u["function"==typeof Symbol?Symbol.iterator:"@@iterator"]();;){var P;if(c){if(f>=u.length)break;P=u[f++]}else{if((f=u.next()).done)break;P=f.value}var y=t(P,2),x=y[0],b=y[1],R=b.exactRe,A=b.exactReKeys,k=b.extendedPathRe,F=b.extendedPathReKeys,O=l[x],j=R&&R.exec(n);if(j&&j.length){var K=k&&k.exec(n),_=null;if(K&&O){var S=v(K,F);_=O.getActionForPathAndParams(S,o)}return s.default.navigate({routeName:x,params:h(o,j,A),action:_})}}var N=p,E=Array.isArray(N),I=0;for(N=E?N:N["function"==typeof Symbol?Symbol.iterator:"@@iterator"]();;){var M;if(E){if(I>=N.length)break;M=N[I++]}else{if((I=N.next()).done)break;M=I.value}var T=t(M,2),w=T[0],C=T[1],U=C.extendedPathRe,W=C.extendedPathReKeys,$=l[w],q=U&&U.exec(n);if(q&&q.length){var z=v(q,W),B=null;if($&&(B=$.getActionForPathAndParams(z,o)),!B)continue;return s.default.navigate({routeName:w,params:h(o,q,W),action:B})}}return null},getPathAndParamsForRoute:function(t){var o=t.routeName,u=t.params,s=l[o],c=R[o],f=c.toPath,h=c.exactReKeys,v=f(u),P={};if(u&&Object.keys(u).filter(function(t){return!h.find(function(n){return n.name===t})}).forEach(function(t){P[t]=u[t]}),s){var p=s.getPathAndParamsForState(t);return{path:v?v+"/"+p.path:p.path,params:p.params?n({},P,p.params):P}}return{path:v,params:P}}}}},378,[9,379,357,354,381]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);m.exports=E,m.exports.parse=o,m.exports.compile=function(t,n){return u(o(t,n))},m.exports.tokensToFunction=u,m.exports.tokensToRegExp=w;var n=new RegExp(['(\\\\.)','([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))'].join('|'),'g');function o(t,o){for(var p,u=[],f=0,s=0,h='',x=o&&o.delimiter||'/';null!=(p=n.exec(t));){var v=p[0],w=p[1],E=p.index;if(h+=t.slice(s,E),s=E+v.length,w)h+=w[1];else{var y=t[s],R=p[2],$=p[3],b=p[4],T=p[5],k=p[6],C=p[7];h&&(u.push(h),h='');var U=null!=R&&null!=y&&y!==R,S='+'===k||'*'===k,j='?'===k||'*'===k,A=p[2]||x,I=b||T;u.push({name:$||f++,prefix:R||'',delimiter:A,optional:j,repeat:S,partial:U,asterisk:!!C,pattern:I?c(I):C?'.*':'[^'+l(A)+']+?'})}}return s=v.length)break;j=v[p++]}else{if((p=v.next()).done)break;j=p.value}var A=j.replace(/\+/g,' ').split('='),k=n(A,2),x=k[0],h=k[1];h=void 0===h?null:s(h,u),c(s(x,u),h,l)}return Object.keys(l).sort().reduce(function(n,t){var o=l[t];return Boolean(o)&&'object'==typeof o&&!Array.isArray(o)?n[t]=y(o):n[t]=o,n},Object.create(null))}e.extract=v,e.parse=b,e.stringify=function(n,o){if(!n)return'';var u=c(o=t({encode:!0,strict:!0,arrayFormat:'none'},o)),f=Object.keys(n);return!1!==o.sort&&f.sort(o.sort),f.map(function(t){var c=n[t];if(void 0===c)return'';if(null===c)return l(t,o);if(Array.isArray(c)){var f=[],s=c.slice(),y=Array.isArray(s),v=0;for(s=y?s:s["function"==typeof Symbol?Symbol.iterator:"@@iterator"]();;){var b;if(y){if(v>=s.length)break;b=s[v++]}else{if((v=s.next()).done)break;b=v.value}var p=b;void 0!==p&&f.push(u(t,p,f.length))}return f.join('&')}return l(t,o)+'='+l(c,o)}).filter(function(n){return n.length>0}).join('&')},e.parseUrl=function(n,t){var o=n.indexOf('#');return-1!==o&&(n=n.slice(0,o)),{url:n.split('?')[0]||'',query:b(v(n),t)}}},381,[9,8,382,383]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports=function(t){return encodeURIComponent(t).replace(/[!'()*]/g,function(t){return"%"+t.charCodeAt(0).toString(16).toUpperCase()})}},382,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=new RegExp('%[a-f0-9]{2}','gi'),n=new RegExp("(%[a-f0-9]{2})+",'gi');function o(t,n){try{return decodeURIComponent(t.join(''))}catch(t){}if(1===t.length)return t;n=n||1;var c=t.slice(0,n),p=t.slice(n);return Array.prototype.concat.call([],o(c),o(p))}function c(n){try{return decodeURIComponent(n)}catch(f){for(var c=n.match(t),p=1;p1&&void 0!==arguments[1]?arguments[1]:{};(0,y.default)(k);var T={},h=Object.keys(k);h.forEach(function(t){var n=(0,f.default)(k,t);n&&n.router?T[t]=n.router:T[t]=null});var x=P.initialRouteParams,b=P.getCustomActionCreators||A,R=P.initialRouteName||h[0],O=T[R];function E(t){var u={},s=T[t.routeName];if(N(t)&&void 0!==s){var f={};if(null!==s){var l=t.action||o.default.init({params:t.params});f=s.getStateForAction(l)}return{key:'StackRouterRoot',isTransitioning:!1,index:0,routes:[n({params:t.params},f,{key:t.key||(0,c.generateKey)(),routeName:t.routeName})]}}O&&(u=O.getStateForAction(o.default.navigate({routeName:R,params:x})));var y=(k[R].params||u.params||t.params||x)&&n({},k[R].params||{},u.params||{},t.params||{},x||{}),p=P.initialRouteKey;return{key:'StackRouterRoot',isTransitioning:!1,index:0,routes:[u=n({},u,y?{params:y}:{},{routeName:R,key:t.key||p||(0,c.generateKey)()})]}}function F(t,o){var u=k[t];return u&&u.params?n({},u.params,o.params):o.params}var C=(0,v.createPathParser)(T,k,P),_=C.getPathAndParamsForRoute,K=C.getActionForPathAndParams;return{childRouters:T,getComponentForState:function(t){var n=t.routes[t.index],o=n.routeName;return T[o]?T[o].getComponentForState(n):(0,f.default)(k,o)},getComponentForRouteName:function(t){return(0,f.default)(k,t)},getActionCreators:function(t,s){return n({},b(t,s),{pop:function(t,o){return u.default.pop(n({n:t},o))},popToTop:function(t){return u.default.popToTop(t)},push:function(t,n,o){return u.default.push({routeName:t,params:n,action:o})},replace:function(n,o,s,f){return'string'==typeof n?u.default.replace({routeName:n,params:o,action:s,key:t.key,newKey:f}):((0,p.default)('object'==typeof n,'Must replaceWith an object or a string'),(0,p.default)(null==o,'Params must not be provided to .replace() when specifying an object'),(0,p.default)(null==s,'Child action must not be provided to .replace() when specifying an object'),(0,p.default)(null==f,'Child action must not be provided to .replace() when specifying an object'),u.default.replace(n))},reset:function(t,n){return u.default.reset({actions:t,index:null==n?t.length-1:n,key:s})},dismiss:function(){return o.default.back({key:s})}})},getStateForAction:function(s,f){if(!f)return E(s);var y=f.routes[f.index];if(S(s)||s.type===o.default.NAVIGATE){if(s.type===o.default.NAVIGATE){var v=f.routes.slice().reverse(),k=Array.isArray(v),A=0;for(v=k?v:v["function"==typeof Symbol?Symbol.iterator:"@@iterator"]();;){var P;if(k){if(A>=v.length)break;P=v[A++]}else{if((A=v.next()).done)break;P=A.value}var h=P,x=T[h.routeName],b=s.routeName===h.routeName&&s.action?s.action:s;if(x){var R=x.getStateForAction(b,h);if(null===R||R!==h){var O=l.default.replaceAndPrune(f,R?R.key:h.key,R||h);return n({},O,{isTransitioning:f.index!==O.index?!0!==s.immediate:f.isTransitioning})}}}}}else{var C=T[y.routeName];if(C){var _=C.getStateForAction(s,y);if(null!==_&&_!==y)return l.default.replaceAt(f,y.key,_,s.type===o.default.SET_PARAMS)}}if(N(s)&&void 0!==T[s.routeName]){var K=T[s.routeName],j=void 0;(0,p.default)(s.type!==u.default.PUSH||null==s.key,'StackRouter does not support key on the push action');var I=f.routes.findIndex(function(t){return s.key?t.key===s.key:t.routeName===s.routeName});if(s.type!==u.default.PUSH&&-1!==I){if(f.index===I&&!s.params)return null;var M=f.routes.slice(0,I+1);if(s.params){var w=f.routes[I];M[I]=n({},w,{params:n({},w.params,s.params)})}return n({},f,{isTransitioning:f.index!==I?!0!==s.immediate:f.isTransitioning,index:I,routes:M})}if(K){var H=s.action||o.default.init({params:F(s.routeName,s)});j=n({params:F(s.routeName,s)},K.getStateForAction(H),{routeName:s.routeName,key:s.key||(0,c.generateKey)()})}else j={params:F(s.routeName,s),routeName:s.routeName,key:s.key||(0,c.generateKey)()};return n({},l.default.push(f,j),{isTransitioning:!0!==s.immediate})}if(s.type===u.default.PUSH&&void 0===T[s.routeName])return f;if(N(s))for(var U=Object.keys(T),G=0;G0?n({},f,{isTransitioning:!0!==s.immediate,index:0,routes:[f.routes[0]]}):f;if(s.type===u.default.REPLACE){var z=void 0;if(-1!==(z=void 0===s.key&&f.routes.length?f.routes.length-1:f.routes.findIndex(function(t){return t.key===s.key}))){var J=T[s.routeName],Q={};if(J){var X=s.action||o.default.init({params:F(s.routeName,s)});Q=J.getStateForAction(X)}var Y=t(f.routes);return Y[z]=n({params:F(s.routeName,s)},Q,{routeName:s.routeName,key:s.newKey||(0,c.generateKey)()}),n({},f,{routes:Y})}}if(s.type===u.default.COMPLETE_TRANSITION&&(null==s.key||s.key===f.key)&&s.toChildKey===f.routes[f.index].key&&f.isTransitioning)return n({},f,{isTransitioning:!1});if(s.type===o.default.SET_PARAMS){var Z=s.key,$=f.routes.find(function(t){return t.key===Z});if($){var ee=n({},$.params,s.params),te=t(f.routes);return te[f.routes.indexOf($)]=n({},$,{params:ee}),n({},f,{routes:te})}}if(s.type===u.default.RESET){if(null!=s.key&&s.key!=f.key)return f;var re=s.actions;return n({},f,{routes:re.map(function(t){var u=T[t.routeName],s={};if(u){var f=t.action||o.default.init({params:F(t.routeName,t)});s=u.getStateForAction(f)}return n({params:F(t.routeName,t)},s,{routeName:t.routeName,key:t.key||(0,c.generateKey)()})}),index:s.index})}if(s.type===o.default.BACK||s.type===u.default.POP){var ae=s.key,ne=s.n,ie=s.immediate,oe=f.index;if(s.type===u.default.POP&&null!=ne)oe=Math.max(1,f.index-ne+1);else if(ae){var ue=f.routes.find(function(t){return t.key===ae});oe=f.routes.indexOf(ue)}if(oe>0)return n({},f,{routes:f.routes.slice(0,oe),index:oe-1,isTransitioning:!0!==ie})}var se=s.key?l.default.indexOf(f,s.key):-1,fe=f.routes.slice().reverse(),le=Array.isArray(fe),de=0;for(fe=le?fe:fe["function"==typeof Symbol?Symbol.iterator:"@@iterator"]();;){var me;if(le){if(de>=fe.length)break;me=fe[de++]}else{if((de=fe.next()).done)break;me=de.value}var ye=me;if(ye.key!==y.key&&!(se>=0&&ye.key!==s.key)){var pe=T[ye.routeName];if(pe){var ce=pe.getStateForAction(s,ye);if(null===ce)return f;if(ce&&ce!==ye)return l.default.replaceAt(f,ye.key,ce,s.type===o.default.SET_PARAMS||s.type===u.default.COMPLETE_TRANSITION||s.type.includes('DRAWER'))}}}return f},getPathAndParamsForState:function(t){var n=t.routes[t.index];return _(n)},getActionForPathAndParams:function(t,n){return K(t,n)},getScreenOptions:(0,s.default)(k,P.defaultNavigationOptions)}}},386,[15,357,376,374,371,353,377,354,387,378]); -__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n="id-"+Date.now(),t=0;e._TESTING_ONLY_normalize_keys=function(){n='id',t=0},e.generateKey=function(){return n+"-"+t++}},387,[]); -__d(function(g,r,i,a,m,e,d){'use strict';Object.defineProperty(e,"__esModule",{value:!0});var t=Object.assign||function(t){for(var n=1;n1&&void 0!==arguments[1]?arguments[1]:{};return l=t({},l),l=(0,u.default)(l,'resetOnBlur',!1),l=(0,u.default)(l,'backBehavior','initialRoute'),(0,n.default)(o,l)}},388,[370,389]); -__d(function(g,r,i,a,m,e,d){'use strict';Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,n,u){return t.hasOwnProperty(n)&&void 0!==t[n]?t:(t[n]=u,t)}},389,[]); -__d(function(g,r,i,a,m,e,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.default=function(t,n){var u=t.state,o=t.router,s=(0,t.getChildNavigation)(u.routes[u.index].key);return o.getScreenOptions(s,n)}},390,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),t=r(d[1]),o=r(d[2]),u=r(d[3]),l=r(d[4]);Object.defineProperty(e,"__esModule",{value:!0});var s=f(r(d[5])),c=f(r(d[6]));function f(n){return n&&n.__esModule?n:{default:n}}var p={willFocus:'onWillFocus',didFocus:'onDidFocus',willBlur:'onWillBlur',didBlur:'onDidBlur'},v=Object.keys(p),h=(function(s){function c(){var t,l,s;n(this,c);for(var f=arguments.length,v=new Array(f),h=0;h1&&void 0!==arguments[1]?arguments[1]:{forwardRef:!0},w=(function(c){function w(){return t(this,w),o(this,u(w).apply(this,arguments))}return f(w,c),n(w,[{key:"render",value:function(){var t=this,n=this.props.navigation;return s.default.createElement(v.default.Consumer,null,function(o){var u=n||o;return(0,p.default)(!!u,'withNavigation can only be used on a view hierarchy of a navigator. The wrapped component is unable to get access to navigation from props or context.'),s.default.createElement(h,l({},t.props,{navigation:u,ref:y.forwardRef?t.props.onRef:void 0}))})}}]),w})(s.default.Component);return w.displayName="withNavigation("+(h.displayName||h.name)+")",(0,c.default)(w,h)};var s=h(r(d[5])),c=h(r(d[6])),p=h(r(d[7])),v=h(r(d[8]));function h(t){return t&&t.__esModule?t:{default:t}}},392,[19,20,27,30,33,47,393,354,363]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},p={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},y={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},n={};function s(p){return t.isMemo(p)?y:n[p.$$typeof]||o}n[t.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0};var c=Object.defineProperty,f=Object.getOwnPropertyNames,l=Object.getOwnPropertySymbols,u=Object.getOwnPropertyDescriptor,O=Object.getPrototypeOf,P=Object.prototype;m.exports=function t(o,y,n){if('string'!=typeof y){if(P){var v=O(y);v&&v!==P&&t(o,v,n)}var b=f(y);l&&(b=b.concat(l(y)));for(var j=s(o),T=s(y),$=0;$n.height};e.isOrientationLandscape=p},402,[1,8,19,20,27,30,33,47,2,399]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=t(r(d[1])),n=t(r(d[2])),u=t(r(d[3])),o=t(r(d[4])),s=t(r(d[5])),f=t(r(d[6])),c=t(r(d[7])),p=t(r(d[8])),v=r(d[9]),h=r(d[10]),w=r(d[11]),y=(function(t){function h(t){var l;return(0,u.default)(this,h),(l=(0,o.default)(this,(0,s.default)(h).call(this)))._mustAlwaysBeVisible=function(){return l.props.animationEnabled||l.props.swipeEnabled},l.state={awake:!t.lazy||t.isFocused},l}return(0,c.default)(h,t),(0,f.default)(h,null,[{key:"getDerivedStateFromProps",value:function(t,l){return t.isFocused&&!l.awake?{awake:!0}:null}}]),(0,f.default)(h,[{key:"render",value:function(){var t=this.state.awake,u=this.props,o=u.isFocused,s=u.childNavigation,f=u.removeClippedSubviews,c=(0,n.default)(u,["isFocused","childNavigation","removeClippedSubviews"]);return p.default.createElement(v.View,{style:b.container,collapsable:!1,removeClippedSubviews:'android'===v.Platform.OS?f:!o&&f},p.default.createElement(v.View,{style:this._mustAlwaysBeVisible()||o?b.innerAttached:b.innerDetached},t?p.default.createElement(w.SceneView,(0,l.default)({},c,{navigation:s})):null))}}]),h})(p.default.PureComponent),b=v.StyleSheet.create({container:{flex:1,overflow:'hidden'},innerAttached:{flex:1},innerDetached:{flex:1,top:3e3}}),S=(0,h.polyfill)(y);e.default=S},403,[1,8,6,19,27,30,20,33,47,2,351,352]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.withSafeArea=e.default=void 0;var o=n(r(d[2])),s=n(r(d[3])),p=n(r(d[4])),u=n(r(d[5])),f=n(r(d[6])),l=n(r(d[7])),c=n(r(d[8])),h=n(r(d[9])),v=t(r(d[10])),y=r(d[11]),w=n(r(d[12])),L=n(r(d[13])),_=y.Dimensions.get('window'),S=_.height,b=_.width,B=y.NativeModules.PlatformConstants,I=(((void 0===B?{}:B).reactNativeVersion||{}).minor,'web'!==y.Platform.OS&&('ios'===y.Platform.OS&&(812===S&&375===b||375===S&&812===b)||896===S&&414===b||414===S&&896===b)),R='ios'===y.Platform.OS&&(1194===S&&834===b||834===S&&1194===b||1024===S&&1366===b||1366===S&&1024===b),T=!('ios'!==y.Platform.OS||I||S>b&&b<768||b>S&&S<768),M=null,k=function(t){return null!==M?M:'android'===y.Platform.OS?g.Expo?g.Expo.Constants.statusBarHeight:0:I?t?0:44:R?24:T?20:t?0:20},x=function(t){if(!t.includes('%'))return 0;var n=parseFloat(t)/100;return isNaN(n)?0:n},A=(function(t){function n(){var t,o;(0,u.default)(this,n);for(var f=arguments.length,h=new Array(f),v=0;v=c?v%=c:v<0&&(v=v%c+c),y>=l?y%=l:y<0&&(y=y%l+l);var w=0===v,L=v+u>=c,_=0===y,S=y+p>=l;o.setState({touchesTop:w,touchesBottom:L,touchesLeft:_,touchesRight:S,orientation:f,viewWidth:p,viewHeight:u}),o.props.onLayout&&(h=o.props).onLayout.apply(h,n)}})}}},o._getSafeAreaStyle=function(){var t=o.state,n=t.touchesTop,s=t.touchesBottom,u=t.touchesLeft,f=t.touchesRight,l=o.props,c=l.forceInset,h=(l.isLandscape,o._getViewStyles()),v=h.paddingTop,y=h.paddingBottom,w=h.paddingLeft,L=h.paddingRight,_=h.viewStyle,S=(0,p.default)({},_,{paddingTop:n?o._getInset('top'):0,paddingBottom:s?o._getInset('bottom'):0,paddingLeft:u?o._getInset('left'):0,paddingRight:f?o._getInset('right'):0});return c&&Object.keys(c).forEach(function(t){var n=c[t];switch('always'===n&&(n=o._getInset(t)),'never'===n&&(n=0),t){case'horizontal':S.paddingLeft=n,S.paddingRight=n;break;case'vertical':S.paddingTop=n,S.paddingBottom=n;break;case'left':case'right':case'top':case'bottom':var s="padding"+t[0].toUpperCase()+t.slice(1);S[s]=n}}),S.height&&'number'==typeof S.height&&(S.height+=S.paddingTop+S.paddingBottom),S.width&&'number'==typeof S.width&&(S.width+=S.paddingLeft+S.paddingRight),S.paddingTop=Math.max(S.paddingTop,v),S.paddingBottom=Math.max(S.paddingBottom,y),S.paddingLeft=Math.max(S.paddingLeft,w),S.paddingRight=Math.max(S.paddingRight,L),S},o._getViewStyles=function(){var t=o.state.viewWidth,n=y.StyleSheet.flatten(o.props.style||{}),p=n.padding,u=void 0===p?0:p,f=n.paddingVertical,l=void 0===f?u:f,c=n.paddingHorizontal,h=void 0===c?u:c,v=n.paddingTop,w=void 0===v?l:v,L=n.paddingBottom,_=void 0===L?l:L,S=n.paddingLeft,b=void 0===S?h:S,B=n.paddingRight,I=void 0===B?h:B,R=(0,s.default)(n,["padding","paddingVertical","paddingHorizontal","paddingTop","paddingBottom","paddingLeft","paddingRight"]);return'number'!=typeof w&&(w=x(w)*t),'number'!=typeof _&&(_=x(_)*t),'number'!=typeof b&&(b=x(b)*t),'number'!=typeof I&&(I=x(I)*t),{paddingTop:w,paddingBottom:_,paddingLeft:b,paddingRight:I,viewStyle:R}},o._getInset=function(t){var n=o.props.isLandscape;switch(t){case'horizontal':case'right':case'left':return n&&I?44:0;case'vertical':case'top':return k(n);case'bottom':return I?n?24:34:R?20:0}},o}return(0,h.default)(n,t),(0,f.default)(n,[{key:"componentDidMount",value:function(){var t=this;this._isMounted=!0,y.InteractionManager.runAfterInteractions(function(){t._onLayout()})}},{key:"componentWillUnmount",value:function(){this._isMounted=!1}},{key:"componentWillReceiveProps",value:function(){this._onLayout()}},{key:"render",value:function(){var t=this,n=this.props,p=(n.forceInset,n.isLandscape,n.style,(0,s.default)(n,["forceInset","isLandscape","style"])),u=this._getSafeAreaStyle();return v.default.createElement(y.Animated.View,(0,o.default)({ref:function(n){return t.view=n},pointerEvents:"box-none"},p,{onLayout:this._onLayout,style:u}))}}]),n})(v.Component);A.setStatusBarHeight=function(t){M=t};var P=(0,L.default)(A),E=P;e.default=E;e.withSafeArea=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return function(n){var o=(function(o){function s(){return(0,u.default)(this,s),(0,l.default)(this,(0,c.default)(s).apply(this,arguments))}return(0,h.default)(s,o),(0,f.default)(s,[{key:"render",value:function(){return v.default.createElement(P,{style:{flex:1},forceInset:t},v.default.createElement(n,this.props))}}]),s})(v.Component);return(0,w.default)(o,n)}}},404,[346,1,8,6,44,19,20,27,30,33,47,2,405,406]); -__d(function(g,r,i,a,m,e,d){'use strict';var t={childContextTypes:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},p=Object.defineProperty,n=Object.getOwnPropertyNames,c=Object.getOwnPropertySymbols,s=Object.getOwnPropertyDescriptor,y=Object.getPrototypeOf,f=y&&y(Object);m.exports=function l(O,u,P){if('string'!=typeof u){if(f){var b=y(u);b&&b!==f&&l(O,b,P)}var v=n(u);c&&(v=v.concat(c(u)));for(var j=0;jn.height};e.isOrientationLandscape=L},406,[346,1,8,19,20,27,30,33,47,2,405]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=t(r(d[1])),l=t(r(d[2])),f=r(d[3]),o=r(d[4]),u=(0,t(r(d[5])).default)(o.ScrollView),c=l.default.forwardRef(function(t,o){return l.default.createElement(f.FlatList,(0,n.default)({ref:o},t,{renderScrollComponent:function(t){return l.default.createElement(u,t)}}))}),S=l.default.forwardRef(function(t,o){return l.default.createElement(f.SectionList,(0,n.default)({ref:o},t,{renderScrollComponent:function(t){return l.default.createElement(u,t)}}))});m.exports={ScrollView:u,FlatList:c,SectionList:S}},407,[1,8,47,2,408,398]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0});var n={Swipeable:!0,DrawerLayout:!0};Object.defineProperty(e,"Swipeable",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(e,"DrawerLayout",{enumerable:!0,get:function(){return u.default}});var o=t(r(d[1])),u=t(r(d[2])),c=r(d[3]);Object.keys(c).forEach(function(t){"default"!==t&&"__esModule"!==t&&(Object.prototype.hasOwnProperty.call(n,t)||Object.defineProperty(e,t,{enumerable:!0,get:function(){return c[t]}}))});var f=r(d[4]);Object.keys(f).forEach(function(t){"default"!==t&&"__esModule"!==t&&(Object.prototype.hasOwnProperty.call(n,t)||Object.defineProperty(e,t,{enumerable:!0,get:function(){return f[t]}}))})},408,[1,409,414,410,416]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=n(r(d[2])),s=n(r(d[3])),l=n(r(d[4])),p=n(r(d[5])),h=n(r(d[6])),u=n(r(d[7])),f=n(r(d[8])),v=t(r(d[9])),c=r(d[10]),w=(r(d[11]),r(d[12])),_=.05;Math.sign||(Math.sign=function(t){return Number(t>0)-Number(t<0)||+t});var S=(function(t){function n(t){var o;(0,l.default)(this,n),(o=(0,h.default)(this,(0,u.default)(n).call(this,t)))._updateAnimatedEvent=function(t,n){var s=t.friction,l=t.overshootFriction,p=(t.useNativeAnimations,n.dragX),h=n.rowTranslation,u=n.leftWidth,f=void 0===u?0:u,v=n.rowWidth,w=void 0===v?0:v,_=n.rightOffset,S=void 0===_?w:_,A=Math.max(0,w-S),R=t.overshootLeft,O=void 0===R?f>0:R,b=t.overshootRight,E=void 0===b?A>0:b,W=c.Animated.add(h,p.interpolate({inputRange:[0,s],outputRange:[0,1]})).interpolate({inputRange:[-A-(E?1:l),-A,f,f+(O?1:l)],outputRange:[-A-(E||l>1?1:0),-A,f,f+(O||l>1?1:0)]});o._transX=W,o._showLeftAction=f>0?W.interpolate({inputRange:[-1,0,f],outputRange:[0,0,1]}):new c.Animated.Value(0),o._leftActionTranslate=o._showLeftAction.interpolate({inputRange:[0,Number.MIN_VALUE],outputRange:[-1e4,0],extrapolate:'clamp'}),o._showRightAction=A>0?W.interpolate({inputRange:[-A,0,1],outputRange:[1,0,0]}):new c.Animated.Value(0),o._rightActionTranslate=o._showRightAction.interpolate({inputRange:[0,Number.MIN_VALUE],outputRange:[-1e4,0],extrapolate:'clamp'})},o._onTapHandlerStateChange=function(t){t.nativeEvent.oldState===w.State.ACTIVE&&o.close()},o._onHandlerStateChange=function(t){var n=t.nativeEvent;n.oldState===w.State.ACTIVE&&o._handleRelease(n)},o._handleRelease=function(t){var n=t.velocityX,s=t.translationX,l=o.state,p=l.leftWidth,h=void 0===p?0:p,u=l.rowWidth,f=void 0===u?0:u,v=l.rowState,c=o.state.rightOffset,w=f-(void 0===c?f:c),S=o.props,A=S.friction,R=S.leftThreshold,O=void 0===R?h/2:R,b=S.rightThreshold,E=void 0===b?w/2:b,W=o._currentOffset()+s/A,y=(s+_*n)/A,L=0;0===v?y>O?L=h:y<-E&&(L=-w):1===v?y>-O&&(L=h):y0&&o.props.onSwipeableLeftOpen?o.props.onSwipeableLeftOpen():n<0&&o.props.onSwipeableRightOpen&&o.props.onSwipeableRightOpen(),0===n?o.props.onSwipeableClose&&o.props.onSwipeableClose():o.props.onSwipeableOpen&&o.props.onSwipeableOpen())}),n>0&&o.props.onSwipeableLeftWillOpen?o.props.onSwipeableLeftWillOpen():n<0&&o.props.onSwipeableRightWillOpen&&o.props.onSwipeableRightWillOpen(),0===n?o.props.onSwipeableWillClose&&o.props.onSwipeableWillClose():o.props.onSwipeableWillOpen&&o.props.onSwipeableWillOpen()},o._onRowLayout=function(t){var n=t.nativeEvent;o.setState({rowWidth:n.layout.width})},o._currentOffset=function(){var t=o.state,n=t.leftWidth,s=void 0===n?0:n,l=t.rowWidth,p=void 0===l?0:l,h=t.rowState,u=o.state.rightOffset;return 1===h?s:-1===h?-(p-(void 0===u?p:u)):0},o.close=function(){o._animateRow(o._currentOffset(),0)},o.openLeft=function(){var t=o.state.leftWidth,n=void 0===t?0:t;o._animateRow(o._currentOffset(),n)},o.openRight=function(){var t=o.state.rowWidth,n=void 0===t?0:t,s=o.state.rightOffset,l=n-(void 0===s?n:s);o._animateRow(o._currentOffset(),-l)};var p=new c.Animated.Value(0);return o.state={dragX:p,rowTranslation:new c.Animated.Value(0),rowState:0,leftWidth:void 0,rightOffset:void 0,rowWidth:void 0},o._updateAnimatedEvent(t,o.state),o._onGestureEvent=c.Animated.event([{nativeEvent:{translationX:p}}],{useNativeDriver:t.useNativeAnimations}),o}return(0,f.default)(n,t),(0,p.default)(n,[{key:"componentWillUpdate",value:function(t,n){this.props.friction===t.friction&&this.props.overshootLeft===t.overshootLeft&&this.props.overshootRight===t.overshootRight&&this.props.overshootFriction===t.overshootFriction&&this.state.leftWidth===n.leftWidth&&this.state.rightOffset===n.rightOffset&&this.state.rowWidth===n.rowWidth||this._updateAnimatedEvent(t,n)}},{key:"render",value:function(){var t=this,n=this.state.rowState,s=this.props,l=s.children,p=s.renderLeftActions,h=s.renderRightActions,u=p&&v.default.createElement(c.Animated.View,{style:[A.leftActions,{transform:[{translateX:this._leftActionTranslate}]}]},p(this._showLeftAction,this._transX),v.default.createElement(c.View,{onLayout:function(n){var o=n.nativeEvent;return t.setState({leftWidth:o.layout.x})}})),f=h&&v.default.createElement(c.Animated.View,{style:[A.rightActions,{transform:[{translateX:this._rightActionTranslate}]}]},h(this._showRightAction,this._transX),v.default.createElement(c.View,{onLayout:function(n){var o=n.nativeEvent;return t.setState({rightOffset:o.layout.x})}}));return v.default.createElement(w.PanGestureHandler,(0,o.default)({},this.props,{minDeltaX:10,onGestureEvent:this._onGestureEvent,onHandlerStateChange:this._onHandlerStateChange}),v.default.createElement(c.Animated.View,{onLayout:this._onRowLayout,style:A.container},u,f,v.default.createElement(w.TapGestureHandler,{enabled:0!==n,onHandlerStateChange:this._onTapHandlerStateChange},v.default.createElement(c.Animated.View,{pointerEvents:0===n?'auto':'box-only',style:{transform:[{translateX:this._transX}]}},l))))}}]),n})(v.Component);e.default=S,S.defaultProps={friction:1,overshootFriction:1,useNativeAnimations:!0};var A=c.StyleSheet.create({container:{overflow:'hidden'},leftActions:(0,s.default)({},c.StyleSheet.absoluteFillObject,{flexDirection:'row'}),rightActions:(0,s.default)({},c.StyleSheet.absoluteFillObject,{flexDirection:'row-reverse'})})},409,[346,1,8,44,19,20,27,30,33,47,2,205,410]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"gestureHandlerRootHOC",{enumerable:!0,get:function(){return _.default}}),e.Directions=e.FlatList=e.BorderlessButton=e.RectButton=e.BaseButton=e.RawButton=e.State=e.RotationGestureHandler=e.PinchGestureHandler=e.PanGestureHandler=e.LongPressGestureHandler=e.ForceTouchGestureHandler=e.FlingGestureHandler=e.TapGestureHandler=e.NativeViewGestureHandler=e.DrawerLayoutAndroid=e.ViewPagerAndroid=e.ToolbarAndroid=e.TextInput=e.Switch=e.Slider=e.ScrollView=void 0;var n,l=t(r(d[1])),o=t(r(d[2])),f=t(r(d[3])),u=t(r(d[4])),s=t(r(d[5])),c=t(r(d[6])),p=t(r(d[7])),v=t(r(d[8])),h=t(r(d[9])),y=t(r(d[10])),O=r(d[11]),b=t(r(d[12])),S=t(r(d[13])),E=t(r(d[14])),H=t(r(d[15])),_=t(r(d[16])),C=O.NativeModules.RNGestureHandlerModule,T=O.NativeModules.UIManager,A=T.setJSResponder,G=T.clearJSResponder;T.setJSResponder=function(t,n){C.handleSetJSResponder(t,n),A(t,n)},T.clearJSResponder=function(){C.handleClearJSResponder(),G()},T.genericDirectEventTypes=(0,h.default)({},T.genericDirectEventTypes,{onGestureHandlerEvent:{registrationName:'onGestureHandlerEvent'},onGestureHandlerStateChange:{registrationName:'onGestureHandlerStateChange'}});var w=C.State;e.State=w;var X=C.Direction;e.Directions=X;var Y=1,D={},P={id:H.default.string,minPointers:H.default.number,enabled:H.default.bool,waitFor:H.default.oneOfType([H.default.string,H.default.object,H.default.arrayOf(H.default.oneOfType([H.default.string,H.default.object]))]),simultaneousHandlers:H.default.oneOfType([H.default.string,H.default.object,H.default.arrayOf(H.default.oneOfType([H.default.string,H.default.object]))]),shouldCancelWhenOutside:H.default.bool,hitSlop:H.default.oneOfType([H.default.number,H.default.shape({left:H.default.number,top:H.default.number,right:H.default.number,bottom:H.default.number,vertical:H.default.number,horizontal:H.default.number,width:H.default.number,height:H.default.number})]),onGestureEvent:H.default.oneOfType([H.default.func,H.default.object]),onHandlerStateChange:H.default.oneOfType([H.default.func,H.default.object]),onBegan:H.default.func,onFailed:H.default.func,onCancelled:H.default.func,onActivated:H.default.func,onEnded:H.default.func},N=(n={},(0,v.default)(n,w.BEGAN,'onBegan'),(0,v.default)(n,w.FAILED,'onFailed'),(0,v.default)(n,w.CANCELLED,'onCancelled'),(0,v.default)(n,w.ACTIVE,'onActivated'),(0,v.default)(n,w.END,'onEnded'),n);function V(t,n){var l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=(0,h.default)({},l);return Object.keys(n).forEach(function(n){var l,f,u,s=t[n];if(u=n,!(void 0===(f=s)||'function'==typeof f||'object'==typeof f&&'__isNative'in f||'onHandlerStateChange'===u||'onGestureEvent'===u)){var c=t[n];'simultaneousHandlers'===n||'waitFor'===n?(l=t[n],Array.isArray(l)||(l=[l]),c=l.map(function(t){return D[t]||t.current&&t.current._handlerTag||-1}).filter(function(t){return t>0})):'hitSlop'===n&&'object'!=typeof c&&(c={top:c,left:c,bottom:c,right:c}),o[n]=c}}),o}function k(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=arguments.length>3?arguments[3]:void 0,v=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},b=(function(n){function b(t){var n;if((0,f.default)(this,b),(n=(0,s.default)(this,(0,c.default)(b).call(this,t)))._onGestureHandlerEvent=function(t){t.nativeEvent.handlerTag===n._handlerTag?n.props.onGestureEvent&&n.props.onGestureEvent(t):n.props.onGestureHandlerEvent&&n.props.onGestureHandlerEvent(t)},n._onGestureHandlerStateChange=function(t){if(t.nativeEvent.handlerTag===n._handlerTag){n.props.onHandlerStateChange&&n.props.onHandlerStateChange(t);var l=N[t.nativeEvent.state];'function'==typeof n.props[l]&&n.props[l](t)}else n.props.onGestureHandlerStateChange&&n.props.onGestureHandlerStateChange(t)},n._refHandler=function(t){n._viewNode=t;var l=y.default.Children.only(n.props.children).ref;null!==l&&('function'==typeof l?l(t):l.current=t)},n._handlerTag=Y++,n._config={},t.id){if(void 0!==D[t.id])throw new Error("Handler with ID \""+t.id+"\" already registered");D[t.id]=n._handlerTag}return n}return(0,p.default)(b,n),(0,u.default)(b,[{key:"componentWillUnmount",value:function(){C.dropGestureHandler(this._handlerTag),this._updateEnqueued&&clearImmediate(this._updateEnqueued),this.props.id&&delete D[this.props.id]}},{key:"componentDidMount",value:function(){var n,f,u=this;this._viewTag=(0,O.findNodeHandle)(this._viewNode),this._config=V(o?o(this.props):this.props,(0,h.default)({},this.constructor.propTypes,v),l),n=this.props,((f=function(t){return Array.isArray(t)?t.some(function(t){return t&&null===t.current}):t&&null===t.current})(n.simultaneousHandlers)||f(n.waitFor))&&(this._updateEnqueued=setImmediate(function(){u._updateEnqueued=null,u._update()})),C.createGestureHandler(t,this._handlerTag,this._config),C.attachGestureHandler(this._handlerTag,this._viewTag)}},{key:"componentDidUpdate",value:function(){var t=(0,O.findNodeHandle)(this._viewNode);this._viewTag!==t&&(this._viewTag=t,C.attachGestureHandler(this._handlerTag,t)),this._update()}},{key:"_update",value:function(){var t=V(o?o(this.props):this.props,(0,h.default)({},this.constructor.propTypes,v),l);(0,E.default)(this._config,t)||(this._config=t,C.updateGestureHandler(this._handlerTag,this._config))}},{key:"setNativeProps",value:function(t){var n=(0,h.default)({},this.props,t),f=V(o?o(n):n,(0,h.default)({},this.constructor.propTypes,v),l);this._config=f,C.updateGestureHandler(this._handlerTag,this._config)}},{key:"render",value:function(){var t=this._onGestureHandlerEvent,n=this.props,l=n.onGestureEvent,o=n.onGestureHandlerEvent;if(l&&'function'!=typeof l){if(o)throw new Error('Nesting touch handlers with native animated driver is not supported yet');t=this.props.onGestureEvent}else if(o&&'function'!=typeof o)throw new Error('Nesting touch handlers with native animated driver is not supported yet');var f=this._onGestureHandlerStateChange,u=this.props,s=u.onHandlerStateChange,c=u.onGestureHandlerStateChange;if(s&&'function'!=typeof s){if(c)throw new Error('Nesting touch handlers with native animated driver is not supported yet');f=this.props.onHandlerStateChange}else if(c&&'function'!=typeof c)throw new Error('Nesting touch handlers with native animated driver is not supported yet');var p=y.default.Children.only(this.props.children),v=p.props.children;return S.default.TOUCH_TARGET_DEBUG&&p.type&&('RNGestureHandlerButton'===p.type||'View'===p.type.name||'View'===p.type.displayName)&&(v=y.default.Children.toArray(v)).push(S.default.renderDebugView({color:'mediumspringgreen',hitSlop:p.props.hitSlop})),y.default.cloneElement(p,{ref:this._refHandler,collapsable:!1,onGestureHandlerEvent:t,onGestureHandlerStateChange:f},v)}}]),b})(y.default.Component);return b.propTypes=(0,h.default)({},P,n),b}var x=k('NativeViewGestureHandler',{shouldActivateOnStart:H.default.bool,disallowInterruption:H.default.bool});e.NativeViewGestureHandler=x;var F=k('TapGestureHandler',{maxDurationMs:H.default.number,maxDelayMs:H.default.number,numberOfTaps:H.default.number,maxDeltaX:H.default.number,maxDeltaY:H.default.number,maxDist:H.default.number,minPointers:H.default.number},{});e.TapGestureHandler=F;var B=k('FlingGestureHandler',{numberOfPointers:H.default.number,direction:H.default.number},{});e.FlingGestureHandler=B;var I=(function(t){function n(){return(0,f.default)(this,n),(0,s.default)(this,(0,c.default)(n).apply(this,arguments))}return(0,p.default)(n,t),(0,u.default)(n,[{key:"componentDidMount",value:function(){console.warn('ForceTouchGestureHandler is not available on this platform. Please use ForceTouchGestureHandler.forceTouchAvailable to conditionally render other components that would provide a fallback behavior specific to your usecase')}},{key:"render",value:function(){return this.props.children}}]),n})(y.default.Component),R=O.NativeModules.PlatformConstants.forceTouchAvailable?k('ForceTouchGestureHandler',{minForce:H.default.number,maxForce:H.default.number,feedbackOnActivation:H.default.bool},{}):I;e.ForceTouchGestureHandler=R,R.forceTouchAvailable=O.NativeModules.PlatformConstants.forceTouchAvailable||!1;var j=k('LongPressGestureHandler',{minDurationMs:H.default.number,maxDist:H.default.number},{});function L(t){var n=(0,h.default)({},t);return void 0!==t.minDeltaX&&(delete n.minDeltaX,n.activeOffsetXStart=-t.minDeltaX,n.activeOffsetXEnd=t.minDeltaX),void 0!==t.maxDeltaX&&(delete n.maxDeltaX,n.failOffsetXStart=-t.maxDeltaX,n.failOffsetXEnd=t.maxDeltaX),void 0!==t.minOffsetX&&(delete n.minOffsetX,t.minOffsetX<0?n.activeOffsetXStart=t.minOffsetX:n.activeOffsetXEnd=t.minOffsetX),void 0!==t.minDeltaY&&(delete n.minDeltaY,n.activeOffsetYStart=-t.minDeltaY,n.activeOffsetYEnd=t.minDeltaY),void 0!==t.maxDeltaY&&(delete n.maxDeltaY,n.failOffsetYStart=-t.maxDeltaY,n.failOffsetYEnd=t.maxDeltaY),void 0!==t.minOffsetY&&(delete n.minOffsetY,t.minOffsetY<0?n.activeOffsetYStart=t.minOffsetY:n.activeOffsetYEnd=t.minOffsetY),void 0!==t.activeOffsetX&&(delete n.activeOffsetX,Array.isArray(t.activeOffsetX)?(n.activeOffsetXStart=t.activeOffsetX[0],n.activeOffsetXEnd=t.activeOffsetX[1]):t.activeOffsetX<0?n.activeOffsetXStart=t.activeOffsetX:n.activeOffsetXEnd=t.activeOffsetX),void 0!==t.activeOffsetY&&(delete n.activeOffsetY,Array.isArray(t.activeOffsetY)?(n.activeOffsetYStart=t.activeOffsetY[0],n.activeOffsetYEnd=t.activeOffsetY[1]):t.activeOffsetY<0?n.activeOffsetYStart=t.activeOffsetY:n.activeOffsetYEnd=t.activeOffsetY),void 0!==t.failOffsetX&&(delete n.failOffsetX,Array.isArray(t.failOffsetX)?(n.failOffsetXStart=t.failOffsetX[0],n.failOffsetXEnd=t.failOffsetX[1]):t.failOffsetX<0?n.failOffsetXStart=t.failOffsetX:n.failOffsetXEnd=t.failOffsetX),void 0!==t.failOffsetY&&(delete n.failOffsetY,Array.isArray(t.failOffsetY)?(n.failOffsetYStart=t.failOffsetY[0],n.failOffsetYEnd=t.failOffsetY[1]):t.failOffsetY<0?n.failOffsetYStart=t.failOffsetY:n.failOffsetYEnd=t.failOffsetY),n}e.LongPressGestureHandler=j;var M=k('PanGestureHandler',{activeOffsetY:H.default.oneOfType([H.default.number,H.default.arrayOf(H.default.number)]),activeOffsetX:H.default.oneOfType([H.default.number,H.default.arrayOf(H.default.number)]),failOffsetY:H.default.oneOfType([H.default.number,H.default.arrayOf(H.default.number)]),failOffsetX:H.default.oneOfType([H.default.number,H.default.arrayOf(H.default.number)]),minDist:H.default.number,minVelocity:H.default.number,minVelocityX:H.default.number,minVelocityY:H.default.number,minPointers:H.default.number,maxPointers:H.default.number,avgTouches:H.default.bool},{},function(t){return L(t)},{activeOffsetYStart:!0,activeOffsetYEnd:!0,activeOffsetXStart:!0,activeOffsetXEnd:!0,failOffsetYStart:!0,failOffsetYEnd:!0,failOffsetXStart:!0,failOffsetXEnd:!0});e.PanGestureHandler=M;var W=k('PinchGestureHandler',{},{});e.PinchGestureHandler=W;var J=k('RotationGestureHandler',{},{});e.RotationGestureHandler=J;var q=new Set(['replaceState','isMounted']),U=(0,h.default)({},x.propTypes,{onGestureHandlerEvent:H.default.func,onGestureHandlerStateChange:H.default.func});function z(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},l=(function(l){function v(){var t,n;(0,f.default)(this,v);for(var l=arguments.length,o=new Array(l),u=0;u=o.length)break;s=o[u++]}else{if((u=o.next()).done)break;s=u.value}var c=s;c.startsWith('_')||c.startsWith('component')||q.has(c)||'function'!=typeof l[c]||void 0!==n[c]||(l[c].prototype?n[c]=l[c].bind(t):n[c]=l[c])}l=Object.getPrototypeOf(l)}},n}return(0,p.default)(v,l),(0,u.default)(v,[{key:"render",value:function(){var l=this,f=Object.keys(this.props).reduce(function(t,n){return n in U&&(t[n]=l.props[n]),t},(0,h.default)({},n));return y.default.createElement(x,f,y.default.createElement(t,(0,o.default)({},this.props,{ref:this._refHandler})))}}]),v})(y.default.Component);return l.propTypes=(0,h.default)({},t.propTypes),l}var K=z(O.ScrollView,{disallowInterruption:!0});e.ScrollView=K;var Q=z(O.Slider,{shouldCancelWhenOutside:!1,shouldActivateOnStart:!0,disallowInterruption:!0});e.Slider=Q;var Z=z(O.Switch,{shouldCancelWhenOutside:!1,shouldActivateOnStart:!0,disallowInterruption:!0});e.Switch=Z;var $=z(O.TextInput);e.TextInput=$;var ee=z(O.ToolbarAndroid);e.ToolbarAndroid=ee;var te=z(O.ViewPagerAndroid,{disallowInterruption:!0});e.ViewPagerAndroid=te;var ae=z(O.DrawerLayoutAndroid,{disallowInterruption:!0});e.DrawerLayoutAndroid=ae,ae.positions=O.DrawerLayoutAndroid.positions,w.print=function(t){for(var n=Object.keys(w),l=0;l1&&void 0!==arguments[1]?arguments[1]:void 0,s=(function(s){function v(){return(0,n.default)(this,v),(0,l.default)(this,(0,o.default)(v).apply(this,arguments))}return(0,f.default)(v,s),(0,u.default)(v,[{key:"render",value:function(){return c.default.createElement(h,{style:[_.container,p]},c.default.createElement(t,this.props))}}]),v})(c.default.Component);return(0,v.default)(s,t),s};var n=t(r(d[1])),u=t(r(d[2])),l=t(r(d[3])),o=t(r(d[4])),f=t(r(d[5])),p=t(r(d[6])),c=t(r(d[7])),s=r(d[8]),v=t(r(d[9])),y={name:'GestureHandlerRootView',propTypes:(0,p.default)({},s.ViewPropTypes)},h=(0,s.requireNativeComponent)('GestureHandlerRootView',y);var _=s.StyleSheet.create({container:{flex:1}})},412,[1,19,20,27,30,33,44,47,2,413]); -__d(function(g,r,i,a,m,e,d){'use strict';var t={childContextTypes:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},p=Object.defineProperty,n=Object.getOwnPropertyNames,c=Object.getOwnPropertySymbols,s=Object.getOwnPropertyDescriptor,y=Object.getPrototypeOf,f=y&&y(Object);m.exports=function l(O,u,P){if('string'!=typeof u){if(f){var b=y(u);b&&b!==f&&l(O,b,P)}var v=n(u);c&&(v=v.concat(c(u)));for(var j=0;jo?f-o:0);var S=c+v+(s._drawerShown?o:0);S+_*w>o/2?s._animateDrawer(S,o,w):s._animateDrawer(S,0,w)},s._updateShowing=function(t){s._drawerShown=t,s._accessibilityIsModalView.current&&s._accessibilityIsModalView.current.setNativeProps({accessibilityViewIsModal:t}),s._pointerEventsView.current&&s._pointerEventsView.current.setNativeProps({pointerEvents:t?'auto':'none'});var n=s.props,o=n.drawerPosition,l=n.minSwipeDistance,u=n.edgeWidth,p='left'===o,c=(p?1:-1)*(s._drawerShown?-1:1),w=p?{left:0,width:t?void 0:u}:{right:0,width:t?void 0:u};s._panGestureHandler.current&&s._panGestureHandler.current.setNativeProps({hitSlop:w,activeOffsetX:c*l})},s._animateDrawer=function(t,n,o){if(s.state.dragX.setValue(0),s.state.touchX.setValue('left'===s.props.drawerPosition?0:s.state.containerWidth),void 0!==t){var l=t;s.props.useNativeAnimations&&(t0?l=Math.min(t+o/60,n):t>n&&o<0&&(l=Math.max(t+o/60,n))),s.state.drawerTranslation.setValue(l)}var u=0!==n;s._updateShowing(u),s._emitStateChanged(V,u),s.props.hideStatusBar&&f.StatusBar.setHidden(u,s.props.statusBarAnimation||'slide'),f.Animated.spring(s.state.drawerTranslation,{velocity:o,bounciness:0,toValue:n,useNativeDriver:s.props.useNativeAnimations}).start(function(t){t.finished&&(s._emitStateChanged(S,u),u?s.props.onDrawerOpen&&s.props.onDrawerOpen():s.props.onDrawerClose&&s.props.onDrawerClose())})},s.openDrawer=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};s._animateDrawer(void 0,s.props.drawerWidth,t.velocity?t.velocity:0)},s.closeDrawer=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};s._animateDrawer(void 0,0,t.velocity?t.velocity:0)},s._renderOverlay=function(){(0,h.default)(s._openValue,'should be set');var t={opacity:s._openValue.interpolate({inputRange:[0,1],outputRange:[0,.7],extrapolate:'clamp'}),backgroundColor:s.props.overlayColor};return w.default.createElement(v.TapGestureHandler,{onHandlerStateChange:s._onTapHandlerStateChange},w.default.createElement(f.Animated.View,{pointerEvents:s._drawerShown?'auto':'none',ref:s._pointerEventsView,style:[C.overlay,t]}))},s._renderDrawer=function(){var t,n=s.props,o=n.drawerBackgroundColor,l=n.drawerWidth,u=n.drawerPosition,p=n.drawerType,c=n.drawerContainerStyle,v=n.contentContainerStyle,_='left'===u,S='back'!==p,y='front'!==p,V=f.I18nManager.isRTL?_:!_,A={backgroundColor:o,width:l},E=s._openValue;((0,h.default)(E,'should be set'),y)&&(t={transform:[{translateX:E.interpolate({inputRange:[0,1],outputRange:_?[0,l]:[0,-l],extrapolate:'clamp'})}]});var b=0;if(S){var D=_?-l:l;b=E.interpolate({inputRange:[0,1],outputRange:[D,0],extrapolate:'clamp'})}var R={transform:[{translateX:b}],flexDirection:V?'row-reverse':'row'};return w.default.createElement(f.Animated.View,{style:C.main,onLayout:s._handleContainerLayout},w.default.createElement(f.Animated.View,{style:['front'===p?C.containerOnBack:C.containerInFront,t,v]},'function'==typeof s.props.children?s.props.children(s._openValue):s.props.children,s._renderOverlay()),w.default.createElement(f.Animated.View,{pointerEvents:"box-none",ref:s._accessibilityIsModalView,accessibilityViewIsModal:s._drawerShown,style:[C.drawerContainer,R,c]},w.default.createElement(f.View,{style:[C.drawer,A]},s.props.renderNavigationView(s._openValue))))},s._setPanGestureRef=function(t){s._panGestureHandler.current=t,s.props.onGestureRef&&s.props.onGestureRef(t)};var c=new f.Animated.Value(0),A=new f.Animated.Value(0),E=new f.Animated.Value(0);return s.state={dragX:c,touchX:A,drawerTranslation:E,containerWidth:0},s._updateAnimatedEvent(t,s.state),s}return(0,c.default)(n,t),(0,s.default)(n,[{key:"componentWillUpdate",value:function(t,n){this.props.drawerPosition===t.drawerPosition&&this.props.drawerWidth===t.drawerWidth&&this.props.drawerType===t.drawerType&&this.state.containerWidth===n.containerWidth||this._updateAnimatedEvent(t,n)}},{key:"render",value:function(){var t=this.props,n=t.drawerPosition,o=t.drawerLockMode,l=t.edgeWidth,s=t.minSwipeDistance,u='left'===n,p=(u?1:-1)*(this._drawerShown?-1:1),c=u?{left:0,width:this._drawerShown?void 0:l}:{right:0,width:this._drawerShown?void 0:l};return w.default.createElement(v.PanGestureHandler,{ref:this._setPanGestureRef,hitSlop:c,activeOffsetX:p*s,failOffsetY:[-15,15],onGestureEvent:this._onGestureEvent,onHandlerStateChange:this._openingHandlerStateChange,enabled:'locked-closed'!==o&&'locked-open'!==o},this._renderDrawer())}}]),n})(w.Component);e.default=A,A.defaultProps={drawerWidth:200,drawerPosition:'left',useNativeAnimations:!0,drawerType:'front',edgeWidth:20,minSwipeDistance:3,overlayColor:'black',drawerLockMode:'unlocked'},A.positions={Left:'left',Right:'right'};var C=f.StyleSheet.create({drawer:{flex:0},drawerContainer:(0,o.default)({},f.StyleSheet.absoluteFillObject,{zIndex:1001,flexDirection:'row'}),containerInFront:(0,o.default)({},f.StyleSheet.absoluteFillObject,{zIndex:1002}),containerOnBack:(0,o.default)({},f.StyleSheet.absoluteFillObject),main:{flex:1,zIndex:0,overflow:'hidden'},overlay:(0,o.default)({},f.StyleSheet.absoluteFillObject,{zIndex:1e3})})},414,[346,1,44,19,20,27,30,33,47,415,2,205,410]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports=function(n,o,t,f,s,u,c,l){if(!n){var v;if(void 0===o)v=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var p=[t,f,s,u,c,l],h=0;(v=new Error(o.replace(/%s/g,function(){return p[h++]}))).name='Invariant Violation'}throw v.framesToPop=1,v}}},415,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"TouchableNativeFeedback",{enumerable:!0,get:function(){return u.default}}),Object.defineProperty(e,"TouchableWithoutFeedback",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(e,"TouchableOpacity",{enumerable:!0,get:function(){return c.default}}),Object.defineProperty(e,"TouchableHighlight",{enumerable:!0,get:function(){return o.default}});var u=t(r(d[1])),n=t(r(d[2])),c=t(r(d[3])),o=t(r(d[4]))},416,[1,417,419,420,421]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),o=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=o(r(d[2])),u=o(r(d[3])),n=o(r(d[4])),s=o(r(d[5])),p=o(r(d[6])),f=o(r(d[7])),c=o(r(d[8])),b=o(r(d[9])),y=o(r(d[10])),B=t(r(d[11])),v=o(r(d[12])),P=(function(t){function o(){var t,l;(0,s.default)(this,o);for(var u=arguments.length,n=new Array(u),p=0;p=23},P.defaultProps=(0,l.default)({},y.default.defaultProps,{useForeground:!0,extraButtonProps:{rippleColor:null}}),P.propTypes=(0,l.default)({},y.default.publicPropTypes,{useForeground:v.default.bool,background:v.default.string,style:v.default.object})},417,[346,1,44,8,6,19,20,27,30,33,418,47,59]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),s=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.TOUCHABLE_STATE=void 0;var o=s(r(d[2])),n=s(r(d[3])),u=s(r(d[4])),l=s(r(d[5])),p=s(r(d[6])),T=s(r(d[7])),c=s(r(d[8])),E=t(r(d[9])),f=r(d[10]),h=r(d[11]),S=s(r(d[12])),P={UNDETERMINED:0,BEGAN:1,MOVED_OUTSIDE:2};e.TOUCHABLE_STATE=P;var D={accessible:S.default.bool,accessibilityLabel:S.default.node,accessibilityHint:S.default.string,hitSlop:S.default.shape({top:S.default.number,left:S.default.number,bottom:S.default.number,right:S.default.number}),disabled:S.default.bool,onPress:S.default.func,onPressIn:S.default.func,onPressOut:S.default.func,onLayout:S.default.func,onLongPress:S.default.func,nativeID:S.default.string,testID:S.default.string,delayPressIn:S.default.number,delayPressOut:S.default.number,delayLongPress:S.default.number},v={extraButtonProps:S.default.object,onStateChange:S.default.func},y=(function(t){function s(){var t,o;(0,u.default)(this,s);for(var n=arguments.length,l=new Array(n),c=0;c1&&void 0!==arguments[1]?arguments[1]:{},l=(0,o.StackRouter)(t,v),c=(0,o.createNavigator)(u.default,l,v);return v.disableKeyboardHandling||(c=(0,n.createKeyboardAwareNavigator)(c,v)),c};e.default=v},423,[1,352,349,424]); -__d(function(g,r,i,a,m,e,d){var n=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=n(r(d[1])),o=n(r(d[2])),s=n(r(d[3])),p=n(r(d[4])),l=n(r(d[5])),c=n(r(d[6])),u=n(r(d[7])),f=n(r(d[8])),v=r(d[9]),h=n(r(d[10])),E=n(r(d[11])),y=n(r(d[12])),T=!0,b={mode:'card',cardShadowEnabled:!0,cardOverlayEnabled:!1},C=(function(n){function C(){var n,p;(0,s.default)(this,C);for(var u=arguments.length,E=new Array(u),_=0;_0&&this._isGestureEnabled()}),f.default.createElement(v.Animated.View,{style:[X.container,this._transitionConfig.containerStyle]},f.default.createElement(H.default.Provider,{value:this.panGestureRef},f.default.createElement(P.ScreenContainer,{style:X.scenes},o.map(this._renderCard)),u)))}},{key:"componentDidUpdate",value:function(t){var n=t.transitionProps.navigation.state,s=this.props.transitionProps.navigation.state;n.index!==s.index&&this._maybeCancelGesture()}},{key:"_getGestureResponseDistance",value:function(){var t=this.props.transitionProps.scene.descriptor.options.gestureResponseDistance,n=void 0===t?{}:t;return this._isModal()?n.vertical||135:n.horizontal||50}},{key:"_gestureActivationCriteria",value:function(){var t=this.props.transitionProps.layout,n=this._getGestureResponseDistance(),s=this._isMotionInverted();if(this._isMotionVertical()){var o=t.height.__getValue();return{maxDeltaX:15,minOffsetY:s?-5:5,hitSlop:s?{top:-o+n}:{bottom:-o+n}}}var l=-t.width.__getValue()+n;return{minOffsetX:s?-5:5,maxDeltaY:20,hitSlop:s?{left:l}:{right:l}}}},{key:"_isGestureEnabled",value:function(){var t=this.props.transitionProps.scene.descriptor.options.gesturesEnabled;return'boolean'==typeof t?t:'ios'===v.Platform.OS}},{key:"_isMotionVertical",value:function(){return this._isModal()}},{key:"_isModal",value:function(){return'modal'===this.props.mode}},{key:"_isMotionInverted",value:function(){var t=this.props.transitionProps.scene.descriptor.options.gestureDirection;return this._isModal()?'inverted'===t:'string'==typeof t?'inverted'===t:v.I18nManager.isRTL}},{key:"_computeHorizontalGestureValue",value:function(t){var n=t.translationX,s=this.props.transitionProps,o=s.navigation,l=s.layout,u=o.state.index,p=l.width.__getValue(),h=u-(this._isMotionInverted()?-1*n:n)/p;return(0,w.default)(u-1,h,u)}},{key:"_computeVerticalGestureValue",value:function(t){var n=t.translationY,s=this.props.transitionProps,o=s.navigation,l=s.layout,u=o.state.index,p=l.height.__getValue(),h=u-(this._isMotionInverted()?-1*n:n)/p;return(0,w.default)(u-1,h,u)}},{key:"_maybeCancelGesture",value:function(){this.positionSwitch.setValue(1)}},{key:"_prepareGesture",value:function(){if(!this._isGestureEnabled())return 1!==this.positionSwitch.__getValue()&&this.positionSwitch.setValue(1),void(this.gesturePosition=void 0);0!==this.props.transitionProps.layout.width.__getValue()&&0!==this.props.transitionProps.layout.height.__getValue()&&(this._isMotionVertical()?this._prepareGestureVertical():this._prepareGestureHorizontal())}},{key:"_prepareGestureHorizontal",value:function(){var t=this.props.transitionProps.navigation.state.index;this._isMotionInverted()?this.gesturePosition=v.Animated.add(t,v.Animated.divide(this.gestureX,this.props.transitionProps.layout.width)).interpolate({inputRange:[t-1,t],outputRange:[t-1,t],extrapolate:'clamp'}):this.gesturePosition=v.Animated.add(t,v.Animated.multiply(-1,v.Animated.divide(this.gestureX,this.props.transitionProps.layout.width))).interpolate({inputRange:[t-1,t],outputRange:[t-1,t],extrapolate:'clamp'})}},{key:"_prepareGestureVertical",value:function(){var t=this.props.transitionProps.navigation.state.index;this._isMotionInverted()?this.gesturePosition=v.Animated.add(t,v.Animated.divide(this.gestureY,this.props.transitionProps.layout.height)).interpolate({inputRange:[t-1,t],outputRange:[t-1,t],extrapolate:'clamp'}):this.gesturePosition=v.Animated.add(t,v.Animated.multiply(-1,v.Animated.divide(this.gestureY,this.props.transitionProps.layout.height))).interpolate({inputRange:[t-1,t],outputRange:[t-1,t],extrapolate:'clamp'})}},{key:"_handleReleaseHorizontal",value:function(t){var n=this.props.transitionProps,s=n.navigation,o=n.position,l=n.layout,u=s.state.index,p=null==this._immediateIndex?u:this._immediateIndex,h=l.width.__getValue(),c=this._isMotionInverted()?-1:1,f=c*t.translationX,v=c*t.velocityX,_=h/500,y=Math.max(Math.abs(v),_),P=this._isMotionInverted()?(h-f)/y:f/y,k=this._isMotionInverted()?f/y:(h-f)/y,V=this._computeHorizontalGestureValue(t);return o.setValue(V),this.positionSwitch.setValue(1),v<-50?(this.props.onGestureCanceled&&this.props.onGestureCanceled(),void this._reset(p,P)):v>50?(this.props.onGestureEnd&&this.props.onGestureEnd(),void this._goBack(p,k)):void(V<=u-.5?(this.props.onGestureEnd&&this.props.onGestureEnd(),this._goBack(p,k)):(this.props.onGestureCanceled&&this.props.onGestureCanceled(),this._reset(p,P)))}},{key:"_handleReleaseVertical",value:function(t){var n=this.props.transitionProps,s=n.navigation,o=n.position,l=n.layout,u=s.state.index,p=null==this._immediateIndex?u:this._immediateIndex,h=l.height.__getValue(),c=this._isMotionInverted(),f=c?-1:1,v=f*t.translationY,_=f*t.velocityY,y=h/500,P=Math.max(Math.abs(_),y),k=c?(h-v)/P:v/P,V=c?v/P:(h-v)/P,S=this._computeVerticalGestureValue(t);return o.setValue(S),this.positionSwitch.setValue(1),_<-50?(this.props.onGestureCanceled&&this.props.onGestureCanceled(),void this._reset(p,k)):_>50?(this.props.onGestureEnd&&this.props.onGestureEnd(),void this._goBack(p,V)):void(S<=u-.5?(this.props.onGestureEnd&&this.props.onGestureEnd(),this._goBack(p,V)):(this.props.onGestureCanceled&&this.props.onGestureCanceled(),this._reset(p,k)))}},{key:"_getHeaderMode",value:function(){return this.props.headerMode?this.props.headerMode:'android'===v.Platform.OS||'modal'===this.props.mode?'screen':'float'}},{key:"_getHeaderBackgroundTransitionPreset",value:function(){var t=this.props.headerBackgroundTransitionPreset;if(t&&B.includes(t)){if('fade'===t)return E.default.forBackgroundWithFade;if('translate'===t)return E.default.forBackgroundWithTranslation;if('toggle'===t)return E.default.forBackgroundWithInactiveHidden}return null}},{key:"_getHeaderLayoutPreset",value:function(){var t=this.props.headerLayoutPreset;return t&&T.includes(t)?t:'android'===v.Platform.OS?'left':'center'}},{key:"_getHeaderTransitionPreset",value:function(){if('android'===v.Platform.OS||'screen'===this._getHeaderMode())return'fade-in-place';var t=this.props.headerTransitionPreset;return t&&R.includes(t)?t:'fade-in-place'}},{key:"_getHeaderBackTitleVisible",value:function(){var t=this.props.headerBackTitleVisible,n=!('left'===this._getHeaderLayoutPreset()||'android'===v.Platform.OS);return'boolean'==typeof t?t:n}},{key:"_renderInnerScene",value:function(t){var n=t.descriptor,s=n.navigation,o=(0,n.getComponent)(),l=this.props.screenProps,u=this._getHeaderMode();return'screen'===u?f.default.createElement(v.View,{style:X.container},f.default.createElement(v.View,{style:X.scenes},f.default.createElement(_.SceneView,{screenProps:l,navigation:s,component:o})),this._renderHeader(t,u)):f.default.createElement(_.SceneView,{screenProps:l,navigation:s,component:o})}},{key:"_prepareTransitionConfig",value:function(){this._transitionConfig=G.default.getTransitionConfig(this.props.transitionConfig,(0,o.default)({},this.props.transitionProps,{position:this.position}),this.props.lastTransitionProps,this._isModal())}},{key:"_preparePosition",value:function(){this.gesturePosition?this.position=v.Animated.add(v.Animated.multiply(this.props.transitionProps.position,this.positionSwitch),v.Animated.multiply(this.gesturePosition,this.gestureSwitch)):this.position=this.props.transitionProps.position}}]),y})(f.default.Component),X=v.StyleSheet.create({container:{flex:1,flexDirection:'column-reverse',overflow:'hidden'},scenes:{flex:1},floatingHeader:{position:'absolute',left:0,top:0,right:0}}),Y=(0,y.withOrientation)(L);e.default=Y},425,[1,6,8,44,19,20,27,30,33,47,2,352,349,426,427,443,446,456,453,459,460,458]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.useScreens=function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];(S=t)&&!C('RNSScreen')&&console.error("Screen native module hasn't been linked. Please check the react-native-screens README for more details")},e.screensEnabled=function(){return S},e.ScreenContainer=e.Screen=e.NativeScreenContainer=e.NativeScreen=void 0;var n=t(r(d[1])),o=t(r(d[2])),l=t(r(d[3])),u=t(r(d[4])),f=t(r(d[5])),c=t(r(d[6])),s=t(r(d[7])),v=t(r(d[8])),p=r(d[9]),h=r(d[10]),S=!1,C=function(t){return void 0!==p.UIManager.getViewManagerConfig?p.UIManager.getViewManagerConfig(t):p.UIManager[t]};var y=(0,p.requireNativeComponent)('RNSScreen',null);e.NativeScreen=y;var N=p.Animated.createAnimatedComponent(y),R=(0,p.requireNativeComponent)('RNSScreenContainer',null);e.NativeScreenContainer=R;var E=(function(t){function C(){var t,n;(0,l.default)(this,C);for(var o=arguments.length,u=new Array(o),s=0;s=57)return v.default.createElement(N,this.props);var t=this.props,l=t.style,u=t.children,f=(0,o.default)(t,["style","children"]);return v.default.createElement(N,(0,n.default)({},f,{ref:this.setRef,style:p.StyleSheet.absoluteFill}),v.default.createElement(p.Animated.View,{style:l},u))}var c=this.props,s=(c.active,c.onComponentRef,(0,o.default)(c,["active","onComponentRef"]));return v.default.createElement(p.Animated.View,(0,n.default)({},s,{ref:this.setRef}))}}]),C})(v.default.Component);e.Screen=E;var M=(function(t){function n(){return(0,l.default)(this,n),(0,f.default)(this,(0,c.default)(n).apply(this,arguments))}return(0,s.default)(n,t),(0,u.default)(n,[{key:"render",value:function(){return S?v.default.createElement(R,this.props):v.default.createElement(p.View,this.props)}}]),n})(v.default.Component);e.ScreenContainer=M},426,[1,8,6,19,20,27,30,33,47,2,96]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0});var n={Swipeable:!0,DrawerLayout:!0};Object.defineProperty(e,"Swipeable",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(e,"DrawerLayout",{enumerable:!0,get:function(){return u.default}});var o=t(r(d[1])),u=t(r(d[2])),c=r(d[3]);Object.keys(c).forEach(function(t){"default"!==t&&"__esModule"!==t&&(Object.prototype.hasOwnProperty.call(n,t)||Object.defineProperty(e,t,{enumerable:!0,get:function(){return c[t]}}))});var f=r(d[4]);Object.keys(f).forEach(function(t){"default"!==t&&"__esModule"!==t&&(Object.prototype.hasOwnProperty.call(n,t)||Object.defineProperty(e,t,{enumerable:!0,get:function(){return f[t]}}))})},427,[1,428,436,429,437]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=n(r(d[2])),s=n(r(d[3])),l=n(r(d[4])),p=n(r(d[5])),h=n(r(d[6])),u=n(r(d[7])),f=n(r(d[8])),v=t(r(d[9])),c=r(d[10]),w=r(d[11]),S=.05;Math.sign||(Math.sign=function(t){return Number(t>0)-Number(t<0)||+t});var _=(function(t){function n(t){var o;(0,l.default)(this,n),(o=(0,h.default)(this,(0,u.default)(n).call(this,t)))._updateAnimatedEvent=function(t,n){var s=t.friction,l=t.overshootFriction,p=(t.useNativeAnimations,n.dragX),h=n.rowTranslation,u=n.leftWidth,f=void 0===u?0:u,v=n.rowWidth,w=void 0===v?0:v,S=n.rightOffset,_=void 0===S?w:S,A=Math.max(0,w-_),R=t.overshootLeft,O=void 0===R?f>0:R,b=t.overshootRight,E=void 0===b?A>0:b,W=c.Animated.add(h,p.interpolate({inputRange:[0,s],outputRange:[0,1]})).interpolate({inputRange:[-A-(E?1:l),-A,f,f+(O?1:l)],outputRange:[-A-(E||l>1?1:0),-A,f,f+(O||l>1?1:0)]});o._transX=W,o._showLeftAction=f>0?W.interpolate({inputRange:[-1,0,f],outputRange:[0,0,1]}):new c.Animated.Value(0),o._leftActionTranslate=o._showLeftAction.interpolate({inputRange:[0,Number.MIN_VALUE],outputRange:[-1e4,0],extrapolate:'clamp'}),o._showRightAction=A>0?W.interpolate({inputRange:[-A,0,1],outputRange:[1,0,0]}):new c.Animated.Value(0),o._rightActionTranslate=o._showRightAction.interpolate({inputRange:[0,Number.MIN_VALUE],outputRange:[-1e4,0],extrapolate:'clamp'})},o._onTapHandlerStateChange=function(t){t.nativeEvent.oldState===w.State.ACTIVE&&o.close()},o._onHandlerStateChange=function(t){var n=t.nativeEvent;n.oldState===w.State.ACTIVE&&o._handleRelease(n)},o._handleRelease=function(t){var n=t.velocityX,s=t.translationX,l=o.state,p=l.leftWidth,h=void 0===p?0:p,u=l.rowWidth,f=void 0===u?0:u,v=l.rowState,c=o.state.rightOffset,w=f-(void 0===c?f:c),_=o.props,A=_.friction,R=_.leftThreshold,O=void 0===R?h/2:R,b=_.rightThreshold,E=void 0===b?w/2:b,W=o._currentOffset()+s/A,y=(s+S*n)/A,L=0;0===v?y>O?L=h:y<-E&&(L=-w):1===v?y>-O&&(L=h):y0&&o.props.onSwipeableLeftOpen?o.props.onSwipeableLeftOpen():n<0&&o.props.onSwipeableRightOpen&&o.props.onSwipeableRightOpen(),0===n?o.props.onSwipeableClose&&o.props.onSwipeableClose():o.props.onSwipeableOpen&&o.props.onSwipeableOpen())}),n>0&&o.props.onSwipeableLeftWillOpen?o.props.onSwipeableLeftWillOpen():n<0&&o.props.onSwipeableRightWillOpen&&o.props.onSwipeableRightWillOpen(),0===n?o.props.onSwipeableWillClose&&o.props.onSwipeableWillClose():o.props.onSwipeableWillOpen&&o.props.onSwipeableWillOpen()},o._onRowLayout=function(t){var n=t.nativeEvent;o.setState({rowWidth:n.layout.width})},o._currentOffset=function(){var t=o.state,n=t.leftWidth,s=void 0===n?0:n,l=t.rowWidth,p=void 0===l?0:l,h=t.rowState,u=o.state.rightOffset;return 1===h?s:-1===h?-(p-(void 0===u?p:u)):0},o.close=function(){o._animateRow(o._currentOffset(),0)},o.openLeft=function(){var t=o.state.leftWidth,n=void 0===t?0:t;o._animateRow(o._currentOffset(),n)},o.openRight=function(){var t=o.state.rowWidth,n=void 0===t?0:t,s=o.state.rightOffset,l=n-(void 0===s?n:s);o._animateRow(o._currentOffset(),-l)};var p=new c.Animated.Value(0);return o.state={dragX:p,rowTranslation:new c.Animated.Value(0),rowState:0,leftWidth:void 0,rightOffset:void 0,rowWidth:void 0},o._updateAnimatedEvent(t,o.state),o._onGestureEvent=c.Animated.event([{nativeEvent:{translationX:p}}],{useNativeDriver:t.useNativeAnimations}),o}return(0,f.default)(n,t),(0,p.default)(n,[{key:"componentWillUpdate",value:function(t,n){this.props.friction===t.friction&&this.props.overshootLeft===t.overshootLeft&&this.props.overshootRight===t.overshootRight&&this.props.overshootFriction===t.overshootFriction&&this.state.leftWidth===n.leftWidth&&this.state.rightOffset===n.rightOffset&&this.state.rowWidth===n.rowWidth||this._updateAnimatedEvent(t,n)}},{key:"render",value:function(){var t=this,n=this.state.rowState,s=this.props,l=s.children,p=s.renderLeftActions,h=s.renderRightActions,u=p&&v.default.createElement(c.Animated.View,{style:[A.leftActions,{transform:[{translateX:this._leftActionTranslate}]}]},p(this._showLeftAction,this._transX),v.default.createElement(c.View,{onLayout:function(n){var o=n.nativeEvent;return t.setState({leftWidth:o.layout.x})}})),f=h&&v.default.createElement(c.Animated.View,{style:[A.rightActions,{transform:[{translateX:this._rightActionTranslate}]}]},h(this._showRightAction,this._transX),v.default.createElement(c.View,{onLayout:function(n){var o=n.nativeEvent;return t.setState({rightOffset:o.layout.x})}}));return v.default.createElement(w.PanGestureHandler,(0,o.default)({},this.props,{minDeltaX:10,onGestureEvent:this._onGestureEvent,onHandlerStateChange:this._onHandlerStateChange}),v.default.createElement(c.Animated.View,{onLayout:this._onRowLayout,style:[A.container,this.props.containerStyle]},u,f,v.default.createElement(w.TapGestureHandler,{enabled:0!==n,onHandlerStateChange:this._onTapHandlerStateChange},v.default.createElement(c.Animated.View,{pointerEvents:0===n?'auto':'box-only',style:[{transform:[{translateX:this._transX}]},this.props.childrenContainerStyle]},l))))}}]),n})(v.Component);e.default=_,_.defaultProps={friction:1,overshootFriction:1,useNativeAnimations:!0};var A=c.StyleSheet.create({container:{overflow:'hidden'},leftActions:(0,s.default)({},c.StyleSheet.absoluteFillObject,{flexDirection:'row'}),rightActions:(0,s.default)({},c.StyleSheet.absoluteFillObject,{flexDirection:'row-reverse'})})},428,[346,1,8,44,19,20,27,30,33,47,2,429]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"gestureHandlerRootHOC",{enumerable:!0,get:function(){return S.default}}),Object.defineProperty(e,"Directions",{enumerable:!0,get:function(){return A.default}}),Object.defineProperty(e,"State",{enumerable:!0,get:function(){return X.default}}),e.FlatList=e.BorderlessButton=e.RectButton=e.BaseButton=e.RawButton=e.RotationGestureHandler=e.PinchGestureHandler=e.PanGestureHandler=e.LongPressGestureHandler=e.ForceTouchGestureHandler=e.FlingGestureHandler=e.TapGestureHandler=e.NativeViewGestureHandler=e.DrawerLayoutAndroid=e.ViewPagerAndroid=e.ToolbarAndroid=e.TextInput=e.Switch=e.Slider=e.ScrollView=void 0;var n=t(r(d[1])),f=t(r(d[2])),l=t(r(d[3])),u=t(r(d[4])),o=t(r(d[5])),s=t(r(d[6])),c=t(r(d[7])),p=t(r(d[8])),v=t(r(d[9])),O=r(d[10]),h=t(r(d[11])),y=t(r(d[12])),b=t(r(d[13])),S=t(r(d[14])),A=t(r(d[15])),X=t(r(d[16])),Y=t(r(d[17])),C={id:h.default.string,minPointers:h.default.number,enabled:h.default.bool,waitFor:h.default.oneOfType([h.default.string,h.default.object,h.default.arrayOf(h.default.oneOfType([h.default.string,h.default.object]))]),simultaneousHandlers:h.default.oneOfType([h.default.string,h.default.object,h.default.arrayOf(h.default.oneOfType([h.default.string,h.default.object]))]),shouldCancelWhenOutside:h.default.bool,hitSlop:h.default.oneOfType([h.default.number,h.default.shape({left:h.default.number,top:h.default.number,right:h.default.number,bottom:h.default.number,vertical:h.default.number,horizontal:h.default.number,width:h.default.number,height:h.default.number})]),onGestureEvent:h.default.oneOfType([h.default.func,h.default.object]),onHandlerStateChange:h.default.oneOfType([h.default.func,h.default.object]),onBegan:h.default.func,onFailed:h.default.func,onCancelled:h.default.func,onActivated:h.default.func,onEnded:h.default.func},E=(0,y.default)('NativeViewGestureHandler',(0,p.default)({},C,{shouldActivateOnStart:h.default.bool,disallowInterruption:h.default.bool}));e.NativeViewGestureHandler=E;var T=(0,y.default)('TapGestureHandler',(0,p.default)({},C,{maxDurationMs:h.default.number,maxDelayMs:h.default.number,numberOfTaps:h.default.number,maxDeltaX:h.default.number,maxDeltaY:h.default.number,maxDist:h.default.number,minPointers:h.default.number}),{});e.TapGestureHandler=T;var H=(0,y.default)('FlingGestureHandler',(0,p.default)({},C,{numberOfPointers:h.default.number,direction:h.default.number}),{});e.FlingGestureHandler=H;var w=(function(t){function n(){return(0,l.default)(this,n),(0,o.default)(this,(0,s.default)(n).apply(this,arguments))}return(0,c.default)(n,t),(0,u.default)(n,[{key:"componentDidMount",value:function(){console.warn('ForceTouchGestureHandler is not available on this platform. Please use ForceTouchGestureHandler.forceTouchAvailable to conditionally render other components that would provide a fallback behavior specific to your usecase')}},{key:"render",value:function(){return this.props.children}}]),n})(v.default.Component),G=Y.default.forceTouchAvailable?(0,y.default)('ForceTouchGestureHandler',(0,p.default)({},C,{minForce:h.default.number,maxForce:h.default.number,feedbackOnActivation:h.default.bool}),{}):w;e.ForceTouchGestureHandler=G,G.forceTouchAvailable=Y.default.forceTouchAvailable||!1;var P=(0,y.default)('LongPressGestureHandler',(0,p.default)({},C,{minDurationMs:h.default.number,maxDist:h.default.number}),{});function D(t){var n=(0,p.default)({},t);return void 0!==t.minDeltaX&&(delete n.minDeltaX,n.activeOffsetXStart=-t.minDeltaX,n.activeOffsetXEnd=t.minDeltaX),void 0!==t.maxDeltaX&&(delete n.maxDeltaX,n.failOffsetXStart=-t.maxDeltaX,n.failOffsetXEnd=t.maxDeltaX),void 0!==t.minOffsetX&&(delete n.minOffsetX,t.minOffsetX<0?n.activeOffsetXStart=t.minOffsetX:n.activeOffsetXEnd=t.minOffsetX),void 0!==t.minDeltaY&&(delete n.minDeltaY,n.activeOffsetYStart=-t.minDeltaY,n.activeOffsetYEnd=t.minDeltaY),void 0!==t.maxDeltaY&&(delete n.maxDeltaY,n.failOffsetYStart=-t.maxDeltaY,n.failOffsetYEnd=t.maxDeltaY),void 0!==t.minOffsetY&&(delete n.minOffsetY,t.minOffsetY<0?n.activeOffsetYStart=t.minOffsetY:n.activeOffsetYEnd=t.minOffsetY),void 0!==t.activeOffsetX&&(delete n.activeOffsetX,Array.isArray(t.activeOffsetX)?(n.activeOffsetXStart=t.activeOffsetX[0],n.activeOffsetXEnd=t.activeOffsetX[1]):t.activeOffsetX<0?n.activeOffsetXStart=t.activeOffsetX:n.activeOffsetXEnd=t.activeOffsetX),void 0!==t.activeOffsetY&&(delete n.activeOffsetY,Array.isArray(t.activeOffsetY)?(n.activeOffsetYStart=t.activeOffsetY[0],n.activeOffsetYEnd=t.activeOffsetY[1]):t.activeOffsetY<0?n.activeOffsetYStart=t.activeOffsetY:n.activeOffsetYEnd=t.activeOffsetY),void 0!==t.failOffsetX&&(delete n.failOffsetX,Array.isArray(t.failOffsetX)?(n.failOffsetXStart=t.failOffsetX[0],n.failOffsetXEnd=t.failOffsetX[1]):t.failOffsetX<0?n.failOffsetXStart=t.failOffsetX:n.failOffsetXEnd=t.failOffsetX),void 0!==t.failOffsetY&&(delete n.failOffsetY,Array.isArray(t.failOffsetY)?(n.failOffsetYStart=t.failOffsetY[0],n.failOffsetYEnd=t.failOffsetY[1]):t.failOffsetY<0?n.failOffsetYStart=t.failOffsetY:n.failOffsetYEnd=t.failOffsetY),n}e.LongPressGestureHandler=P;var _=(0,y.default)('PanGestureHandler',(0,p.default)({},C,{activeOffsetY:h.default.oneOfType([h.default.number,h.default.arrayOf(h.default.number)]),activeOffsetX:h.default.oneOfType([h.default.number,h.default.arrayOf(h.default.number)]),failOffsetY:h.default.oneOfType([h.default.number,h.default.arrayOf(h.default.number)]),failOffsetX:h.default.oneOfType([h.default.number,h.default.arrayOf(h.default.number)]),minDist:h.default.number,minVelocity:h.default.number,minVelocityX:h.default.number,minVelocityY:h.default.number,minPointers:h.default.number,maxPointers:h.default.number,avgTouches:h.default.bool}),{},function(t){return D(t)},{activeOffsetYStart:!0,activeOffsetYEnd:!0,activeOffsetXStart:!0,activeOffsetXEnd:!0,failOffsetYStart:!0,failOffsetYEnd:!0,failOffsetXStart:!0,failOffsetXEnd:!0});e.PanGestureHandler=_;var x=(0,y.default)('PinchGestureHandler',C,{});e.PinchGestureHandler=x;var V=(0,y.default)('RotationGestureHandler',C,{});e.RotationGestureHandler=V;var F=new Set(['replaceState','isMounted']),j=(0,p.default)({},E.propTypes,{onGestureHandlerEvent:h.default.func,onGestureHandlerStateChange:h.default.func});function k(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},O=(function(O){function h(){var t,n;(0,l.default)(this,h);for(var f=arguments.length,u=new Array(f),c=0;c=l.length)break;s=l[o++]}else{if((o=l.next()).done)break;s=o.value}var c=s;c.startsWith('_')||c.startsWith('component')||F.has(c)||'function'!=typeof f[c]||void 0!==n[c]||(f[c].prototype?n[c]=f[c].bind(t):n[c]=f[c])}f=Object.getPrototypeOf(f)}},n}return(0,c.default)(h,O),(0,u.default)(h,[{key:"render",value:function(){var l=this,u=Object.keys(this.props).reduce(function(t,n){return n in j&&(t[n]=l.props[n]),t},(0,p.default)({},n));return v.default.createElement(E,u,v.default.createElement(t,(0,f.default)({},this.props,{ref:this._refHandler})))}}]),h})(v.default.Component);return O.propTypes=(0,p.default)({},t.propTypes),O}var B=k(O.ScrollView,{disallowInterruption:!0});e.ScrollView=B;var I=k(O.Slider,{shouldCancelWhenOutside:!1,shouldActivateOnStart:!0,disallowInterruption:!0});e.Slider=I;var L=k(O.Switch,{shouldCancelWhenOutside:!1,shouldActivateOnStart:!0,disallowInterruption:!0});e.Switch=L;var R=k(O.TextInput);e.TextInput=R;var M=k(O.ToolbarAndroid);e.ToolbarAndroid=M;var W=k(O.ViewPagerAndroid,{disallowInterruption:!0});e.ViewPagerAndroid=W;var N=k(O.DrawerLayoutAndroid,{disallowInterruption:!0});e.DrawerLayoutAndroid=N,N.positions=O.DrawerLayoutAndroid.positions,X.default.print=function(t){for(var n=Object.keys(X.default),f=0;f1&&void 0!==arguments[1]?arguments[1]:{},h=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},H=arguments.length>3?arguments[3]:void 0,G=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},E=(function(n){function E(n){var u;if((0,o.default)(this,E),(u=(0,s.default)(this,(0,l.default)(E).call(this,n)))._onGestureHandlerEvent=function(t){t.nativeEvent.handlerTag===u._handlerTag?u.props.onGestureEvent&&u.props.onGestureEvent(t):u.props.onGestureHandlerEvent&&u.props.onGestureHandlerEvent(t)},u._onGestureHandlerStateChange=function(t){if(t.nativeEvent.handlerTag===u._handlerTag){u.props.onHandlerStateChange&&u.props.onHandlerStateChange(t);var n=A[t.nativeEvent.state];'function'==typeof u.props[n]&&u.props[n](t)}else u.props.onGestureHandlerStateChange&&u.props.onGestureHandlerStateChange(t)},u._refHandler=function(t){u._viewNode=t;var n=c.default.Children.only(u.props.children),o=n.ref;null!==o&&('function'==typeof o?o(t):o.current=t)},u._createGestureHandler=function(n){u._config=n,y.createGestureHandler(t,u._handlerTag,n)},u._attachGestureHandler=function(t){u._viewTag=t,y.attachGestureHandler(u._handlerTag,t)},u._updateGestureHandler=function(t){u._config=t,y.updateGestureHandler(u._handlerTag,t)},u._dropGestureHandler=function(){y.dropGestureHandler(u._handlerTag)},u._handlerTag=T++,u._config={},n.id){if(void 0!==C[n.id])throw new Error("Handler with ID \""+n.id+"\" already registered");C[n.id]=u._handlerTag}return u}return(0,p.default)(E,n),(0,u.default)(E,[{key:"componentWillUnmount",value:function(){this._updateEnqueued&&clearImmediate(this._updateEnqueued),this.props.id&&delete C[this.props.id]}},{key:"componentDidMount",value:function(){var t,n,o=this;t=this.props,((n=function(t){return Array.isArray(t)?t.some(function(t){return t&&null===t.current}):t&&null===t.current})(t.simultaneousHandlers)||n(t.waitFor))&&(this._updateEnqueued=setImmediate(function(){o._updateEnqueued=null,o._update()})),this._createGestureHandler(S(H?H(this.props):this.props,(0,f.default)({},this.constructor.propTypes,G),h)),this._attachGestureHandler((0,v.findNodeHandle)(this._viewNode))}},{key:"componentDidUpdate",value:function(){var t=(0,v.findNodeHandle)(this._viewNode);this._viewTag!==t&&this._attachGestureHandler(t),this._update()}},{key:"_update",value:function(){var t=S(H?H(this.props):this.props,(0,f.default)({},this.constructor.propTypes,G),h);(0,_.default)(this._config,t)||this._updateGestureHandler(t)}},{key:"setNativeProps",value:function(t){var n=(0,f.default)({},this.props,t),o=S(H?H(n):n,(0,f.default)({},this.constructor.propTypes,G),h);this._updateGestureHandler(o)}},{key:"render",value:function(){var t=this._onGestureHandlerEvent,n=this.props,o=n.onGestureEvent,u=n.onGestureHandlerEvent;if(o&&'function'!=typeof o){if(u)throw new Error('Nesting touch handlers with native animated driver is not supported yet');t=this.props.onGestureEvent}else if(u&&'function'!=typeof u)throw new Error('Nesting touch handlers with native animated driver is not supported yet');var s=this._onGestureHandlerStateChange,l=this.props,p=l.onHandlerStateChange,h=l.onGestureHandlerStateChange;if(p&&'function'!=typeof p){if(h)throw new Error('Nesting touch handlers with native animated driver is not supported yet');s=this.props.onHandlerStateChange}else if(h&&'function'!=typeof h)throw new Error('Nesting touch handlers with native animated driver is not supported yet');var f=c.default.Children.only(this.props.children),_=f.props.children;return v.Touchable.TOUCH_TARGET_DEBUG&&f.type&&('RNGestureHandlerButton'===f.type||'View'===f.type.name||'View'===f.type.displayName)&&(_=c.default.Children.toArray(_)).push(v.Touchable.renderDebugView({color:'mediumspringgreen',hitSlop:f.props.hitSlop})),c.default.cloneElement(f,{ref:this._refHandler,collapsable:!1,onGestureHandlerEvent:t,onGestureHandlerStateChange:s},_)}}]),E})(c.default.Component);return E.displayName=t,E.propTypes=n,E};var n,o=t(r(d[1])),u=t(r(d[2])),s=t(r(d[3])),l=t(r(d[4])),p=t(r(d[5])),h=t(r(d[6])),f=t(r(d[7])),c=t(r(d[8])),v=r(d[9]),_=t(r(d[10])),H=t(r(d[11])),y=v.NativeModules.RNGestureHandlerModule,G=v.NativeModules.UIManager,E=G.setJSResponder,w=G.clearJSResponder;G.setJSResponder=function(t,n){y.handleSetJSResponder(t,n),E(t,n)},G.clearJSResponder=function(){y.handleClearJSResponder(),w()},G.genericDirectEventTypes=(0,f.default)({},G.genericDirectEventTypes,{onGestureHandlerEvent:{registrationName:'onGestureHandlerEvent'},onGestureHandlerStateChange:{registrationName:'onGestureHandlerStateChange'}});var T=1,C={};function S(t,n){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},u=(0,f.default)({},o);return Object.keys(n).forEach(function(n){var o,s,l=t[n];if(s=n,!(void 0===(o=l)||'function'==typeof o||'object'==typeof o&&'__isNative'in o||'onHandlerStateChange'===s||'onGestureEvent'===s)){var p=t[n];'simultaneousHandlers'===n||'waitFor'===n?p=N(t[n]):'hitSlop'===n&&'object'!=typeof p&&(p={top:p,left:p,bottom:p,right:p}),u[n]=p}}),u}function N(t){return Array.isArray(t)||(t=[t]),t.map(function(t){return C[t]||t.current&&t.current._handlerTag||-1}).filter(function(t){return t>0})}var A=(n={},(0,h.default)(n,H.default.BEGAN,'onBegan'),(0,h.default)(n,H.default.FAILED,'onFailed'),(0,h.default)(n,H.default.CANCELLED,'onCancelled'),(0,h.default)(n,H.default.ACTIVE,'onActivated'),(0,h.default)(n,H.default.END,'onEnded'),n)},430,[1,19,20,27,30,33,45,44,47,2,411,431]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;e.default={UNDETERMINED:0,FAILED:1,BEGAN:2,CANCELLED:3,ACTIVE:4,END:5}},431,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=(0,r(d[0]).requireNativeComponent)('RNGestureHandlerButton',null);e.default=t},432,[2]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){var p=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,s=(function(s){function v(){return(0,n.default)(this,v),(0,l.default)(this,(0,o.default)(v).apply(this,arguments))}return(0,f.default)(v,s),(0,u.default)(v,[{key:"render",value:function(){return c.default.createElement(h,{style:[_.container,p]},c.default.createElement(t,this.props))}}]),v})(c.default.Component);return(0,v.default)(s,t),s};var n=t(r(d[1])),u=t(r(d[2])),l=t(r(d[3])),o=t(r(d[4])),f=t(r(d[5])),p=t(r(d[6])),c=t(r(d[7])),s=r(d[8]),v=t(r(d[9])),y={name:'GestureHandlerRootView',propTypes:(0,p.default)({},s.ViewPropTypes)},h=(0,s.requireNativeComponent)('GestureHandlerRootView',y);var _=s.StyleSheet.create({container:{flex:1}})},433,[1,19,20,27,30,33,44,47,2,405]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=r(d[0]).NativeModules.RNGestureHandlerModule.Direction;e.default=t},434,[2]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=r(d[0]).NativeModules.PlatformConstants;e.default=t},435,[2]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=n(r(d[2])),l=n(r(d[3])),s=n(r(d[4])),u=n(r(d[5])),p=n(r(d[6])),c=n(r(d[7])),w=t(r(d[8])),h=n(r(d[9])),f=r(d[10]),v=r(d[11]),_=.05,S='Idle',y='Dragging',V='Settling',A=(function(t){function n(t,o){var s;(0,l.default)(this,n),(s=(0,u.default)(this,(0,p.default)(n).call(this,t,o)))._accessibilityIsModalView=w.default.createRef(),s._pointerEventsView=w.default.createRef(),s._panGestureHandler=w.default.createRef(),s._drawerShown=!1,s._updateAnimatedEvent=function(t,n){var o=t.drawerPosition,l=t.drawerWidth,u=t.drawerType,p=n.dragX,c=n.touchX,w=n.drawerTranslation,h=n.containerWidth,v=p,_=c;'left'!==o?(v=f.Animated.multiply(new f.Animated.Value(-1),p),_=f.Animated.add(new f.Animated.Value(h),f.Animated.multiply(new f.Animated.Value(-1),c)),c.setValue(h)):c.setValue(0);var S=v;if('front'===u){var y=f.Animated.add(_,f.Animated.multiply(new f.Animated.Value(-1),v)).interpolate({inputRange:[l-1,l,l+1],outputRange:[0,0,1]});S=f.Animated.add(v,y)}s._openValue=f.Animated.add(S,w).interpolate({inputRange:[0,l],outputRange:[0,1],extrapolate:'clamp'}),s._onGestureEvent=f.Animated.event([{nativeEvent:{translationX:p,x:c}}],{useNativeDriver:t.useNativeAnimations})},s._handleContainerLayout=function(t){var n=t.nativeEvent;s.setState({containerWidth:n.layout.width})},s._emitStateChanged=function(t,n){s.props.onDrawerStateChanged&&s.props.onDrawerStateChanged(t,n)},s._openingHandlerStateChange=function(t){var n=t.nativeEvent;n.oldState===v.State.ACTIVE?s._handleRelease(n):n.state===v.State.ACTIVE&&(s._emitStateChanged(y,!1),'on-drag'===s.props.keyboardDismissMode&&f.Keyboard.dismiss(),s.props.hideStatusBar&&f.StatusBar.setHidden(!0,s.props.statusBarAnimation||'slide'))},s._onTapHandlerStateChange=function(t){var n=t.nativeEvent;s._drawerShown&&n.oldState===v.State.ACTIVE&&'locked-open'!==s.props.drawerLockMode&&s.closeDrawer()},s._handleRelease=function(t){var n=s.props,o=n.drawerWidth,l=n.drawerPosition,u=n.drawerType,p=s.state.containerWidth,c=t.translationX,w=t.velocityX,h=t.x;'left'!==l&&(c=-c,h=p-h,w=-w);var f=h-c,v=0;'front'===u&&(v=f>o?f-o:0);var S=c+v+(s._drawerShown?o:0);S+_*w>o/2?s._animateDrawer(S,o,w):s._animateDrawer(S,0,w)},s._updateShowing=function(t){s._drawerShown=t,s._accessibilityIsModalView.current&&s._accessibilityIsModalView.current.setNativeProps({accessibilityViewIsModal:t}),s._pointerEventsView.current&&s._pointerEventsView.current.setNativeProps({pointerEvents:t?'auto':'none'});var n=s.props,o=n.drawerPosition,l=n.minSwipeDistance,u=n.edgeWidth,p='left'===o,c=(p?1:-1)*(s._drawerShown?-1:1),w=p?{left:0,width:t?void 0:u}:{right:0,width:t?void 0:u};s._panGestureHandler.current&&s._panGestureHandler.current.setNativeProps({hitSlop:w,activeOffsetX:c*l})},s._animateDrawer=function(t,n,o){if(s.state.dragX.setValue(0),s.state.touchX.setValue('left'===s.props.drawerPosition?0:s.state.containerWidth),void 0!==t){var l=t;s.props.useNativeAnimations&&(t0?l=Math.min(t+o/60,n):t>n&&o<0&&(l=Math.max(t+o/60,n))),s.state.drawerTranslation.setValue(l)}var u=0!==n;s._updateShowing(u),s._emitStateChanged(V,u),s.props.hideStatusBar&&f.StatusBar.setHidden(u,s.props.statusBarAnimation||'slide'),f.Animated.spring(s.state.drawerTranslation,{velocity:o,bounciness:0,toValue:n,useNativeDriver:s.props.useNativeAnimations}).start(function(t){t.finished&&(s._emitStateChanged(S,u),u?s.props.onDrawerOpen&&s.props.onDrawerOpen():s.props.onDrawerClose&&s.props.onDrawerClose())})},s.openDrawer=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};s._animateDrawer(void 0,s.props.drawerWidth,t.velocity?t.velocity:0),s.forceUpdate()},s.closeDrawer=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};s._animateDrawer(void 0,0,t.velocity?t.velocity:0),s.forceUpdate()},s._renderOverlay=function(){(0,h.default)(s._openValue,'should be set');var t={opacity:s._openValue.interpolate({inputRange:[0,1],outputRange:[0,.7],extrapolate:'clamp'}),backgroundColor:s.props.overlayColor};return w.default.createElement(v.TapGestureHandler,{onHandlerStateChange:s._onTapHandlerStateChange},w.default.createElement(f.Animated.View,{pointerEvents:s._drawerShown?'auto':'none',ref:s._pointerEventsView,style:[C.overlay,t]}))},s._renderDrawer=function(){var t,n=s.props,o=n.drawerBackgroundColor,l=n.drawerWidth,u=n.drawerPosition,p=n.drawerType,c=n.drawerContainerStyle,v=n.contentContainerStyle,_='left'===u,S='back'!==p,y='front'!==p,V=f.I18nManager.isRTL?_:!_,A={backgroundColor:o,width:l},E=s._openValue;((0,h.default)(E,'should be set'),y)&&(t={transform:[{translateX:E.interpolate({inputRange:[0,1],outputRange:_?[0,l]:[0,-l],extrapolate:'clamp'})}]});var b=0;if(S){var D=_?-l:l;b=E.interpolate({inputRange:[0,1],outputRange:[D,0],extrapolate:'clamp'})}var R={transform:[{translateX:b}],flexDirection:V?'row-reverse':'row'};return w.default.createElement(f.Animated.View,{style:C.main,onLayout:s._handleContainerLayout},w.default.createElement(f.Animated.View,{style:['front'===p?C.containerOnBack:C.containerInFront,t,v]},'function'==typeof s.props.children?s.props.children(s._openValue):s.props.children,s._renderOverlay()),w.default.createElement(f.Animated.View,{pointerEvents:"box-none",ref:s._accessibilityIsModalView,accessibilityViewIsModal:s._drawerShown,style:[C.drawerContainer,R,c]},w.default.createElement(f.View,{style:A},s.props.renderNavigationView(s._openValue))))},s._setPanGestureRef=function(t){s._panGestureHandler.current=t,s.props.onGestureRef&&s.props.onGestureRef(t)};var c=new f.Animated.Value(0),A=new f.Animated.Value(0),E=new f.Animated.Value(0);return s.state={dragX:c,touchX:A,drawerTranslation:E,containerWidth:0},s._updateAnimatedEvent(t,s.state),s}return(0,c.default)(n,t),(0,s.default)(n,[{key:"componentWillUpdate",value:function(t,n){this.props.drawerPosition===t.drawerPosition&&this.props.drawerWidth===t.drawerWidth&&this.props.drawerType===t.drawerType&&this.state.containerWidth===n.containerWidth||this._updateAnimatedEvent(t,n)}},{key:"render",value:function(){var t=this.props,n=t.drawerPosition,o=t.drawerLockMode,l=t.edgeWidth,s=t.minSwipeDistance,u='left'===n,p=(u?1:-1)*(this._drawerShown?-1:1),c=u?{left:0,width:this._drawerShown?void 0:l}:{right:0,width:this._drawerShown?void 0:l};return w.default.createElement(v.PanGestureHandler,{ref:this._setPanGestureRef,hitSlop:c,activeOffsetX:p*s,failOffsetY:[-15,15],onGestureEvent:this._onGestureEvent,onHandlerStateChange:this._openingHandlerStateChange,enabled:'locked-closed'!==o&&'locked-open'!==o},this._renderDrawer())}}]),n})(w.Component);e.default=A,A.defaultProps={drawerWidth:200,drawerPosition:'left',useNativeAnimations:!0,drawerType:'front',edgeWidth:20,minSwipeDistance:3,overlayColor:'black',drawerLockMode:'unlocked'},A.positions={Left:'left',Right:'right'};var C=f.StyleSheet.create({drawerContainer:(0,o.default)({},f.StyleSheet.absoluteFillObject,{zIndex:1001,flexDirection:'row'}),containerInFront:(0,o.default)({},f.StyleSheet.absoluteFillObject,{zIndex:1002}),containerOnBack:(0,o.default)({},f.StyleSheet.absoluteFillObject),main:{flex:1,zIndex:0,overflow:'hidden'},overlay:(0,o.default)({},f.StyleSheet.absoluteFillObject,{zIndex:1e3})})},436,[346,1,44,19,20,27,30,33,47,415,2,429]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"TouchableNativeFeedback",{enumerable:!0,get:function(){return u.default}}),Object.defineProperty(e,"TouchableWithoutFeedback",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(e,"TouchableOpacity",{enumerable:!0,get:function(){return c.default}}),Object.defineProperty(e,"TouchableHighlight",{enumerable:!0,get:function(){return o.default}});var u=t(r(d[1])),n=t(r(d[2])),c=t(r(d[3])),o=t(r(d[4]))},437,[1,438,440,441,442]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),o=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=o(r(d[2])),u=o(r(d[3])),n=o(r(d[4])),s=o(r(d[5])),p=o(r(d[6])),f=o(r(d[7])),c=o(r(d[8])),b=o(r(d[9])),y=o(r(d[10])),B=t(r(d[11])),v=o(r(d[12])),P=(function(t){function o(){var t,l;(0,s.default)(this,o);for(var u=arguments.length,n=new Array(u),p=0;p=23},P.defaultProps=(0,l.default)({},y.default.defaultProps,{useForeground:!0,extraButtonProps:{rippleColor:null}}),P.propTypes=(0,l.default)({},y.default.publicPropTypes,{useForeground:v.default.bool,background:v.default.string,style:v.default.object})},438,[346,1,44,8,6,19,20,27,30,33,439,47,59]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),s=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.TOUCHABLE_STATE=void 0;var o=s(r(d[2])),n=s(r(d[3])),u=s(r(d[4])),l=s(r(d[5])),p=s(r(d[6])),T=s(r(d[7])),c=s(r(d[8])),E=t(r(d[9])),f=r(d[10]),h=r(d[11]),S=s(r(d[12])),P={UNDETERMINED:0,BEGAN:1,MOVED_OUTSIDE:2};e.TOUCHABLE_STATE=P;var D={accessible:S.default.bool,accessibilityLabel:S.default.node,accessibilityHint:S.default.string,hitSlop:S.default.shape({top:S.default.number,left:S.default.number,bottom:S.default.number,right:S.default.number}),disabled:S.default.bool,onPress:S.default.func,onPressIn:S.default.func,onPressOut:S.default.func,onLayout:S.default.func,onLongPress:S.default.func,nativeID:S.default.string,testID:S.default.string,delayPressIn:S.default.number,delayPressOut:S.default.number,delayLongPress:S.default.number},v={extraButtonProps:S.default.object,onStateChange:S.default.func},y=(function(t){function s(){var t,o;(0,u.default)(this,s);for(var n=arguments.length,l=new Array(n),c=0;cn.state.index?'box-only':'none';var u=o.__getAnimatedValue()-n.state.index;return Math.abs(u)>_?'box-only':'auto'}}]),P})(f.default.Component)};var n=t(r(d[1])),o=t(r(d[2])),s=t(r(d[3])),u=t(r(d[4])),p=t(r(d[5])),v=t(r(d[6])),f=t(r(d[7])),l=t(r(d[8])),_=.01;var c=(function(){function t(n,s){(0,o.default)(this,t),this._value=n,this._token=n.addListener(s)}return(0,s.default)(t,[{key:"remove",value:function(){this._value.removeListener(this._token)}}]),t})()},444,[1,8,19,20,27,30,33,47,445]); -__d(function(g,r,i,a,m,e,d){'use strict';Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(n,o,t,f,u,s,l,c){if(void 0===o)throw new Error('invariant requires an error message argument');if(!n){var v;if(void 0===o)v=new Error('Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.');else{var w=[t,f,u,s,l,c],h=0;(v=new Error(o.replace(/%s/g,function(){return w[h++]}))).name='Invariant Violation'}throw v.framesToPop=1,v}}},445,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n,o=t(r(d[1])),l=t(r(d[2])),s=t(r(d[3])),u=t(r(d[4])),f=t(r(d[5])),c=t(r(d[6])),p=t(r(d[7])),h=t(r(d[8])),y=t(r(d[9])),k=t(r(d[10])),v=r(d[11]),S=r(d[12]),b=t(r(d[13])),C=t(r(d[14])),_=t(r(d[15])),w=t(r(d[16])),T='ios'===v.Platform.OS?44:56,L='ios'===v.Platform.OS?20:0,x='ios'===v.Platform.OS?70:56,B='ios'===v.Platform.OS?20:56,I=function(t,n,o,l){if('left'===t){var s={left:B,right:B};return o||(s.left=0),l||(s.right=0),s}if('center'===t){var u={left:x,right:x};return o||l||(u.left=0,u.right=0),u}},V=function(t){return'ios'===v.Platform.OS?t&&!v.Platform.isPad?32:44:56},P=(function(t){function n(){var t,o;(0,f.default)(this,n);for(var l=arguments.length,c=new Array(l),y=0;y2?null:this._renderSubView((0,u.default)({},t,{style:v.StyleSheet.absoluteFill}),'background',function(){return l.headerBackground},this.props.backgroundInterpolator)}},{key:"_renderModularSubView",value:function(t,n,o,l,s){var f=this,c=t.scene,p=c.index,h=c.isStale,y=c.key;if(0!==p){var S=this.props.navigation.state.index-p;if(Math.abs(S)>2)return null;var b=o(t,function(n){var o=n.children;return k.default.createElement(v.Animated.View,{style:[s((0,u.default)({},f.props,t))]},o)},function(n){var o=n.children;return k.default.createElement(v.Animated.View,{style:[l((0,u.default)({},f.props,t))]},o)});if(null===b)return b;var C=0!==S||h?'none':'box-none';return k.default.createElement(v.View,{key:n+"_"+y,pointerEvents:C,style:[A.item,A[n],t.style]},b)}}},{key:"_renderSubView",value:function(t,n,o,l){var s=t.scene,f=s.index,c=s.isStale,p=s.key,h=this.props.navigation.state.index-f;if(Math.abs(h)>2)return null;var y=o(t);if(null==y)return null;var S=0!==h||c?'none':'box-none';return k.default.createElement(v.Animated.View,{pointerEvents:S,key:n+"_"+p,style:[A.item,A[n],t.style,l((0,u.default)({},this.props,t))]},y)}},{key:"_renderHeader",value:function(t){var n=t.scene.descriptor.options;if(null===n.header)return null;var o=this._renderLeft(t),s=this._renderRight(t),u=this._renderTitle(t,{hasLeftComponent:!!o,hasRightComponent:!!s,headerTitleContainerStyle:n.headerTitleContainerStyle}),f=this.props.transitionPreset,c={style:A.header,key:"scene_"+t.scene.key};return n.headerLeft||n.headerBackImage||'ios'!==v.Platform.OS||'uikit'!==f?k.default.createElement(v.View,c,u,o,s):k.default.createElement(v.MaskedViewIOS,(0,l.default)({},c,{maskElement:k.default.createElement(v.View,{style:A.iconMaskContainer},k.default.createElement(v.Image,{source:r(d[17]),style:A.iconMask}),k.default.createElement(v.View,{style:A.iconMaskFillerRect}))}),u,o,s)}},{key:"render",value:function(){var t,n,l=this,s=this.props,u=s.mode,f=s.scene,c=s.isLandscape;if('float'===u){var p={};this.props.scenes.forEach(function(t){p[t.index]=t});var h=Object.values(p).map(function(t){return{position:l.props.position,scene:t}});t=h.map(this._renderHeader,this),n=h.map(this._renderBackground,this)}else{var y={position:new v.Animated.Value(this.props.scene.index),scene:this.props.scene};t=this._renderHeader(y),n=this._renderBackground(y)}var b=f.descriptor.options,C=b.headerStyle,_=void 0===C?{}:C,w=v.StyleSheet.flatten(_),T=V(c),L=(w.alignItems,w.justifyContent,w.flex,w.flexDirection,w.flexGrow,w.flexShrink,w.flexBasis,w.flexWrap,w.position,w.padding,w.paddingHorizontal,w.paddingRight,w.paddingLeft,w.top,w.right,w.bottom,w.left,(0,o.default)(w,["alignItems","justifyContent","flex","flexDirection","flexGrow","flexShrink","flexBasis","flexWrap","position","padding","paddingHorizontal","paddingRight","paddingLeft","top","right","bottom","left"])),x=[b.headerTransparent?A.transparentContainer:A.container,{height:T},L],B=b.headerForceInset||{top:'always',bottom:'never',horizontal:'always'};return k.default.createElement(v.Animated.View,{style:[this.props.layoutInterpolator(this.props),'ios'!==v.Platform.OS||b.headerTransparent?null:{backgroundColor:L.backgroundColor||E}]},k.default.createElement(S.SafeAreaView,{forceInset:B,style:x},n,k.default.createElement(v.View,{style:A.flexOne},t)))}}],[{key:"HEIGHT",get:function(){return T+L}}]),n})(k.default.PureComponent);P.defaultProps={layoutInterpolator:w.default.forLayout,leftInterpolator:w.default.forLeft,leftButtonInterpolator:w.default.forLeftButton,leftLabelInterpolator:w.default.forLeftLabel,titleFromLeftInterpolator:w.default.forCenterFromLeft,titleInterpolator:w.default.forCenter,rightInterpolator:w.default.forRight,backgroundInterpolator:w.default.forBackground},n='ios'===v.Platform.OS?{borderBottomWidth:v.StyleSheet.hairlineWidth,borderBottomColor:'#A7A7AA'}:{elevation:4};var E='#FFF',A=v.StyleSheet.create({container:(0,u.default)({backgroundColor:E},n),transparentContainer:(0,u.default)({position:'absolute',top:0,left:0,right:0},n,{borderBottomWidth:0,borderBottomColor:'transparent',elevation:0}),header:(0,u.default)({},v.StyleSheet.absoluteFillObject,{flexDirection:'row'}),item:{backgroundColor:'transparent'},iconMaskContainer:{flex:1,flexDirection:'row',justifyContent:'center'},iconMaskFillerRect:{flex:1,backgroundColor:'#d8d8d8',marginLeft:-5},iconMask:{height:23,width:14.5,marginLeft:8.5,marginTop:-2.5,alignSelf:'center',resizeMode:'contain',transform:[{scaleX:v.I18nManager.isRTL?-1:1}]},title:{bottom:0,top:0,position:'absolute',alignItems:'center',flexDirection:'row'},left:{left:0,bottom:0,top:0,position:'absolute',alignItems:'center',flexDirection:'row'},right:{right:0,bottom:0,top:0,position:'absolute',flexDirection:'row',alignItems:'center'},flexOne:{flex:1}}),M=(0,S.withOrientation)(P);e.default=M},446,[1,6,8,45,44,19,20,27,30,33,47,2,349,447,448,452,453,455]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=t(r(d[1])),o=t(r(d[2])),n=t(r(d[3])),f=r(d[4]),u=f.Animated.Text,s=f.StyleSheet.create({title:{fontSize:'ios'===f.Platform.OS?17:20,fontWeight:'ios'===f.Platform.OS?'600':'500',color:'rgba(0, 0, 0, .9)',marginHorizontal:16}}),c=function(t){var f=t.style,c=(0,o.default)(t,["style"]);return n.default.createElement(u,(0,l.default)({numberOfLines:1},c,{style:[s.title,f],accessibilityTraits:"header"}))};e.default=c},447,[1,8,6,47,2]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(r(d[1])),l=t(r(d[2])),o=t(r(d[3])),s=t(r(d[4])),c=t(r(d[5])),u=t(r(d[6])),f=t(r(d[7])),h=r(d[8]),b=t(r(d[9])),p=t(r(d[10])),y=(function(t){function y(){var t,n;(0,l.default)(this,y);for(var o=arguments.length,u=new Array(o),f=0;fl?s:o:s},n}return(0,u.default)(y,t),(0,o.default)(y,[{key:"_renderBackImage",value:function(){var t,l,o=this.props,s=o.backImage,c=o.backTitleVisible,u=o.tintColor,b=this._getTitleText();return f.default.isValidElement(s)?s:(s?(t=s,l={tintColor:u,title:b}):(t=h.Image,l={style:[T.icon,!!c&&T.iconWithTitle,!!u&&{tintColor:u}],source:p.default}),f.default.createElement(t,(0,n.default)({},l,{fadeDuration:0})))}},{key:"_maybeRenderTitle",value:function(){var t=this.props,n=t.backTitleVisible,l=t.titleStyle,o=t.tintColor,s=this._getTitleText();return n&&null!==s?f.default.createElement(h.Text,{accessible:!1,onLayout:this._onTextLayout,style:[T.title,!!o&&{color:o},l],numberOfLines:1},this._getTitleText()):null}},{key:"render",value:function(){var t=this.props,n=t.onPress,l=t.pressColorAndroid,o=t.title,s=f.default.createElement(b.default,{accessible:!0,accessibilityRole:"button",accessibilityComponentType:"button",accessibilityLabel:o?o+", back":'Go back',accessibilityTraits:"button",testID:"header-back",delayPressIn:0,onPress:n,pressColor:l,style:T.container,borderless:!0},f.default.createElement(h.View,{style:T.container},this._renderBackImage(),this._maybeRenderTitle()));return'android'===h.Platform.OS?f.default.createElement(h.View,{style:T.androidButtonWrapper},s):s}}]),y})(f.default.PureComponent);y.defaultProps={pressColorAndroid:'rgba(0, 0, 0, .32)',tintColor:h.Platform.select({ios:'#037aff'}),truncatedTitle:'Back'};var T=h.StyleSheet.create({androidButtonWrapper:{margin:13,backgroundColor:'transparent'},container:{alignItems:'center',flexDirection:'row',backgroundColor:'transparent'},title:{fontSize:17,paddingRight:10},icon:'ios'===h.Platform.OS?{backgroundColor:'transparent',height:21,width:13,marginLeft:9,marginRight:22,marginVertical:12,resizeMode:'contain',transform:[{scaleX:h.I18nManager.isRTL?-1:1}]}:{height:24,width:24,margin:3,resizeMode:'contain',backgroundColor:'transparent',transform:[{scaleX:h.I18nManager.isRTL?-1:1}]},iconWithTitle:'ios'===h.Platform.OS?{marginRight:6}:{}}),v=y;e.default=v},448,[1,8,19,20,27,30,33,47,2,449,451]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=t(r(d[1])),o=t(r(d[2])),s=t(r(d[3])),u=t(r(d[4])),n=t(r(d[5])),p=t(r(d[6])),f=t(r(d[7])),h=t(r(d[8])),c=r(d[9]),b=t(r(d[10])),y=(function(t){function y(){return(0,s.default)(this,y),(0,n.default)(this,(0,p.default)(y).apply(this,arguments))}return(0,f.default)(y,t),(0,u.default)(y,[{key:"render",value:function(){if('android'===c.Platform.OS&&c.Platform.Version>=21){var t=this.props,s=t.style,u=(0,o.default)(t,["style"]);return h.default.createElement(c.TouchableNativeFeedback,(0,l.default)({},u,{style:null,background:c.TouchableNativeFeedback.Ripple(this.props.pressColor,this.props.borderless)}),h.default.createElement(c.View,{style:s},h.default.Children.only(this.props.children)))}return'ios'===c.Platform.OS?h.default.createElement(b.default,(0,l.default)({hitSlop:{top:10,bottom:10,right:10,left:10},disallowInterruption:!0},this.props),this.props.children):h.default.createElement(c.TouchableOpacity,this.props,this.props.children)}}]),y})(h.default.Component);e.default=y,y.defaultProps={borderless:!1,pressColor:'rgba(0, 0, 0, .32)'}},449,[1,8,6,19,20,27,30,33,47,2,450]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(r(d[1])),o=t(r(d[2])),s=t(r(d[3])),l=t(r(d[4])),u=t(r(d[5])),p=t(r(d[6])),c=t(r(d[7])),f=t(r(d[8])),h=t(r(d[9])),v=t(r(d[10])),y=r(d[11]),A=r(d[12]),_=y.Animated.createAnimatedComponent(A.BaseButton),C=(function(t){function n(t){var o;return(0,l.default)(this,n),(o=(0,p.default)(this,(0,c.default)(n).call(this,t)))._onActiveStateChange=function(t){'android'!==y.Platform.OS&&y.Animated.spring(o._opacity,{stiffness:1e3,damping:500,mass:3,overshootClamping:!0,restDisplacementThreshold:.01,restSpeedThreshold:.01,toValue:t?o.props.activeOpacity:1,useNativeDriver:!0}).start(),o.props.onActiveStateChange&&o.props.onActiveStateChange(t)},o._opacity=new y.Animated.Value(1),o}return(0,f.default)(n,t),(0,u.default)(n,[{key:"render",value:function(){var t=this.props,n=t.children,l=t.style,u=(0,s.default)(t,["children","style"]);return h.default.createElement(_,(0,o.default)({},u,{onActiveStateChange:this._onActiveStateChange,style:[l,'ios'===y.Platform.OS&&{opacity:this._opacity}]}),n)}}]),n})(h.default.Component);e.default=C,C.propTypes=(0,n.default)({},A.BaseButton.propTypes,{borderless:v.default.bool}),C.defaultProps={activeOpacity:.3,borderless:!0}},450,[1,44,8,6,19,20,27,30,33,47,59,2,427]); -__d(function(g,r,i,a,m,e,d){m.exports=r(d[0]).registerAsset({__packager_asset:!0,httpServerLocation:"/assets/node_modules/react-navigation-stack/src/views/assets",width:24,height:24,scales:[1,1.5,2,3,4],hash:"a364dc7a784101f7c8f6791c7b4514ce",name:"back-icon",type:"png"})},451,[166]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(r(d[1])),l=t(r(d[2])),o=t(r(d[3])),s=t(r(d[4])),u=t(r(d[5])),c=t(r(d[6])),f=r(d[7]),h=t(r(d[8])),y=t(r(d[9])),b=(function(t){function b(){var t,l;(0,n.default)(this,b);for(var u=arguments.length,c=new Array(u),f=0;fn?s:o.length>8?s:o:s},l}return(0,u.default)(b,t),(0,l.default)(b,[{key:"_renderBackImage",value:function(){var t,n,l=this.props,o=l.backImage,s=l.backTitleVisible,u=l.tintColor;return c.default.isValidElement(o)?o:(o?(t=o,n={tintColor:u}):(t=f.Image,n={style:[p.icon,!!s&&p.iconWithTitle,!!u&&{tintColor:u}],source:y.default}),c.default.createElement(t,n))}},{key:"_maybeRenderTitle",value:function(){var t=this.props,n=t.backTitleVisible,l=t.titleStyle,o=t.tintColor,s=this._getTitleText();if(!n||null===s)return null;var u=this.props.LabelContainerComponent;return c.default.createElement(u,null,c.default.createElement(f.Text,{accessible:!1,onLayout:this._onTextLayout,style:[p.title,!!o&&{color:o},l],numberOfLines:1},this._getTitleText()))}},{key:"render",value:function(){var t=this.props,n=t.onPress,l=t.title,o=this.props.ButtonContainerComponent;return c.default.createElement(h.default,{accessibilityComponentType:"button",accessibilityLabel:l?l+", back":'Go back',accessibilityTraits:"button",testID:"header-back",delayPressIn:0,onPress:n,style:p.container,borderless:!0},c.default.createElement(f.View,{style:p.container},c.default.createElement(o,null,this._renderBackImage()),this._maybeRenderTitle()))}}]),b})(c.default.PureComponent);b.defaultProps={tintColor:'#037aff',truncatedTitle:'Back'};var p=f.StyleSheet.create({container:{alignItems:'center',flexDirection:'row',backgroundColor:'transparent',marginBottom:1,overflow:'visible'},title:{fontSize:17,paddingRight:10},icon:{height:21,width:12,marginLeft:9,marginRight:22,marginVertical:12,resizeMode:'contain',transform:[{scaleX:f.I18nManager.isRTL?-1:1}]},iconWithTitle:{marginRight:3}}),T=b;e.default=T},452,[1,19,20,27,30,33,47,2,449,451]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=r(d[1]),o=t(r(d[2]));function u(t){return!t||null!==t.descriptor.options.header}var s=function(t,n,o,s){return{inputRange:[n,n+.001,o-.9,o-.2,o,s-.001,s],outputRange:[0,u(t[n])?0:1,u(t[n])?0:1,u(t[n])?.3:1,u(t[o])?1:0,u(t[s])?0:1,0],extrapolate:'clamp'}};function p(t){return!t[t.length-1].isActive}var f=n.Dimensions.get('window').width/2-70-25;var c=n.Dimensions.get('window').width/2-70+25;var l={opacity:1},v={opacity:0};function R(t){var n=t.navigation,o=t.scene;return n.state.index===o.index?l:v}var x=n.Dimensions.get('window').width;var y={forLayout:function(t){var s=t.layout,f=t.position,c=t.scene,l=t.scenes;if('float'!==t.mode)return{};var v=p(l),R=(0,o.default)(t);if(!R)return{};var x=R.first,y=R.last,h=c.index,w=s.initWidth||n.Dimensions.get('window').width;if(v&&!u(l[h])&&!u(l[y])||!v&&!u(l[x])&&!u(l[h]))return{transform:[{translateX:w}]};var L=n.I18nManager.isRTL?-1:1;return{transform:[{translateX:f.interpolate({inputRange:[x,h,y],outputRange:[L*(u(l[x])?0:w),L*(u(l[h])?0:v?w:-w),L*(u(l[y])?0:-w)],extrapolate:'clamp'})}]}},forLeft:function(t){var n=t.position,u=t.scene,p=t.scenes,f=(0,o.default)(t);if(!f)return{opacity:0};var c=f.first,l=f.last,v=u.index;return{opacity:n.interpolate(s(p,c,v,l))}},forLeftButton:function(t){var n=t.position,s=t.scene,p=t.scenes,f=(0,o.default)(t);if(!f)return{opacity:0};var c=f.first,l=f.last,v=s.index,R=[c,c+.001,c+Math.abs(v-c)/2,v,l-Math.abs(l-v)/2,l-.001,l],x=[0,u(p[c])?0:1,u(p[c])?.3:1,u(p[v])?1:0,u(p[l])?.3:1,u(p[l])?0:1,0];return{opacity:n.interpolate({inputRange:R,outputRange:x,extrapolate:'clamp'})}},forLeftLabel:function(t){var s=t.position,p=t.scene,c=t.scenes,l=(0,o.default)(t);if(!l)return{opacity:0};var v=l.first,R=l.last,x=p.index,y=f;return{opacity:s.interpolate({inputRange:[v,v+.001,x-.35,x,x+.5,R-.001,R],outputRange:[0,u(c[v])?0:1,u(c[v])?0:1,u(c[x])?1:0,u(c[R])?.5:1,u(c[R])?0:1,0],extrapolate:'clamp'}),transform:[{translateX:s.interpolate({inputRange:[v,v+.001,x,R-.001,R],outputRange:n.I18nManager.isRTL?[1.5*-y,u(c[v])?1.5*-y:0,0,u(c[R])?y:0,y]:[y,u(c[v])?y:0,0,u(c[R])?1.5*-y:0,1.5*-y],extrapolate:'clamp'})}]}},forCenterFromLeft:function(t){var s=t.position,p=t.scene,f=t.scenes,l=(0,o.default)(t);if(!l)return{opacity:0};var v=l.first,R=l.last,x=p.index,y=c;return{opacity:s.interpolate({inputRange:[v,v+.001,x-.5,x,x+.7,R-.001,R],outputRange:[0,u(f[v])?0:1,u(f[v])?0:1,u(f[x])?1:0,u(f[R])?0:1,u(f[R])?0:1,0],extrapolate:'clamp'}),transform:[{translateX:s.interpolate({inputRange:[v,v+.001,x,R-.001,R],outputRange:n.I18nManager.isRTL?[-y,u(f[v])?-y:0,0,u(f[R])?y:0,y]:[y,u(f[v])?y:0,0,u(f[R])?-y:0,-y],extrapolate:'clamp'})}]}},forCenter:function(t){var n=t.position,u=t.scene,p=t.scenes,f=(0,o.default)(t);if(!f)return{opacity:0};var c=f.first,l=f.last,v=u.index;return{opacity:n.interpolate(s(p,c,v,l))}},forRight:function(t){var n=t.position,u=t.scene,p=t.scenes,f=(0,o.default)(t);if(!f)return{opacity:0};var c=f.first,l=f.last,v=u.index;return{opacity:n.interpolate(s(p,c,v,l))}},forBackground:R,forBackgroundWithInactiveHidden:R,forBackgroundWithFade:function(t){var n=t.position,u=t.scene,s=(0,o.default)(t);return s?{opacity:n.interpolate({inputRange:[s.first,u.index,s.last],outputRange:[0,1,0],extrapolate:'clamp'})}:{opacity:0}},forBackgroundWithTranslation:function(t){var u=t.position,s=t.scene,p=(0,o.default)(t);if(!p)return{opacity:0};var f=p.first,c=p.last,l=s.index,v=[x,0,-x];return{transform:[{translateX:u.interpolate({inputRange:[f,l,c],outputRange:n.I18nManager.isRTL?v.reverse():v,extrapolate:'clamp'})}]}}};e.default=y},453,[1,2,454]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=function(n){var t=n.scene,f=n.scenes,s=t.index,u=f.length-1;if(!f[u].isActive){var l=f.findIndex(function(n){return n===t}),c=f.findIndex(function(n){return n.isActive}),o=f[c].index,v=f[u].index;return s!==o&&l===u?{first:Math.min(o,s-1),last:s+1}:s===o&&l===c?{first:s-1,last:Math.max(v,s+1)}:s===o||l>c?null:{first:s-1,last:s+1}}return{first:s-1,last:s+1}};e.default=n},454,[]); -__d(function(g,r,i,a,m,e,d){m.exports=r(d[0]).registerAsset({__packager_asset:!0,httpServerLocation:"/assets/node_modules/react-navigation-stack/src/views/assets",width:50,height:85,scales:[1],hash:"6165c9d7a2e729ba57b23dd93add5366",name:"back-icon-mask",type:"png"})},455,[166]); -__d(function(g,r,i,a,m,e,d){var n=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t,o=n(r(d[1])),s=r(d[2]),l=n(r(d[3])),u={transitionSpec:t=(0,r(d[4]).supportsImprovedSpringAnimation)()?{timing:s.Animated.spring,stiffness:1e3,damping:500,mass:3,overshootClamping:!0,restDisplacementThreshold:.01,restSpeedThreshold:.01}:{duration:500,easing:s.Easing.bezier(.2833,.99,.31833,.99),timing:s.Animated.timing},screenInterpolator:l.default.forHorizontal,containerStyle:{backgroundColor:'#eee'}},f={transitionSpec:t,screenInterpolator:l.default.forVertical,containerStyle:{backgroundColor:'#eee'}},p={transitionSpec:{duration:350,easing:s.Easing.out(s.Easing.poly(5)),timing:s.Animated.timing},screenInterpolator:l.default.forFadeFromBottomAndroid},c={transitionSpec:{duration:150,easing:s.Easing.in(s.Easing.linear),timing:s.Animated.timing},screenInterpolator:l.default.forFadeToBottomAndroid};function S(n,t,o){return'android'===s.Platform.OS?t&&n.index=50||0===t&&0===s}return!1}},458,[2]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=t(r(d[1])).default.createContext(null);e.default=l},459,[1,47]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(n,t,u){if(tu)return u;return t}},460,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(r(d[1])),s=t(r(d[2])),o=t(r(d[3])),u=t(r(d[4])),p=t(r(d[5])),l=t(r(d[6])),c=t(r(d[7])),f=t(r(d[8])),v=r(d[9]),h=t(r(d[10])),_=t(r(d[11])),T={duration:250,easing:v.Easing.inOut(v.Easing.ease),timing:v.Animated.timing},P=(function(t){function h(t,u){var c;(0,o.default)(this,h),(c=(0,p.default)(this,(0,l.default)(h).call(this,t,u)))._computeScenes=function(t,n){var s=(0,_.default)(c.state.scenes,n.navigation.state,t.navigation.state,n.descriptors);if(n.navigation.state.isTransitioning||(s=S(s)),n.screenProps!==c.props.screenProps&&c.setState({nextScenes:s}),s!==c.state.scenes)return s},c._onLayout=function(t){var n=t.nativeEvent.layout,o=n.height,u=n.width;if(c.state.layout.initWidth!==u||c.state.layout.initHeight!==o){var p=(0,s.default)({},c.state.layout,{initHeight:o,initWidth:u,isMeasured:!0});p.height.setValue(o),p.width.setValue(u);var l=(0,s.default)({},c.state,{layout:p});c._transitionProps=x(c.props,l),c.setState(l)}},c._onTransitionEnd=function(){if(c._isMounted){var t=c._prevTransitionProps;c._prevTransitionProps=null;var o=S(c.state.scenes),u=(0,s.default)({},c.state,{scenes:o});c._transitionProps=x(c.props,u),c.setState(u,function(){var s,o;return n.default.async(function(u){for(;;)switch(u.prev=u.next){case 0:if(!c.props.onTransitionEnd){u.next=5;break}if(!((s=c.props.onTransitionEnd(c._transitionProps,t))instanceof Promise)){u.next=5;break}return u.next=5,n.default.awrap(s);case 5:c._queuedTransition?(o=c._queuedTransition.prevProps,c._queuedTransition=null,c._startTransition(o,c.props)):c._isTransitionRunning=!1;case 6:case"end":return u.stop()}},null,this)})}};var f={height:new v.Animated.Value(0),initHeight:0,initWidth:0,isMeasured:!1,width:new v.Animated.Value(0)},T=new v.Animated.Value(c.props.navigation.state.index);return c._positionListener=T.addListener(function(){}),c.state={layout:f,position:T,scenes:(0,_.default)([],c.props.navigation.state,null,c.props.descriptors)},c._prevTransitionProps=null,c._transitionProps=x(t,c.state),c._isMounted=!1,c._isTransitionRunning=!1,c._queuedTransition=null,c}return(0,c.default)(h,t),(0,u.default)(h,[{key:"componentDidMount",value:function(){this._isMounted=!0}},{key:"componentWillUnmount",value:function(){this._isMounted=!1,this._positionListener&&this.state.position.removeListener(this._positionListener)}},{key:"componentWillReceiveProps",value:function(t){this._isTransitionRunning?this._queuedTransition||(this._queuedTransition={prevProps:this.props}):this._startTransition(this.props,t)}},{key:"_startTransition",value:function(t,o){var u=this,p=t.navigation.state.index!==o.navigation.state.index,l=this._computeScenes(t,o);if(!l)return this._prevTransitionProps=this._transitionProps,this.state.position.setValue(t.navigation.state.index),void this._onTransitionEnd();var c=(0,s.default)({},this.state,{scenes:l}),f=c.position,v=o.navigation.state.index;this._prevTransitionProps=this._transitionProps,this._transitionProps=x(o,c);var h=this._transitionProps.navigation.state.isTransitioning;h&&p?h&&(this._isTransitionRunning=!0,this.setState(c,function(){var t,l,c,h,_;return n.default.async(function(P){for(;;)switch(P.prev=P.next){case 0:if(!o.onTransitionStart){P.next=5;break}if(!((t=o.onTransitionStart(u._transitionProps,u._prevTransitionProps))instanceof Promise)){P.next=5;break}return P.next=5,n.default.awrap(t);case 5:l=o.configureTransition?o.configureTransition(u._transitionProps,u._prevTransitionProps):null,c=(0,s.default)({},T,l),h=c.timing,delete c.timing,_=f.__getValue()!==v,p&&_?h(f,(0,s.default)({},c,{toValue:o.navigation.state.index})).start(function(){requestAnimationFrame(u._onTransitionEnd)}):u._onTransitionEnd();case 11:case"end":return P.stop()}},null,this)})):this.setState(c,function(){var t;return n.default.async(function(s){for(;;)switch(s.prev=s.next){case 0:if(!o.onTransitionStart){s.next=5;break}if(!((t=o.onTransitionStart(u._transitionProps,u._prevTransitionProps))instanceof Promise)){s.next=5;break}return s.next=5,n.default.awrap(t);case 5:p&&f.setValue(v),u._onTransitionEnd();case 7:case"end":return s.stop()}},null,this)})}},{key:"render",value:function(){return f.default.createElement(v.View,{onLayout:this._onLayout,style:k.main},this.props.render(this._transitionProps,this._prevTransitionProps))}}]),h})(f.default.Component);function x(t,n){var s=t.navigation,o=t.options,u=n.layout,p=n.position,l=n.scenes,c=l.find(w);return(0,h.default)(c,'Could not find active scene'),{layout:u,navigation:s,position:p,scenes:l,scene:c,options:o,index:c.index}}function y(t){return!t.isStale}function S(t){var n=t.filter(y);return n.length===t.length?t:n}function w(t){return t.isActive}var k=v.StyleSheet.create({main:{flex:1}}),E=P;e.default=E},461,[1,139,44,19,20,27,30,33,47,2,445,462]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,u,c,v){if(t.forEach(function(t){var n=t.route;v&&v[n.key]&&(t.descriptor=v[n.key])}),c===u)return t;var h=new Map,y=new Map,k=new Map;t.forEach(function(t){var n=t.key;t.isStale&&k.set(n,t),h.set(n,t)});var x=new Set,p=u.routes;p.length>u.index+1&&(console.warn('StackRouter provided invalid state, index should always be the top route'),p=u.routes.slice(0,u.index+1));if(p.forEach(function(t,n){var u=s+t.key,c={index:n,isActive:!1,isStale:!1,key:u,route:t,descriptor:v&&v[t.key]};(0,o.default)(!x.has(u),"navigation.state.routes["+n+"].key \""+u+"\" conflicts with another route!"),x.add(u),k.has(u)&&k.delete(u),y.set(u,c)}),c){var w=c.routes;w.length>c.index+1&&(console.warn('StackRouter provided invalid state, index should always be the top route'),w=w.slice(0,c.index+1)),w.forEach(function(n,o){var u=s+n.key;if(!y.has(u)){var c=t.find(function(t){return t.route.key===n.key}),l=c?c.descriptor:v[n.key];l&&k.set(u,{index:o,isActive:!1,isStale:!0,key:u,route:n,descriptor:l})}})}var S=[],E=function(t){var n=t.key,o=h.has(n)?h.get(n):null;o&&f(o,t)?S.push(o):S.push(t)};k.forEach(E),y.forEach(E),S.sort(l);var A=0;if(S.forEach(function(t,o){var s=!t.isStale&&t.index===u.index;s!==t.isActive&&(S[o]=(0,n.default)({},t,{isActive:s})),s&&A++}),(0,o.default)(1===A,'there should always be only one scene active, not %s.',A),S.length!==t.length)return S;if(S.some(function(n,o){return!f(t[o],n)}))return S;return t};var n=t(r(d[1])),o=t(r(d[2])),u=t(r(d[3])),s='scene_';function c(t,n){var o=t.length-n.length;return o>0?1:o<0?-1:t>n?1:-1}function l(t,n){return t.index>n.index?1:t.index0?s.dispatch(v.StackActions.popToTop({key:o.key})):s.emit('refocus'):n._jumpTo(o.routeName)}},n._handleTabPress=function(t){var o=t.route;n._isTabPress=!0;var s=n.props.descriptors,u=s[o.key],p=u.navigation,c=u.options,l=n._makeDefaultHandler({route:o,navigation:p});c.tabBarOnPress?c.tabBarOnPress({navigation:p,defaultHandler:l}):l()},n._handleTabLongPress=function(t){var o=t.route,s=n.props.descriptors,u=s[o.key],p=u.navigation,c=u.options,l=n._makeDefaultHandler({route:o,navigation:p});c.tabBarOnLongPress?c.tabBarOnLongPress({navigation:p,defaultHandler:l}):l()},n._handleIndexChange=function(t){n._isTabPress?n._isTabPress=!1:n._jumpTo(n.props.navigation.state.routes[t].routeName)},n._handleSwipeStart=function(){n.setState({isSwiping:!0})},n._handleSwipeEnd=function(){n.setState({isSwiping:!1})},n._jumpTo=function(t){return n.props.navigation.dispatch(v.NavigationActions.navigate({routeName:t}))},n._isTabPress=!1,n}return(0,f.default)(_,n),(0,p.default)(_,[{key:"render",value:function(){var n=this.props,u=n.descriptors,p=n.navigation,c=n.screenProps,l=p.state,f=l.routes[l.index],v=u[f.key],_=(0,s.default)({},this.props.navigationConfig,v.options);return b.createElement(t,(0,o.default)({},_,{getLabelText:this._getLabelText,getButtonComponent:this._getButtonComponent,getAccessibilityLabel:this._getAccessibilityLabel,getTestID:this._getTestID,renderIcon:this._renderIcon,renderScene:this._renderScene,onIndexChange:this._handleIndexChange,onTabPress:this._handleTabPress,onTabLongPress:this._handleTabLongPress,navigation:p,descriptors:u,screenProps:c}))}}]),_})(b.Component);return function(t){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=(0,v.TabRouter)(t,o);return(0,v.createNavigator)(n,s,o)}};var o=n(r(d[2])),s=n(r(d[3])),u=n(r(d[4])),p=n(r(d[5])),c=n(r(d[6])),l=n(r(d[7])),f=n(r(d[8])),b=t(r(d[9])),v=r(d[10])},466,[346,1,8,44,19,20,27,30,33,47,352]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=t(r(d[1])),n=t(r(d[2])),l=t(r(d[3])),s=t(r(d[4])),u=t(r(d[5])),c=t(r(d[6])),f=t(r(d[7])),b=r(d[8]),h=r(d[9]),p=t(r(d[10])),v=t(r(d[11])),y=parseInt(b.Platform.Version,10),L='ios'===b.Platform.OS,C=y>=11&&L,P=125,w=(function(t){function h(){return(0,n.default)(this,h),(0,s.default)(this,(0,u.default)(h).apply(this,arguments))}return(0,c.default)(h,t),(0,l.default)(h,[{key:"render",value:function(){var t=this.props,n=t.onPress,l=t.onLongPress,s=t.testID,u=t.accessibilityLabel,c=(0,o.default)(t,["onPress","onLongPress","testID","accessibilityLabel"]);return f.default.createElement(b.TouchableWithoutFeedback,{onPress:n,onLongPress:l,testID:s,hitSlop:{left:15,right:15,top:5,bottom:5},accessibilityLabel:u},f.default.createElement(b.View,c))}}]),h})(f.default.Component),I=(function(t){function o(){var t,l;(0,n.default)(this,o);for(var c=arguments.length,h=new Array(c),v=0;vn.height};e.isOrientationLandscape=w},469,[346,1,8,19,20,27,30,33,47,2,405]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),l=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=l(r(d[2])),s=l(r(d[3])),o=l(r(d[4])),u=l(r(d[5])),c=l(r(d[6])),f=l(r(d[7])),p=l(r(d[8])),h=t(r(d[9])),v=r(d[10]),b=r(d[11]),y=(function(t){function l(){return(0,o.default)(this,l),(0,c.default)(this,(0,f.default)(l).apply(this,arguments))}return(0,p.default)(l,t),(0,u.default)(l,[{key:"render",value:function(){if(b.screensEnabled&&(0,b.screensEnabled)()){var t=this.props,l=t.isVisible,o=(0,s.default)(t,["isVisible"]);return h.createElement(b.Screen,(0,n.default)({active:l?1:0},o))}var u=this.props,c=u.isVisible,f=u.children,p=u.style,y=(0,s.default)(u,["isVisible","children","style"]);return h.createElement(v.View,(0,n.default)({style:[E.container,p,{opacity:c?1:0}],collapsable:!1,removeClippedSubviews:'ios'!==v.Platform.OS||!c,pointerEvents:c?'auto':'none'},y),h.createElement(v.View,{style:c?E.attached:E.detached},f))}}]),l})(h.Component);e.default=y;var E=v.StyleSheet.create({container:{flex:1,overflow:'hidden'},attached:{flex:1},detached:{flex:1,top:3e3}})},470,[346,1,8,6,19,20,27,30,33,47,2,426]); -__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=t(r(d[2])),s=t(r(d[3])),l=t(r(d[4])),u=t(r(d[5])),p=t(r(d[6])),c=t(r(d[7])),f=t(r(d[8])),b=t(r(d[9])),v=n(r(d[10])),h=r(d[11]),x=r(d[12]),y=r(d[13]),S=t(r(d[14])),P=t(r(d[15])),E=t(r(d[16])),I=(function(n){function t(){var n,o;(0,u.default)(this,t);for(var p=arguments.length,b=new Array(p),x=0;x1&&void 0!==arguments[1])||arguments[1];o.props.scrollEnabled&&(g.cancelAnimationFrame(o._scrollResetCallback),o._scrollResetCallback=g.requestAnimationFrame(function(){o._scrollView&&o._scrollView.scrollTo({x:o._getScrollAmount(o.props,t),animated:n})}))},o._handleBeginDrag=function(){o._isManualScroll=!0,o._isMomentumScroll=!1},o._handleEndDrag=function(){g.requestAnimationFrame(function(){o._isMomentumScroll||(o._isManualScroll=!1)})},o._handleMomentumScrollBegin=function(){o._isMomentumScroll=!0},o._handleMomentumScrollEnd=function(){o._isMomentumScroll=!1,o._isManualScroll=!1};var l=1;o.props.scrollEnabled&&(o._getTabWidth(o.props)||(l=0));var u=o.props.scrollEnabled&&o.props.layout.width?{x:o._getScrollAmount(o.props,o.props.navigationState.index),y:0}:void 0;return o.state={visibility:new y.Animated.Value(l),scrollAmount:new y.Animated.Value(0),initialOffset:u},o}return(0,f.default)(n,t),(0,u.default)(n,[{key:"componentDidMount",value:function(){this.props.scrollEnabled&&this._startTrackingPosition()}},{key:"componentDidUpdate",value:function(t){var n=this._getTabWidth(t),o=this._getTabWidth(this.props),l='number'==typeof this._pendingIndex?this._pendingIndex:this.props.navigationState.index;this._pendingIndex=null,n!==o&&o&&this.state.visibility.setValue(1),t.navigationState.routes.length!==this.props.navigationState.routes.length||t.layout.width!==this.props.layout.width?this._resetScroll(this.props.navigationState.index,!1):t.navigationState.index!==l&&this._resetScroll(this.props.navigationState.index)}},{key:"componentWillUnmount",value:function(){this._stopTrackingPosition()}},{key:"render",value:function(){var t=this,n=this.props,s=n.position,u=n.navigationState,c=n.scrollEnabled,p=n.bounces,f=u.routes,b=this._getTabWidth(this.props),v=b*f.length,w=[-1].concat((0,l.default)(f.map(function(t,n){return n}))),x=y.Animated.multiply(this.state.scrollAmount,-1);return h.createElement(y.Animated.View,{style:[T.tabBar,this.props.style]},h.createElement(y.Animated.View,{pointerEvents:"none",style:[T.indicatorContainer,c?{width:v,transform:[{translateX:x}]}:null]},this._renderIndicator((0,o.default)({},this.props,{width:b}))),h.createElement(y.View,{style:T.scroll},h.createElement(y.Animated.ScrollView,{horizontal:!0,keyboardShouldPersistTaps:"handled",scrollEnabled:c,bounces:p,alwaysBounceHorizontal:!1,scrollsToTop:!1,showsHorizontalScrollIndicator:!1,automaticallyAdjustContentInsets:!1,overScrollMode:"never",contentContainerStyle:[T.tabContent,c?null:T.container],scrollEventThrottle:1,onScroll:y.Animated.event([{nativeEvent:{contentOffset:{x:this.state.scrollAmount}}}],{useNativeDriver:S}),onScrollBeginDrag:this._handleBeginDrag,onScrollEndDrag:this._handleEndDrag,onMomentumScrollBegin:this._handleMomentumScrollBegin,onMomentumScrollEnd:this._handleMomentumScrollEnd,contentOffset:this.state.initialOffset,ref:function(n){return t._scrollView=n&&n.getNode()}},f.map(function(n,o){var l=w.map(function(t){return t===o?1:.7}),p=y.Animated.multiply(t.state.visibility,s.interpolate({inputRange:w,outputRange:l})),f=t._renderLabel({route:n}),v=t.props.renderIcon?t.props.renderIcon({route:n}):null,S=t.props.renderBadge?t.props.renderBadge({route:n}):null,x={};x.opacity=p,v&&(f?x.paddingTop=8:x.padding=12);var A=y.StyleSheet.flatten(t.props.tabStyle),L=A&&void 0!==A.width||!0===c,E={};L&&(x.width=b),A&&'number'==typeof A.flex?E.flex=A.flex:L||(E.flex=1);var P=t.props.getAccessibilityLabel({route:n});P=void 0!==P?P:t.props.getLabelText({route:n});var I=o===u.index;return h.createElement(_.default,{borderless:!0,key:n.key,testID:t.props.getTestID({route:n}),accessible:t.props.getAccessible({route:n}),accessibilityLabel:P,accessibilityTraits:I?['button','selected']:'button',accessibilityComponentType:"button",accessibilityRole:"button",accessibilityStates:I?['selected']:[],pressColor:t.props.pressColor,pressOpacity:t.props.pressOpacity,delayPressIn:0,onPress:function(){return t._handleTabPress({route:n})},onLongPress:function(){return t._handleTabLongPress({route:n})},style:E},h.createElement(y.View,{pointerEvents:"none",style:T.container},h.createElement(y.Animated.View,{style:[T.tabItem,x,A,T.container]},v,f),S?h.createElement(y.Animated.View,{style:[T.badge,{opacity:t.state.visibility}]},S):null))}))))}}]),n})(h.Component);e.default=w,w.propTypes=(0,o.default)({},v.SceneRendererPropType,{scrollEnabled:b.default.bool,bounces:b.default.bool,pressColor:_.default.propTypes.pressColor,pressOpacity:_.default.propTypes.pressOpacity,getLabelText:b.default.func,getAccessible:b.default.func,getAccessibilityLabel:b.default.func,getTestID:b.default.func,renderIcon:b.default.func,renderLabel:b.default.func,renderIndicator:b.default.func,onTabPress:b.default.func,onTabLongPress:b.default.func,labelStyle:b.default.any,style:b.default.any}),w.defaultProps={getLabelText:function(t){var n=t.route;return'string'==typeof n.title?n.title.toUpperCase():n.title},getAccessible:function(t){var n=t.route;return void 0===n.accessible||n.accessible},getAccessibilityLabel:function(t){return t.route.accessibilityLabel},getTestID:function(t){return t.route.testID}};var T=y.StyleSheet.create({container:{flex:1},scroll:{overflow:'web'===y.Platform.OS?'auto':'scroll'},tabBar:{backgroundColor:'#2196f3',elevation:4,shadowColor:'black',shadowOpacity:.1,shadowRadius:y.StyleSheet.hairlineWidth,shadowOffset:{height:y.StyleSheet.hairlineWidth},zIndex:'android'===y.Platform.OS?0:1},tabContent:{flexDirection:'row',flexWrap:'nowrap'},tabLabel:{backgroundColor:'transparent',color:'white',margin:8},tabItem:{flex:1,padding:8,alignItems:'center',justifyContent:'center'},badge:{position:'absolute',top:0,right:0},indicatorContainer:{position:'absolute',top:0,left:0,right:0,bottom:0},indicator:{backgroundColor:'#ffeb3b',position:'absolute',left:0,bottom:0,right:0,height:2}})},474,[346,1,44,15,19,20,27,30,33,47,59,2,475,476]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),l=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var s=l(r(d[2])),o=l(r(d[3])),u=l(r(d[4])),n=l(r(d[5])),p=l(r(d[6])),f=l(r(d[7])),c=l(r(d[8])),y=t(r(d[9])),b=l(r(d[10])),h=r(d[11]),v=(function(t){function l(){return(0,u.default)(this,l),(0,p.default)(this,(0,f.default)(l).apply(this,arguments))}return(0,c.default)(l,t),(0,n.default)(l,[{key:"render",value:function(){var t=this.props,l=t.style,u=t.pressOpacity,n=t.pressColor,p=t.borderless,f=(0,o.default)(t,["style","pressOpacity","pressColor","borderless"]);return'android'===h.Platform.OS&&h.Platform.Version>=21?y.createElement(h.TouchableNativeFeedback,(0,s.default)({},f,{background:h.TouchableNativeFeedback.Ripple(n,p)}),y.createElement(h.View,{style:l},y.Children.only(this.props.children))):y.createElement(h.TouchableOpacity,(0,s.default)({},f,{style:l,activeOpacity:u}),this.props.children)}}]),l})(y.Component);e.default=v,v.propTypes={onPress:b.default.func.isRequired,delayPressIn:b.default.number,borderless:b.default.bool,pressColor:b.default.string,pressOpacity:b.default.number,children:b.default.node.isRequired},v.defaultProps={pressColor:'rgba(255, 255, 255, .4)'}},475,[346,1,8,6,19,20,27,30,33,47,59,2]); -__d(function(g,r,i,a,m,e,d){var u=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.PagerRendererPropType=e.SceneRendererPropType=e.NavigationStatePropType=e.NavigationRoutePropType=void 0;var t=u(r(d[1])),n=r(d[2]),o=t.default.shape({title:t.default.string,key:t.default.string.isRequired});e.NavigationRoutePropType=o;var l=t.default.shape({routes:t.default.arrayOf(o).isRequired,index:t.default.number.isRequired});e.NavigationStatePropType=l;var f={panX:t.default.object.isRequired,offsetX:t.default.object.isRequired,layout:t.default.shape({measured:t.default.bool.isRequired,height:t.default.number.isRequired,width:t.default.number.isRequired}).isRequired,navigationState:l.isRequired,position:t.default.object.isRequired,jumpTo:t.default.func.isRequired,useNativeDriver:t.default.bool};e.SceneRendererPropType=f;var s={layout:t.default.shape({measured:t.default.bool.isRequired,height:t.default.number.isRequired,width:t.default.number.isRequired}).isRequired,navigationState:l.isRequired,panX:t.default.instanceOf(n.Animated.Value).isRequired,offsetX:t.default.instanceOf(n.Animated.Value).isRequired,canJumpToTab:t.default.func.isRequired,jumpTo:t.default.func.isRequired,animationEnabled:t.default.bool,swipeEnabled:t.default.bool,useNativeDriver:t.default.bool,onSwipeStart:t.default.func,onSwipeEnd:t.default.func,onAnimationEnd:t.default.func,children:t.default.node.isRequired};e.PagerRendererPropType=s},476,[1,59,2]); -__d(function(g,r,i,a,m,e,d){var t;switch(Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0,r(d[0]).Platform.OS){case'android':t=r(d[1]).default;break;case'ios':t=r(d[2]).default;break;default:t=r(d[3]).default}var f=t;e.default=f},477,[2,478,479,480]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=n(r(d[2])),s=n(r(d[3])),p=n(r(d[4])),l=n(r(d[5])),u=n(r(d[6])),c=t(r(d[7])),h=r(d[8]),v=r(d[9]),_=(function(t){function n(t){var s;return(0,o.default)(this,n),(s=(0,p.default)(this,(0,l.default)(n).call(this,t)))._isIdle=!0,s._currentIndex=0,s._getPageIndex=function(t){return h.I18nManager.isRTL?s.props.navigationState.routes.length-(t+1):t},s._setPage=function(t){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=s._viewPager;if(o){var p=s._getPageIndex(t);!1===s.props.animationEnabled||!1===n?o.setPageWithoutAnimation(p):o.setPage(p)}},s._handlePageChange=function(t,n){s._isIdle&&s._currentIndex!==t&&(s._setPage(t,n),s._currentIndex=t)},s._handlePageScroll=function(t){s.props.offsetX.setValue(s._getPageIndex(t.nativeEvent.position)*s.props.layout.width*-1),s.props.panX.setValue(t.nativeEvent.offset*s.props.layout.width*(h.I18nManager.isRTL?1:-1))},s._handlePageScrollStateChanged=function(t){s._isIdle='idle'===t;var n=s._currentIndex,o=s.props.navigationState.routes[n];switch(s.props.canJumpToTab({route:o})?s.props.jumpTo(o.key):(s._setPage(s.props.navigationState.index),s._currentIndex=s.props.navigationState.index),t){case'dragging':s.props.onSwipeStart&&s.props.onSwipeStart();break;case'settling':s.props.onSwipeEnd&&s.props.onSwipeEnd();break;case'idle':s.props.onAnimationEnd&&s.props.onAnimationEnd()}},s._handlePageSelected=function(t){var n=s._getPageIndex(t.nativeEvent.position);s._currentIndex=n},s._currentIndex=s.props.navigationState.index,s}return(0,u.default)(n,t),(0,s.default)(n,[{key:"componentDidUpdate",value:function(t){t.navigationState.routes.length!==this.props.navigationState.routes.length||t.layout.width!==this.props.layout.width?this._handlePageChange(this.props.navigationState.index,!1):t.navigationState.index!==this.props.navigationState.index&&this._handlePageChange(this.props.navigationState.index)}},{key:"render",value:function(){var t=this,n=this.props,o=n.navigationState,s=n.swipeEnabled,p=n.keyboardDismissMode,l=(h.I18nManager.isRTL?c.Children.toArray(this.props.children).reverse():c.Children.toArray(this.props.children)).map(function(n,s){var p=o.routes[s],l=s===o.index;return c.createElement(h.View,{key:p.key,testID:t.props.getTestID({route:p}),accessibilityElementsHidden:!l,importantForAccessibility:l?'auto':'no-hide-descendants',style:S.page},n)}),u=this._getPageIndex(o.index);return c.createElement(h.ViewPagerAndroid,{key:o.routes.length,keyboardDismissMode:p,initialPage:u,scrollEnabled:!1!==s,onPageScroll:this._handlePageScroll,onPageScrollStateChanged:this._handlePageScrollStateChanged,onPageSelected:this._handlePageSelected,style:S.container,ref:function(n){return t._viewPager=n}},l)}}]),n})(c.Component);e.default=_,_.propTypes=v.PagerRendererPropType,_.defaultProps={canJumpToTab:function(){return!0},keyboardDismissMode:'on-drag'};var S=h.StyleSheet.create({container:{flexGrow:1},page:{overflow:'hidden'}})},478,[346,1,19,20,27,30,33,47,2,476]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=n(r(d[2])),l=n(r(d[3])),s=n(r(d[4])),p=n(r(d[5])),u=n(r(d[6])),c=t(r(d[7])),h=r(d[8]),f=r(d[9]),v=(function(t){function n(t){var l;(0,o.default)(this,n),(l=(0,s.default)(this,(0,p.default)(n).call(this,t)))._isIdle=!0,l._isInitial=!0,l._setInitialPage=function(){l.props.layout.width&&(l._isInitial=!0,l._scrollTo(l.props.navigationState.index*l.props.layout.width,!1)),setTimeout(function(){l._isInitial=!1},50)},l._scrollTo=function(t){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];l._isIdle&&l._scrollView&&l._scrollView.scrollTo({x:t,animated:n&&!1!==l.props.animationEnabled})},l._handleMomentumScrollEnd=function(t){var n=Math.round(t.nativeEvent.contentOffset.x/l.props.layout.width),o=l.props.navigationState.routes[n];l.props.canJumpToTab({route:o})?(l.props.jumpTo(o.key),l.props.onAnimationEnd&&l.props.onAnimationEnd()):g.requestAnimationFrame(function(){l._scrollTo(l.props.navigationState.index*l.props.layout.width)})},l._handleScroll=function(t){if(!l._isInitial&&0!==t.nativeEvent.contentSize.width){var n=l.props,o=n.navigationState,s=n.layout,p=o.index*s.width;l.props.offsetX.setValue(-p),l.props.panX.setValue(p-t.nativeEvent.contentOffset.x),g.cancelAnimationFrame(l._idleCallback),l._isIdle=!1,l._idleCallback=g.requestAnimationFrame(function(){l._isIdle=!0})}};var u=l.props,c=u.navigationState,h=u.layout;return l.state={initialOffset:{x:c.index*h.width,y:0}},l}return(0,u.default)(n,t),(0,l.default)(n,[{key:"componentDidMount",value:function(){this._setInitialPage()}},{key:"componentDidUpdate",value:function(t){var n=this.props.navigationState.index*this.props.layout.width;t.navigationState.routes.length!==this.props.navigationState.routes.length||t.layout.width!==this.props.layout.width?this._scrollTo(n,!1):t.navigationState.index!==this.props.navigationState.index&&this._scrollTo(n)}},{key:"render",value:function(){var t=this,n=this.props,o=n.children,l=n.layout,s=n.navigationState,p=n.onSwipeStart,u=n.onSwipeEnd;return c.createElement(h.ScrollView,{horizontal:!0,pagingEnabled:!0,directionalLockEnabled:!0,keyboardDismissMode:"on-drag",keyboardShouldPersistTaps:"always",overScrollMode:"never",scrollEnabled:this.props.swipeEnabled,automaticallyAdjustContentInsets:!1,bounces:!1,alwaysBounceHorizontal:!1,scrollsToTop:!1,showsHorizontalScrollIndicator:!1,scrollEventThrottle:1,onScroll:this._handleScroll,onScrollBeginDrag:p,onScrollEndDrag:u,onMomentumScrollEnd:this._handleMomentumScrollEnd,contentOffset:this.state.initialOffset,style:y.container,contentContainerStyle:l.width?null:y.container,ref:function(n){return t._scrollView=n}},c.Children.map(o,function(n,o){var p=s.routes[o],u=o===s.index;return c.createElement(h.View,{key:p.key,testID:t.props.getTestID({route:p}),accessibilityElementsHidden:!u,importantForAccessibility:u?'auto':'no-hide-descendants',style:l.width?{width:l.width,overflow:'hidden'}:u?y.page:null},u||l.width?n:null)}))}}]),n})(c.Component);e.default=v,v.propTypes=f.PagerRendererPropType,v.defaultProps={canJumpToTab:function(){return!0}};var y=h.StyleSheet.create({container:{flex:1},page:{flex:1,overflow:'hidden'}})},479,[346,1,19,20,27,30,33,47,2,476]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=n(r(d[2])),s=n(r(d[3])),p=n(r(d[4])),u=n(r(d[5])),l=n(r(d[6])),h=n(r(d[7])),f=n(r(d[8])),v=n(r(d[9])),c=t(r(d[10])),x=n(r(d[11])),S=r(d[12]),_=r(d[13]),y=12,M={timing:S.Animated.spring,tension:300,friction:35},T=(function(t){function n(){var t,o;(0,u.default)(this,n);for(var l=arguments.length,v=new Array(l),c=0;cMath.abs(2*n.dy)&&Math.abs(n.vx)>Math.abs(2*n.vy)},o._canMoveScreen=function(t,n){if(!1===o.props.swipeEnabled)return!1;var s=o.props.navigationState.routes;return o._isMovingHorizontally(t,n)&&(n.dx>=y&&o._currentIndex>0||n.dx<=-12&&o._currentIndex0&&u<=0||n.dx<0&&u>=p.length-1||o.props.panX.setValue(n.dx)},o._finishGesture=function(t,n){var s=o.props,p=s.navigationState,u=s.layout,l=s.swipeDistanceThreshold,h=void 0===l?u.width/1.75:l,f=o.props.swipeVelocityThreshold,v=void 0===f?.15:f;o.props.onSwipeEnd&&o.props.onSwipeEnd(),'android'===S.Platform.OS&&(v/=1e6);var c='number'==typeof o._pendingIndex?o._pendingIndex:o._currentIndex,x=c;Math.abs(n.dx)>Math.abs(n.dy)&&Math.abs(n.vx)>Math.abs(n.vy)&&(Math.abs(n.dx)>h||Math.abs(n.vx)>v)&&(x=Math.round(Math.min(Math.max(0,c-n.dx/Math.abs(n.dx)),p.routes.length-1)),o._currentIndex=x),isFinite(x)&&o.props.canJumpToTab({route:o.props.navigationState.routes[x]})||(x=c),o._transitionTo(x)},o._transitionTo=function(t){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],u=-t*o.props.layout.width,l=o.props.navigationState.routes[t];if(!1===o.props.animationEnabled||!1===n)return o.props.panX.setValue(0),o.props.offsetX.setValue(u),void o.props.jumpTo(l.key);var h=M.timing,f=(0,p.default)(M,["timing"]);S.Animated.parallel([h(o.props.panX,(0,s.default)({},f,{toValue:0})),h(o.props.offsetX,(0,s.default)({},f,{toValue:u}))]).start(function(t){t.finished&&(o.props.jumpTo(l.key),o.props.onAnimationEnd&&o.props.onAnimationEnd(),o._pendingIndex=null)}),o._pendingIndex=t},o._panResponder=S.PanResponder.create({onMoveShouldSetPanResponder:o._canMoveScreen,onMoveShouldSetPanResponderCapture:o._canMoveScreen,onPanResponderGrant:o._startGesture,onPanResponderMove:o._respondToGesture,onPanResponderTerminate:o._finishGesture,onPanResponderRelease:o._finishGesture,onPanResponderTerminationRequest:function(){return!0}}),o}return(0,v.default)(n,t),(0,l.default)(n,[{key:"componentDidUpdate",value:function(t){this._currentIndex=this.props.navigationState.index,t.navigationState.routes.length!==this.props.navigationState.routes.length||t.layout.width!==this.props.layout.width?this._transitionTo(this.props.navigationState.index,!1):t.navigationState.index!==this.props.navigationState.index&&this._transitionTo(this.props.navigationState.index)}},{key:"render",value:function(){var t=this,n=this.props,s=n.panX,p=n.offsetX,u=n.navigationState,l=n.layout,h=n.children,f=l.width,v=u.routes,x=f*(v.length-1),_=S.Animated.multiply(S.Animated.add(s,p).interpolate({inputRange:[-x,0],outputRange:[-x,0],extrapolate:'clamp'}),S.I18nManager.isRTL?-1:1);return c.createElement(S.Animated.View,(0,o.default)({style:[w.sheet,f?{width:v.length*f,transform:[{translateX:_}]}:null]},this._panResponder.panHandlers),c.Children.map(h,function(n,o){var s=u.routes[o],p=o===u.index;return c.createElement(S.View,{key:s.key,testID:t.props.getTestID({route:s}),style:f?{width:f}:p?S.StyleSheet.absoluteFill:null},p||f?n:null)}))}}]),n})(c.Component);e.default=T,T.propTypes=(0,s.default)({},_.PagerRendererPropType,{swipeDistanceThreshold:x.default.number,swipeVelocityThreshold:x.default.number}),T.defaultProps={canJumpToTab:function(){return!0},initialLayout:{height:0,width:0}};var w=S.StyleSheet.create({sheet:{flex:1,flexDirection:'row',alignItems:'stretch'}})},480,[346,1,8,44,6,19,20,27,30,33,47,59,2,476]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=n(r(d[2])),s=n(r(d[3])),p=n(r(d[4])),l=n(r(d[5])),u=n(r(d[6])),h=n(r(d[7])),v=n(r(d[8])),f=t(r(d[9])),c=n(r(d[10])),y=r(d[11]),S=r(d[12]),w={timing:y.Animated.spring,tension:68,friction:12},b=(function(t){function n(){var t,l;(0,p.default)(this,n);for(var v=arguments.length,f=new Array(v),c=0;cMath.abs(S)&&Math.abs(w)>Math.abs(b)&&(Math.abs(y)>h||Math.abs(w)>f)&&(x=Math.round(Math.min(Math.max(0,E-y/Math.abs(y)),s.routes.length-1))),isFinite(x)&&l.props.canJumpToTab(l.props.navigationState.routes[x])||(x=E),l._transitionTo(x,w)}},l._transitionTo=function(t,n){var p=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],u=-t*l.props.layout.width;if(!1===l.props.animationEnabled||!1===p)return l.props.panX.setValue(0),void l.props.offsetX.setValue(u);var h=w.timing,v=(0,s.default)(w,["timing"]),f=l.props.useNativeDriver;y.Animated.parallel([h(l.props.panX,(0,o.default)({},v,{toValue:0,velocity:n,useNativeDriver:f})),h(l.props.offsetX,(0,o.default)({},v,{toValue:u,velocity:n,useNativeDriver:f}))]).start(function(n){if(n.finished){var o=l.props.navigationState.routes[t];l.props.jumpTo(o.key),l.props.onAnimationEnd&&l.props.onAnimationEnd(),l._pendingIndex=null}}),l._pendingIndex=t},l}return(0,v.default)(n,t),(0,l.default)(n,[{key:"componentDidUpdate",value:function(t){t.navigationState.routes.length!==this.props.navigationState.routes.length||t.layout.width!==this.props.layout.width?this._transitionTo(this.props.navigationState.index,void 0,!1):t.navigationState.index!==this.props.navigationState.index&&this.props.navigationState.index!==this._pendingIndex&&this._transitionTo(this.props.navigationState.index)}},{key:"render",value:function(){var t=this,n=this.props,o=n.GestureHandler,s=n.panX,p=n.offsetX,l=n.layout,u=n.navigationState,h=n.swipeEnabled,v=n.children,c=l.width,S=u.routes,w=c*(S.length-1),b=S.length>1?y.Animated.add(s,p).interpolate({inputRange:[-w,0],outputRange:[-w,0],extrapolate:'clamp'}):0;return f.createElement(o.PanGestureHandler,{enabled:0!==l.width&&!1!==h,minDeltaX:10,onGestureEvent:y.Animated.event([{nativeEvent:{translationX:this.props.panX}}],{useNativeDriver:this.props.useNativeDriver}),onHandlerStateChange:this._handleHandlerStateChange},f.createElement(y.Animated.View,{style:[E.sheet,c?{width:S.length*c,transform:[{translateX:b}]}:null]},f.Children.map(v,function(n,o){var s=u.routes[o],p=o===u.index;return f.createElement(y.View,{key:s.key,testID:t.props.getTestID({route:s}),accessibilityElementsHidden:!p,importantForAccessibility:p?'auto':'no-hide-descendants',style:c?{width:c}:p?y.StyleSheet.absoluteFill:null},p||c?n:null)})))}}]),n})(f.Component);e.default=b,b.propTypes=(0,o.default)({},S.PagerRendererPropType,{swipeDistanceThreshold:c.default.number,swipeVelocityThreshold:c.default.number,GestureHandler:c.default.object}),b.defaultProps={canJumpToTab:function(){return!0}};var E=y.StyleSheet.create({sheet:{flex:1,flexDirection:'row',alignItems:'stretch'}})},481,[346,1,44,6,19,20,27,30,33,47,59,2,476]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){return function(n){var u=n.route,o=n.jumpTo;return s.createElement(v,{key:u.key,component:t[u.key],route:u,jumpTo:o})}};var u=n(r(d[2])),o=n(r(d[3])),f=n(r(d[4])),l=n(r(d[5])),c=n(r(d[6])),p=n(r(d[7])),s=t(r(d[8])),v=(function(t){function n(){return(0,o.default)(this,n),(0,l.default)(this,(0,c.default)(n).apply(this,arguments))}return(0,p.default)(n,t),(0,f.default)(n,[{key:"render",value:function(){var t=this.props,n=t.component,o=(0,u.default)(t,["component"]);return s.createElement(n,o)}}]),n})(s.PureComponent)},482,[346,1,6,19,20,27,30,33,47]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=n(r(d[2])),l=n(r(d[3])),u=n(r(d[4])),c=n(r(d[5])),f=n(r(d[6])),p=n(r(d[7])),s=n(r(d[8])),v=n(r(d[9])),b=t(r(d[10])),h=r(d[11]),C=r(d[12]),y=n(r(d[13])),T=(function(t){function n(){var t,o;(0,c.default)(this,n);for(var l=arguments.length,f=new Array(l),v=0;vn,s=u>=600,c='ios'===l.Platform.OS?f?32:44:56,w=s?320:280;return Math.min(u-c,w)},contentComponent:function(t){return o.default.createElement(l.ScrollView,{alwaysBounceVertical:!1},o.default.createElement(f.SafeAreaView,{forceInset:{top:'always',horizontal:'never'}},o.default.createElement(w.default,t)))},drawerPosition:'left',keyboardDismissMode:'on-drag',drawerBackgroundColor:'white',useNativeAnimations:!0,drawerType:'front',hideStatusBar:!1,statusBarAnimation:'slide',overlayColor:'black'},h=function(t){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},l=(0,n.default)({},v,o),f=(0,s.default)(t,l);return(0,u.createNavigator)(c.default,f,l)};e.default=h},485,[1,44,47,2,352,349,486,488,493]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(r(d[1])),u=r(d[2]),o=t(r(d[3]));function l(t,n,u){return t.hasOwnProperty(n)&&void 0!==t[n]?t:(t[n]=u,t)}var f=function t(n){return n.routes&&n.routes[n.index]?t(n.routes[n.index]):n.key};e.default=function(t){var c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};c=l(c=l(c=(0,n.default)({},c),'resetOnBlur',!!c.unmountInactiveRoutes||!!c.resetOnBlur),'backBehavior','initialRoute');var D=(0,u.SwitchRouter)(t,c),s=-1,w=function(){return++s};return(0,n.default)({},D,{getActionCreators:function(t,u){return(0,n.default)({openDrawer:function(){return o.default.openDrawer({key:u})},closeDrawer:function(){return o.default.closeDrawer({key:u})},toggleDrawer:function(){return o.default.toggleDrawer({key:u})}},D.getActionCreators(t,u))},getStateForAction:function(t,l){if(!l)return(0,n.default)({},D.getStateForAction(t,void 0),{isDrawerOpen:!1,isDrawerIdle:!0,drawerMovementDirection:null,openId:w(),closeId:w(),toggleId:w()});if(null==t.key||t.key===l.key){if(t.type===o.default.DRAWER_CLOSED)return(0,n.default)({},l,{isDrawerOpen:!1,isDrawerIdle:!0,drawerMovementDirection:null});if(t.type===o.default.DRAWER_OPENED)return(0,n.default)({},l,{isDrawerOpen:!0,isDrawerIdle:!0,drawerMovementDirection:null});if(t.type===o.default.CLOSE_DRAWER)return(0,n.default)({},l,{closeId:w()});if(t.type===o.default.MARK_DRAWER_SETTLING)return(0,n.default)({},l,{isDrawerIdle:!1,drawerMovementDirection:t.willShow?'opening':'closing'});if(t.type===o.default.MARK_DRAWER_ACTIVE)return(0,n.default)({},l,{isDrawerIdle:!1,drawerMovementDirection:null});if(t.type===o.default.MARK_DRAWER_IDLE)return(0,n.default)({},l,{isDrawerIdle:!0,drawerMovementDirection:null});if(t.type===u.NavigationActions.BACK&&(l.isDrawerOpen||!l.isDrawerIdle)&&'closing'!==l.drawerMovementDirection)return(0,n.default)({},l,{closeId:w()});if(t.type===o.default.OPEN_DRAWER)return(0,n.default)({},l,{openId:w()});if(t.type===o.default.TOGGLE_DRAWER)return(0,n.default)({},l,{toggleId:w()})}var c=D.getStateForAction(t,l);return null===c?null:c!==l?f(c)===f(l)||!l.isDrawerOpen&&'closing'===l.drawerMovementDirection?c:(0,n.default)({},c,{closeId:w()}):l}})}},486,[1,44,352,487]); -__d(function(g,r,i,a,m,e,d){var R=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=R(r(d[1])),E={OPEN_DRAWER:"Navigation/OPEN_DRAWER",CLOSE_DRAWER:"Navigation/CLOSE_DRAWER",TOGGLE_DRAWER:"Navigation/TOGGLE_DRAWER",DRAWER_OPENED:'Navigation/DRAWER_OPENED',DRAWER_CLOSED:'Navigation/DRAWER_CLOSED',MARK_DRAWER_ACTIVE:"Navigation/MARK_DRAWER_ACTIVE",MARK_DRAWER_IDLE:"Navigation/MARK_DRAWER_IDLE",MARK_DRAWER_SETTLING:"Navigation/MARK_DRAWER_SETTLING",openDrawer:function(R){return(0,t.default)({type:"Navigation/OPEN_DRAWER"},R)},closeDrawer:function(R){return(0,t.default)({type:"Navigation/CLOSE_DRAWER"},R)},toggleDrawer:function(R){return(0,t.default)({type:"Navigation/TOGGLE_DRAWER"},R)},markDrawerIdle:function(R){return(0,t.default)({type:"Navigation/MARK_DRAWER_IDLE"},R)},markDrawerActive:function(R){return(0,t.default)({type:"Navigation/MARK_DRAWER_ACTIVE"},R)},markDrawerSettling:function(R){return(0,t.default)({type:"Navigation/MARK_DRAWER_SETTLING"},R)}};e.default=E},487,[1,44]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(r(d[1])),o=t(r(d[2])),s=t(r(d[3])),p=t(r(d[4])),l=t(r(d[5])),u=t(r(d[6])),f=t(r(d[7])),c=t(r(d[8])),v=r(d[9]),h=r(d[10]),w=t(r(d[11])),y=r(d[12]),C=t(r(d[13])),D=t(r(d[14])),_=t(r(d[15])),k=t(r(d[16])),R=(function(t){function R(){var t,n;(0,s.default)(this,R);for(var p=arguments.length,f=new Array(p),w=0;wn}).forEach(function(t){t===s?n._drawer.openDrawer():t===p?n._drawer.closeDrawer():t===l&&(u?n._drawer.closeDrawer():n._drawer.openDrawer())})}},{key:"componentWillUnmount",value:function(){v.Dimensions.removeEventListener('change',this._updateWidth)}},{key:"render",value:function(){var t=this,n=this.props.navigation,o=n.state.routes[n.state.index].key,s=this.props.descriptors[o].options.drawerLockMode;return c.default.createElement(w.default,{ref:function(n){t._drawer=n},onGestureRef:this._setDrawerGestureRef,drawerLockMode:s||this.props.screenProps&&this.props.screenProps.drawerLockMode||this.props.navigationConfig.drawerLockMode,drawerBackgroundColor:this.props.navigationConfig.drawerBackgroundColor,keyboardDismissMode:this.props.navigationConfig.keyboardDismissMode,drawerWidth:this.state.drawerWidth,onDrawerOpen:this._handleDrawerOpen,onDrawerClose:this._handleDrawerClose,onDrawerStateChanged:this._handleDrawerStateChange,useNativeAnimations:this.props.navigationConfig.useNativeAnimations,renderNavigationView:this._renderNavigationView,drawerPosition:'right'===this.props.navigationConfig.drawerPosition?w.default.positions.Right:w.default.positions.Left,drawerType:this.props.navigationConfig.drawerType,edgeWidth:this.props.navigationConfig.edgeWidth,hideStatusBar:this.props.navigationConfig.hideStatusBar,statusBarAnimation:this.props.navigationConfig.statusBarAnimation,minSwipeDistance:this.props.navigationConfig.minSwipeDistance,overlayColor:this.props.navigationConfig.overlayColor,contentContainerStyle:this.props.navigationConfig.contentContainerStyle},c.default.createElement(_.default.Provider,{value:this.drawerGestureRef},this._renderContent()))}}],[{key:"getDerivedStateFromProps",value:function(t,o){var s=t.navigation.state.index;return{loaded:o.loaded.includes(s)?o.loaded:[].concat((0,n.default)(o.loaded),[s])}}}]),R})(c.default.PureComponent);e.default=R,R.defaultProps={lazy:!0};var E=v.StyleSheet.create({pages:{flex:1}})},488,[1,15,8,19,20,27,30,33,47,2,352,436,426,487,489,491,492]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=t(r(d[1])),n=t(r(d[2])),s=t(r(d[3])),u=t(r(d[4])),p=t(r(d[5])),c=t(r(d[6])),l=t(r(d[7])),f=r(d[8]),v=r(d[9]),h=t(r(d[10])),y=(function(t){function y(){var t,o;(0,n.default)(this,y);for(var s=arguments.length,c=new Array(s),l=0;l=21){var t=this.props,u=t.style,s=(0,o.default)(t,["style"]);return c.default.createElement(h.TouchableNativeFeedback,(0,l.default)({},s,{style:null,background:h.TouchableNativeFeedback.Ripple(this.props.pressColor,this.props.borderless)}),c.default.createElement(h.View,{style:u},c.default.Children.only(this.props.children)))}return c.default.createElement(h.TouchableOpacity,this.props,this.props.children)}}]),b})(c.default.Component);e.default=b,b.defaultProps={borderless:!1,pressColor:'rgba(0, 0, 0, .32)'}},494,[1,8,6,19,20,27,30,33,47,2]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=n(r(d[2])),l=n(r(d[3])),s=n(r(d[4])),u=n(r(d[5])),c=n(r(d[6])),f=t(r(d[7])),v=r(d[8]),h=r(d[9]),p=n(r(d[10])),y=n(r(d[11])),w=n(r(d[12])),k=v.Dimensions.get("window"),C=k.width,I=k.height,V=(function(t){function n(t){var l;return(0,o.default)(this,n),(l=(0,s.default)(this,(0,u.default)(n).call(this,t))).state={vodKey:w.default.User.vodKey,decodeKey:w.default.User.decodeKey,decodeIv:w.default.User.decodeIv,viewerId:w.default.User.viewerId,nickName:w.default.User.nickName,inputVid:w.default.User.inputVid,canDownload:!1},l}return(0,c.default)(n,t),(0,l.default)(n,[{key:"componentWillMount",value:function(){console.log("componentWillMount"),console.log("Polyv vod init"),(0,h.setAxios)(),p.default.init(this.state.vodKey,this.state.decodeKey,this.state.decodeIv,this.state.viewerId,this.state.nickName).then(function(t){if(0!=t.code){var n="\u521d\u59cb\u5316\u5931\u8d25 errCode="+t.code+" errMsg="+t.message;console.log(n),alert(n)}else console.log("\u521d\u59cb\u5316\u6210\u529f")})}},{key:"updateVid",value:function(){console.log("updateVid"),this.refs.playerA.updateVid(this.state.inputVid)}},{key:"startOrPause",value:function(){console.log("startOrPause"),this.refs.playerA.startOrPause()}},{key:"componentDidMount",value:function(){}},{key:"render",value:function(){return console.log('app render'),f.default.createElement(v.View,{style:b.container},f.default.createElement(y.default,{navigation:this.props.navigation,ref:"videoList",style:b.video}))}}]),n})(f.Component);e.default=V,V.navigationOptions=function(t){var n=t.navigation;return{headerTitle:'\u5728\u7ebf\u89c6\u9891',headerRight:f.default.createElement(v.Button,{onPress:function(){console.log('nav btn is '),n.navigate('downloadList')},title:"\u4e0b\u8f7d\u5217\u8868>",color:"red"})}};var b=v.StyleSheet.create({container:{width:C,height:I,backgroundColor:"gray"},video:{position:"relative",height:9*C/16,width:C},input:{height:50,backgroundColor:"#C0C0C0",fontSize:20,margin:10,padding:10},horizon:{display:"flex",flexDirection:"row",width:C},text:{textAlign:"center",flex:1,borderRadius:5,justifyContent:"center",alignItems:"center",fontSize:20,height:80,backgroundColor:"#63B8FF",margin:10,padding:10}})},495,[346,1,19,20,27,30,33,47,2,496,523,524,532]); -__d(function(g,r,i,a,m,e,d){var o=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.setAxios=function(){console.log('init http'),t.default.defaults.headers=s,t.default.defaults.headers['x-auth-token']=n,t.default.interceptors.response.use(function(o){var t=o.config,n=o.data,s=o.request;return console.log('\u8bf7\u6c42\u7684url: ',t.method+":"+s.responseURL),console.log('token: ',t.headers['x-auth-token']),console.log('\u8bf7\u6c42body: ',t.data?JSON.parse(t.data):void 0),console.log('\u8fd4\u56de\u503c: ',n),200===n.code||n.data?Promise.resolve(n):Promise.reject(n)})};var t=o(r(d[1])),n='token',s={Accept:'application/json;charset=utf-8','Content-Type':'application/json;charset=utf-8','Accept-Encoding':'gzip, deflate'}},496,[1,497]); -__d(function(g,r,i,a,m,e,d){m.exports=r(d[0])},497,[498]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=r(d[1]),o=r(d[2]),u=r(d[3]);function c(u){var c=new o(u),s=n(o.prototype.request,c);return t.extend(s,o.prototype,c),t.extend(s,c),s}var s=c(u);s.Axios=o,s.create=function(n){return c(t.merge(u,n))},s.Cancel=r(d[4]),s.CancelToken=r(d[5]),s.isCancel=r(d[6]),s.all=function(t){return Promise.all(t)},s.spread=r(d[7]),m.exports=s,m.exports.default=s},498,[499,500,502,503,520,521,517,522]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),t=r(d[1]),o=Object.prototype.toString;function f(n){return'[object Array]'===o.call(n)}function u(n){return null!==n&&'object'==typeof n}function c(n){return'[object Function]'===o.call(n)}function l(n,t){if(null!==n&&void 0!==n)if('object'!=typeof n&&(n=[n]),f(n))for(var o=0,u=n.length;o=200&&t<300}};c.headers={common:{Accept:'application/json, text/plain, */*'}},t.forEach(['delete','get','head'],function(t){c.headers[t]={}}),t.forEach(['post','put','patch'],function(n){c.headers[n]=t.merge(o)}),m.exports=c},503,[499,504,505,505]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]);m.exports=function(o,n){t.forEach(o,function(t,c){c!==n&&c.toUpperCase()===n.toUpperCase()&&(o[n]=t,delete o[c])})}},504,[499]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),o=r(d[1]),n=r(d[2]),s=r(d[3]),u=r(d[4]),p=r(d[5]),l='undefined'!=typeof window&&window.btoa&&window.btoa.bind(window)||r(d[6]);m.exports=function(f){return new Promise(function(w,c){var h=f.data,y=f.headers;t.isFormData(h)&&delete y['Content-Type'];var T=new XMLHttpRequest,v='onreadystatechange',C=!1;if('undefined'==typeof window||!window.XDomainRequest||'withCredentials'in T||u(f.url)||(T=new window.XDomainRequest,v='onload',C=!0,T.onprogress=function(){},T.ontimeout=function(){}),f.auth){var x=f.auth.username||'',R=f.auth.password||'';y.Authorization='Basic '+l(x+':'+R)}if(T.open(f.method.toUpperCase(),n(f.url,f.params,f.paramsSerializer),!0),T.timeout=f.timeout,T[v]=function(){if(T&&(4===T.readyState||C)&&(0!==T.status||T.responseURL&&0===T.responseURL.indexOf('file:'))){var t='getAllResponseHeaders'in T?s(T.getAllResponseHeaders()):null,n={data:f.responseType&&'text'!==f.responseType?T.response:T.responseText,status:1223===T.status?204:T.status,statusText:1223===T.status?'No Content':T.statusText,headers:t,config:f,request:T};o(w,c,n),T=null}},T.onerror=function(){c(p('Network Error',f,null,T)),T=null},T.ontimeout=function(){c(p('timeout of '+f.timeout+'ms exceeded',f,'ECONNABORTED',T)),T=null},t.isStandardBrowserEnv()){var E=r(d[7]),N=(f.withCredentials||u(f.url))&&f.xsrfCookieName?E.read(f.xsrfCookieName):void 0;N&&(y[f.xsrfHeaderName]=N)}if('setRequestHeader'in T&&t.forEach(y,function(t,o){void 0===h&&'content-type'===o.toLowerCase()?delete y[o]:T.setRequestHeader(o,t)}),f.withCredentials&&(T.withCredentials=!0),f.responseType)try{T.responseType=f.responseType}catch(t){if('json'!==f.responseType)throw t}'function'==typeof f.onDownloadProgress&&T.addEventListener('progress',f.onDownloadProgress),'function'==typeof f.onUploadProgress&&T.upload&&T.upload.addEventListener('progress',f.onUploadProgress),f.cancelToken&&f.cancelToken.promise.then(function(t){T&&(T.abort(),c(t),T=null)}),void 0===h&&(h=null),T.send(h)})}},505,[499,506,509,510,511,507,512,513]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]);m.exports=function(s,u,n){var c=n.config.validateStatus;n.status&&c&&!c(n.status)?u(t('Request failed with status code '+n.status,n.config,null,n.request,n)):s(n)}},506,[507]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]);m.exports=function(t,o,u,c,s){var f=new Error(t);return n(f,o,u,c,s)}},507,[508]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports=function(n,t,o,s,c){return n.config=t,o&&(n.code=o),n.request=s,n.response=c,n}},508,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]);function t(n){return encodeURIComponent(n).replace(/%40/gi,'@').replace(/%3A/gi,':').replace(/%24/g,'$').replace(/%2C/gi,',').replace(/%20/g,'+').replace(/%5B/gi,'[').replace(/%5D/gi,']')}m.exports=function(c,o,f){if(!o)return c;var s;if(f)s=f(o);else if(n.isURLSearchParams(o))s=o.toString();else{var l=[];n.forEach(o,function(c,o){null!==c&&void 0!==c&&(n.isArray(c)?o+='[]':c=[c],n.forEach(c,function(c){n.isDate(c)?c=c.toISOString():n.isObject(c)&&(c=JSON.stringify(c)),l.push(t(o)+'='+t(c))}))}),s=l.join('&')}return s&&(c+=(-1===c.indexOf('?')?'?':'&')+s),c}},509,[499]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),o=['age','authorization','content-length','content-type','etag','expires','from','host','if-modified-since','if-unmodified-since','last-modified','location','max-forwards','proxy-authorization','referer','retry-after','user-agent'];m.exports=function(n){var f,s,c,u={};return n?(t.forEach(n.split('\n'),function(n){if(c=n.indexOf(':'),f=t.trim(n.substr(0,c)).toLowerCase(),s=t.trim(n.substr(c+1)),f){if(u[f]&&o.indexOf(f)>=0)return;u[f]='set-cookie'===f?(u[f]?u[f]:[]).concat([s]):u[f]?u[f]+', '+s:s}}),u):u}},510,[499]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]);m.exports=t.isStandardBrowserEnv()?(function(){var o,n=/(msie|trident)/i.test(navigator.userAgent),h=document.createElement('a');function s(t){var o=t;return n&&(h.setAttribute('href',o),o=h.href),h.setAttribute('href',o),{href:h.href,protocol:h.protocol?h.protocol.replace(/:$/,''):'',host:h.host,search:h.search?h.search.replace(/^\?/,''):'',hash:h.hash?h.hash.replace(/^#/,''):'',hostname:h.hostname,port:h.port,pathname:'/'===h.pathname.charAt(0)?h.pathname:'/'+h.pathname}}return o=s(window.location.href),function(n){var h=t.isString(n)?s(n):n;return h.protocol===o.protocol&&h.host===o.host}})():function(){return!0}},511,[499]); -__d(function(g,r,i,a,m,e,d){'use strict';var t='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';function n(){this.message='String contains an invalid character'}n.prototype=new Error,n.prototype.code=5,n.prototype.name='InvalidCharacterError',m.exports=function(o){for(var c,h,p=String(o),s='',f=0,u=t;p.charAt(0|f)||(u='=',f%1);s+=u.charAt(63&c>>8-f%1*8)){if((h=p.charCodeAt(f+=.75))>255)throw new n;c=c<<8|h}return s}},512,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]);m.exports=n.isStandardBrowserEnv()?{write:function(t,o,u,s,c,p){var h=[];h.push(t+'='+encodeURIComponent(o)),n.isNumber(u)&&h.push('expires='+new Date(u).toGMTString()),n.isString(s)&&h.push('path='+s),n.isString(c)&&h.push('domain='+c),!0===p&&h.push('secure'),document.cookie=h.join('; ')},read:function(n){var t=document.cookie.match(new RegExp('(^|;\\s*)('+n+')=([^;]*)'));return t?decodeURIComponent(t[3]):null},remove:function(n){this.write(n,'',Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},513,[499]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]);function n(){this.handlers=[]}n.prototype.use=function(t,n){return this.handlers.push({fulfilled:t,rejected:n}),this.handlers.length-1},n.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},n.prototype.forEach=function(n){t.forEach(this.handlers,function(t){null!==t&&n(t)})},m.exports=n},514,[499]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),s=r(d[1]),n=r(d[2]),o=r(d[3]),c=r(d[4]),h=r(d[5]);function u(t){t.cancelToken&&t.cancelToken.throwIfRequested()}m.exports=function(p){return u(p),p.baseURL&&!c(p.url)&&(p.url=h(p.baseURL,p.url)),p.headers=p.headers||{},p.data=s(p.data,p.headers,p.transformRequest),p.headers=t.merge(p.headers.common||{},p.headers[p.method]||{},p.headers||{}),t.forEach(['delete','get','head','post','put','patch','common'],function(t){delete p.headers[t]}),(p.adapter||o.adapter)(p).then(function(t){return u(p),t.data=s(t.data,t.headers,p.transformResponse),t},function(t){return n(t)||(u(p),t&&t.response&&(t.response.data=s(t.response.data,t.response.headers,p.transformResponse))),Promise.reject(t)})}},515,[499,516,517,503,518,519]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]);m.exports=function(t,c,o){return n.forEach(o,function(n){t=n(t,c)}),t}},516,[499]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports=function(t){return!(!t||!t.__CANCEL__)}},517,[]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports=function(t){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(t)}},518,[]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports=function(t,c){return c?t.replace(/\/+$/,'')+'/'+c.replace(/^\/+/,''):t}},519,[]); -__d(function(g,r,i,a,m,e,d){'use strict';function t(t){this.message=t}t.prototype.toString=function(){return'Cancel'+(this.message?': '+this.message:'')},t.prototype.__CANCEL__=!0,m.exports=t},520,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]);function o(o){if('function'!=typeof o)throw new TypeError('executor must be a function.');var t;this.promise=new Promise(function(n){t=n});var s=this;o(function(o){s.reason||(s.reason=new n(o),t(s.reason))})}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.source=function(){var n;return{token:new o(function(o){n=o}),cancel:n}},m.exports=o},521,[520]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports=function(n){return function(t){return n.apply(null,t)}}},522,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var n,t,o=r(d[0])(r(d[1])),s=r(d[2]).NativeModules.PolyvRNVodConfigModule,u={init:function(u,c,l,f,p){var v,_;return o.default.async(function(o){for(;;)switch(o.prev=o.next){case 0:return console.log("config_"+u+"_"+c+"_"+l),o.prev=1,s.init(u,c,l,f,p).then(function(o){console.log('result :token:'+o.token+" isSign:"+o.isSign),n=o.token,t=o.isSign}),console.log('result end'),o.abrupt("return",{code:0});case 7:return o.prev=7,o.t0=o.catch(1),v=o.t0.code,_=o.t0.message,o.abrupt("return",{code:v,message:_});case 12:case"end":return o.stop()}},null,this,[[1,7]])},getToken:function(){return n},isSign:function(){return t}};m.exports=u},523,[1,139,2]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),o=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n,l,s=o(r(d[2])),u=o(r(d[3])),h=o(r(d[4])),f=o(r(d[5])),c=o(r(d[6])),w=o(r(d[7])),p=t(r(d[8])),v=r(d[9]),y=o(r(d[10])),E=o(r(d[11])),F=r(d[12]),k=o(r(d[13])),_=v.Dimensions.get("window"),C=_.width,b=_.height,x=1,I=(function(t){function o(t){var n;return(0,s.default)(this,o),(n=(0,h.default)(this,(0,f.default)(o).call(this,t)))._onRefresh=function(){n.setState({refreshing:!0}),n.getOnlineList()},n.state={datas:[],showFoot:0,refreshing:!1},l=(0,w.default)((0,w.default)(n)),n}return(0,c.default)(o,t),(0,u.default)(o,[{key:"componentDidMount",value:function(){var t=this;setTimeout(function(){t.getOnlineList()},50)}},{key:"update",value:function(t){console.log(" update list view"),this.setState({datas:t})}},{key:"getOnlineList",value:function(){var t=this;console.log("showDownloadOptions"),k.default.getVideoList(1,20,function(o,n){o&&t.update(o.data),t.setState({refreshing:!1})})}},{key:"renderItem",value:function(t){var o=t.item;return p.default.createElement(F.PolyvVideoOnlineItem,{downloadCallback:function(t){console.log("receive callback"),l.showDownloadOptions(t,o)},navigation:n,style:O.modalBox,videoInfo:o})}},{key:"showDownloadOptions",value:function(t,o){console.log("showDownloadOptions"),this.popUp.show(t,o)}},{key:"_separator",value:function(){return p.default.createElement(v.View,{style:{height:15,backgroundColor:"#FFFAFA"}})}},{key:"render",value:function(){var t=this;return n=this.props.navigation,p.default.createElement(v.View,{style:O.container},p.default.createElement(v.FlatList,{style:O.list,ItemSeparatorComponent:this._separator,data:this.state.datas,renderItem:this.renderItem,onEndReached:this._onEndReached.bind(this),ListFooterComponent:this._renderFooter.bind(this),keyExtractor:function(t,o){return t.vid+t.bitrate},refreshControl:p.default.createElement(v.RefreshControl,{refreshing:this.state.refreshing,onRefresh:this._onRefresh})}),p.default.createElement(E.default,{ref:function(o){return t.popUp=o}}))}},{key:"_onEndReached",value:function(){0==this.state.showFoot&&(1!=x&&x>=5||(x++,this.setState({showFoot:2})))}},{key:"_renderFooter",value:function(){return console.log("_renderFooter:"+this.state.showFoot),1===this.state.showFoot?p.default.createElement(v.View,{style:{height:80,alignItems:"center",justifyContent:"flex-start"}},p.default.createElement(v.Text,{style:{color:"#999999",fontSize:14,marginTop:5,marginBottom:5}},"\u6ca1\u6709\u66f4\u591a\u6570\u636e\u4e86")):2===this.state.showFoot?p.default.createElement(v.View,{style:O.footer},p.default.createElement(v.ActivityIndicator,null),p.default.createElement(v.Text,null,"\u6b63\u5728\u52a0\u8f7d\u66f4\u591a\u6570\u636e...")):0===this.state.showFoot?p.default.createElement(v.View,{style:O.footer},p.default.createElement(v.Text,null)):void 0}}]),o})(p.Component);e.default=I,I.propTypes={navigation:y.default.object};var O=v.StyleSheet.create({container:{width:C,height:b,backgroundColor:"white",position:"absolute",top:0,zIndex:9},title:{margin:15,textAlign:"center",display:"flex",color:"red",fontSize:20,justifyContent:"center",alignItems:"center"},modalBox:{backgroundColor:"white",width:C,height:50},footer:{flexDirection:"row",height:50,justifyContent:"center",alignItems:"center",marginBottom:10},list:{width:C}})},524,[346,1,19,20,27,30,33,29,47,2,59,525,528,531]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=n(r(d[2])),s=n(r(d[3])),l=n(r(d[4])),u=n(r(d[5])),f=n(r(d[6])),c=n(r(d[7])),h=t(r(d[8])),y=r(d[9]),v=n(r(d[10])),p=n(r(d[11])),w=y.Dimensions.get("window"),E=w.width,k=w.height,x=(function(t){function n(t){var o;return(0,s.default)(this,n),(o=(0,u.default)(this,(0,f.default)(n).call(this,t))).state={offset:new y.Animated.Value(0),show:!1,videoJson:{},sourceData:new Map,datas:[],vid:"",title:""},o}return(0,c.default)(n,t),(0,l.default)(n,[{key:"in",value:function(){y.Animated.timing(this.state.offset,{easing:y.Easing.linear,duration:300,toValue:1}).start()}},{key:"out",value:function(){var t=this;y.Animated.timing(this.state.offset,{easing:y.Easing.linear,duration:300,toValue:0}).start(),setTimeout(function(){return t.setState({show:!1})},300)}},{key:"_sortBitrates",value:function(t){var n,s=new Map;return(n=Object.keys(t)).forEach(function(n){s.set(t[n]+'',n)}),this.state.sourceData=s,(n=(0,o.default)(s.keys())).sort(),n}},{key:"show",value:function(t,n){var o=this._sortBitrates(t);console.log('bitrate:'+JSON.stringify(o)),this.setState({show:!0,datas:o,vid:n.vid,title:n.title},this.in())}},{key:"hide",value:function(){this.out()}},{key:"defaultHide",value:function(){this.props.hide(),this.out()}},{key:"chooseDefPlay",value:function(t){console.log("will to download "+t),this.defaultHide(),this.state.vid?t<0?y.Alert.alert(p.default.getErrorDes(p.default.BITRATE_INDEX_ERROR)):v.default.startDownload(this.state.vid,t,this.state.title).then(function(t){0!=t.code&&console.log('start download response is error')}):y.Alert.alert(p.default.getErrorDes(p.default.VID_ERROR))}},{key:"renderItemData",value:function(t){var n=this,o=t.item,s=(t.index,o);return console.log('render item :'+s),h.default.createElement(y.Text,{style:D.content,onPress:function(){n.chooseDefPlay(parseInt(s))}},this.state.sourceData.get(s))}},{key:"render",value:function(){var t=this.props,n=t.transparentIsClick,o=t.modalBoxBg,s=t.modalBoxHeight;return this.state.show?h.default.createElement(y.View,{style:[D.container,{height:k}]},h.default.createElement(y.TouchableOpacity,{style:{height:k-s},onPress:n&&this.defaultHide.bind(this)}),h.default.createElement(y.Animated.View,{style:[D.modalBox,{height:k,top:0,backgroundColor:o,transform:[{translateY:this.state.offset.interpolate({inputRange:[0,1],outputRange:[k,k-s]})}]}]},h.default.createElement(y.Text,{style:D.title},"\u8bf7\u9009\u62e9\u5206\u8fa8\u7387"),h.default.createElement(y.FlatList,{style:D.list,data:this.state.datas,renderItem:this.renderItemData.bind(this),keyExtractor:function(t,n){return t}}))):h.default.createElement(y.View,null)}}]),n})(h.Component);e.default=x;var D=y.StyleSheet.create({container:{width:E,backgroundColor:"rgba(0, 0, 0, 0.6)",position:"absolute",top:0,zIndex:9},title:{margin:15,textAlign:"center",display:"flex",color:"red",fontSize:20,justifyContent:"center",alignItems:"center"},content:{margin:15,textAlign:"center",display:"flex",fontSize:15,justifyContent:"center",alignItems:"center"},modalBox:{position:"absolute",width:E},list:{}});x.defaultProps={modalBoxHeight:300,modalBoxBg:"#fff",hide:function(){},transparentIsClick:!0}},525,[346,1,15,19,20,27,30,33,47,2,526,527]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=t(r(d[1])),u=r(d[2]),o=t(r(d[3])),s=u.NativeModules.PolyvRNVodDownloadModule,l={_validate:function(t,n){return t?n<0?o.default.BITRATE_INDEX_ERROR:o.default.SUCCESS:o.default.VID_ERROR},getBitrateNumbers:function(t){var u,l;return n.default.async(function(c){for(;;)switch(c.prev=c.next){case 0:if((u=this._validate(t))==o.default.SUCCESS){c.next=3;break}return c.abrupt("return",{code:u});case 3:return c.prev=3,c.next=6,n.default.awrap(s.getBitrateNumbers(t));case 6:return l=c.sent,c.abrupt("return",{code:o.default.SUCCESS,bitrates:l});case 10:c.prev=10,c.t0=c.catch(3),u=c.t0.code;case 13:return c.abrupt("return",{code:u});case 14:case"end":return c.stop()}},null,this,[[3,10]])},startDownload:function(t,u,l){var c;return n.default.async(function(f){for(;;)switch(f.prev=f.next){case 0:if((c=this._validate(t,u))==o.default.SUCCESS){f.next=3;break}return f.abrupt("return",{code:c});case 3:return f.prev=3,f.next=6,n.default.awrap(s.startDownload(t,u,l));case 6:c=o.default.SUCCESS,f.next=12;break;case 9:f.prev=9,f.t0=f.catch(3),c=f.t0.code;case 12:return f.abrupt("return",{code:c});case 13:case"end":return f.stop()}},null,this,[[3,9]])},pauseDownload:function(t,n){var u=this._validate(t,n);return u!=o.default.SUCCESS?u:(s.pauseDownload(t,n),u)},pauseAllDownload:function(){s.pauseAllDownload()},resumeDownload:function(t,n){var u=this._validate(t,n);return u!=o.default.SUCCESS?u:(s.resumeDownload(t,n),u)},startAllDownload:function(){s.startAllDownload()},deleteDownload:function(t,n){var u=this._validate(t,n);return u!=o.default.SUCCESS?u:(s.deleteDownload(t,n),u)},deleteAllDownload:function(){s.deleteAllDownload()},getDownloadVideoList:function(t){var u,o,l,c,f,p;return n.default.async(function(v){for(;;)switch(v.prev=v.next){case 0:return v.prev=0,v.next=3,n.default.awrap(s.getDownloadVideoList(t));case 3:return u=v.sent,o=u.downloadList,l=new Map,c=JSON.parse(o),t||c.forEach(function(t){var n=t.vid+t.bitrate;l.set(n,t)}),v.abrupt("return",{code:0,data:c,dataMaps:l});case 11:return v.prev=11,v.t0=v.catch(0),f=v.t0.code,p=v.t0.message,v.abrupt("return",{code:f,message:p});case 16:case"end":return v.stop()}},null,this,[[0,11]])},getDownloadStatus:function(t,u){var l,c;return n.default.async(function(f){for(;;)switch(f.prev=f.next){case 0:return f.prev=0,f.next=3,n.default.awrap(s.getDownloadStatus(t,u));case 3:return l=f.sent,c=l.downloadStatus,f.abrupt("return",{code:c});case 8:return f.prev=8,f.t0=f.catch(0),f.abrupt("return",{code:o.default.DOWNLOAD_STATUS_ERROR});case 11:case"end":return f.stop()}},null,this,[[0,8]])}};m.exports=l},526,[1,139,2,527]); -__d(function(g,r,i,a,m,e,d){m.exports={SUCCESS:0,VID_ERROR:-1,BITRATE_INDEX_ERROR:-2,DOWNLOAD_STATUS_ERROR:-3,DOWNLOAD_INFO_ERROR:-1004,DOWNLOAD_EXIST:-1005,getErrorDes:function(R){var O="";switch(R){case this.VID_ERROR:O="vid is error";break;case this.BITRATE_INDEX_ERROR:O="bitrate is error";break;case this.DOWNLOAD_EXIST:O="download task is exits"}return O}}},527,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),o=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.PolyvVideoOnlineItem=void 0;var n=o(r(d[2])),l=o(r(d[3])),s=o(r(d[4])),u=o(r(d[5])),f=o(r(d[6])),c=o(r(d[7])),y=t(r(d[8])),v=r(d[9]),h=o(r(d[10])),p=o(r(d[11])),b=v.Dimensions.get("window"),w=b.width,_=(b.height,r(d[12])),x=r(d[13]),C=(function(t){function o(t){var n;return(0,l.default)(this,o),(n=(0,u.default)(this,(0,f.default)(o).call(this,t))).state={data:{}},n}return(0,c.default)(o,t),(0,s.default)(o,[{key:"startPlay",value:function(){var t=this.props.videoInfo.vid;this.props.navigation.navigate('VideoPlayer',{vid:t})}},{key:"startDownload",value:function(){var t=this;console.log('startDownload:'+this.props.videoInfo.vid);var o=this.props.videoInfo.vid;o?p.default.getBitrateNumbers(o).then(function(o){0==o.code?t.props.downloadCallback(o.bitrates):alert('\u83b7\u53d6\u5206\u8fa8\u7387\u5931\u8d25')}):alert("vid is error")}},{key:"render",value:function(){var t=this,o=this.props.videoInfo;return y.default.createElement(v.View,{style:I.container},y.default.createElement(v.Image,{style:I.img,source:{uri:o.first_image},defaultSource:x}),y.default.createElement(v.View,null,y.default.createElement(v.Text,{style:I.title},o.title),y.default.createElement(v.View,{style:I.bottomContainer},y.default.createElement(v.View,{style:I.bottomHorizonContianer},y.default.createElement(v.Image,{style:I.bottom_time_img,source:_}),y.default.createElement(v.Text,{style:I.bottom_time_txt},o.duration)),y.default.createElement(v.View,{style:I.bottomHorizonContianer},y.default.createElement(v.Text,{style:I.bottom_download_txt,onPress:function(){t.startDownload()}},"\u4e0b\u8f7d"),y.default.createElement(v.Text,{style:I.bottom_play_txt,onPress:function(){t.startPlay()}},"\u64ad\u653e")))))}}]),o})(y.Component);e.PolyvVideoOnlineItem=C,C.propTypes=(0,n.default)({videoInfo:h.default.object,downloadCallback:h.default.func},v.View.propTypes);var I=v.StyleSheet.create({container:{width:w,margin:10,display:'flex',flexDirection:'row'},title:{marginBottom:5,marginLeft:5,display:"flex",color:"red",fontSize:15,justifyContent:"center",alignItems:"center"},bottomContainer:{position:"relative",bottom:0,margin:10,display:"flex",flexDirection:'column'},bottomHorizonContianer:{display:"flex",flexDirection:"row"},bottom_time_img:{resizeMode:"cover",width:10,height:10},bottom_time_txt:{lineHeight:10,marginLeft:5,fontSize:10,color:"green"},bottom_download_txt:{textAlign:"center",width:60,borderRadius:15,justifyContent:"center",alignItems:"center",fontSize:12,backgroundColor:"#63B8FF",margin:5},bottom_play_txt:{textAlign:"center",width:60,borderRadius:15,justifyContent:"center",alignItems:"center",fontSize:12,height:20,backgroundColor:"#63B8FF",margin:5},img:{resizeMode:"cover",width:100,height:'auto'}})},528,[346,1,44,19,20,27,30,33,47,2,59,526,529,530]); -__d(function(g,r,i,a,m,e,d){m.exports=r(d[0]).registerAsset({__packager_asset:!0,httpServerLocation:"/assets/polyv/demo/img",width:32,height:32,scales:[1],hash:"3c1dcd9b6325a0061f7e4cb7478d5a72",name:"polyv_time",type:"png"})},529,[166]); -__d(function(g,r,i,a,m,e,d){m.exports=r(d[0]).registerAsset({__packager_asset:!0,httpServerLocation:"/assets/polyv/demo/img",width:384,height:240,scales:[1],hash:"5cadff8896d10c977996cb477b87fabc",name:"polyv_pic_demo",type:"png"})},530,[166]); -__d(function(g,r,i,a,m,e,d){var o=r(d[0]),t=o(r(d[1])),n=o(r(d[2])),s={getVideoList:function(o,s,c){var u=n.default.getToken;n.default.isSign;console.log("sign : token :"+u()),t.default.get('http://v.polyv.net/uc/services/rest?method=getNewList',{params:{readtoken:u(),pageNum:o,numPerPage:s,sign:''}}).then(function(o){console.log(' request is success '+o),c(o)}).catch(function(o){console.log(' request is error '+o)})},getVideoInfo:function(o,n){t.default.get("https://player.polyv.net/videojson/"+o+".json").then(function(o){console.log(' getVideoInfo is success '+o),n(o)}).catch(function(o){console.log(' getVideoInfo is error '+o)})}};m.exports=s},531,[1,497,523]); -__d(function(g,r,i,a,m,e,d){m.exports={User:{vodKey:"Z3qwS0sp2CR6dVGLpOL1PXegNFZN1GTAenpW976Wmjho9MJVUxpsxGngEA7ZYDQl1VWrbNbW6FBPxcEmfmmPjktjuMoo5ZRZDlvcCF3c4ktjX4AzswIl2qniYYwHF1XrD1cgBTQOnzpqB700lelArw==",decodeKey:"VXtlHmwfS2oYm0CZ",decodeIv:"2u9gDPKdX6GyQJKU",viewerId:"rn_viewerId",nickName:"rn_nickName",inputVid:"e97dbe3e649c56a1e58535bd8c5d3924_e"}}},532,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=n(r(d[2])),l=n(r(d[3])),s=n(r(d[4])),u=n(r(d[5])),f=n(r(d[6])),p=t(r(d[7])),c=r(d[8]),h=n(r(d[9])),y=c.Dimensions.get("window"),v=y.width,w=y.height,x=(function(t){function n(t){var l;return(0,o.default)(this,n),(l=(0,s.default)(this,(0,u.default)(n).call(this,t))).state={vid:'',inputVid:"e97dbe3e649c56a1e58535bd8c5d3924_e",canDownload:!1},l}return(0,f.default)(n,t),(0,l.default)(n,[{key:"componentWillUnmount",value:function(){this.refs.playerA.release()}},{key:"componentDidMount",value:function(){}},{key:"updateVid",value:function(){this.state.inputVid?(console.log("updateVid"),this.refs.playerA.updateVid(this.state.inputVid)):Alert.alert('vid is error')}},{key:"startOrPause",value:function(){console.log("startOrPause"),this.refs.playerA.startOrPause()}},{key:"play",value:function(){console.log("play"),this.refs.playerA.play()}},{key:"pause",value:function(){console.log("pause"),this.refs.playerA.pause()}},{key:"showDownloadOptions",value:function(){console.log("showDownloadOptions"),this.popUp.show()}},{key:"render",value:function(){var t=this;console.log('app render');var n=this.props.navigation.getParam('vid','');return p.default.createElement(c.View,null,p.default.createElement(h.default,{ref:"playerA",style:k.video,vid:n,isAutoStart:!0,fullScreen:!1,marquee:{displayDuration:8,maxRollInterval:1,content:'\u6211\u662f\u8dd1\u9a6c\u706f',color:'#0000FF',alpha:.5,font:20}}),p.default.createElement(c.TextInput,{style:k.input,placeholder:"\u8bf7\u8f93\u5165\u66f4\u65b0vid",onChangeText:function(n){t.setState({vid:n})}},this.state.inputVid),p.default.createElement(c.View,{style:k.horizon},p.default.createElement(c.Text,{style:k.text,onPress:this.updateVid.bind(this)},"updateVid"),p.default.createElement(c.Text,{style:k.text,onPress:this.play.bind(this)},"play"),p.default.createElement(c.Text,{style:k.text,onPress:this.pause.bind(this)},"pause")))}}]),n})(p.Component);e.default=x,x.navigationOptions=function(t){t.navigation;return{headerTitle:'\u89c6\u9891\u64ad\u653e'}};var k=c.StyleSheet.create({container:{width:v,height:w,backgroundColor:"#ffffff"},video:{position:"relative",height:9*v/16,width:v},input:{height:50,backgroundColor:"#C0C0C0",fontSize:20,margin:10,padding:10},horizon:{display:"flex",flexDirection:"row",width:v},text:{textAlign:"center",flex:1,borderRadius:5,justifyContent:"center",alignItems:"center",fontSize:16,height:50,backgroundColor:"#63B8FF",margin:10,padding:10}})},533,[346,1,19,20,27,30,33,47,2,534]); -__d(function(g,r,i,a,m,e,d){'use strict';var n=r(d[0]),t=r(d[1]),l=t(r(d[2])),o=t(r(d[3])),s=t(r(d[4])),u=t(r(d[5])),p=t(r(d[6])),f=t(r(d[7])),y=n(r(d[8])),c=r(d[9]),h=t(r(d[10])),v=(0,c.requireNativeComponent)('PolyvVodPlayer',M,{}),M=(function(n){function t(){return(0,o.default)(this,t),(0,u.default)(this,(0,p.default)(t).apply(this,arguments))}return(0,f.default)(t,n),(0,s.default)(t,[{key:"updateVid",value:function(n){c.UIManager.dispatchViewManagerCommand((0,c.findNodeHandle)(this.refs.player),c.UIManager.PolyvVodPlayer.Commands.updateVid,[n])}},{key:"play",value:function(){c.UIManager.dispatchViewManagerCommand((0,c.findNodeHandle)(this.refs.player),c.UIManager.PolyvVodPlayer.Commands.play,[])}},{key:"pause",value:function(){c.UIManager.dispatchViewManagerCommand((0,c.findNodeHandle)(this.refs.player),c.UIManager.PolyvVodPlayer.Commands.pause,[])}},{key:"release",value:function(){c.UIManager.dispatchViewManagerCommand((0,c.findNodeHandle)(this.refs.player),c.UIManager.PolyvVodPlayer.Commands.release,[])}},{key:"startOrPause",value:function(){c.UIManager.dispatchViewManagerCommand((0,c.findNodeHandle)(this.refs.player),c.UIManager.PolyvVodPlayer.Commands.startOrPause,[])}},{key:"setFullScreen",value:function(n){c.UIManager.dispatchViewManagerCommand((0,c.findNodeHandle)(this.refs.player),c.UIManager.PolyvVodPlayer.Commands.setFullScreen,[n])}},{key:"render",value:function(){return y.default.createElement(v,{ref:"player",style:(0,l.default)({},this.props.style),play_parameters:{vid:this.props.vid,is_auto_start:this.props.isAutoStart,full_screen:this.props.fullScreen,marquee:this.props.marquee}})}}]),t})(y.Component);M.propTypes=(0,l.default)({vid:h.default.string,isAutoStart:h.default.bool,onStart:h.default.func,fullScreen:h.default.bool,marquee:h.default.object},c.View.propTypes),m.exports=M},534,[346,1,44,19,20,27,30,33,47,2,59]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),o=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=o(r(d[2])),l=o(r(d[3])),s=o(r(d[4])),u=o(r(d[5])),c=o(r(d[6])),f=o(r(d[7])),w=t(r(d[8])),h=r(d[9]),p=r(d[10]),v=o(r(d[11])),y=r(d[12]),b=h.Dimensions.get("window"),k=b.width,C=(b.height,{}),D=r(d[13]),L={refCollection:{}},B=(function(t){function o(t){var n;return(0,l.default)(this,o),(n=(0,u.default)(this,(0,c.default)(o).call(this,t))).state={},n}return(0,f.default)(o,t),(0,s.default)(o,[{key:"componentDidMount",value:function(){this.getDownloadedVideos()}},{key:"getDownloadedVideos",value:function(){v.default.getDownloadVideoList(!0).then(function(t){0==t.code?(console.log("downloed :"+t.dataMaps),L.refCollection.downloadedList.update(t)):console.log("download error:"+t.message)}).catch(function(t){console.log("download error:"+t)})}},{key:"render",value:function(){return console.log('render downloaed'),w.default.createElement(y.PolyvVideoDownloadList,(0,n.default)({nav:C},this.props,{style:E.container,ref:function(t){L.refCollection.downloadedList=t},isDownloadedPage:!0}))}}]),o})(w.Component);B.navigationOptions={tabBarLabel:"\u5df2\u4e0b\u8f7d"};var V=(function(t){function o(){return(0,l.default)(this,o),(0,u.default)(this,(0,c.default)(o).apply(this,arguments))}return(0,f.default)(o,t),(0,s.default)(o,[{key:"componentDidMount",value:function(){var t=this;setTimeout(function(){t.getDownloadingList()},50)}},{key:"getDownloadingList",value:function(){var t=this;v.default.getDownloadVideoList(!1).then(function(o){0==o.code?t.refs.downloadingList.update(o):console.log("download error:"+o.message)}).catch(function(t){console.log("download error:"+t)})}},{key:"updateDownload",value:function(t){var o=L.refCollection.downloadedList.state.datas;console.log('download success callback:'+JSON.stringify(t)),L.refCollection.downloadedList.setState({datas:o.concat(t)})}},{key:"render",value:function(){return w.default.createElement(y.PolyvVideoDownloadList,(0,n.default)({downloadCallback:this.updateDownload},this.props,{style:E.container,ref:"downloadingList",isDownloadedPage:!1}))}}]),o})(w.Component);V.navigationOptions={tabBarLabel:"\u4e0b\u8f7d\u4e2d"};var O=(function(t){function o(t){var n;return(0,l.default)(this,o),(n=(0,u.default)(this,(0,c.default)(o).call(this,t))).state={datas:[]},n}return(0,f.default)(o,t),(0,s.default)(o,[{key:"render",value:function(){var t=this;return C=this.props.navigation,w.default.createElement(h.View,{style:E.container},w.default.createElement(S,null),w.default.createElement(h.TouchableOpacity,{style:E.tabBackContainer,onPress:function(){t.props.navigation.goBack()}},w.default.createElement(h.Image,{style:E.tabBack,source:D})))}}]),o})(w.Component);e.default=O,O.navigationOptions={tabBarVisible:!1,header:null};var S=(0,p.createAppContainer)((0,p.createMaterialTopTabNavigator)({downloaded:{screen:B},downloading:{screen:V}},{initialRouteName:"downloaded",tabBarOptions:{activeTintColor:"tomato",inactiveTintColor:"gray",indicatorStyle:{width:50,borderRadius:5,marginLeft:k/4-25,position:"absolute",backgroundColor:"#2196F3"},labelStyle:{},tabStyle:{},style:{backgroundColor:"white"}}})),E=h.StyleSheet.create({container:{position:"relative",display:"flex",flexDirection:"row",width:k,flex:1,backgroundColor:"gray"},tabBackContainer:{position:"absolute",margin:10,width:30,height:30},tabBack:{width:30,height:30}})},535,[346,1,8,19,20,27,30,33,47,2,348,526,536,734]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),o=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.PolyvVideoDownloadList=void 0;var n=o(r(d[2])),l=o(r(d[3])),s=o(r(d[4])),u=o(r(d[5])),c=o(r(d[6])),f=o(r(d[7])),v=o(r(d[8])),w=t(r(d[9])),p=r(d[10]),h=r(d[11]),y=o(r(d[12])),D=r(d[13]),E=o(r(d[14])),P=o(r(d[15])),S=p.Dimensions.get("window"),k=S.width,b=S.height,x=(function(t){function o(t){var n;return(0,s.default)(this,o),(n=(0,c.default)(this,(0,f.default)(o).call(this,t))).refsCollection={},n.getQuickActions=function(){return w.default.createElement(p.View,{style:C.quickAContent},w.default.createElement(p.TouchableHighlight,{onPress:function(){return alert("\u786e\u8ba4\u5220\u9664\uff1f")}},w.default.createElement(p.View,{style:C.quick},w.default.createElement(h.Text,{style:C.delete},"\u5220\u9664"))))},n.emptyView=function(){return w.default.createElement(p.View,{style:C.empty_container},w.default.createElement(h.Text,{style:C.empty},"\u6682\u65e0\u4e0b\u8f7d\u89c6\u9891"))},n.state={datas:[],downloadingInfos:new Map,videoMap:new Map,allTaskDownloadPause:!1},n}return(0,v.default)(o,t),(0,u.default)(o,[{key:"componentWillMount",value:function(){this.registerReceiver()}},{key:"componentWillUnmount",value:function(){console.log("download list componentWillUnmount"),p.DeviceEventEmitter.removeAllListeners(),this.refsCollection={}}},{key:"update",value:function(t){console.log("update datas:"+t.dataMaps.size),this.state.videoMap=t.dataMaps,this.setState({datas:t.data})}},{key:"registerReceiver",value:function(){var t=this;console.log("registerReceiver:"+this.props.isDownloadedPage),this.props.isDownloadedPage||(p.DeviceEventEmitter.addListener("startDownloadEvent",function(t){console.log("startDownload"+t)}),p.DeviceEventEmitter.addListener("downloadFailedEvent",function(t){console.log("downloadFailedEvent"+JSON.stringify(t))}),p.DeviceEventEmitter.addListener("downloadSpeedEvent",function(o){console.log("downloadSpeedEvent"+JSON.stringify(o));var n=o.downloadSpeed,l=o.vid+o.bitrate,s=t.refsCollection[l];s?s.setState({speed:n}):console.log("downloadView is null")}),p.DeviceEventEmitter.addListener("updateProgressEvent",function(o){var n=t.state.videoMap;if(n&&0!=n.size){var l=t.state.downloadingInfos.get(o.downloadInfo);if(!l){if(!(l=JSON.parse(o.downloadInfo)))return void console.log("downloadInfo is null");t.state.downloadingInfos.set(o.downloadInfo,l)}var s=l.vid+l.bitrate,u=n.get(s);u&&(u.percent=o.current,u.total=o.total,u.progress=o.progress,t.refsCollection[s].setState({data:u,videoStatus:0}))}}),p.DeviceEventEmitter.addListener("downloadSuccessEvent",function(o){console.log("downloadSuccess:"+o.vid+" bitrate \uff1a"+o.bitrate);var n=o.vid+o.bitrate,l=t.refsCollection[n];if(l){var s=l.state.data;t.props.downloadCallback(s);var u=t.state.datas.filter(function(t){return t.vid+t.bitrate!==n});t.state.videoMap.delete(n),t.setState({datas:u})}else console.log("downloadView is null")}))}},{key:"_onPressItem",value:function(t){var o=this,n=t.vid+t.bitrate;p.Alert.alert("\u5220\u9664\u8be5\u89c6\u9891","",[{text:"\u786e\u5b9a",onPress:function(){var l=o.state.datas.filter(function(t){return t.vid+t.bitrate!=n});o.state.videoMap.delete(n),o.setState({datas:l});var s=t,u=E.default.deleteDownload(s.vid,s.bitrate);if(u!=P.default.SUCCESS){var c=P.default.getErrorDes(u);alert(c)}}},{text:"\u53d6\u6d88"}],{cancelable:!0,onDismiss:function(){}})}},{key:"renderItemData",value:function(t){var o=this,n=t.item,s=(t.index,n.vid+n.bitrate);return w.default.createElement(D.PolyvVideoDownloadItem,(0,l.default)({ref:function(t){o.refsCollection[s]=t}},this.props,{style:C.modalBox,isDownloadedPage:this.props.isDownloadedPage,downloadInfo:n,onPressItem:this._onPressItem.bind(this)}))}},{key:"_startOrPauseDownloadAll",value:function(){0!=this.state.datas.length&&(this.state.allTaskDownloadPause?(E.default.startAllDownload(),this.updateAllDownloadStatus(0)):(E.default.pauseAllDownload(),this.updateAllDownloadStatus(1)),this.setState({allTaskDownloadPause:!this.state.allTaskDownloadPause}))}},{key:"updateAllDownloadStatus",value:function(t){var o=this;this.state.downloadingInfos.forEach(function(n){var l=n.vid+n.bitrate,s=o.refsCollection[l];s?(console.log("updateAllDownloadStatus:"+t),s.setState({videoStatus:t})):console.log("download view is undefine")})}},{key:"_clearAll",value:function(){var t=this;0!=this.state.datas.length&&p.Alert.alert('\u63d0\u793a','\u662f\u5426\u8981\u6e05\u7a7a\u6240\u6709\u4e0b\u8f7d\u4e2d\u7684\u4efb\u52a1',[{text:"\u786e\u5b9a",onPress:function(){E.default.deleteAllDownload(),t.setState({datas:[],downloadingInfos:new Map,videoMap:new Map,allTaskDownloadPause:!1})}},{text:"\u53d6\u6d88"}],{cancelable:!0,onDismiss:function(){}})}},{key:"createFooterView",value:function(){var t=this;return this.props.isDownloadedPage?null:w.default.createElement(h.Footer,null,w.default.createElement(h.FooterTab,null,w.default.createElement(h.Button,{onPress:this._startOrPauseDownloadAll.bind(this)},w.default.createElement(h.Text,{style:C.footerTxt},this.state.allTaskDownloadPause?"\u4e0b\u8f7d\u5168\u90e8":"\u6682\u505c\u5168\u90e8")),w.default.createElement(h.Button,{onPress:function(){t._clearAll()}},w.default.createElement(h.Text,{style:C.footerTxt},"\u5168\u90e8\u6e05\u7a7a"))))}},{key:"render",value:function(){console.log(" list status "+this.props.isDownloadedPage);var t=this.createFooterView();return w.default.createElement(p.View,{style:C.container},w.default.createElement(p.FlatList,{style:C.list,data:this.state.datas,renderItem:this.renderItemData.bind(this),keyExtractor:function(t,o){return t.vid+t.bitrate+o},ListEmptyComponent:this.emptyView}),t)}}]),o})(w.Component);e.PolyvVideoDownloadList=x,x.propTypes=(0,n.default)({isDownloadedPage:y.default.bool,downloadCallback:y.default.func},p.View.propTypes);var C=p.StyleSheet.create({container:{flex:1,backgroundColor:'white',alignItems:"center",justifyContent:"center"},empty_container:{height:b,alignItems:"center",justifyContent:"center",display:"flex"},empty:{textAlign:'center',alignItems:"center",justifyContent:"center",display:"flex"},footerTxt:{fontSize:15},modalBox:{width:k,height:50},list:{width:k},delete:{color:"#d8fffa",marginRight:30},quickAContent:{margin:10,flex:1,flexDirection:"row",justifyContent:"flex-end"},quick:{backgroundColor:"red",alignItems:"flex-end",justifyContent:"center",width:80,height:70},delete:{color:"#d8fffa",marginRight:30}})},536,[346,1,44,8,19,20,27,30,33,47,2,537,59,729,526,527]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.mapPropsToStyleNames=e.Accordion=e.VueNativeBase=e.SwipeRow=e.Root=e.Segment=e.DefaultTabBar=e.TabContainer=e.TabHeading=e.ActionSheet=e.ScrollableTab=e.Toast=e.View=e.TabContent=e.Text=e.Grid=e.Row=e.Col=e.Textarea=e.Label=e.Subtitle=e.Item=e.DeckSwiper=e.Separator=e.ListItem=e.List=e.Picker=e.FooterTab=e.Tabs=e.Tab=e.Footer=e.Content=e.Container=e.Switch=e.Spinner=e.H3=e.H2=e.H1=e.CardItem=e.Card=e.Thumbnail=e.Radio=e.CheckBox=e.Badge=e.Body=e.Right=e.Left=e.Fab=e.Title=e.Input=e.InputGroup=e.Form=e.Header=e.Icon=e.IconNB=e.DatePicker=e.Button=e.Drawer=e.connectStyle=e.StyleProvider=e.variables=e.getTheme=void 0;var t=r(d[0]),o=r(d[1]),n=r(d[2]),l=ue(r(d[3])),c=ue(r(d[4])),T=ue(r(d[5])),b=ue(r(d[6])),u=r(d[7]),S=r(d[8]),p=r(d[9]),C=r(d[10]),s=r(d[11]),B=r(d[12]),I=r(d[13]),w=r(d[14]),f=r(d[15]),h=r(d[16]),H=r(d[17]),R=r(d[18]),k=r(d[19]),y=r(d[20]),F=r(d[21]),L=r(d[22]),P=r(d[23]),D=r(d[24]),v=r(d[25]),x=r(d[26]),N=r(d[27]),A=r(d[28]),G=r(d[29]),_=r(d[30]),V=r(d[31]),M=r(d[32]),j=r(d[33]),O=r(d[34]),q=r(d[35]),z=r(d[36]),E=r(d[37]),J=r(d[38]),K=r(d[39]),Q=r(d[40]),U=r(d[41]),W=r(d[42]),X=r(d[43]),Y=r(d[44]),Z=r(d[45]),$=r(d[46]),ee=r(d[47]),te=r(d[48]),ae=r(d[49]),oe=r(d[50]),re=r(d[51]),ne=r(d[52]),ie=ue(r(d[53])),le=r(d[54]),ce=r(d[55]),de=r(d[56]),Te=r(d[57]),be=ue(r(d[58]));function ue(t){return t&&t.__esModule?t:{default:t}}(0,l.default)(),e.getTheme=c.default,e.variables=T.default,e.StyleProvider=t.StyleProvider,e.connectStyle=t.connectStyle,e.Drawer=b.default,e.Button=C.Button,e.DatePicker=s.DatePicker,e.IconNB=w.IconNB,e.Icon=f.Icon,e.Header=h.Header,e.Form=Q.Form,e.InputGroup=H.InputGroup,e.Input=R.Input,e.Title=k.Title,e.Fab=y.Fab,e.Left=F.Left,e.Right=L.Right,e.Body=P.Body,e.Badge=D.Badge,e.CheckBox=v.CheckBox,e.Radio=x.Radio,e.Thumbnail=N.Thumbnail,e.Card=A.Card,e.CardItem=G.CardItem,e.H1=_.H1,e.H2=V.H2,e.H3=M.H3,e.Spinner=j.Spinner,e.Switch=O.Switch,e.Container=q.Container,e.Content=E.Content,e.Footer=J.Footer,e.Tab=ne.Tab,e.Tabs=ie.default,e.FooterTab=K.FooterTab,e.Picker=X.PickerNB,e.List=Y.List,e.ListItem=Z.ListItem,e.Separator=$.Separator,e.DeckSwiper=ee.DeckSwiper,e.Item=te.Item,e.Subtitle=de.Subtitle,e.Label=oe.Label,e.Textarea=re.Textarea,e.Col=n.Col,e.Row=n.Row,e.Grid=n.Grid,e.Text=S.Text,e.TabContent=E.Content,e.View=p.ViewNB,e.Toast=U.ToastContainer,e.ScrollableTab=ce.ScrollableTab,e.ActionSheet=W.ActionSheetContainer,e.TabHeading=B.TabHeading,e.TabContainer=I.TabContainer,e.DefaultTabBar=le.DefaultTabBar,e.Segment=ae.Segment,e.Root=z.Root,e.SwipeRow=u.SwipeRow,e.VueNativeBase=be.default,e.Accordion=Te.Accordion;e.mapPropsToStyleNames=function(t,n){return(0,o.keys)(n)}},537,[538,552,553,559,560,565,614,618,624,625,626,628,629,630,631,673,675,677,678,680,681,620,621,622,682,683,684,685,686,687,688,689,690,691,692,693,696,700,707,708,709,697,699,710,711,623,712,713,715,717,716,718,719,720,723,725,726,727,728]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"connectStyle",{enumerable:!0,get:function(){return u.default}}),Object.defineProperty(e,"clearThemeCache",{enumerable:!0,get:function(){return u.clearThemeCache}}),Object.defineProperty(e,"INCLUDE",{enumerable:!0,get:function(){return c.INCLUDE}}),Object.defineProperty(e,"StyleProvider",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(e,"Theme",{enumerable:!0,get:function(){return f.default}}),Object.defineProperty(e,"ThemeShape",{enumerable:!0,get:function(){return f.ThemeShape}}),Object.defineProperty(e,"createVariations",{enumerable:!0,get:function(){return l.createVariations}}),Object.defineProperty(e,"createSharedStyle",{enumerable:!0,get:function(){return l.createSharedStyle}});var u=n(r(d[2])),c=r(d[3]),o=t(r(d[4])),f=n(r(d[5])),l=r(d[6])},538,[1,346,539,546,550,545,551]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.clearThemeCache=function(){k={}},e.default=void 0;var l=n(r(d[2])),o=n(r(d[3])),s=n(r(d[4])),u=n(r(d[5])),p=n(r(d[6])),y=n(r(d[7])),c=n(r(d[8])),h=n(r(d[9])),f=n(r(d[10])),v=n(r(d[11])),S=n(r(d[12])),P=t(r(d[13])),C=(n(r(d[14])),r(d[15]),t(r(d[16]))),N=r(d[17]),k={};function b(t,n){throw Error(t+" - when connecting "+n+" component to style.")}function j(t){return t.theme||C.default.getDefaultTheme()}function I(t){return/(^[^\.].*\.)|^\*$/.test(t)}function _(t){return P.pickBy(t,function(t,n){return!/^\./.test(n)&&!I(n)})}e.default=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},I=arguments.length>2?arguments[2]:void 0,x=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};function w(t){return t.displayName||t.name||"Component"}return function(T){var O=w(T);P.isPlainObject(n)||b("Component style must be plain object",O),P.isString(t)||b("Component Style Name must be string",O);var W=(function(v){function S(t,n){var l;(0,s.default)(this,S);var o=(l=(0,p.default)(this,(0,y.default)(S).call(this,t,n))).getStyleNames(t),u=t.style,c=l.getFinalStyle(t,n,u,o);return l.setWrappedInstance=l.setWrappedInstance.bind((0,h.default)((0,h.default)(l))),l.resolveConnectedComponentStyle=l.resolveConnectedComponentStyle.bind((0,h.default)((0,h.default)(l))),l.state={style:c,addedProps:l.resolveAddedProps(),styleNames:o},l}return(0,c.default)(S,v),(0,u.default)(S,[{key:"getFinalStyle",value:function(n,l,s,u){var p={};l.parentPath?p=this.getOrSetStylesInCache(l,n,u,[].concat((0,o.default)(l.parentPath),[t],(0,o.default)(u))):(p=this.resolveStyle(l,n,u),k[t]=p);var y=_(P.merge({},p));return P.isArray(s)?[y].concat((0,o.default)(s)):"number"==typeof s||"object"==typeof s?[y,s]:y}},{key:"getStyleNames",value:function(t){var n=P.map(t,function(t,n){return"object"!=typeof t&&!0===t&&"."+n});return P.remove(n,function(t,n){return!1===t}),n}},{key:"getParentPath",value:function(){return this.context.parentPath?[].concat((0,o.default)(this.context.parentPath),[t],(0,o.default)(this.getStyleNames(this.props))):[t]}},{key:"getChildContext",value:function(){return{parentPath:this.getParentPath()}}},{key:"UNSAFE_componentWillReceiveProps",value:function(t,n){var l=this.getStyleNames(t),o=t.style;if(this.shouldRebuildStyle(t,n,l)){var s=this.getFinalStyle(t,n,o,l);this.setState({style:s,styleNames:l})}}},{key:"setNativeProps",value:function(t){this.wrappedInstance.setNativeProps&&this.wrappedInstance.setNativeProps(t)}},{key:"setWrappedInstance",value:function(t){t&&t._root?this._root=t._root:this._root=t,this.wrappedInstance=this._root}},{key:"hasStyleNameChanged",value:function(t,n){return I&&this.props!==t&&!P.isEqual(this.state.styleNames,n)}},{key:"shouldRebuildStyle",value:function(t,n,l){return t.style!==this.props.style||t.styleName!==this.props.styleName||n.theme!==this.context.theme||!P.isEqual(n.parentPath,this.context.parentPath)||this.hasStyleNameChanged(t,l)}},{key:"resolveStyleNames",value:function(t){var n=t.styleName,l=n?n.split(/\s/g):[];return I?P.uniq(I(l,t)):l}},{key:"resolveAddedProps",value:function(){var t={};return x.withRef&&(t.ref="wrappedInstance"),t}},{key:"getOrSetStylesInCache",value:function(t,n,l,o){if(k&&k[o.join(">")])return k[o.join(">")];var s=this.resolveStyle(t,n,l);return Object.keys(k).length<1e4&&(k[o.join(">")]=s),s}},{key:"resolveStyle",value:function(l,o,s){var u={},p=j(l).createComponentStyle(t,n);return u=l.parentPath?k[l.parentPath.join(">")]:(0,N.resolveComponentStyle)(t,s,p,u),(0,N.resolveComponentStyle)(t,s,p,u)}},{key:"resolveConnectedComponentStyle",value:function(t){var n=this.resolveStyleNames(t);return this.resolveStyle(this.context,t,n).componentStyle}},{key:"render",value:function(){var t=this.state,n=t.addedProps,o=t.style;return f.default.createElement(T,(0,l.default)({},this.props,n,{style:o,ref:this.setWrappedInstance}))}}]),S})(f.default.Component);return W.contextTypes={theme:C.ThemeShape,parentPath:v.default.array},W.childContextTypes={parentPath:v.default.array},W.propTypes={style:v.default.oneOfType([v.default.object,v.default.number,v.default.array]),styleName:v.default.string,virtual:v.default.bool},W.defaultProps={virtual:x.virtual},W.displayName="Styled("+O+")",W.WrappedComponent=T,(0,S.default)(W,T)}}},539,[346,1,8,15,19,20,27,30,33,29,47,59,540,541,542,2,545,548]); -__d(function(g,r,i,a,m,e,d){'use strict';var t={childContextTypes:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,arguments:!0,arity:!0},n='function'==typeof Object.getOwnPropertySymbols;m.exports=function(p,s,y){if('string'!=typeof s){var c=Object.getOwnPropertyNames(s);n&&(c=c.concat(Object.getOwnPropertySymbols(s)));for(var f=0;f"']/g,jn=RegExp(wn.source),An=RegExp(mn.source),kn=/<%-([\s\S]+?)%>/g,zn=/<%([\s\S]+?)%>/g,On=/<%=([\s\S]+?)%>/g,In=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Rn=/^\w*$/,En=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Sn=/[\\^$.*+?()[\]{}|]/g,Ln=RegExp(Sn.source),Wn=/^\s+|\s+$/g,Cn=/^\s+/,Tn=/\s+$/,Un=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Bn=/\{\n\/\* \[wrapped with (.+)\] \*/,$n=/,? & /,Dn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Mn=/\\(\\)?/g,Fn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Nn=/\w*$/,Pn=/^[-+]0x[0-9a-f]+$/i,Zn=/^0b[01]+$/i,qn=/^\[object .+?Constructor\]$/,Kn=/^0o[0-7]+$/i,Vn=/^(?:0|[1-9]\d*)$/,Gn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Hn=/($^)/,Jn=/['\n\r\u2028\u2029\\]/g,Yn="[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]",Qn="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Xn="(?:\\ud83c[\\udde6-\\uddff]){2}",nt="[\\ud800-\\udbff][\\udc00-\\udfff]",tt="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?"+("(?:\\u200d(?:"+["[^\\ud800-\\udfff]",Xn,nt].join('|')+")[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?)*"),rt='(?:'+["[\\u2700-\\u27bf]",Xn,nt].join('|')+')'+tt,et='(?:'+["[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]?",Qn,Xn,nt,"[\\ud800-\\udfff]"].join('|')+')',ut=RegExp("['\u2019]",'g'),it=RegExp(Qn,'g'),ot=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+et+tt,'g'),ft=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[Yn,"[A-Z\\xc0-\\xd6\\xd8-\\xde]",'$'].join('|')+')',"(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[Yn,"[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])",'$'].join('|')+')',"[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?","[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?",'\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])','\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])','\\d+',rt].join('|'),'g'),at=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]"),ct=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,lt=['Array','Buffer','DataView','Date','Error','Float32Array','Float64Array','Function','Int8Array','Int16Array','Int32Array','Map','Math','Object','Promise','RegExp','Set','String','Symbol','TypeError','Uint8Array','Uint8ClampedArray','Uint16Array','Uint32Array','WeakMap','_','clearTimeout','isFinite','parseInt','setTimeout'],st=-1,ht={};ht[cn]=ht[ln]=ht[sn]=ht[hn]=ht[pn]=ht[vn]=ht[_n]=ht[gn]=ht[dn]=!0,ht[D]=ht[M]=ht[fn]=ht[N]=ht[an]=ht[P]=ht[q]=ht[K]=ht[G]=ht[H]=ht[Y]=ht[X]=ht[nn]=ht[tn]=ht[un]=!1;var pt={};pt[D]=pt[M]=pt[fn]=pt[an]=pt[N]=pt[P]=pt[cn]=pt[ln]=pt[sn]=pt[hn]=pt[pn]=pt[G]=pt[H]=pt[Y]=pt[X]=pt[nn]=pt[tn]=pt[rn]=pt[vn]=pt[_n]=pt[gn]=pt[dn]=!0,pt[q]=pt[K]=pt[un]=!1;var vt={'\\':'\\',"'":"'",'\n':'n','\r':'r',"\u2028":'u2028',"\u2029":'u2029'},_t=parseFloat,gt=parseInt,dt='object'==typeof n&&n&&n.Object===Object&&n,yt='object'==typeof self&&self&&self.Object===Object&&self,xt=dt||yt||Function('return this')(),bt='object'==typeof i&&i&&!i.nodeType&&i,wt=bt&&'object'==typeof u&&u&&!u.nodeType&&u,mt=wt&&wt.exports===bt,jt=mt&&dt.process,At=(function(){try{var n=wt&&wt.require&&wt.require('util').types;return n||jt&&jt.binding&&jt.binding('util')}catch(n){}})(),kt=At&&At.isArrayBuffer,zt=At&&At.isDate,Ot=At&&At.isMap,It=At&&At.isRegExp,Rt=At&&At.isSet,Et=At&&At.isTypedArray;function St(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function Lt(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u-1}function $t(n,t,r){for(var e=-1,u=null==n?0:n.length;++e-1;);return r}function lr(n,t){for(var r=n.length;r--&&Ht(t,n[r],0)>-1;);return r}function sr(n,t){for(var r=n.length,e=0;r--;)n[r]===t&&++e;return e}var hr=nr({'\xc0':'A','\xc1':'A','\xc2':'A','\xc3':'A','\xc4':'A','\xc5':'A','\xe0':'a','\xe1':'a','\xe2':'a','\xe3':'a','\xe4':'a','\xe5':'a','\xc7':'C','\xe7':'c','\xd0':'D','\xf0':'d','\xc8':'E','\xc9':'E','\xca':'E','\xcb':'E','\xe8':'e','\xe9':'e','\xea':'e','\xeb':'e','\xcc':'I','\xcd':'I','\xce':'I','\xcf':'I','\xec':'i','\xed':'i','\xee':'i','\xef':'i','\xd1':'N','\xf1':'n','\xd2':'O','\xd3':'O','\xd4':'O','\xd5':'O','\xd6':'O','\xd8':'O','\xf2':'o','\xf3':'o','\xf4':'o','\xf5':'o','\xf6':'o','\xf8':'o','\xd9':'U','\xda':'U','\xdb':'U','\xdc':'U','\xf9':'u','\xfa':'u','\xfb':'u','\xfc':'u','\xdd':'Y','\xfd':'y','\xff':'y','\xc6':'Ae','\xe6':'ae','\xde':'Th','\xfe':'th','\xdf':'ss',"\u0100":'A',"\u0102":'A',"\u0104":'A',"\u0101":'a',"\u0103":'a',"\u0105":'a',"\u0106":'C',"\u0108":'C',"\u010a":'C',"\u010c":'C',"\u0107":'c',"\u0109":'c',"\u010b":'c',"\u010d":'c',"\u010e":'D',"\u0110":'D',"\u010f":'d',"\u0111":'d',"\u0112":'E',"\u0114":'E',"\u0116":'E',"\u0118":'E',"\u011a":'E',"\u0113":'e',"\u0115":'e',"\u0117":'e',"\u0119":'e',"\u011b":'e',"\u011c":'G',"\u011e":'G',"\u0120":'G',"\u0122":'G',"\u011d":'g',"\u011f":'g',"\u0121":'g',"\u0123":'g',"\u0124":'H',"\u0126":'H',"\u0125":'h',"\u0127":'h',"\u0128":'I',"\u012a":'I',"\u012c":'I',"\u012e":'I',"\u0130":'I',"\u0129":'i',"\u012b":'i',"\u012d":'i',"\u012f":'i',"\u0131":'i',"\u0134":'J',"\u0135":'j',"\u0136":'K',"\u0137":'k',"\u0138":'k',"\u0139":'L',"\u013b":'L',"\u013d":'L',"\u013f":'L',"\u0141":'L',"\u013a":'l',"\u013c":'l',"\u013e":'l',"\u0140":'l',"\u0142":'l',"\u0143":'N',"\u0145":'N',"\u0147":'N',"\u014a":'N',"\u0144":'n',"\u0146":'n',"\u0148":'n',"\u014b":'n',"\u014c":'O',"\u014e":'O',"\u0150":'O',"\u014d":'o',"\u014f":'o',"\u0151":'o',"\u0154":'R',"\u0156":'R',"\u0158":'R',"\u0155":'r',"\u0157":'r',"\u0159":'r',"\u015a":'S',"\u015c":'S',"\u015e":'S',"\u0160":'S',"\u015b":'s',"\u015d":'s',"\u015f":'s',"\u0161":'s',"\u0162":'T',"\u0164":'T',"\u0166":'T',"\u0163":'t',"\u0165":'t',"\u0167":'t',"\u0168":'U',"\u016a":'U',"\u016c":'U',"\u016e":'U',"\u0170":'U',"\u0172":'U',"\u0169":'u',"\u016b":'u',"\u016d":'u',"\u016f":'u',"\u0171":'u',"\u0173":'u',"\u0174":'W',"\u0175":'w',"\u0176":'Y',"\u0177":'y',"\u0178":'Y',"\u0179":'Z',"\u017b":'Z',"\u017d":'Z',"\u017a":'z',"\u017c":'z',"\u017e":'z',"\u0132":'IJ',"\u0133":'ij',"\u0152":'Oe',"\u0153":'oe',"\u0149":"'n","\u017f":'s'}),pr=nr({'&':'&','<':'<','>':'>','"':'"',"'":'''});function vr(n){return'\\'+vt[n]}function _r(n,r){return null==n?t:n[r]}function gr(n){return at.test(n)}function dr(n){return ct.test(n)}function yr(n){for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}function xr(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n]}),r}function br(n,t){return function(r){return n(t(r))}}function wr(n,t){for(var r=-1,e=n.length,u=0,i=[];++r','"':'"',''':"'"});function Rr(n){for(var t=ot.lastIndex=0;ot.test(n);)++t;return t}function Er(n){return n.match(ot)||[]}function Sr(n){return n.match(ft)||[]}var Lr=(function n(u){var i,Dn=(u=null==u?xt:Lr.defaults(xt.Object(),u,Lr.pick(xt,lt))).Array,Yn=u.Date,Qn=u.Error,Xn=u.Function,nt=u.Math,tt=u.Object,rt=u.RegExp,et=u.String,ot=u.TypeError,ft=Dn.prototype,at=Xn.prototype,ct=tt.prototype,vt=u['__core-js_shared__'],dt=at.toString,yt=ct.hasOwnProperty,bt=0,wt=(i=/[^.]+$/.exec(vt&&vt.keys&&vt.keys.IE_PROTO||''))?'Symbol(src)_1.'+i:'',jt=ct.toString,At=dt.call(tt),Zt=xt._,qt=rt('^'+dt.call(yt).replace(Sn,'\\$&').replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,'$1.*?')+'$'),nr=mt?u.Buffer:t,Ar=u.Symbol,Rr=u.Uint8Array,Er=nr?nr.allocUnsafe:t,Wr=br(tt.getPrototypeOf,tt),Cr=tt.create,Tr=ct.propertyIsEnumerable,Ur=ft.splice,Br=Ar?"function"==typeof Ar?Ar.isConcatSpreadable:"@@isConcatSpreadable":t,$r=Ar?"function"==typeof Ar?Ar.iterator:"@@iterator":t,Dr=Ar?"function"==typeof Ar?Ar.toStringTag:"@@toStringTag":t,Mr=(function(){try{var n=co(tt,'defineProperty');return n({},'',{}),n}catch(n){}})(),Fr=u.clearTimeout!==xt.clearTimeout&&u.clearTimeout,Nr=Yn&&Yn.now!==xt.Date.now&&Yn.now,Pr=u.setTimeout!==xt.setTimeout&&u.setTimeout,Zr=nt.ceil,qr=nt.floor,Kr=tt.getOwnPropertySymbols,Vr=nr?nr.isBuffer:t,Gr=u.isFinite,Hr=ft.join,Jr=br(tt.keys,tt),Yr=nt.max,Qr=nt.min,Xr=Yn.now,ne=u.parseInt,te=nt.random,re=ft.reverse,ee=co(u,'DataView'),ue=co(u,'Map'),ie=co(u,'Promise'),oe=co(u,'Set'),fe=co(u,'WeakMap'),ae=co(tt,'create'),ce=fe&&new fe,le={},se=Ko(ee),he=Ko(ue),pe=Ko(ie),ve=Ko(oe),_e=Ko(fe),ge=Ar?"function"==typeof Ar?Ar.prototype:"@@prototype":t,de=ge?ge.valueOf:t,ye=ge?ge.toString:t;function xe(n){if(sa(n)&&!na(n)&&!(n instanceof je)){if(n instanceof me)return n;if(yt.call(n,'__wrapped__'))return Go(n)}return new me(n)}var be=(function(){function n(){}return function(r){if(!la(r))return{};if(Cr)return Cr(r);n.prototype=r;var e=new n;return n.prototype=t,e}})();function we(){}function me(n,r){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!r,this.__index__=0,this.__values__=t}function je(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=T,this.__views__=[]}function Ae(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t=r?n:r)),n}function Ne(n,r,e,u,i,o){var f,a=r&l,c=r&s,p=r&h;if(e&&(f=i?e(n,u,i,o):e(n)),f!==t)return f;if(!la(n))return n;var v=na(n);if(v){if(f=yo(n),!a)return bi(n,f)}else{var _=po(n),g=_==K||_==V;if(ua(n))return hi(n,a);if(_==Y||_==D||g&&!i){if(f=c||g?{}:xo(n),!a)return c?ji(n,$e(f,n)):mi(n,Be(f,n))}else{if(!pt[_])return i?n:{};f=bo(n,_,a)}}o||(o=new Ie);var d=o.get(n);if(d)return d;o.set(n,f),ga(n)?n.forEach(function(t){f.add(Ne(t,r,e,t,n,o))}):ha(n)&&n.forEach(function(t,u){f.set(u,Ne(t,r,e,u,n,o))});var y=v?t:(p?c?ro:to:c?Na:Fa)(n);return Wt(y||n,function(t,u){y&&(t=n[u=t]),Ce(f,u,Ne(t,r,e,u,n,o))}),f}function Pe(n){var t=Fa(n);return function(r){return Ze(r,n,t)}}function Ze(n,r,e){var u=e.length;if(null==n)return!u;for(n=tt(n);u--;){var i=e[u],o=r[i],f=n[i];if(f===t&&!(i in n)||!o(f))return!1}return!0}function qe(n,r,e){if('function'!=typeof n)throw new ot(o);return Do(function(){n.apply(t,e)},r)}function Ke(n,t,e,u){var i=-1,o=Bt,f=!0,a=n.length,c=[],l=t.length;if(!a)return c;e&&(t=Dt(t,or(e))),u?(o=$t,f=!1):t.length>=r&&(o=ar,f=!1,t=new Oe(t));n:for(;++i-1},ke.prototype.set=function(n,t){var r=this.__data__,e=Te(r,n);return e<0?(++this.size,r.push([n,t])):r[e][1]=t,this},ze.prototype.clear=function(){this.size=0,this.__data__={hash:new Ae,map:new(ue||ke),string:new Ae}},ze.prototype.delete=function(n){var t=fo(this,n).delete(n);return this.size-=t?1:0,t},ze.prototype.get=function(n){return fo(this,n).get(n)},ze.prototype.has=function(n){return fo(this,n).has(n)},ze.prototype.set=function(n,t){var r=fo(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},Oe.prototype.add=Oe.prototype.push=function(n){return this.__data__.set(n,f),this},Oe.prototype.has=function(n){return this.__data__.has(n)},Ie.prototype.clear=function(){this.__data__=new ke,this.size=0},Ie.prototype.delete=function(n){var t=this.__data__,r=t.delete(n);return this.size=t.size,r},Ie.prototype.get=function(n){return this.__data__.get(n)},Ie.prototype.has=function(n){return this.__data__.has(n)},Ie.prototype.set=function(n,t){var r=this.__data__;if(r instanceof ke){var e=r.__data__;if(!ue||e.length<199)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new ze(e)}return r.set(n,t),this.size=r.size,this};var Ve=zi(ru),Ge=zi(eu,!0);function He(n,t){var r=!0;return Ve(n,function(n,e,u){return r=!!t(n,e,u)}),r}function Je(n,r,e){for(var u=-1,i=n.length;++ui?0:i+e),(u=u===t||u>i?i:Aa(u))<0&&(u+=i),u=e>u?0:ka(u);e0&&r(f)?t>1?Xe(f,t-1,r,e,u):Mt(u,f):e||(u[u.length]=f)}return u}var nu=Oi(),tu=Oi(!0);function ru(n,t){return n&&nu(n,t,Fa)}function eu(n,t){return n&&tu(n,t,Fa)}function uu(n,t){return Ut(t,function(t){return fa(n[t])})}function iu(n,r){for(var e=0,u=(r=ai(r,n)).length;null!=n&&et}function cu(n,t){return null!=n&&yt.call(n,t)}function lu(n,t){return null!=n&&t in tt(n)}function su(n,t,r){return n>=Qr(t,r)&&n=120&&s.length>=120)?new Oe(f&&s):t}s=n[0];var h=-1,p=a[0];n:for(;++h-1;)f!==n&&Ur.call(f,a,1),Ur.call(n,a,1);return n}function Tu(n,t){for(var r=n?t.length:0,e=r-1;r--;){var u=t[r];if(r==e||u!==i){var i=u;jo(u)?Ur.call(n,u,1):ni(n,u)}}return n}function Uu(n,t){return n+qr(te()*(t-n+1))}function Bu(n,t,r,e){for(var u=-1,i=Yr(Zr((t-n)/(r||1)),0),o=Dn(i);i--;)o[e?i:++u]=n,n+=r;return o}function $u(n,t){var r='';if(!n||t<1||t>L)return r;do{t%2&&(r+=n),(t=qr(t/2))&&(n+=n)}while(t);return r}function Du(n,t){return Mo(Co(n,t,pc),n+'')}function Mu(n){return Ee(Ja(n))}function Fu(n,t){var r=Ja(n);return Po(r,Fe(t,0,r.length))}function Nu(n,r,e,u){if(!la(n))return n;for(var i=-1,o=(r=ai(r,n)).length,f=o-1,a=n;null!=a&&++iu?0:u+t),(r=r>u?u:r)<0&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0;for(var i=Dn(u);++e>>1,o=n[i];null!==o&&!ya(o)&&(r?o<=t:o=r){var l=t?null:qi(n);if(l)return mr(l);f=!1,i=ar,c=new Oe}else c=t?[]:a;n:for(;++u=u?n:Ku(n,r,e)}var si=Fr||function(n){return xt.clearTimeout(n)};function hi(n,t){if(t)return n.slice();var r=n.length,e=Er?Er(r):new n.constructor(r);return n.copy(e),e}function pi(n){var t=new n.constructor(n.byteLength);return new Rr(t).set(new Rr(n)),t}function vi(n,t){var r=t?pi(n.buffer):n.buffer;return new n.constructor(r,n.byteOffset,n.byteLength)}function _i(n,t){var r=t?pi(n.buffer):n.buffer;return new n.constructor(r,n.byteOffset,n.length)}function gi(n,r){if(n!==r){var e=n!==t,u=null===n,i=n==n,o=ya(n),f=r!==t,a=null===r,c=r==r,l=ya(r);if(!a&&!l&&!o&&n>r||o&&f&&c&&!a&&!l||u&&f&&c||!e&&c||!i)return 1;if(!u&&!o&&!l&&n=f?a:a*('desc'==r[e]?-1:1)}return n.index-t.index}function yi(n,t,r,e){for(var u=-1,i=n.length,o=r.length,f=-1,a=t.length,c=Yr(i-o,0),l=Dn(a+c),s=!e;++f1?e[i-1]:t,f=i>2?e[2]:t;for(o=n.length>3&&'function'==typeof o?(i--,o):t,f&&Ao(e[0],e[1],f)&&(o=i<3?t:o,i=1),r=tt(r);++u-1?i[o?r[f]:f]:t}}function Ci(n){return no(function(r){var e=r.length,u=e,i=me.prototype.thru;for(n&&r.reverse();u--;){var f=r[u];if('function'!=typeof f)throw new ot(o);if(i&&!a&&'wrapper'==uo(f))var a=new me([],!0)}for(u=a?u:e;++u1&&g.reverse(),s&&c<_&&(g.length=c),this&&this!==xt&&this instanceof t&&(A=y||Si(A)),A.apply(j,g)}}function Ui(n,t){return function(r,e){return pu(r,n,t(e),{})}}function Bi(n,r){return function(e,u){var i;if(e===t&&u===t)return r;if(e!==t&&(i=e),u!==t){if(i===t)return u;'string'==typeof e||'string'==typeof u?(e=Qu(e),u=Qu(u)):(e=Yu(e),u=Yu(u)),i=n(e,u)}return i}}function $i(n){return no(function(t){return t=Dt(t,or(oo())),Du(function(r){var e=this;return n(t,function(n){return St(n,e,r)})})})}function Di(n,r){var e=(r=r===t?' ':Qu(r)).length;if(e<2)return e?$u(r,n):r;var u=$u(r,Zr(n/zr(r)));return gr(r)?li(Or(u),0,n).join(''):u.slice(0,n)}function Mi(n,t,r,e){var u=t&_,i=Si(n);return function t(){for(var o=-1,f=arguments.length,a=-1,c=e.length,l=Dn(c+f),s=this&&this!==xt&&this instanceof t?i:n;++aa))return!1;var l=o.get(n),s=o.get(r);if(l&&s)return l==r&&s==n;var h=-1,_=!0,g=e&v?new Oe:t;for(o.set(n,r),o.set(r,n);++h1?'& ':'')+t[e],t=t.join(r>2?', ':' '),n.replace(Un,'{\n/* [wrapped with '+t+'] */\n')}function mo(n){return na(n)||Xf(n)||!!(Br&&n&&n[Br])}function jo(n,t){var r=typeof n;return!!(t=null==t?L:t)&&('number'==r||'symbol'!=r&&Vn.test(n))&&n>-1&&n%1==0&&n0){if(++r>=O)return arguments[0]}else r=0;return n.apply(t,arguments)}}function Po(n,r){var e=-1,u=n.length,i=u-1;for(r=r===t?u:r;++e1?n[r-1]:t;return _f(n,e='function'==typeof e?(n.pop(),e):t)});function mf(n){var t=xe(n);return t.__chain__=!0,t}function jf(n,t){return t(n)}var Af=no(function(n){var r=n.length,e=r?n[0]:0,u=this.__wrapped__,i=function(t){return Me(t,n)};return!(r>1||this.__actions__.length)&&u instanceof je&&jo(e)?((u=u.slice(e,+e+(r?1:0))).__actions__.push({func:jf,args:[i],thisArg:t}),new me(u,this.__chain__).thru(function(n){return r&&!n.length&&n.push(t),n})):this.thru(i)});var kf=Ai(function(n,t,r){yt.call(n,r)?++n[r]:De(n,r,1)});var zf=Wi(Qo),Of=Wi(Xo);function If(n,t){return(na(n)?Wt:Ve)(n,oo(t,3))}function Rf(n,t){return(na(n)?Ct:Ge)(n,oo(t,3))}var Ef=Ai(function(n,t,r){yt.call(n,r)?n[r].push(t):De(n,r,[t])});var Sf=Du(function(n,t,r){var e=-1,u='function'==typeof t,i=ra(n)?Dn(n.length):[];return Ve(n,function(n){i[++e]=u?St(t,n,r):vu(n,t,r)}),i}),Lf=Ai(function(n,t,r){De(n,r,t)});function Wf(n,t){return(na(n)?Dt:Au)(n,oo(t,3))}var Cf=Ai(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]});var Tf=Du(function(n,t){if(null==n)return[];var r=t.length;return r>1&&Ao(n,t[0],t[1])?t=[]:r>2&&Ao(t[0],t[1],t[2])&&(t=[t[0]]),Eu(n,Xe(t,1),[])}),Uf=Nr||function(){return xt.Date.now()};function Bf(n,r,e){return r=e?t:r,r=n&&null==r?n.length:r,Vi(n,m,t,t,t,t,r)}function $f(n,r){var e;if('function'!=typeof r)throw new ot(o);return n=Aa(n),function(){return--n>0&&(e=r.apply(this,arguments)),n<=1&&(r=t),e}}var Df=Du(function(n,t,r){var e=_;if(r.length){var u=wr(r,io(Df));e|=b}return Vi(n,e,t,r,u)}),Mf=Du(function(n,t,r){var e=3;if(r.length){var u=wr(r,io(Mf));e|=b}return Vi(t,e,n,r,u)});function Ff(n,r,e){var u,i,f,a,c,l,s=0,h=!1,p=!1,v=!0;if('function'!=typeof n)throw new ot(o);function _(r){var e=u,o=i;return u=i=t,s=r,a=n.apply(o,e)}function g(n){return s=n,c=Do(x,r),h?_(n):a}function d(n){var t=r-(n-l);return p?Qr(t,f-(n-s)):t}function y(n){var e=n-l;return l===t||e>=r||e<0||p&&n-s>=f}function x(){var n=Uf();if(y(n))return b(n);c=Do(x,d(n))}function b(n){return c=t,v&&u?_(n):(u=i=t,a)}function w(){var n=Uf(),e=y(n);if(u=arguments,i=this,l=n,e){if(c===t)return g(l);if(p)return si(c),c=Do(x,r),_(l)}return c===t&&(c=Do(x,r)),a}return r=za(r)||0,la(e)&&(h=!!e.leading,f=(p='maxWait'in e)?Yr(za(e.maxWait)||0,r):f,v='trailing'in e?!!e.trailing:v),w.cancel=function(){c!==t&&si(c),s=0,u=l=i=c=t},w.flush=function(){return c===t?a:b(Uf())},w}var Nf=Du(function(n,t){return qe(n,1,t)}),Pf=Du(function(n,t,r){return qe(n,za(t)||0,r)});function Zf(n,t){if('function'!=typeof n||null!=t&&'function'!=typeof t)throw new ot(o);var r=function r(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;if(i.has(u))return i.get(u);var o=n.apply(this,e);return r.cache=i.set(u,o)||i,o};return r.cache=new(Zf.Cache||ze),r}function qf(n){if('function'!=typeof n)throw new ot(o);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}Zf.Cache=ze;var Kf=ci(function(n,t){var r=(t=1==t.length&&na(t[0])?Dt(t[0],or(oo())):Dt(Xe(t,1),or(oo()))).length;return Du(function(e){for(var u=-1,i=Qr(e.length,r);++u=t}),Xf=_u((function(){return arguments})())?_u:function(n){return sa(n)&&yt.call(n,'callee')&&!Tr.call(n,'callee')},na=Dn.isArray,ta=kt?or(kt):function(n){return sa(n)&&fu(n)==fn};function ra(n){return null!=n&&ca(n.length)&&!fa(n)}function ea(n){return sa(n)&&ra(n)}var ua=Vr||zc,ia=zt?or(zt):function(n){return sa(n)&&fu(n)==P};function oa(n){if(!sa(n))return!1;var t=fu(n);return t==q||t==Z||'string'==typeof n.message&&'string'==typeof n.name&&!va(n)}function fa(n){if(!la(n))return!1;var t=fu(n);return t==K||t==V||t==F||t==Q}function aa(n){return'number'==typeof n&&n==Aa(n)}function ca(n){return'number'==typeof n&&n>-1&&n%1==0&&n<=L}function la(n){var t=typeof n;return null!=n&&('object'==t||'function'==t)}function sa(n){return null!=n&&'object'==typeof n}var ha=Ot?or(Ot):function(n){return sa(n)&&po(n)==G};function pa(n){return'number'==typeof n||sa(n)&&fu(n)==H}function va(n){if(!sa(n)||fu(n)!=Y)return!1;var t=Wr(n);if(null===t)return!0;var r=yt.call(t,'constructor')&&t.constructor;return'function'==typeof r&&r instanceof r&&dt.call(r)==At}var _a=It?or(It):function(n){return sa(n)&&fu(n)==X};var ga=Rt?or(Rt):function(n){return sa(n)&&po(n)==nn};function da(n){return'string'==typeof n||!na(n)&&sa(n)&&fu(n)==tn}function ya(n){return'symbol'==typeof n||sa(n)&&fu(n)==rn}var xa=Et?or(Et):function(n){return sa(n)&&ca(n.length)&&!!ht[fu(n)]};var ba=Ni(ju),wa=Ni(function(n,t){return n<=t});function ma(n){if(!n)return[];if(ra(n))return da(n)?Or(n):bi(n);if($r&&n[$r])return yr(n[$r]());var t=po(n);return(t==G?xr:t==nn?mr:Ja)(n)}function ja(n){return n?(n=za(n))===S||n===-1/0?(n<0?-1:1)*W:n==n?n:0:0===n?n:0}function Aa(n){var t=ja(n),r=t%1;return t==t?r?t-r:t:0}function ka(n){return n?Fe(Aa(n),0,T):0}function za(n){if('number'==typeof n)return n;if(ya(n))return C;if(la(n)){var t='function'==typeof n.valueOf?n.valueOf():n;n=la(t)?t+'':t}if('string'!=typeof n)return 0===n?n:+n;n=n.replace(Wn,'');var r=Zn.test(n);return r||Kn.test(n)?gt(n.slice(2),r?2:8):Pn.test(n)?C:+n}function Oa(n){return wi(n,Na(n))}function Ia(n){return null==n?'':Qu(n)}var Ra=ki(function(n,t){if(Io(t)||ra(t))wi(t,Fa(t),n);else for(var r in t)yt.call(t,r)&&Ce(n,r,t[r])}),Ea=ki(function(n,t){wi(t,Na(t),n)}),Sa=ki(function(n,t,r,e){wi(t,Na(t),n,e)}),La=ki(function(n,t,r,e){wi(t,Fa(t),n,e)}),Wa=no(Me);var Ca=Du(function(n,r){n=tt(n);var e=-1,u=r.length,i=u>2?r[2]:t;for(i&&Ao(r[0],r[1],i)&&(u=1);++e1),t}),wi(n,ro(n),r),e&&(r=Ne(r,7,Ji));for(var u=t.length;u--;)ni(r,t[u]);return r});var Ka=no(function(n,t){return null==n?{}:Su(n,t)});function Va(n,t){if(null==n)return{};var r=Dt(ro(n),function(n){return[n]});return t=oo(t),Lu(n,r,function(n,r){return t(n,r[0])})}var Ga=Ki(Fa),Ha=Ki(Na);function Ja(n){return null==n?[]:fr(n,Fa(n))}var Ya=Ei(function(n,t,r){return t=t.toLowerCase(),n+(r?Qa(t):t)});function Qa(n){return oc(Ia(n).toLowerCase())}function Xa(n){return(n=Ia(n))&&n.replace(Gn,hr).replace(it,'')}var nc=Ei(function(n,t,r){return n+(r?'-':'')+t.toLowerCase()}),tc=Ei(function(n,t,r){return n+(r?' ':'')+t.toLowerCase()}),rc=Ri('toLowerCase');var ec=Ei(function(n,t,r){return n+(r?'_':'')+t.toLowerCase()});var uc=Ei(function(n,t,r){return n+(r?' ':'')+oc(t)});var ic=Ei(function(n,t,r){return n+(r?' ':'')+t.toUpperCase()}),oc=Ri('toUpperCase');function fc(n,r,e){return n=Ia(n),(r=e?t:r)===t?dr(n)?Sr(n):Kt(n):n.match(r)||[]}var ac=Du(function(n,r){try{return St(n,t,r)}catch(n){return oa(n)?n:new Qn(n)}}),cc=no(function(n,t){return Wt(t,function(t){t=qo(t),De(n,t,Df(n[t],n))}),n});function lc(n){return function(){return n}}var sc=Ci(),hc=Ci(!0);function pc(n){return n}function vc(n){return bu('function'==typeof n?n:Ne(n,l))}var _c=Du(function(n,t){return function(r){return vu(r,n,t)}}),gc=Du(function(n,t){return function(r){return vu(n,r,t)}});function dc(n,t,r){var e=Fa(t),u=uu(t,e);null!=r||la(t)&&(u.length||!e.length)||(r=t,t=n,n=this,u=uu(t,Fa(t)));var i=!(la(r)&&'chain'in r&&!r.chain),o=fa(n);return Wt(u,function(r){var e=t[r];n[r]=e,o&&(n.prototype[r]=function(){var t=this.__chain__;if(i||t){var r=n(this.__wrapped__);return(r.__actions__=bi(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,Mt([this.value()],arguments))})}),n}function yc(){}var xc=$i(Dt),bc=$i(Tt),wc=$i(Pt);function mc(n){return ko(n)?Xt(qo(n)):Wu(n)}var jc=Fi(),Ac=Fi(!0);function kc(){return[]}function zc(){return!1}var Oc=Bi(function(n,t){return n+t},0),Ic=Zi('ceil'),Rc=Bi(function(n,t){return n/t},1),Ec=Zi('floor');var Sc,Lc=Bi(function(n,t){return n*t},1),Wc=Zi('round'),Cc=Bi(function(n,t){return n-t},0);return xe.after=function(n,t){if('function'!=typeof t)throw new ot(o);return n=Aa(n),function(){if(--n<1)return t.apply(this,arguments)}},xe.ary=Bf,xe.assign=Ra,xe.assignIn=Ea,xe.assignInWith=Sa,xe.assignWith=La,xe.at=Wa,xe.before=$f,xe.bind=Df,xe.bindAll=cc,xe.bindKey=Mf,xe.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return na(n)?n:[n]},xe.chain=mf,xe.chunk=function(n,r,e){r=(e?Ao(n,r,e):r===t)?1:Yr(Aa(r),0);var u=null==n?0:n.length;if(!u||r<1)return[];for(var i=0,o=0,f=Dn(Zr(u/r));i>>0)?(n=Ia(n))&&('string'==typeof r||null!=r&&!_a(r))&&!(r=Qu(r))&&gr(n)?li(Or(n),0,e):n.split(r,e):[]},xe.spread=function(n,t){if('function'!=typeof n)throw new ot(o);return t=null==t?0:Yr(Aa(t),0),Du(function(r){var e=r[t],u=li(r,0,t);return e&&Mt(u,e),St(n,this,u)})},xe.tail=function(n){var t=null==n?0:n.length;return t?Ku(n,1,t):[]},xe.take=function(n,r,e){return n&&n.length?Ku(n,0,(r=e||r===t?1:Aa(r))<0?0:r):[]},xe.takeRight=function(n,r,e){var u=null==n?0:n.length;return u?Ku(n,(r=u-(r=e||r===t?1:Aa(r)))<0?0:r,u):[]},xe.takeRightWhile=function(n,t){return n&&n.length?ri(n,oo(t,3),!1,!0):[]},xe.takeWhile=function(n,t){return n&&n.length?ri(n,oo(t,3)):[]},xe.tap=function(n,t){return t(n),n},xe.throttle=function(n,t,r){var e=!0,u=!0;if('function'!=typeof n)throw new ot(o);return la(r)&&(e='leading'in r?!!r.leading:e,u='trailing'in r?!!r.trailing:u),Ff(n,t,{leading:e,maxWait:t,trailing:u})},xe.thru=jf,xe.toArray=ma,xe.toPairs=Ga,xe.toPairsIn=Ha,xe.toPath=function(n){return na(n)?Dt(n,qo):ya(n)?[n]:bi(Zo(Ia(n)))},xe.toPlainObject=Oa,xe.transform=function(n,t,r){var e=na(n),u=e||ua(n)||xa(n);if(t=oo(t,4),null==r){var i=n&&n.constructor;r=u?e?new i:[]:la(n)&&fa(i)?be(Wr(n)):{}}return(u?Wt:ru)(n,function(n,e,u){return t(r,n,e,u)}),r},xe.unary=function(n){return Bf(n,1)},xe.union=sf,xe.unionBy=hf,xe.unionWith=pf,xe.uniq=function(n){return n&&n.length?Xu(n):[]},xe.uniqBy=function(n,t){return n&&n.length?Xu(n,oo(t,2)):[]},xe.uniqWith=function(n,r){return r='function'==typeof r?r:t,n&&n.length?Xu(n,t,r):[]},xe.unset=function(n,t){return null==n||ni(n,t)},xe.unzip=vf,xe.unzipWith=_f,xe.update=function(n,t,r){return null==n?n:ti(n,t,fi(r))},xe.updateWith=function(n,r,e,u){return u='function'==typeof u?u:t,null==n?n:ti(n,r,fi(e),u)},xe.values=Ja,xe.valuesIn=function(n){return null==n?[]:fr(n,Na(n))},xe.without=gf,xe.words=fc,xe.wrap=function(n,t){return Vf(fi(t),n)},xe.xor=df,xe.xorBy=yf,xe.xorWith=xf,xe.zip=bf,xe.zipObject=function(n,t){return ii(n||[],t||[],Ce)},xe.zipObjectDeep=function(n,t){return ii(n||[],t||[],Nu)},xe.zipWith=wf,xe.entries=Ga,xe.entriesIn=Ha,xe.extend=Ea,xe.extendWith=Sa,dc(xe,xe),xe.add=Oc,xe.attempt=ac,xe.camelCase=Ya,xe.capitalize=Qa,xe.ceil=Ic,xe.clamp=function(n,r,e){return e===t&&(e=r,r=t),e!==t&&(e=(e=za(e))==e?e:0),r!==t&&(r=(r=za(r))==r?r:0),Fe(za(n),r,e)},xe.clone=function(n){return Ne(n,h)},xe.cloneDeep=function(n){return Ne(n,5)},xe.cloneDeepWith=function(n,r){return Ne(n,5,r='function'==typeof r?r:t)},xe.cloneWith=function(n,r){return Ne(n,h,r='function'==typeof r?r:t)},xe.conformsTo=function(n,t){return null==t||Ze(n,t,Fa(t))},xe.deburr=Xa,xe.defaultTo=function(n,t){return null==n||n!=n?t:n},xe.divide=Rc,xe.endsWith=function(n,r,e){n=Ia(n),r=Qu(r);var u=n.length,i=e=e===t?u:Fe(Aa(e),0,u);return(e-=r.length)>=0&&n.slice(e,i)==r},xe.eq=Jf,xe.escape=function(n){return(n=Ia(n))&&An.test(n)?n.replace(mn,pr):n},xe.escapeRegExp=function(n){return(n=Ia(n))&&Ln.test(n)?n.replace(Sn,'\\$&'):n},xe.every=function(n,r,e){var u=na(n)?Tt:He;return e&&Ao(n,r,e)&&(r=t),u(n,oo(r,3))},xe.find=zf,xe.findIndex=Qo,xe.findKey=function(n,t){return Vt(n,oo(t,3),ru)},xe.findLast=Of,xe.findLastIndex=Xo,xe.findLastKey=function(n,t){return Vt(n,oo(t,3),eu)},xe.floor=Ec,xe.forEach=If,xe.forEachRight=Rf,xe.forIn=function(n,t){return null==n?n:nu(n,oo(t,3),Na)},xe.forInRight=function(n,t){return null==n?n:tu(n,oo(t,3),Na)},xe.forOwn=function(n,t){return n&&ru(n,oo(t,3))},xe.forOwnRight=function(n,t){return n&&eu(n,oo(t,3))},xe.get=Ua,xe.gt=Yf,xe.gte=Qf,xe.has=function(n,t){return null!=n&&go(n,t,cu)},xe.hasIn=Ba,xe.head=tf,xe.identity=pc,xe.includes=function(n,t,r,e){n=ra(n)?n:Ja(n),r=r&&!e?Aa(r):0;var u=n.length;return r<0&&(r=Yr(u+r,0)),da(n)?r<=u&&n.indexOf(t,r)>-1:!!u&&Ht(n,t,r)>-1},xe.indexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=null==r?0:Aa(r);return u<0&&(u=Yr(e+u,0)),Ht(n,t,u)},xe.inRange=function(n,r,e){return r=ja(r),e===t?(e=r,r=0):e=ja(e),su(n=za(n),r,e)},xe.invoke=Ma,xe.isArguments=Xf,xe.isArray=na,xe.isArrayBuffer=ta,xe.isArrayLike=ra,xe.isArrayLikeObject=ea,xe.isBoolean=function(n){return!0===n||!1===n||sa(n)&&fu(n)==N},xe.isBuffer=ua,xe.isDate=ia,xe.isElement=function(n){return sa(n)&&1===n.nodeType&&!va(n)},xe.isEmpty=function(n){if(null==n)return!0;if(ra(n)&&(na(n)||'string'==typeof n||'function'==typeof n.splice||ua(n)||xa(n)||Xf(n)))return!n.length;var t=po(n);if(t==G||t==nn)return!n.size;if(Io(n))return!wu(n).length;for(var r in n)if(yt.call(n,r))return!1;return!0},xe.isEqual=function(n,t){return gu(n,t)},xe.isEqualWith=function(n,r,e){var u=(e='function'==typeof e?e:t)?e(n,r):t;return u===t?gu(n,r,t,e):!!u},xe.isError=oa,xe.isFinite=function(n){return'number'==typeof n&&Gr(n)},xe.isFunction=fa,xe.isInteger=aa,xe.isLength=ca,xe.isMap=ha,xe.isMatch=function(n,t){return n===t||yu(n,t,ao(t))},xe.isMatchWith=function(n,r,e){return e='function'==typeof e?e:t,yu(n,r,ao(r),e)},xe.isNaN=function(n){return pa(n)&&n!=+n},xe.isNative=function(n){if(Oo(n))throw new Qn(e);return xu(n)},xe.isNil=function(n){return null==n},xe.isNull=function(n){return null===n},xe.isNumber=pa,xe.isObject=la,xe.isObjectLike=sa,xe.isPlainObject=va,xe.isRegExp=_a,xe.isSafeInteger=function(n){return aa(n)&&n>=-9007199254740991&&n<=L},xe.isSet=ga,xe.isString=da,xe.isSymbol=ya,xe.isTypedArray=xa,xe.isUndefined=function(n){return n===t},xe.isWeakMap=function(n){return sa(n)&&po(n)==un},xe.isWeakSet=function(n){return sa(n)&&fu(n)==on},xe.join=function(n,t){return null==n?'':Hr.call(n,t)},xe.kebabCase=nc,xe.last=of,xe.lastIndexOf=function(n,r,e){var u=null==n?0:n.length;if(!u)return-1;var i=u;return e!==t&&(i=(i=Aa(e))<0?Yr(u+i,0):Qr(i,u-1)),r==r?kr(n,r,i):Gt(n,Yt,i,!0)},xe.lowerCase=tc,xe.lowerFirst=rc,xe.lt=ba,xe.lte=wa,xe.max=function(n){return n&&n.length?Je(n,pc,au):t},xe.maxBy=function(n,r){return n&&n.length?Je(n,oo(r,2),au):t},xe.mean=function(n){return Qt(n,pc)},xe.meanBy=function(n,t){return Qt(n,oo(t,2))},xe.min=function(n){return n&&n.length?Je(n,pc,ju):t},xe.minBy=function(n,r){return n&&n.length?Je(n,oo(r,2),ju):t},xe.stubArray=kc,xe.stubFalse=zc,xe.stubObject=function(){return{}},xe.stubString=function(){return''},xe.stubTrue=function(){return!0},xe.multiply=Lc,xe.nth=function(n,r){return n&&n.length?Ru(n,Aa(r)):t},xe.noConflict=function(){return xt._===this&&(xt._=Zt),this},xe.noop=yc,xe.now=Uf,xe.pad=function(n,t,r){n=Ia(n);var e=(t=Aa(t))?zr(n):0;if(!t||e>=t)return n;var u=(t-e)/2;return Di(qr(u),r)+n+Di(Zr(u),r)},xe.padEnd=function(n,t,r){n=Ia(n);var e=(t=Aa(t))?zr(n):0;return t&&er){var u=n;n=r,r=u}if(e||n%1||r%1){var i=te();return Qr(n+i*(r-n+_t('1e-'+((i+'').length-1))),r)}return Uu(n,r)},xe.reduce=function(n,t,r){var e=na(n)?Ft:tr,u=arguments.length<3;return e(n,oo(t,4),r,u,Ve)},xe.reduceRight=function(n,t,r){var e=na(n)?Nt:tr,u=arguments.length<3;return e(n,oo(t,4),r,u,Ge)},xe.repeat=function(n,r,e){return r=(e?Ao(n,r,e):r===t)?1:Aa(r),$u(Ia(n),r)},xe.replace=function(){var n=arguments,t=Ia(n[0]);return n.length<3?t:t.replace(n[1],n[2])},xe.result=function(n,r,e){var u=-1,i=(r=ai(r,n)).length;for(i||(i=1,n=t);++uL)return[];var r=T,e=Qr(n,T);t=oo(t),n-=T;for(var u=ur(e,t);++r=o)return n;var a=e-zr(u);if(a<1)return u;var c=f?li(f,0,a).join(''):n.slice(0,a);if(i===t)return c+u;if(f&&(a+=c.length-a),_a(i)){if(n.slice(a).search(i)){var l,s=c;for(i.global||(i=rt(i.source,Ia(Nn.exec(i))+'g')),i.lastIndex=0;l=i.exec(s);)var h=l.index;c=c.slice(0,h===t?a:h)}}else if(n.indexOf(Qu(i),a)!=a){var p=c.lastIndexOf(i);p>-1&&(c=c.slice(0,p))}return c+u},xe.unescape=function(n){return(n=Ia(n))&&jn.test(n)?n.replace(wn,Ir):n},xe.uniqueId=function(n){var t=++bt;return Ia(n)+t},xe.upperCase=ic,xe.upperFirst=oc,xe.each=If,xe.eachRight=Rf,xe.first=tf,dc(xe,(Sc={},ru(xe,function(n,t){yt.call(xe.prototype,t)||(Sc[t]=n)}),Sc),{chain:!1}),xe.VERSION="4.17.20",Wt(['bind','bindKey','curry','curryRight','partial','partialRight'],function(n){xe[n].placeholder=xe}),Wt(['drop','take'],function(n,r){je.prototype[n]=function(e){e=e===t?1:Yr(Aa(e),0);var u=this.__filtered__&&!r?new je(this):this.clone();return u.__filtered__?u.__takeCount__=Qr(e,u.__takeCount__):u.__views__.push({size:Qr(e,T),type:n+(u.__dir__<0?'Right':'')}),u},je.prototype[n+'Right']=function(t){return this.reverse()[n](t).reverse()}}),Wt(['filter','map','takeWhile'],function(n,t){var r=t+1,e=r==R||3==r;je.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:oo(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),Wt(['head','last'],function(n,t){var r='take'+(t?'Right':'');je.prototype[n]=function(){return this[r](1).value()[0]}}),Wt(['initial','tail'],function(n,t){var r='drop'+(t?'':'Right');je.prototype[n]=function(){return this.__filtered__?new je(this):this[r](1)}}),je.prototype.compact=function(){return this.filter(pc)},je.prototype.find=function(n){return this.filter(n).head()},je.prototype.findLast=function(n){return this.reverse().find(n)},je.prototype.invokeMap=Du(function(n,t){return'function'==typeof n?new je(this):this.map(function(r){return vu(r,n,t)})}),je.prototype.reject=function(n){return this.filter(qf(oo(n)))},je.prototype.slice=function(n,r){n=Aa(n);var e=this;return e.__filtered__&&(n>0||r<0)?new je(e):(n<0?e=e.takeRight(-n):n&&(e=e.drop(n)),r!==t&&(e=(r=Aa(r))<0?e.dropRight(-r):e.take(r-n)),e)},je.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},je.prototype.toArray=function(){return this.take(T)},ru(je.prototype,function(n,r){var e=/^(?:filter|find|map|reject)|While$/.test(r),u=/^(?:head|last)$/.test(r),i=xe[u?'take'+('last'==r?'Right':''):r],o=u||/^find/.test(r);i&&(xe.prototype[r]=function(){var r=this.__wrapped__,f=u?[1]:arguments,a=r instanceof je,c=f[0],l=a||na(r),s=function(n){var t=i.apply(xe,Mt([n],f));return u&&h?t[0]:t};l&&e&&'function'==typeof c&&1!=c.length&&(a=l=!1);var h=this.__chain__,p=!!this.__actions__.length,v=o&&!h,_=a&&!p;if(!o&&l){r=_?r:new je(this);var g=n.apply(r,f);return g.__actions__.push({func:jf,args:[s],thisArg:t}),new me(g,h)}return v&&_?n.apply(this,f):(g=this.thru(s),v?u?g.value()[0]:g.value():g)})}),Wt(['pop','push','shift','sort','splice','unshift'],function(n){var t=ft[n],r=/^(?:push|sort|unshift)$/.test(n)?'tap':'thru',e=/^(?:pop|shift)$/.test(n);xe.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(na(u)?u:[],n)}return this[r](function(r){return t.apply(na(r)?r:[],n)})}}),ru(je.prototype,function(n,t){var r=xe[t];if(r){var e=r.name+'';yt.call(le,e)||(le[e]=[]),le[e].push({name:t,func:r})}}),le[Ti(t,g).name]=[{name:'wrapper',func:t}],je.prototype.clone=function(){var n=new je(this.__wrapped__);return n.__actions__=bi(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=bi(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=bi(this.__views__),n},je.prototype.reverse=function(){if(this.__filtered__){var n=new je(this);n.__dir__=-1,n.__filtered__=!0}else(n=this.clone()).__dir__*=-1;return n},je.prototype.value=function(){var n=this.__wrapped__.value(),t=this.__dir__,r=na(n),e=t<0,u=r?n.length:0,i=vo(0,u,this.__views__),o=i.start,f=i.end,a=f-o,c=e?f:o-1,l=this.__iteratees__,s=l.length,h=0,p=Qr(a,this.__takeCount__);if(!r||!e&&u==a&&p==a)return ei(n,this.__actions__);var v=[];n:for(;a--&&h=this.__values__.length;return{done:n,value:n?t:this.__values__[this.__index__++]}},xe.prototype.plant=function(n){for(var r,e=this;e instanceof we;){var u=Go(e);u.__index__=0,u.__values__=t,r?i.__wrapped__=u:r=u;var i=u;e=e.__wrapped__}return i.__wrapped__=n,r},xe.prototype.reverse=function(){var n=this.__wrapped__;if(n instanceof je){var r=n;return this.__actions__.length&&(r=new je(this)),(r=r.reverse()).__actions__.push({func:jf,args:[lf],thisArg:t}),new me(r,this.__chain__)}return this.thru(lf)},xe.prototype.toJSON=xe.prototype.valueOf=xe.prototype.value=function(){return ei(this.__wrapped__,this.__actions__)},xe.prototype.first=xe.prototype.head,$r&&(xe.prototype[$r]=function(){return this}),xe})();'function'==typeof define&&'object'==typeof define.amd&&define.amd?(xt._=Lr,define(function(){return Lr})):wt?((wt.exports=Lr)._=Lr,bt._=Lr):xt._=Lr}).call(this)},541,[]); -__d(function(g,r,i,a,m,e,d){var n=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=function n(l){return u.default.reduce(l,function(l,c,o){return u.default.isPlainObject(c)?l[o]=n(c):f.canNormalize(o)?l=(0,t.default)({},l,f.normalize(o,c)):l[o]=c,l},{})};var t=n(r(d[1])),u=n(r(d[2])),l=n(r(d[3])),f=(r(d[4]),new l.default)},542,[1,44,541,543,2]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=n(r(d[2])),l=n(r(d[3])),s=t(r(d[4])),u=(function(){function t(){(0,o.default)(this,t),this.normalizers={},this.createNormalizers('margin',[s.HORIZONTAL,s.VERTICAL,s.SIDES]),this.createNormalizers('padding',[s.HORIZONTAL,s.VERTICAL,s.SIDES]),this.createNormalizers('border',[s.SIDES],'Width')}return(0,l.default)(t,[{key:"createNormalizers",value:function(t,n){var o=this,l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:'';n.forEach(function(n){var u=t+n.type+l;if(o.normalizerExists(u))throw Error("Normalizer for '"+u+"' shorthand already exists");o.normalizers[u]=s.default.createNormalizer(t,n,l)})}},{key:"normalizerExists",value:function(t){return!!this.normalizers[t]}},{key:"canNormalize",value:function(t){return this.normalizerExists(t)}},{key:"normalize",value:function(t,n){return this.normalizers[t](n)}}]),t})();e.default=u},543,[346,1,19,20,544]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BOTTOM_LEFT=e.TOP_LEFT=e.BOTTOM_RIGHT=e.TOP_RIGHT=e.BOTTOM=e.TOP=e.RIGHT=e.LEFT=e.VERTICAL=e.HORIZONTAL=e.CORNERS=e.SIDES=void 0;var o=t(r(d[1])),l=t(r(d[2])),n=t(r(d[3])),u=t(r(d[4])),f=function(t,o){return{name:t,type:u.default.isUndefined(o)?t:o}},T=f('Sides','');e.SIDES=T;var c=f('Corners','');e.CORNERS=c;var O=f('Horizontal');e.HORIZONTAL=O;var v=f('Vertical');e.VERTICAL=v;e.LEFT="Left";e.RIGHT="Right";e.TOP="Top";e.BOTTOM="Bottom";e.TOP_RIGHT="TopRight";e.BOTTOM_RIGHT="BottomRight";e.TOP_LEFT="TopLeft";e.BOTTOM_LEFT="BottomLeft";var s=new((function(){function t(){var n;(0,l.default)(this,t),this.createNormalizersMap=(n={},(0,o.default)(n,T.name,this.createAllSidesNormalizer),(0,o.default)(n,c.name,this.createAllCornersNormalizer),(0,o.default)(n,O.name,this.createHorizontalSidesNormalizer),(0,o.default)(n,v.name,this.createVerticalSidesNormalizer),n)}return(0,n.default)(t,[{key:"createAllSidesNormalizer",value:function(t,l){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:'';return function(l){var u;return u={},(0,o.default)(u,t+"Left"+n,l),(0,o.default)(u,t+"Right"+n,l),(0,o.default)(u,t+"Top"+n,l),(0,o.default)(u,t+"Bottom"+n,l),u}}},{key:"createAllCornersNormalizer",value:function(t,l){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:'';return function(l){var u;return u={},(0,o.default)(u,t+"BottomLeft"+n,l),(0,o.default)(u,t+"BottomRight"+n,l),(0,o.default)(u,t+"TopLeft"+n,l),(0,o.default)(u,t+"TopRight"+n,l),u}}},{key:"createHorizontalSidesNormalizer",value:function(t){return function(l){var n;return n={},(0,o.default)(n,t+"Left",l),(0,o.default)(n,t+"Right",l),n}}},{key:"createVerticalSidesNormalizer",value:function(t){return function(l){var n;return n={},(0,o.default)(n,t+"Top",l),(0,o.default)(n,t+"Bottom",l),n}}},{key:"getNormalizerCreator",value:function(t){return this.createNormalizersMap[t.name]}},{key:"createNormalizer",value:function(t,o,l){return this.getNormalizerCreator(o)(t,o,l)}}]),t})());e.default=s},544,[1,45,19,20,541]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.ThemeShape=e.default=void 0;var u,n=t(r(d[1])),h=t(r(d[2])),f=r(d[3]),l=t(r(d[4])),o=t(r(d[5])),s=t(r(d[6])),c="@@shoutem.theme/themeStyle",y="@@shoutem.theme/themeCachedStyle",p=function(t,u){return(0,s.default)((0,l.default)(t,u))},v=(function(){function t(u){(0,n.default)(this,t),this[c]=p(u),this[y]={}}return(0,h.default)(t,[{key:"createComponentStyle",value:function(t,u){if(this[y][t])return this[y][t];var n=p(u,this[c]);return this[y][t]=(0,o.default)(n,this[c][t],this[c]),this[y][t]}}],[{key:"setDefaultThemeStyle",value:function(n){u=new t(n)}},{key:"getDefaultTheme",value:function(){return u||(u=new t({})),u}}]),t})();e.default=v;var S=f.PropTypes.shape({createComponentStyle:f.PropTypes.func.isRequired});e.ThemeShape=S},545,[1,19,20,59,546,547,542]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};function l(l){var u={},c=u,v=n[l];if(v){if(v[f])throw Error("Base style cannot have includes, unexpected include in "+l+".");c=(0,o.default)({},v)}var s=t[l];return s&&(c=(0,o.default)({},c,s)),c===u&&console.warn("Including unexisting style: "+l),c}var v=new Set;return(function t(n,o){if(!u.isPlainObject(n))return n;var v=n[f];var s={};if(v){if(!u.isArray(v))throw Error('Include should be array');for(var y=v,h=Array.isArray(y),b=0,y=h?y:y["function"==typeof Symbol?Symbol.iterator:"@@iterator"]();;){var k;if(h){if(b>=y.length)break;k=y[b++]}else{if((b=y.next()).done)break;k=b.value}var w=k;if(o.has(w))throw Error("Circular style include, including "+w);o.add(w),s=u.mergeWith({},s,t(l(w),o),c),o.delete(w)}}var A=u.mergeWith({},s,n,c);delete A[f];for(var E=u.keys(A),S=Array.isArray(E),j=0,E=S?E:E["function"==typeof Symbol?Symbol.iterator:"@@iterator"]();;){var p;if(S){if(j>=E.length)break;p=E[j++]}else{if((j=E.next()).done)break;p=j.value}var x=p;A[x]=t(A[x],o)}return A})(t,v)},e.INCLUDE=void 0;var o=n(r(d[2])),l=n(r(d[3])),u=t(r(d[4])),f='@@shoutem.theme/include';function c(t,n){var o,c=t;if(n&&n[f]&&(o=c&&c[f]?[].concat((0,l.default)(c[f]),(0,l.default)(n[f])):n[f]),u.isUndefined(c)&&u.isPlainObject(n)){var v=u.mergeWith({},n,function(t,n){return n});return o&&(v[f]=o),v}u.isPlainObject(c)&&o&&(c[f]=o)}e.INCLUDE=f},546,[346,1,44,15,541]); -__d(function(g,r,i,a,m,e,d){var n=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(n,u,c){var f=t.merge({},n,u),o=t.pick(c,t.keys(f));return t.merge({},o,f)};var t=n(r(d[1]))},547,[346,541]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.resolveComponentStyle=function(t){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],f=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},u=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},l=(arguments.length>4&&arguments[4],(0,n.default)(f,u[t]));o.forEach(function(t,o){l=(0,n.default)(l,f[""+t])}),o.forEach(function(o,f){l=(0,n.default)(l,u[""+t+o])});var c=(0,n.default)(l,u[t]);return o.forEach(function(t,o){c=(0,n.default)(c,l[""+t])}),o.forEach(function(o,f){c=(0,n.default)(c,u[""+t+o])}),c};t(r(d[1]));var n=t(r(d[2]))},548,[1,541,549]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function o(t,f){var n={};var u,c;if(!t)return f;if(!f)return t;for(u in t)for(c in f)u===c?"object"==typeof t[u]&&"object"==typeof f[u]&&f[u]&&t[u]?n[u]=o(t[u],f[u]):n[u]=f[u]:(void 0===n[u]&&(n[u]=t[u]),void 0===n[c]&&(n[c]=f[c]));return n}},549,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),l=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=l(r(d[2])),u=l(r(d[3])),s=l(r(d[4])),h=l(r(d[5])),o=l(r(d[6])),f=t(r(d[7])),c=l(r(d[8])),p=t(r(d[9])),y=(l(r(d[10])),(function(t){function l(t,u){var o;return(0,n.default)(this,l),(o=(0,s.default)(this,(0,h.default)(l).call(this,t,u))).state={theme:o.createTheme(t)},o}return(0,o.default)(l,t),(0,u.default)(l,[{key:"getChildContext",value:function(){return{theme:this.state.theme}}},{key:"UNSAFE_componentWillReceiveProps",value:function(t){t.style!==this.props.style&&this.setState({theme:this.createTheme(t)})}},{key:"createTheme",value:function(t){return new p.default(t.style)}},{key:"render",value:function(){var t=this.props.children;return f.Children.only(t)}}]),l})(f.default.Component));e.default=y,y.propTypes={children:c.default.element.isRequired,style:c.default.object},y.defaultProps={style:{}},y.childContextTypes={theme:p.ThemeShape.isRequired}},550,[346,1,19,20,27,30,33,47,59,545,542]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.createVariations=function(t,n,f,l){return c.default.reduce(n,function(n,c){var v=c?t+"-"+c:t,h=c?""+f+o(c):f;return n[v]=(0,u.default)({},h,l),n},{})},e.createSharedStyle=function(t){var u=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return c.default.reduce(t,function(t,c){return t[c]=(0,n.default)({},u,o[c]),t},{})};var n=t(r(d[1])),u=t(r(d[2])),c=t(r(d[3]));function o(t){return t.charAt(0).toUpperCase()+t.slice(1)}},551,[1,44,45,541]); -__d(function(n,t,r,e,u,i,o){(function(){var t,r=200,e='Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',o='Expected a function',f='__lodash_hash_undefined__',a=500,c='__lodash_placeholder__',l=1,s=2,h=4,p=1,v=2,_=1,g=2,d=4,y=8,x=16,b=32,w=64,m=128,j=256,A=512,k=30,z='...',O=800,I=16,R=1,E=2,S=1/0,L=9007199254740991,W=1.7976931348623157e308,C=NaN,T=4294967295,U=4294967294,B=2147483647,$=[['ary',m],['bind',_],['bindKey',g],['curry',y],['curryRight',x],['flip',A],['partial',b],['partialRight',w],['rearg',j]],D='[object Arguments]',M='[object Array]',F='[object AsyncFunction]',N='[object Boolean]',P='[object Date]',Z='[object DOMException]',q='[object Error]',K='[object Function]',V='[object GeneratorFunction]',G='[object Map]',H='[object Number]',J='[object Null]',Y='[object Object]',Q='[object Proxy]',X='[object RegExp]',nn='[object Set]',tn='[object String]',rn='[object Symbol]',en='[object Undefined]',un='[object WeakMap]',on='[object WeakSet]',fn='[object ArrayBuffer]',an='[object DataView]',cn='[object Float32Array]',ln='[object Float64Array]',sn='[object Int8Array]',hn='[object Int16Array]',pn='[object Int32Array]',vn='[object Uint8Array]',_n='[object Uint8ClampedArray]',gn='[object Uint16Array]',dn='[object Uint32Array]',yn=/\b__p \+= '';/g,xn=/\b(__p \+=) '' \+/g,bn=/(__e\(.*?\)|\b__t\)) \+\n'';/g,wn=/&(?:amp|lt|gt|quot|#39);/g,mn=/[&<>"']/g,jn=RegExp(wn.source),An=RegExp(mn.source),kn=/<%-([\s\S]+?)%>/g,zn=/<%([\s\S]+?)%>/g,On=/<%=([\s\S]+?)%>/g,In=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Rn=/^\w*$/,En=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Sn=/[\\^$.*+?()[\]{}|]/g,Ln=RegExp(Sn.source),Wn=/^\s+|\s+$/g,Cn=/^\s+/,Tn=/\s+$/,Un=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Bn=/\{\n\/\* \[wrapped with (.+)\] \*/,$n=/,? & /,Dn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Mn=/\\(\\)?/g,Fn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Nn=/\w*$/,Pn=/^[-+]0x[0-9a-f]+$/i,Zn=/^0b[01]+$/i,qn=/^\[object .+?Constructor\]$/,Kn=/^0o[0-7]+$/i,Vn=/^(?:0|[1-9]\d*)$/,Gn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Hn=/($^)/,Jn=/['\n\r\u2028\u2029\\]/g,Yn="[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]",Qn="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Xn="(?:\\ud83c[\\udde6-\\uddff]){2}",nt="[\\ud800-\\udbff][\\udc00-\\udfff]",tt="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?"+("(?:\\u200d(?:"+["[^\\ud800-\\udfff]",Xn,nt].join('|')+")[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?)*"),rt='(?:'+["[\\u2700-\\u27bf]",Xn,nt].join('|')+')'+tt,et='(?:'+["[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]?",Qn,Xn,nt,"[\\ud800-\\udfff]"].join('|')+')',ut=RegExp("['\u2019]",'g'),it=RegExp(Qn,'g'),ot=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+et+tt,'g'),ft=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[Yn,"[A-Z\\xc0-\\xd6\\xd8-\\xde]",'$'].join('|')+')',"(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[Yn,"[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])",'$'].join('|')+')',"[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?","[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?",'\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])','\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])','\\d+',rt].join('|'),'g'),at=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]"),ct=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,lt=['Array','Buffer','DataView','Date','Error','Float32Array','Float64Array','Function','Int8Array','Int16Array','Int32Array','Map','Math','Object','Promise','RegExp','Set','String','Symbol','TypeError','Uint8Array','Uint8ClampedArray','Uint16Array','Uint32Array','WeakMap','_','clearTimeout','isFinite','parseInt','setTimeout'],st=-1,ht={};ht[cn]=ht[ln]=ht[sn]=ht[hn]=ht[pn]=ht[vn]=ht[_n]=ht[gn]=ht[dn]=!0,ht[D]=ht[M]=ht[fn]=ht[N]=ht[an]=ht[P]=ht[q]=ht[K]=ht[G]=ht[H]=ht[Y]=ht[X]=ht[nn]=ht[tn]=ht[un]=!1;var pt={};pt[D]=pt[M]=pt[fn]=pt[an]=pt[N]=pt[P]=pt[cn]=pt[ln]=pt[sn]=pt[hn]=pt[pn]=pt[G]=pt[H]=pt[Y]=pt[X]=pt[nn]=pt[tn]=pt[rn]=pt[vn]=pt[_n]=pt[gn]=pt[dn]=!0,pt[q]=pt[K]=pt[un]=!1;var vt={'\\':'\\',"'":"'",'\n':'n','\r':'r',"\u2028":'u2028',"\u2029":'u2029'},_t=parseFloat,gt=parseInt,dt='object'==typeof n&&n&&n.Object===Object&&n,yt='object'==typeof self&&self&&self.Object===Object&&self,xt=dt||yt||Function('return this')(),bt='object'==typeof i&&i&&!i.nodeType&&i,wt=bt&&'object'==typeof u&&u&&!u.nodeType&&u,mt=wt&&wt.exports===bt,jt=mt&&dt.process,At=(function(){try{var n=wt&&wt.require&&wt.require('util').types;return n||jt&&jt.binding&&jt.binding('util')}catch(n){}})(),kt=At&&At.isArrayBuffer,zt=At&&At.isDate,Ot=At&&At.isMap,It=At&&At.isRegExp,Rt=At&&At.isSet,Et=At&&At.isTypedArray;function St(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function Lt(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u-1}function $t(n,t,r){for(var e=-1,u=null==n?0:n.length;++e-1;);return r}function lr(n,t){for(var r=n.length;r--&&Ht(t,n[r],0)>-1;);return r}function sr(n,t){for(var r=n.length,e=0;r--;)n[r]===t&&++e;return e}var hr=nr({'\xc0':'A','\xc1':'A','\xc2':'A','\xc3':'A','\xc4':'A','\xc5':'A','\xe0':'a','\xe1':'a','\xe2':'a','\xe3':'a','\xe4':'a','\xe5':'a','\xc7':'C','\xe7':'c','\xd0':'D','\xf0':'d','\xc8':'E','\xc9':'E','\xca':'E','\xcb':'E','\xe8':'e','\xe9':'e','\xea':'e','\xeb':'e','\xcc':'I','\xcd':'I','\xce':'I','\xcf':'I','\xec':'i','\xed':'i','\xee':'i','\xef':'i','\xd1':'N','\xf1':'n','\xd2':'O','\xd3':'O','\xd4':'O','\xd5':'O','\xd6':'O','\xd8':'O','\xf2':'o','\xf3':'o','\xf4':'o','\xf5':'o','\xf6':'o','\xf8':'o','\xd9':'U','\xda':'U','\xdb':'U','\xdc':'U','\xf9':'u','\xfa':'u','\xfb':'u','\xfc':'u','\xdd':'Y','\xfd':'y','\xff':'y','\xc6':'Ae','\xe6':'ae','\xde':'Th','\xfe':'th','\xdf':'ss',"\u0100":'A',"\u0102":'A',"\u0104":'A',"\u0101":'a',"\u0103":'a',"\u0105":'a',"\u0106":'C',"\u0108":'C',"\u010a":'C',"\u010c":'C',"\u0107":'c',"\u0109":'c',"\u010b":'c',"\u010d":'c',"\u010e":'D',"\u0110":'D',"\u010f":'d',"\u0111":'d',"\u0112":'E',"\u0114":'E',"\u0116":'E',"\u0118":'E',"\u011a":'E',"\u0113":'e',"\u0115":'e',"\u0117":'e',"\u0119":'e',"\u011b":'e',"\u011c":'G',"\u011e":'G',"\u0120":'G',"\u0122":'G',"\u011d":'g',"\u011f":'g',"\u0121":'g',"\u0123":'g',"\u0124":'H',"\u0126":'H',"\u0125":'h',"\u0127":'h',"\u0128":'I',"\u012a":'I',"\u012c":'I',"\u012e":'I',"\u0130":'I',"\u0129":'i',"\u012b":'i',"\u012d":'i',"\u012f":'i',"\u0131":'i',"\u0134":'J',"\u0135":'j',"\u0136":'K',"\u0137":'k',"\u0138":'k',"\u0139":'L',"\u013b":'L',"\u013d":'L',"\u013f":'L',"\u0141":'L',"\u013a":'l',"\u013c":'l',"\u013e":'l',"\u0140":'l',"\u0142":'l',"\u0143":'N',"\u0145":'N',"\u0147":'N',"\u014a":'N',"\u0144":'n',"\u0146":'n',"\u0148":'n',"\u014b":'n',"\u014c":'O',"\u014e":'O',"\u0150":'O',"\u014d":'o',"\u014f":'o',"\u0151":'o',"\u0154":'R',"\u0156":'R',"\u0158":'R',"\u0155":'r',"\u0157":'r',"\u0159":'r',"\u015a":'S',"\u015c":'S',"\u015e":'S',"\u0160":'S',"\u015b":'s',"\u015d":'s',"\u015f":'s',"\u0161":'s',"\u0162":'T',"\u0164":'T',"\u0166":'T',"\u0163":'t',"\u0165":'t',"\u0167":'t',"\u0168":'U',"\u016a":'U',"\u016c":'U',"\u016e":'U',"\u0170":'U',"\u0172":'U',"\u0169":'u',"\u016b":'u',"\u016d":'u',"\u016f":'u',"\u0171":'u',"\u0173":'u',"\u0174":'W',"\u0175":'w',"\u0176":'Y',"\u0177":'y',"\u0178":'Y',"\u0179":'Z',"\u017b":'Z',"\u017d":'Z',"\u017a":'z',"\u017c":'z',"\u017e":'z',"\u0132":'IJ',"\u0133":'ij',"\u0152":'Oe',"\u0153":'oe',"\u0149":"'n","\u017f":'s'}),pr=nr({'&':'&','<':'<','>':'>','"':'"',"'":'''});function vr(n){return'\\'+vt[n]}function _r(n,r){return null==n?t:n[r]}function gr(n){return at.test(n)}function dr(n){return ct.test(n)}function yr(n){for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}function xr(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n]}),r}function br(n,t){return function(r){return n(t(r))}}function wr(n,t){for(var r=-1,e=n.length,u=0,i=[];++r','"':'"',''':"'"});function Rr(n){for(var t=ot.lastIndex=0;ot.test(n);)++t;return t}function Er(n){return n.match(ot)||[]}function Sr(n){return n.match(ft)||[]}var Lr=(function n(u){var i,Dn=(u=null==u?xt:Lr.defaults(xt.Object(),u,Lr.pick(xt,lt))).Array,Yn=u.Date,Qn=u.Error,Xn=u.Function,nt=u.Math,tt=u.Object,rt=u.RegExp,et=u.String,ot=u.TypeError,ft=Dn.prototype,at=Xn.prototype,ct=tt.prototype,vt=u['__core-js_shared__'],dt=at.toString,yt=ct.hasOwnProperty,bt=0,wt=(i=/[^.]+$/.exec(vt&&vt.keys&&vt.keys.IE_PROTO||''))?'Symbol(src)_1.'+i:'',jt=ct.toString,At=dt.call(tt),Zt=xt._,qt=rt('^'+dt.call(yt).replace(Sn,'\\$&').replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,'$1.*?')+'$'),nr=mt?u.Buffer:t,Ar=u.Symbol,Rr=u.Uint8Array,Er=nr?nr.allocUnsafe:t,Wr=br(tt.getPrototypeOf,tt),Cr=tt.create,Tr=ct.propertyIsEnumerable,Ur=ft.splice,Br=Ar?"function"==typeof Ar?Ar.isConcatSpreadable:"@@isConcatSpreadable":t,$r=Ar?"function"==typeof Ar?Ar.iterator:"@@iterator":t,Dr=Ar?"function"==typeof Ar?Ar.toStringTag:"@@toStringTag":t,Mr=(function(){try{var n=co(tt,'defineProperty');return n({},'',{}),n}catch(n){}})(),Fr=u.clearTimeout!==xt.clearTimeout&&u.clearTimeout,Nr=Yn&&Yn.now!==xt.Date.now&&Yn.now,Pr=u.setTimeout!==xt.setTimeout&&u.setTimeout,Zr=nt.ceil,qr=nt.floor,Kr=tt.getOwnPropertySymbols,Vr=nr?nr.isBuffer:t,Gr=u.isFinite,Hr=ft.join,Jr=br(tt.keys,tt),Yr=nt.max,Qr=nt.min,Xr=Yn.now,ne=u.parseInt,te=nt.random,re=ft.reverse,ee=co(u,'DataView'),ue=co(u,'Map'),ie=co(u,'Promise'),oe=co(u,'Set'),fe=co(u,'WeakMap'),ae=co(tt,'create'),ce=fe&&new fe,le={},se=Ko(ee),he=Ko(ue),pe=Ko(ie),ve=Ko(oe),_e=Ko(fe),ge=Ar?"function"==typeof Ar?Ar.prototype:"@@prototype":t,de=ge?ge.valueOf:t,ye=ge?ge.toString:t;function xe(n){if(sa(n)&&!na(n)&&!(n instanceof je)){if(n instanceof me)return n;if(yt.call(n,'__wrapped__'))return Go(n)}return new me(n)}var be=(function(){function n(){}return function(r){if(!la(r))return{};if(Cr)return Cr(r);n.prototype=r;var e=new n;return n.prototype=t,e}})();function we(){}function me(n,r){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!r,this.__index__=0,this.__values__=t}function je(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=T,this.__views__=[]}function Ae(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t=r?n:r)),n}function Ne(n,r,e,u,i,o){var f,a=r&l,c=r&s,p=r&h;if(e&&(f=i?e(n,u,i,o):e(n)),f!==t)return f;if(!la(n))return n;var v=na(n);if(v){if(f=yo(n),!a)return bi(n,f)}else{var _=po(n),g=_==K||_==V;if(ua(n))return hi(n,a);if(_==Y||_==D||g&&!i){if(f=c||g?{}:xo(n),!a)return c?ji(n,$e(f,n)):mi(n,Be(f,n))}else{if(!pt[_])return i?n:{};f=bo(n,_,a)}}o||(o=new Ie);var d=o.get(n);if(d)return d;o.set(n,f),ga(n)?n.forEach(function(t){f.add(Ne(t,r,e,t,n,o))}):ha(n)&&n.forEach(function(t,u){f.set(u,Ne(t,r,e,u,n,o))});var y=v?t:(p?c?ro:to:c?Na:Fa)(n);return Wt(y||n,function(t,u){y&&(t=n[u=t]),Ce(f,u,Ne(t,r,e,u,n,o))}),f}function Pe(n){var t=Fa(n);return function(r){return Ze(r,n,t)}}function Ze(n,r,e){var u=e.length;if(null==n)return!u;for(n=tt(n);u--;){var i=e[u],o=r[i],f=n[i];if(f===t&&!(i in n)||!o(f))return!1}return!0}function qe(n,r,e){if('function'!=typeof n)throw new ot(o);return Do(function(){n.apply(t,e)},r)}function Ke(n,t,e,u){var i=-1,o=Bt,f=!0,a=n.length,c=[],l=t.length;if(!a)return c;e&&(t=Dt(t,or(e))),u?(o=$t,f=!1):t.length>=r&&(o=ar,f=!1,t=new Oe(t));n:for(;++i-1},ke.prototype.set=function(n,t){var r=this.__data__,e=Te(r,n);return e<0?(++this.size,r.push([n,t])):r[e][1]=t,this},ze.prototype.clear=function(){this.size=0,this.__data__={hash:new Ae,map:new(ue||ke),string:new Ae}},ze.prototype.delete=function(n){var t=fo(this,n).delete(n);return this.size-=t?1:0,t},ze.prototype.get=function(n){return fo(this,n).get(n)},ze.prototype.has=function(n){return fo(this,n).has(n)},ze.prototype.set=function(n,t){var r=fo(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},Oe.prototype.add=Oe.prototype.push=function(n){return this.__data__.set(n,f),this},Oe.prototype.has=function(n){return this.__data__.has(n)},Ie.prototype.clear=function(){this.__data__=new ke,this.size=0},Ie.prototype.delete=function(n){var t=this.__data__,r=t.delete(n);return this.size=t.size,r},Ie.prototype.get=function(n){return this.__data__.get(n)},Ie.prototype.has=function(n){return this.__data__.has(n)},Ie.prototype.set=function(n,t){var r=this.__data__;if(r instanceof ke){var e=r.__data__;if(!ue||e.length<199)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new ze(e)}return r.set(n,t),this.size=r.size,this};var Ve=zi(ru),Ge=zi(eu,!0);function He(n,t){var r=!0;return Ve(n,function(n,e,u){return r=!!t(n,e,u)}),r}function Je(n,r,e){for(var u=-1,i=n.length;++ui?0:i+e),(u=u===t||u>i?i:Aa(u))<0&&(u+=i),u=e>u?0:ka(u);e0&&r(f)?t>1?Xe(f,t-1,r,e,u):Mt(u,f):e||(u[u.length]=f)}return u}var nu=Oi(),tu=Oi(!0);function ru(n,t){return n&&nu(n,t,Fa)}function eu(n,t){return n&&tu(n,t,Fa)}function uu(n,t){return Ut(t,function(t){return fa(n[t])})}function iu(n,r){for(var e=0,u=(r=ai(r,n)).length;null!=n&&et}function cu(n,t){return null!=n&&yt.call(n,t)}function lu(n,t){return null!=n&&t in tt(n)}function su(n,t,r){return n>=Qr(t,r)&&n=120&&s.length>=120)?new Oe(f&&s):t}s=n[0];var h=-1,p=a[0];n:for(;++h-1;)f!==n&&Ur.call(f,a,1),Ur.call(n,a,1);return n}function Tu(n,t){for(var r=n?t.length:0,e=r-1;r--;){var u=t[r];if(r==e||u!==i){var i=u;jo(u)?Ur.call(n,u,1):ni(n,u)}}return n}function Uu(n,t){return n+qr(te()*(t-n+1))}function Bu(n,t,r,e){for(var u=-1,i=Yr(Zr((t-n)/(r||1)),0),o=Dn(i);i--;)o[e?i:++u]=n,n+=r;return o}function $u(n,t){var r='';if(!n||t<1||t>L)return r;do{t%2&&(r+=n),(t=qr(t/2))&&(n+=n)}while(t);return r}function Du(n,t){return Mo(Co(n,t,pc),n+'')}function Mu(n){return Ee(Ja(n))}function Fu(n,t){var r=Ja(n);return Po(r,Fe(t,0,r.length))}function Nu(n,r,e,u){if(!la(n))return n;for(var i=-1,o=(r=ai(r,n)).length,f=o-1,a=n;null!=a&&++iu?0:u+t),(r=r>u?u:r)<0&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0;for(var i=Dn(u);++e>>1,o=n[i];null!==o&&!ya(o)&&(r?o<=t:o=r){var l=t?null:qi(n);if(l)return mr(l);f=!1,i=ar,c=new Oe}else c=t?[]:a;n:for(;++u=u?n:Ku(n,r,e)}var si=Fr||function(n){return xt.clearTimeout(n)};function hi(n,t){if(t)return n.slice();var r=n.length,e=Er?Er(r):new n.constructor(r);return n.copy(e),e}function pi(n){var t=new n.constructor(n.byteLength);return new Rr(t).set(new Rr(n)),t}function vi(n,t){var r=t?pi(n.buffer):n.buffer;return new n.constructor(r,n.byteOffset,n.byteLength)}function _i(n,t){var r=t?pi(n.buffer):n.buffer;return new n.constructor(r,n.byteOffset,n.length)}function gi(n,r){if(n!==r){var e=n!==t,u=null===n,i=n==n,o=ya(n),f=r!==t,a=null===r,c=r==r,l=ya(r);if(!a&&!l&&!o&&n>r||o&&f&&c&&!a&&!l||u&&f&&c||!e&&c||!i)return 1;if(!u&&!o&&!l&&n=f?a:a*('desc'==r[e]?-1:1)}return n.index-t.index}function yi(n,t,r,e){for(var u=-1,i=n.length,o=r.length,f=-1,a=t.length,c=Yr(i-o,0),l=Dn(a+c),s=!e;++f1?e[i-1]:t,f=i>2?e[2]:t;for(o=n.length>3&&'function'==typeof o?(i--,o):t,f&&Ao(e[0],e[1],f)&&(o=i<3?t:o,i=1),r=tt(r);++u-1?i[o?r[f]:f]:t}}function Ci(n){return no(function(r){var e=r.length,u=e,i=me.prototype.thru;for(n&&r.reverse();u--;){var f=r[u];if('function'!=typeof f)throw new ot(o);if(i&&!a&&'wrapper'==uo(f))var a=new me([],!0)}for(u=a?u:e;++u1&&g.reverse(),s&&c<_&&(g.length=c),this&&this!==xt&&this instanceof t&&(A=y||Si(A)),A.apply(j,g)}}function Ui(n,t){return function(r,e){return pu(r,n,t(e),{})}}function Bi(n,r){return function(e,u){var i;if(e===t&&u===t)return r;if(e!==t&&(i=e),u!==t){if(i===t)return u;'string'==typeof e||'string'==typeof u?(e=Qu(e),u=Qu(u)):(e=Yu(e),u=Yu(u)),i=n(e,u)}return i}}function $i(n){return no(function(t){return t=Dt(t,or(oo())),Du(function(r){var e=this;return n(t,function(n){return St(n,e,r)})})})}function Di(n,r){var e=(r=r===t?' ':Qu(r)).length;if(e<2)return e?$u(r,n):r;var u=$u(r,Zr(n/zr(r)));return gr(r)?li(Or(u),0,n).join(''):u.slice(0,n)}function Mi(n,t,r,e){var u=t&_,i=Si(n);return function t(){for(var o=-1,f=arguments.length,a=-1,c=e.length,l=Dn(c+f),s=this&&this!==xt&&this instanceof t?i:n;++aa))return!1;var l=o.get(n),s=o.get(r);if(l&&s)return l==r&&s==n;var h=-1,_=!0,g=e&v?new Oe:t;for(o.set(n,r),o.set(r,n);++h1?'& ':'')+t[e],t=t.join(r>2?', ':' '),n.replace(Un,'{\n/* [wrapped with '+t+'] */\n')}function mo(n){return na(n)||Xf(n)||!!(Br&&n&&n[Br])}function jo(n,t){var r=typeof n;return!!(t=null==t?L:t)&&('number'==r||'symbol'!=r&&Vn.test(n))&&n>-1&&n%1==0&&n0){if(++r>=O)return arguments[0]}else r=0;return n.apply(t,arguments)}}function Po(n,r){var e=-1,u=n.length,i=u-1;for(r=r===t?u:r;++e1?n[r-1]:t;return _f(n,e='function'==typeof e?(n.pop(),e):t)});function mf(n){var t=xe(n);return t.__chain__=!0,t}function jf(n,t){return t(n)}var Af=no(function(n){var r=n.length,e=r?n[0]:0,u=this.__wrapped__,i=function(t){return Me(t,n)};return!(r>1||this.__actions__.length)&&u instanceof je&&jo(e)?((u=u.slice(e,+e+(r?1:0))).__actions__.push({func:jf,args:[i],thisArg:t}),new me(u,this.__chain__).thru(function(n){return r&&!n.length&&n.push(t),n})):this.thru(i)});var kf=Ai(function(n,t,r){yt.call(n,r)?++n[r]:De(n,r,1)});var zf=Wi(Qo),Of=Wi(Xo);function If(n,t){return(na(n)?Wt:Ve)(n,oo(t,3))}function Rf(n,t){return(na(n)?Ct:Ge)(n,oo(t,3))}var Ef=Ai(function(n,t,r){yt.call(n,r)?n[r].push(t):De(n,r,[t])});var Sf=Du(function(n,t,r){var e=-1,u='function'==typeof t,i=ra(n)?Dn(n.length):[];return Ve(n,function(n){i[++e]=u?St(t,n,r):vu(n,t,r)}),i}),Lf=Ai(function(n,t,r){De(n,r,t)});function Wf(n,t){return(na(n)?Dt:Au)(n,oo(t,3))}var Cf=Ai(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]});var Tf=Du(function(n,t){if(null==n)return[];var r=t.length;return r>1&&Ao(n,t[0],t[1])?t=[]:r>2&&Ao(t[0],t[1],t[2])&&(t=[t[0]]),Eu(n,Xe(t,1),[])}),Uf=Nr||function(){return xt.Date.now()};function Bf(n,r,e){return r=e?t:r,r=n&&null==r?n.length:r,Vi(n,m,t,t,t,t,r)}function $f(n,r){var e;if('function'!=typeof r)throw new ot(o);return n=Aa(n),function(){return--n>0&&(e=r.apply(this,arguments)),n<=1&&(r=t),e}}var Df=Du(function(n,t,r){var e=_;if(r.length){var u=wr(r,io(Df));e|=b}return Vi(n,e,t,r,u)}),Mf=Du(function(n,t,r){var e=3;if(r.length){var u=wr(r,io(Mf));e|=b}return Vi(t,e,n,r,u)});function Ff(n,r,e){var u,i,f,a,c,l,s=0,h=!1,p=!1,v=!0;if('function'!=typeof n)throw new ot(o);function _(r){var e=u,o=i;return u=i=t,s=r,a=n.apply(o,e)}function g(n){return s=n,c=Do(x,r),h?_(n):a}function d(n){var t=r-(n-l);return p?Qr(t,f-(n-s)):t}function y(n){var e=n-l;return l===t||e>=r||e<0||p&&n-s>=f}function x(){var n=Uf();if(y(n))return b(n);c=Do(x,d(n))}function b(n){return c=t,v&&u?_(n):(u=i=t,a)}function w(){var n=Uf(),e=y(n);if(u=arguments,i=this,l=n,e){if(c===t)return g(l);if(p)return si(c),c=Do(x,r),_(l)}return c===t&&(c=Do(x,r)),a}return r=za(r)||0,la(e)&&(h=!!e.leading,f=(p='maxWait'in e)?Yr(za(e.maxWait)||0,r):f,v='trailing'in e?!!e.trailing:v),w.cancel=function(){c!==t&&si(c),s=0,u=l=i=c=t},w.flush=function(){return c===t?a:b(Uf())},w}var Nf=Du(function(n,t){return qe(n,1,t)}),Pf=Du(function(n,t,r){return qe(n,za(t)||0,r)});function Zf(n,t){if('function'!=typeof n||null!=t&&'function'!=typeof t)throw new ot(o);var r=function r(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;if(i.has(u))return i.get(u);var o=n.apply(this,e);return r.cache=i.set(u,o)||i,o};return r.cache=new(Zf.Cache||ze),r}function qf(n){if('function'!=typeof n)throw new ot(o);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}Zf.Cache=ze;var Kf=ci(function(n,t){var r=(t=1==t.length&&na(t[0])?Dt(t[0],or(oo())):Dt(Xe(t,1),or(oo()))).length;return Du(function(e){for(var u=-1,i=Qr(e.length,r);++u=t}),Xf=_u((function(){return arguments})())?_u:function(n){return sa(n)&&yt.call(n,'callee')&&!Tr.call(n,'callee')},na=Dn.isArray,ta=kt?or(kt):function(n){return sa(n)&&fu(n)==fn};function ra(n){return null!=n&&ca(n.length)&&!fa(n)}function ea(n){return sa(n)&&ra(n)}var ua=Vr||zc,ia=zt?or(zt):function(n){return sa(n)&&fu(n)==P};function oa(n){if(!sa(n))return!1;var t=fu(n);return t==q||t==Z||'string'==typeof n.message&&'string'==typeof n.name&&!va(n)}function fa(n){if(!la(n))return!1;var t=fu(n);return t==K||t==V||t==F||t==Q}function aa(n){return'number'==typeof n&&n==Aa(n)}function ca(n){return'number'==typeof n&&n>-1&&n%1==0&&n<=L}function la(n){var t=typeof n;return null!=n&&('object'==t||'function'==t)}function sa(n){return null!=n&&'object'==typeof n}var ha=Ot?or(Ot):function(n){return sa(n)&&po(n)==G};function pa(n){return'number'==typeof n||sa(n)&&fu(n)==H}function va(n){if(!sa(n)||fu(n)!=Y)return!1;var t=Wr(n);if(null===t)return!0;var r=yt.call(t,'constructor')&&t.constructor;return'function'==typeof r&&r instanceof r&&dt.call(r)==At}var _a=It?or(It):function(n){return sa(n)&&fu(n)==X};var ga=Rt?or(Rt):function(n){return sa(n)&&po(n)==nn};function da(n){return'string'==typeof n||!na(n)&&sa(n)&&fu(n)==tn}function ya(n){return'symbol'==typeof n||sa(n)&&fu(n)==rn}var xa=Et?or(Et):function(n){return sa(n)&&ca(n.length)&&!!ht[fu(n)]};var ba=Ni(ju),wa=Ni(function(n,t){return n<=t});function ma(n){if(!n)return[];if(ra(n))return da(n)?Or(n):bi(n);if($r&&n[$r])return yr(n[$r]());var t=po(n);return(t==G?xr:t==nn?mr:Ja)(n)}function ja(n){return n?(n=za(n))===S||n===-1/0?(n<0?-1:1)*W:n==n?n:0:0===n?n:0}function Aa(n){var t=ja(n),r=t%1;return t==t?r?t-r:t:0}function ka(n){return n?Fe(Aa(n),0,T):0}function za(n){if('number'==typeof n)return n;if(ya(n))return C;if(la(n)){var t='function'==typeof n.valueOf?n.valueOf():n;n=la(t)?t+'':t}if('string'!=typeof n)return 0===n?n:+n;n=n.replace(Wn,'');var r=Zn.test(n);return r||Kn.test(n)?gt(n.slice(2),r?2:8):Pn.test(n)?C:+n}function Oa(n){return wi(n,Na(n))}function Ia(n){return null==n?'':Qu(n)}var Ra=ki(function(n,t){if(Io(t)||ra(t))wi(t,Fa(t),n);else for(var r in t)yt.call(t,r)&&Ce(n,r,t[r])}),Ea=ki(function(n,t){wi(t,Na(t),n)}),Sa=ki(function(n,t,r,e){wi(t,Na(t),n,e)}),La=ki(function(n,t,r,e){wi(t,Fa(t),n,e)}),Wa=no(Me);var Ca=Du(function(n,r){n=tt(n);var e=-1,u=r.length,i=u>2?r[2]:t;for(i&&Ao(r[0],r[1],i)&&(u=1);++e1),t}),wi(n,ro(n),r),e&&(r=Ne(r,7,Ji));for(var u=t.length;u--;)ni(r,t[u]);return r});var Ka=no(function(n,t){return null==n?{}:Su(n,t)});function Va(n,t){if(null==n)return{};var r=Dt(ro(n),function(n){return[n]});return t=oo(t),Lu(n,r,function(n,r){return t(n,r[0])})}var Ga=Ki(Fa),Ha=Ki(Na);function Ja(n){return null==n?[]:fr(n,Fa(n))}var Ya=Ei(function(n,t,r){return t=t.toLowerCase(),n+(r?Qa(t):t)});function Qa(n){return oc(Ia(n).toLowerCase())}function Xa(n){return(n=Ia(n))&&n.replace(Gn,hr).replace(it,'')}var nc=Ei(function(n,t,r){return n+(r?'-':'')+t.toLowerCase()}),tc=Ei(function(n,t,r){return n+(r?' ':'')+t.toLowerCase()}),rc=Ri('toLowerCase');var ec=Ei(function(n,t,r){return n+(r?'_':'')+t.toLowerCase()});var uc=Ei(function(n,t,r){return n+(r?' ':'')+oc(t)});var ic=Ei(function(n,t,r){return n+(r?' ':'')+t.toUpperCase()}),oc=Ri('toUpperCase');function fc(n,r,e){return n=Ia(n),(r=e?t:r)===t?dr(n)?Sr(n):Kt(n):n.match(r)||[]}var ac=Du(function(n,r){try{return St(n,t,r)}catch(n){return oa(n)?n:new Qn(n)}}),cc=no(function(n,t){return Wt(t,function(t){t=qo(t),De(n,t,Df(n[t],n))}),n});function lc(n){return function(){return n}}var sc=Ci(),hc=Ci(!0);function pc(n){return n}function vc(n){return bu('function'==typeof n?n:Ne(n,l))}var _c=Du(function(n,t){return function(r){return vu(r,n,t)}}),gc=Du(function(n,t){return function(r){return vu(n,r,t)}});function dc(n,t,r){var e=Fa(t),u=uu(t,e);null!=r||la(t)&&(u.length||!e.length)||(r=t,t=n,n=this,u=uu(t,Fa(t)));var i=!(la(r)&&'chain'in r&&!r.chain),o=fa(n);return Wt(u,function(r){var e=t[r];n[r]=e,o&&(n.prototype[r]=function(){var t=this.__chain__;if(i||t){var r=n(this.__wrapped__);return(r.__actions__=bi(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,Mt([this.value()],arguments))})}),n}function yc(){}var xc=$i(Dt),bc=$i(Tt),wc=$i(Pt);function mc(n){return ko(n)?Xt(qo(n)):Wu(n)}var jc=Fi(),Ac=Fi(!0);function kc(){return[]}function zc(){return!1}var Oc=Bi(function(n,t){return n+t},0),Ic=Zi('ceil'),Rc=Bi(function(n,t){return n/t},1),Ec=Zi('floor');var Sc,Lc=Bi(function(n,t){return n*t},1),Wc=Zi('round'),Cc=Bi(function(n,t){return n-t},0);return xe.after=function(n,t){if('function'!=typeof t)throw new ot(o);return n=Aa(n),function(){if(--n<1)return t.apply(this,arguments)}},xe.ary=Bf,xe.assign=Ra,xe.assignIn=Ea,xe.assignInWith=Sa,xe.assignWith=La,xe.at=Wa,xe.before=$f,xe.bind=Df,xe.bindAll=cc,xe.bindKey=Mf,xe.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return na(n)?n:[n]},xe.chain=mf,xe.chunk=function(n,r,e){r=(e?Ao(n,r,e):r===t)?1:Yr(Aa(r),0);var u=null==n?0:n.length;if(!u||r<1)return[];for(var i=0,o=0,f=Dn(Zr(u/r));i>>0)?(n=Ia(n))&&('string'==typeof r||null!=r&&!_a(r))&&!(r=Qu(r))&&gr(n)?li(Or(n),0,e):n.split(r,e):[]},xe.spread=function(n,t){if('function'!=typeof n)throw new ot(o);return t=null==t?0:Yr(Aa(t),0),Du(function(r){var e=r[t],u=li(r,0,t);return e&&Mt(u,e),St(n,this,u)})},xe.tail=function(n){var t=null==n?0:n.length;return t?Ku(n,1,t):[]},xe.take=function(n,r,e){return n&&n.length?Ku(n,0,(r=e||r===t?1:Aa(r))<0?0:r):[]},xe.takeRight=function(n,r,e){var u=null==n?0:n.length;return u?Ku(n,(r=u-(r=e||r===t?1:Aa(r)))<0?0:r,u):[]},xe.takeRightWhile=function(n,t){return n&&n.length?ri(n,oo(t,3),!1,!0):[]},xe.takeWhile=function(n,t){return n&&n.length?ri(n,oo(t,3)):[]},xe.tap=function(n,t){return t(n),n},xe.throttle=function(n,t,r){var e=!0,u=!0;if('function'!=typeof n)throw new ot(o);return la(r)&&(e='leading'in r?!!r.leading:e,u='trailing'in r?!!r.trailing:u),Ff(n,t,{leading:e,maxWait:t,trailing:u})},xe.thru=jf,xe.toArray=ma,xe.toPairs=Ga,xe.toPairsIn=Ha,xe.toPath=function(n){return na(n)?Dt(n,qo):ya(n)?[n]:bi(Zo(Ia(n)))},xe.toPlainObject=Oa,xe.transform=function(n,t,r){var e=na(n),u=e||ua(n)||xa(n);if(t=oo(t,4),null==r){var i=n&&n.constructor;r=u?e?new i:[]:la(n)&&fa(i)?be(Wr(n)):{}}return(u?Wt:ru)(n,function(n,e,u){return t(r,n,e,u)}),r},xe.unary=function(n){return Bf(n,1)},xe.union=sf,xe.unionBy=hf,xe.unionWith=pf,xe.uniq=function(n){return n&&n.length?Xu(n):[]},xe.uniqBy=function(n,t){return n&&n.length?Xu(n,oo(t,2)):[]},xe.uniqWith=function(n,r){return r='function'==typeof r?r:t,n&&n.length?Xu(n,t,r):[]},xe.unset=function(n,t){return null==n||ni(n,t)},xe.unzip=vf,xe.unzipWith=_f,xe.update=function(n,t,r){return null==n?n:ti(n,t,fi(r))},xe.updateWith=function(n,r,e,u){return u='function'==typeof u?u:t,null==n?n:ti(n,r,fi(e),u)},xe.values=Ja,xe.valuesIn=function(n){return null==n?[]:fr(n,Na(n))},xe.without=gf,xe.words=fc,xe.wrap=function(n,t){return Vf(fi(t),n)},xe.xor=df,xe.xorBy=yf,xe.xorWith=xf,xe.zip=bf,xe.zipObject=function(n,t){return ii(n||[],t||[],Ce)},xe.zipObjectDeep=function(n,t){return ii(n||[],t||[],Nu)},xe.zipWith=wf,xe.entries=Ga,xe.entriesIn=Ha,xe.extend=Ea,xe.extendWith=Sa,dc(xe,xe),xe.add=Oc,xe.attempt=ac,xe.camelCase=Ya,xe.capitalize=Qa,xe.ceil=Ic,xe.clamp=function(n,r,e){return e===t&&(e=r,r=t),e!==t&&(e=(e=za(e))==e?e:0),r!==t&&(r=(r=za(r))==r?r:0),Fe(za(n),r,e)},xe.clone=function(n){return Ne(n,h)},xe.cloneDeep=function(n){return Ne(n,5)},xe.cloneDeepWith=function(n,r){return Ne(n,5,r='function'==typeof r?r:t)},xe.cloneWith=function(n,r){return Ne(n,h,r='function'==typeof r?r:t)},xe.conformsTo=function(n,t){return null==t||Ze(n,t,Fa(t))},xe.deburr=Xa,xe.defaultTo=function(n,t){return null==n||n!=n?t:n},xe.divide=Rc,xe.endsWith=function(n,r,e){n=Ia(n),r=Qu(r);var u=n.length,i=e=e===t?u:Fe(Aa(e),0,u);return(e-=r.length)>=0&&n.slice(e,i)==r},xe.eq=Jf,xe.escape=function(n){return(n=Ia(n))&&An.test(n)?n.replace(mn,pr):n},xe.escapeRegExp=function(n){return(n=Ia(n))&&Ln.test(n)?n.replace(Sn,'\\$&'):n},xe.every=function(n,r,e){var u=na(n)?Tt:He;return e&&Ao(n,r,e)&&(r=t),u(n,oo(r,3))},xe.find=zf,xe.findIndex=Qo,xe.findKey=function(n,t){return Vt(n,oo(t,3),ru)},xe.findLast=Of,xe.findLastIndex=Xo,xe.findLastKey=function(n,t){return Vt(n,oo(t,3),eu)},xe.floor=Ec,xe.forEach=If,xe.forEachRight=Rf,xe.forIn=function(n,t){return null==n?n:nu(n,oo(t,3),Na)},xe.forInRight=function(n,t){return null==n?n:tu(n,oo(t,3),Na)},xe.forOwn=function(n,t){return n&&ru(n,oo(t,3))},xe.forOwnRight=function(n,t){return n&&eu(n,oo(t,3))},xe.get=Ua,xe.gt=Yf,xe.gte=Qf,xe.has=function(n,t){return null!=n&&go(n,t,cu)},xe.hasIn=Ba,xe.head=tf,xe.identity=pc,xe.includes=function(n,t,r,e){n=ra(n)?n:Ja(n),r=r&&!e?Aa(r):0;var u=n.length;return r<0&&(r=Yr(u+r,0)),da(n)?r<=u&&n.indexOf(t,r)>-1:!!u&&Ht(n,t,r)>-1},xe.indexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=null==r?0:Aa(r);return u<0&&(u=Yr(e+u,0)),Ht(n,t,u)},xe.inRange=function(n,r,e){return r=ja(r),e===t?(e=r,r=0):e=ja(e),su(n=za(n),r,e)},xe.invoke=Ma,xe.isArguments=Xf,xe.isArray=na,xe.isArrayBuffer=ta,xe.isArrayLike=ra,xe.isArrayLikeObject=ea,xe.isBoolean=function(n){return!0===n||!1===n||sa(n)&&fu(n)==N},xe.isBuffer=ua,xe.isDate=ia,xe.isElement=function(n){return sa(n)&&1===n.nodeType&&!va(n)},xe.isEmpty=function(n){if(null==n)return!0;if(ra(n)&&(na(n)||'string'==typeof n||'function'==typeof n.splice||ua(n)||xa(n)||Xf(n)))return!n.length;var t=po(n);if(t==G||t==nn)return!n.size;if(Io(n))return!wu(n).length;for(var r in n)if(yt.call(n,r))return!1;return!0},xe.isEqual=function(n,t){return gu(n,t)},xe.isEqualWith=function(n,r,e){var u=(e='function'==typeof e?e:t)?e(n,r):t;return u===t?gu(n,r,t,e):!!u},xe.isError=oa,xe.isFinite=function(n){return'number'==typeof n&&Gr(n)},xe.isFunction=fa,xe.isInteger=aa,xe.isLength=ca,xe.isMap=ha,xe.isMatch=function(n,t){return n===t||yu(n,t,ao(t))},xe.isMatchWith=function(n,r,e){return e='function'==typeof e?e:t,yu(n,r,ao(r),e)},xe.isNaN=function(n){return pa(n)&&n!=+n},xe.isNative=function(n){if(Oo(n))throw new Qn(e);return xu(n)},xe.isNil=function(n){return null==n},xe.isNull=function(n){return null===n},xe.isNumber=pa,xe.isObject=la,xe.isObjectLike=sa,xe.isPlainObject=va,xe.isRegExp=_a,xe.isSafeInteger=function(n){return aa(n)&&n>=-9007199254740991&&n<=L},xe.isSet=ga,xe.isString=da,xe.isSymbol=ya,xe.isTypedArray=xa,xe.isUndefined=function(n){return n===t},xe.isWeakMap=function(n){return sa(n)&&po(n)==un},xe.isWeakSet=function(n){return sa(n)&&fu(n)==on},xe.join=function(n,t){return null==n?'':Hr.call(n,t)},xe.kebabCase=nc,xe.last=of,xe.lastIndexOf=function(n,r,e){var u=null==n?0:n.length;if(!u)return-1;var i=u;return e!==t&&(i=(i=Aa(e))<0?Yr(u+i,0):Qr(i,u-1)),r==r?kr(n,r,i):Gt(n,Yt,i,!0)},xe.lowerCase=tc,xe.lowerFirst=rc,xe.lt=ba,xe.lte=wa,xe.max=function(n){return n&&n.length?Je(n,pc,au):t},xe.maxBy=function(n,r){return n&&n.length?Je(n,oo(r,2),au):t},xe.mean=function(n){return Qt(n,pc)},xe.meanBy=function(n,t){return Qt(n,oo(t,2))},xe.min=function(n){return n&&n.length?Je(n,pc,ju):t},xe.minBy=function(n,r){return n&&n.length?Je(n,oo(r,2),ju):t},xe.stubArray=kc,xe.stubFalse=zc,xe.stubObject=function(){return{}},xe.stubString=function(){return''},xe.stubTrue=function(){return!0},xe.multiply=Lc,xe.nth=function(n,r){return n&&n.length?Ru(n,Aa(r)):t},xe.noConflict=function(){return xt._===this&&(xt._=Zt),this},xe.noop=yc,xe.now=Uf,xe.pad=function(n,t,r){n=Ia(n);var e=(t=Aa(t))?zr(n):0;if(!t||e>=t)return n;var u=(t-e)/2;return Di(qr(u),r)+n+Di(Zr(u),r)},xe.padEnd=function(n,t,r){n=Ia(n);var e=(t=Aa(t))?zr(n):0;return t&&er){var u=n;n=r,r=u}if(e||n%1||r%1){var i=te();return Qr(n+i*(r-n+_t('1e-'+((i+'').length-1))),r)}return Uu(n,r)},xe.reduce=function(n,t,r){var e=na(n)?Ft:tr,u=arguments.length<3;return e(n,oo(t,4),r,u,Ve)},xe.reduceRight=function(n,t,r){var e=na(n)?Nt:tr,u=arguments.length<3;return e(n,oo(t,4),r,u,Ge)},xe.repeat=function(n,r,e){return r=(e?Ao(n,r,e):r===t)?1:Aa(r),$u(Ia(n),r)},xe.replace=function(){var n=arguments,t=Ia(n[0]);return n.length<3?t:t.replace(n[1],n[2])},xe.result=function(n,r,e){var u=-1,i=(r=ai(r,n)).length;for(i||(i=1,n=t);++uL)return[];var r=T,e=Qr(n,T);t=oo(t),n-=T;for(var u=ur(e,t);++r=o)return n;var a=e-zr(u);if(a<1)return u;var c=f?li(f,0,a).join(''):n.slice(0,a);if(i===t)return c+u;if(f&&(a+=c.length-a),_a(i)){if(n.slice(a).search(i)){var l,s=c;for(i.global||(i=rt(i.source,Ia(Nn.exec(i))+'g')),i.lastIndex=0;l=i.exec(s);)var h=l.index;c=c.slice(0,h===t?a:h)}}else if(n.indexOf(Qu(i),a)!=a){var p=c.lastIndexOf(i);p>-1&&(c=c.slice(0,p))}return c+u},xe.unescape=function(n){return(n=Ia(n))&&jn.test(n)?n.replace(wn,Ir):n},xe.uniqueId=function(n){var t=++bt;return Ia(n)+t},xe.upperCase=ic,xe.upperFirst=oc,xe.each=If,xe.eachRight=Rf,xe.first=tf,dc(xe,(Sc={},ru(xe,function(n,t){yt.call(xe.prototype,t)||(Sc[t]=n)}),Sc),{chain:!1}),xe.VERSION="4.17.20",Wt(['bind','bindKey','curry','curryRight','partial','partialRight'],function(n){xe[n].placeholder=xe}),Wt(['drop','take'],function(n,r){je.prototype[n]=function(e){e=e===t?1:Yr(Aa(e),0);var u=this.__filtered__&&!r?new je(this):this.clone();return u.__filtered__?u.__takeCount__=Qr(e,u.__takeCount__):u.__views__.push({size:Qr(e,T),type:n+(u.__dir__<0?'Right':'')}),u},je.prototype[n+'Right']=function(t){return this.reverse()[n](t).reverse()}}),Wt(['filter','map','takeWhile'],function(n,t){var r=t+1,e=r==R||3==r;je.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:oo(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),Wt(['head','last'],function(n,t){var r='take'+(t?'Right':'');je.prototype[n]=function(){return this[r](1).value()[0]}}),Wt(['initial','tail'],function(n,t){var r='drop'+(t?'':'Right');je.prototype[n]=function(){return this.__filtered__?new je(this):this[r](1)}}),je.prototype.compact=function(){return this.filter(pc)},je.prototype.find=function(n){return this.filter(n).head()},je.prototype.findLast=function(n){return this.reverse().find(n)},je.prototype.invokeMap=Du(function(n,t){return'function'==typeof n?new je(this):this.map(function(r){return vu(r,n,t)})}),je.prototype.reject=function(n){return this.filter(qf(oo(n)))},je.prototype.slice=function(n,r){n=Aa(n);var e=this;return e.__filtered__&&(n>0||r<0)?new je(e):(n<0?e=e.takeRight(-n):n&&(e=e.drop(n)),r!==t&&(e=(r=Aa(r))<0?e.dropRight(-r):e.take(r-n)),e)},je.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},je.prototype.toArray=function(){return this.take(T)},ru(je.prototype,function(n,r){var e=/^(?:filter|find|map|reject)|While$/.test(r),u=/^(?:head|last)$/.test(r),i=xe[u?'take'+('last'==r?'Right':''):r],o=u||/^find/.test(r);i&&(xe.prototype[r]=function(){var r=this.__wrapped__,f=u?[1]:arguments,a=r instanceof je,c=f[0],l=a||na(r),s=function(n){var t=i.apply(xe,Mt([n],f));return u&&h?t[0]:t};l&&e&&'function'==typeof c&&1!=c.length&&(a=l=!1);var h=this.__chain__,p=!!this.__actions__.length,v=o&&!h,_=a&&!p;if(!o&&l){r=_?r:new je(this);var g=n.apply(r,f);return g.__actions__.push({func:jf,args:[s],thisArg:t}),new me(g,h)}return v&&_?n.apply(this,f):(g=this.thru(s),v?u?g.value()[0]:g.value():g)})}),Wt(['pop','push','shift','sort','splice','unshift'],function(n){var t=ft[n],r=/^(?:push|sort|unshift)$/.test(n)?'tap':'thru',e=/^(?:pop|shift)$/.test(n);xe.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(na(u)?u:[],n)}return this[r](function(r){return t.apply(na(r)?r:[],n)})}}),ru(je.prototype,function(n,t){var r=xe[t];if(r){var e=r.name+'';yt.call(le,e)||(le[e]=[]),le[e].push({name:t,func:r})}}),le[Ti(t,g).name]=[{name:'wrapper',func:t}],je.prototype.clone=function(){var n=new je(this.__wrapped__);return n.__actions__=bi(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=bi(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=bi(this.__views__),n},je.prototype.reverse=function(){if(this.__filtered__){var n=new je(this);n.__dir__=-1,n.__filtered__=!0}else(n=this.clone()).__dir__*=-1;return n},je.prototype.value=function(){var n=this.__wrapped__.value(),t=this.__dir__,r=na(n),e=t<0,u=r?n.length:0,i=vo(0,u,this.__views__),o=i.start,f=i.end,a=f-o,c=e?f:o-1,l=this.__iteratees__,s=l.length,h=0,p=Qr(a,this.__takeCount__);if(!r||!e&&u==a&&p==a)return ei(n,this.__actions__);var v=[];n:for(;a--&&h=this.__values__.length;return{done:n,value:n?t:this.__values__[this.__index__++]}},xe.prototype.plant=function(n){for(var r,e=this;e instanceof we;){var u=Go(e);u.__index__=0,u.__values__=t,r?i.__wrapped__=u:r=u;var i=u;e=e.__wrapped__}return i.__wrapped__=n,r},xe.prototype.reverse=function(){var n=this.__wrapped__;if(n instanceof je){var r=n;return this.__actions__.length&&(r=new je(this)),(r=r.reverse()).__actions__.push({func:jf,args:[lf],thisArg:t}),new me(r,this.__chain__)}return this.thru(lf)},xe.prototype.toJSON=xe.prototype.valueOf=xe.prototype.value=function(){return ei(this.__wrapped__,this.__actions__)},xe.prototype.first=xe.prototype.head,$r&&(xe.prototype[$r]=function(){return this}),xe})();'function'==typeof define&&'object'==typeof define.amd&&define.amd?(xt._=Lr,define(function(){return Lr})):wt?((wt.exports=Lr)._=Lr,bt._=Lr):xt._=Lr}).call(this)},552,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"Row",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(e,"Grid",{enumerable:!0,get:function(){return u.default}}),Object.defineProperty(e,"Col",{enumerable:!0,get:function(){return f.default}});var n=t(r(d[1])),u=t(r(d[2])),f=t(r(d[3]))},553,[1,554,557,558]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),o=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var s=o(r(d[2])),p=o(r(d[3])),n=o(r(d[4])),u=o(r(d[5])),l=o(r(d[6])),f=o(r(d[7])),h=t(r(d[8])),c=r(d[9]),v=o(r(d[10])),P=(function(t){function o(){return(0,p.default)(this,o),(0,u.default)(this,(0,l.default)(o).apply(this,arguments))}return(0,f.default)(o,t),(0,n.default)(o,[{key:"prepareRootProps",value:function(){var t=c.StyleSheet.flatten(this.props.style),o={style:{flexDirection:'row',flex:this.props.size?this.props.size:t&&t.height?0:1}};return(0,v.default)(this.props,o)}},{key:"setNativeProps",value:function(t){this._root.setNativeProps(t)}},{key:"render",value:function(){var t=this;return this.props.onPress?h.default.createElement(c.TouchableOpacity,(0,s.default)({onPress:this.props.onPress},this.prepareRootProps()),h.default.createElement(c.View,(0,s.default)({ref:function(o){return t._root=o}},this.props,this.prepareRootProps()),this.props.children)):h.default.createElement(c.View,(0,s.default)({ref:function(o){return t._root=o}},this.props,this.prepareRootProps()),this.props.children)}}]),o})(h.Component);e.default=P},554,[346,1,8,19,20,27,30,33,47,2,555]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;t(r(d[1]));var l=r(d[2]),f=t(r(d[3]));var u=function(t,u){var n={};delete(t=f.default.clone(t)).children;var y=t.style;if(delete t.style,t?f.default.merge(n,u,t):n=u,y){var o={};n.style={},Array.isArray(y)?f.default.forEach(y,function(t){"number"==typeof t?f.default.merge(o,l.StyleSheet.flatten(t)):f.default.merge(o,t)}):o="number"==typeof y?l.StyleSheet.flatten(y):y,f.default.merge(n.style,u.style,o)}return n};e.default=u},555,[1,47,2,556]); -__d(function(n,t,r,e,u,i,o){(function(){var t,r=200,e='Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',o='Expected a function',f='__lodash_hash_undefined__',a=500,c='__lodash_placeholder__',l=1,s=2,h=4,p=1,v=2,_=1,g=2,d=4,y=8,x=16,b=32,w=64,m=128,j=256,A=512,k=30,z='...',O=800,I=16,R=1,E=2,S=1/0,L=9007199254740991,W=1.7976931348623157e308,C=NaN,T=4294967295,U=4294967294,B=2147483647,$=[['ary',m],['bind',_],['bindKey',g],['curry',y],['curryRight',x],['flip',A],['partial',b],['partialRight',w],['rearg',j]],D='[object Arguments]',M='[object Array]',F='[object AsyncFunction]',N='[object Boolean]',P='[object Date]',Z='[object DOMException]',q='[object Error]',K='[object Function]',V='[object GeneratorFunction]',G='[object Map]',H='[object Number]',J='[object Null]',Y='[object Object]',Q='[object Proxy]',X='[object RegExp]',nn='[object Set]',tn='[object String]',rn='[object Symbol]',en='[object Undefined]',un='[object WeakMap]',on='[object WeakSet]',fn='[object ArrayBuffer]',an='[object DataView]',cn='[object Float32Array]',ln='[object Float64Array]',sn='[object Int8Array]',hn='[object Int16Array]',pn='[object Int32Array]',vn='[object Uint8Array]',_n='[object Uint8ClampedArray]',gn='[object Uint16Array]',dn='[object Uint32Array]',yn=/\b__p \+= '';/g,xn=/\b(__p \+=) '' \+/g,bn=/(__e\(.*?\)|\b__t\)) \+\n'';/g,wn=/&(?:amp|lt|gt|quot|#39);/g,mn=/[&<>"']/g,jn=RegExp(wn.source),An=RegExp(mn.source),kn=/<%-([\s\S]+?)%>/g,zn=/<%([\s\S]+?)%>/g,On=/<%=([\s\S]+?)%>/g,In=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Rn=/^\w*$/,En=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Sn=/[\\^$.*+?()[\]{}|]/g,Ln=RegExp(Sn.source),Wn=/^\s+|\s+$/g,Cn=/^\s+/,Tn=/\s+$/,Un=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Bn=/\{\n\/\* \[wrapped with (.+)\] \*/,$n=/,? & /,Dn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Mn=/\\(\\)?/g,Fn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Nn=/\w*$/,Pn=/^[-+]0x[0-9a-f]+$/i,Zn=/^0b[01]+$/i,qn=/^\[object .+?Constructor\]$/,Kn=/^0o[0-7]+$/i,Vn=/^(?:0|[1-9]\d*)$/,Gn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Hn=/($^)/,Jn=/['\n\r\u2028\u2029\\]/g,Yn="[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]",Qn="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Xn="(?:\\ud83c[\\udde6-\\uddff]){2}",nt="[\\ud800-\\udbff][\\udc00-\\udfff]",tt="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?"+("(?:\\u200d(?:"+["[^\\ud800-\\udfff]",Xn,nt].join('|')+")[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?)*"),rt='(?:'+["[\\u2700-\\u27bf]",Xn,nt].join('|')+')'+tt,et='(?:'+["[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]?",Qn,Xn,nt,"[\\ud800-\\udfff]"].join('|')+')',ut=RegExp("['\u2019]",'g'),it=RegExp(Qn,'g'),ot=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+et+tt,'g'),ft=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?="+[Yn,"[A-Z\\xc0-\\xd6\\xd8-\\xde]",'$'].join('|')+')',"(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?="+[Yn,"[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])",'$'].join('|')+')',"[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?","[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?",'\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])','\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])','\\d+',rt].join('|'),'g'),at=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]"),ct=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,lt=['Array','Buffer','DataView','Date','Error','Float32Array','Float64Array','Function','Int8Array','Int16Array','Int32Array','Map','Math','Object','Promise','RegExp','Set','String','Symbol','TypeError','Uint8Array','Uint8ClampedArray','Uint16Array','Uint32Array','WeakMap','_','clearTimeout','isFinite','parseInt','setTimeout'],st=-1,ht={};ht[cn]=ht[ln]=ht[sn]=ht[hn]=ht[pn]=ht[vn]=ht[_n]=ht[gn]=ht[dn]=!0,ht[D]=ht[M]=ht[fn]=ht[N]=ht[an]=ht[P]=ht[q]=ht[K]=ht[G]=ht[H]=ht[Y]=ht[X]=ht[nn]=ht[tn]=ht[un]=!1;var pt={};pt[D]=pt[M]=pt[fn]=pt[an]=pt[N]=pt[P]=pt[cn]=pt[ln]=pt[sn]=pt[hn]=pt[pn]=pt[G]=pt[H]=pt[Y]=pt[X]=pt[nn]=pt[tn]=pt[rn]=pt[vn]=pt[_n]=pt[gn]=pt[dn]=!0,pt[q]=pt[K]=pt[un]=!1;var vt={'\\':'\\',"'":"'",'\n':'n','\r':'r',"\u2028":'u2028',"\u2029":'u2029'},_t=parseFloat,gt=parseInt,dt='object'==typeof n&&n&&n.Object===Object&&n,yt='object'==typeof self&&self&&self.Object===Object&&self,xt=dt||yt||Function('return this')(),bt='object'==typeof i&&i&&!i.nodeType&&i,wt=bt&&'object'==typeof u&&u&&!u.nodeType&&u,mt=wt&&wt.exports===bt,jt=mt&&dt.process,At=(function(){try{var n=wt&&wt.require&&wt.require('util').types;return n||jt&&jt.binding&&jt.binding('util')}catch(n){}})(),kt=At&&At.isArrayBuffer,zt=At&&At.isDate,Ot=At&&At.isMap,It=At&&At.isRegExp,Rt=At&&At.isSet,Et=At&&At.isTypedArray;function St(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function Lt(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u-1}function $t(n,t,r){for(var e=-1,u=null==n?0:n.length;++e-1;);return r}function lr(n,t){for(var r=n.length;r--&&Ht(t,n[r],0)>-1;);return r}function sr(n,t){for(var r=n.length,e=0;r--;)n[r]===t&&++e;return e}var hr=nr({'\xc0':'A','\xc1':'A','\xc2':'A','\xc3':'A','\xc4':'A','\xc5':'A','\xe0':'a','\xe1':'a','\xe2':'a','\xe3':'a','\xe4':'a','\xe5':'a','\xc7':'C','\xe7':'c','\xd0':'D','\xf0':'d','\xc8':'E','\xc9':'E','\xca':'E','\xcb':'E','\xe8':'e','\xe9':'e','\xea':'e','\xeb':'e','\xcc':'I','\xcd':'I','\xce':'I','\xcf':'I','\xec':'i','\xed':'i','\xee':'i','\xef':'i','\xd1':'N','\xf1':'n','\xd2':'O','\xd3':'O','\xd4':'O','\xd5':'O','\xd6':'O','\xd8':'O','\xf2':'o','\xf3':'o','\xf4':'o','\xf5':'o','\xf6':'o','\xf8':'o','\xd9':'U','\xda':'U','\xdb':'U','\xdc':'U','\xf9':'u','\xfa':'u','\xfb':'u','\xfc':'u','\xdd':'Y','\xfd':'y','\xff':'y','\xc6':'Ae','\xe6':'ae','\xde':'Th','\xfe':'th','\xdf':'ss',"\u0100":'A',"\u0102":'A',"\u0104":'A',"\u0101":'a',"\u0103":'a',"\u0105":'a',"\u0106":'C',"\u0108":'C',"\u010a":'C',"\u010c":'C',"\u0107":'c',"\u0109":'c',"\u010b":'c',"\u010d":'c',"\u010e":'D',"\u0110":'D',"\u010f":'d',"\u0111":'d',"\u0112":'E',"\u0114":'E',"\u0116":'E',"\u0118":'E',"\u011a":'E',"\u0113":'e',"\u0115":'e',"\u0117":'e',"\u0119":'e',"\u011b":'e',"\u011c":'G',"\u011e":'G',"\u0120":'G',"\u0122":'G',"\u011d":'g',"\u011f":'g',"\u0121":'g',"\u0123":'g',"\u0124":'H',"\u0126":'H',"\u0125":'h',"\u0127":'h',"\u0128":'I',"\u012a":'I',"\u012c":'I',"\u012e":'I',"\u0130":'I',"\u0129":'i',"\u012b":'i',"\u012d":'i',"\u012f":'i',"\u0131":'i',"\u0134":'J',"\u0135":'j',"\u0136":'K',"\u0137":'k',"\u0138":'k',"\u0139":'L',"\u013b":'L',"\u013d":'L',"\u013f":'L',"\u0141":'L',"\u013a":'l',"\u013c":'l',"\u013e":'l',"\u0140":'l',"\u0142":'l',"\u0143":'N',"\u0145":'N',"\u0147":'N',"\u014a":'N',"\u0144":'n',"\u0146":'n',"\u0148":'n',"\u014b":'n',"\u014c":'O',"\u014e":'O',"\u0150":'O',"\u014d":'o',"\u014f":'o',"\u0151":'o',"\u0154":'R',"\u0156":'R',"\u0158":'R',"\u0155":'r',"\u0157":'r',"\u0159":'r',"\u015a":'S',"\u015c":'S',"\u015e":'S',"\u0160":'S',"\u015b":'s',"\u015d":'s',"\u015f":'s',"\u0161":'s',"\u0162":'T',"\u0164":'T',"\u0166":'T',"\u0163":'t',"\u0165":'t',"\u0167":'t',"\u0168":'U',"\u016a":'U',"\u016c":'U',"\u016e":'U',"\u0170":'U',"\u0172":'U',"\u0169":'u',"\u016b":'u',"\u016d":'u',"\u016f":'u',"\u0171":'u',"\u0173":'u',"\u0174":'W',"\u0175":'w',"\u0176":'Y',"\u0177":'y',"\u0178":'Y',"\u0179":'Z',"\u017b":'Z',"\u017d":'Z',"\u017a":'z',"\u017c":'z',"\u017e":'z',"\u0132":'IJ',"\u0133":'ij',"\u0152":'Oe',"\u0153":'oe',"\u0149":"'n","\u017f":'s'}),pr=nr({'&':'&','<':'<','>':'>','"':'"',"'":'''});function vr(n){return'\\'+vt[n]}function _r(n,r){return null==n?t:n[r]}function gr(n){return at.test(n)}function dr(n){return ct.test(n)}function yr(n){for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}function xr(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n]}),r}function br(n,t){return function(r){return n(t(r))}}function wr(n,t){for(var r=-1,e=n.length,u=0,i=[];++r','"':'"',''':"'"});function Rr(n){for(var t=ot.lastIndex=0;ot.test(n);)++t;return t}function Er(n){return n.match(ot)||[]}function Sr(n){return n.match(ft)||[]}var Lr=(function n(u){var i,Dn=(u=null==u?xt:Lr.defaults(xt.Object(),u,Lr.pick(xt,lt))).Array,Yn=u.Date,Qn=u.Error,Xn=u.Function,nt=u.Math,tt=u.Object,rt=u.RegExp,et=u.String,ot=u.TypeError,ft=Dn.prototype,at=Xn.prototype,ct=tt.prototype,vt=u['__core-js_shared__'],dt=at.toString,yt=ct.hasOwnProperty,bt=0,wt=(i=/[^.]+$/.exec(vt&&vt.keys&&vt.keys.IE_PROTO||''))?'Symbol(src)_1.'+i:'',jt=ct.toString,At=dt.call(tt),Zt=xt._,qt=rt('^'+dt.call(yt).replace(Sn,'\\$&').replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,'$1.*?')+'$'),nr=mt?u.Buffer:t,Ar=u.Symbol,Rr=u.Uint8Array,Er=nr?nr.allocUnsafe:t,Wr=br(tt.getPrototypeOf,tt),Cr=tt.create,Tr=ct.propertyIsEnumerable,Ur=ft.splice,Br=Ar?"function"==typeof Ar?Ar.isConcatSpreadable:"@@isConcatSpreadable":t,$r=Ar?"function"==typeof Ar?Ar.iterator:"@@iterator":t,Dr=Ar?"function"==typeof Ar?Ar.toStringTag:"@@toStringTag":t,Mr=(function(){try{var n=co(tt,'defineProperty');return n({},'',{}),n}catch(n){}})(),Fr=u.clearTimeout!==xt.clearTimeout&&u.clearTimeout,Nr=Yn&&Yn.now!==xt.Date.now&&Yn.now,Pr=u.setTimeout!==xt.setTimeout&&u.setTimeout,Zr=nt.ceil,qr=nt.floor,Kr=tt.getOwnPropertySymbols,Vr=nr?nr.isBuffer:t,Gr=u.isFinite,Hr=ft.join,Jr=br(tt.keys,tt),Yr=nt.max,Qr=nt.min,Xr=Yn.now,ne=u.parseInt,te=nt.random,re=ft.reverse,ee=co(u,'DataView'),ue=co(u,'Map'),ie=co(u,'Promise'),oe=co(u,'Set'),fe=co(u,'WeakMap'),ae=co(tt,'create'),ce=fe&&new fe,le={},se=Ko(ee),he=Ko(ue),pe=Ko(ie),ve=Ko(oe),_e=Ko(fe),ge=Ar?"function"==typeof Ar?Ar.prototype:"@@prototype":t,de=ge?ge.valueOf:t,ye=ge?ge.toString:t;function xe(n){if(sa(n)&&!na(n)&&!(n instanceof je)){if(n instanceof me)return n;if(yt.call(n,'__wrapped__'))return Go(n)}return new me(n)}var be=(function(){function n(){}return function(r){if(!la(r))return{};if(Cr)return Cr(r);n.prototype=r;var e=new n;return n.prototype=t,e}})();function we(){}function me(n,r){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!r,this.__index__=0,this.__values__=t}function je(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=T,this.__views__=[]}function Ae(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t=r?n:r)),n}function Ne(n,r,e,u,i,o){var f,a=r&l,c=r&s,p=r&h;if(e&&(f=i?e(n,u,i,o):e(n)),f!==t)return f;if(!la(n))return n;var v=na(n);if(v){if(f=yo(n),!a)return bi(n,f)}else{var _=po(n),g=_==K||_==V;if(ua(n))return hi(n,a);if(_==Y||_==D||g&&!i){if(f=c||g?{}:xo(n),!a)return c?ji(n,$e(f,n)):mi(n,Be(f,n))}else{if(!pt[_])return i?n:{};f=bo(n,_,a)}}o||(o=new Ie);var d=o.get(n);if(d)return d;o.set(n,f),ga(n)?n.forEach(function(t){f.add(Ne(t,r,e,t,n,o))}):ha(n)&&n.forEach(function(t,u){f.set(u,Ne(t,r,e,u,n,o))});var y=v?t:(p?c?ro:to:c?Na:Fa)(n);return Wt(y||n,function(t,u){y&&(t=n[u=t]),Ce(f,u,Ne(t,r,e,u,n,o))}),f}function Pe(n){var t=Fa(n);return function(r){return Ze(r,n,t)}}function Ze(n,r,e){var u=e.length;if(null==n)return!u;for(n=tt(n);u--;){var i=e[u],o=r[i],f=n[i];if(f===t&&!(i in n)||!o(f))return!1}return!0}function qe(n,r,e){if('function'!=typeof n)throw new ot(o);return Do(function(){n.apply(t,e)},r)}function Ke(n,t,e,u){var i=-1,o=Bt,f=!0,a=n.length,c=[],l=t.length;if(!a)return c;e&&(t=Dt(t,or(e))),u?(o=$t,f=!1):t.length>=r&&(o=ar,f=!1,t=new Oe(t));n:for(;++i-1},ke.prototype.set=function(n,t){var r=this.__data__,e=Te(r,n);return e<0?(++this.size,r.push([n,t])):r[e][1]=t,this},ze.prototype.clear=function(){this.size=0,this.__data__={hash:new Ae,map:new(ue||ke),string:new Ae}},ze.prototype.delete=function(n){var t=fo(this,n).delete(n);return this.size-=t?1:0,t},ze.prototype.get=function(n){return fo(this,n).get(n)},ze.prototype.has=function(n){return fo(this,n).has(n)},ze.prototype.set=function(n,t){var r=fo(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},Oe.prototype.add=Oe.prototype.push=function(n){return this.__data__.set(n,f),this},Oe.prototype.has=function(n){return this.__data__.has(n)},Ie.prototype.clear=function(){this.__data__=new ke,this.size=0},Ie.prototype.delete=function(n){var t=this.__data__,r=t.delete(n);return this.size=t.size,r},Ie.prototype.get=function(n){return this.__data__.get(n)},Ie.prototype.has=function(n){return this.__data__.has(n)},Ie.prototype.set=function(n,t){var r=this.__data__;if(r instanceof ke){var e=r.__data__;if(!ue||e.length<199)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new ze(e)}return r.set(n,t),this.size=r.size,this};var Ve=zi(ru),Ge=zi(eu,!0);function He(n,t){var r=!0;return Ve(n,function(n,e,u){return r=!!t(n,e,u)}),r}function Je(n,r,e){for(var u=-1,i=n.length;++ui?0:i+e),(u=u===t||u>i?i:Aa(u))<0&&(u+=i),u=e>u?0:ka(u);e0&&r(f)?t>1?Xe(f,t-1,r,e,u):Mt(u,f):e||(u[u.length]=f)}return u}var nu=Oi(),tu=Oi(!0);function ru(n,t){return n&&nu(n,t,Fa)}function eu(n,t){return n&&tu(n,t,Fa)}function uu(n,t){return Ut(t,function(t){return fa(n[t])})}function iu(n,r){for(var e=0,u=(r=ai(r,n)).length;null!=n&&et}function cu(n,t){return null!=n&&yt.call(n,t)}function lu(n,t){return null!=n&&t in tt(n)}function su(n,t,r){return n>=Qr(t,r)&&n=120&&s.length>=120)?new Oe(f&&s):t}s=n[0];var h=-1,p=a[0];n:for(;++h-1;)f!==n&&Ur.call(f,a,1),Ur.call(n,a,1);return n}function Tu(n,t){for(var r=n?t.length:0,e=r-1;r--;){var u=t[r];if(r==e||u!==i){var i=u;jo(u)?Ur.call(n,u,1):ni(n,u)}}return n}function Uu(n,t){return n+qr(te()*(t-n+1))}function Bu(n,t,r,e){for(var u=-1,i=Yr(Zr((t-n)/(r||1)),0),o=Dn(i);i--;)o[e?i:++u]=n,n+=r;return o}function $u(n,t){var r='';if(!n||t<1||t>L)return r;do{t%2&&(r+=n),(t=qr(t/2))&&(n+=n)}while(t);return r}function Du(n,t){return Mo(Co(n,t,pc),n+'')}function Mu(n){return Ee(Ja(n))}function Fu(n,t){var r=Ja(n);return Po(r,Fe(t,0,r.length))}function Nu(n,r,e,u){if(!la(n))return n;for(var i=-1,o=(r=ai(r,n)).length,f=o-1,a=n;null!=a&&++iu?0:u+t),(r=r>u?u:r)<0&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0;for(var i=Dn(u);++e>>1,o=n[i];null!==o&&!ya(o)&&(r?o<=t:o=r){var l=t?null:qi(n);if(l)return mr(l);f=!1,i=ar,c=new Oe}else c=t?[]:a;n:for(;++u=u?n:Ku(n,r,e)}var si=Fr||function(n){return xt.clearTimeout(n)};function hi(n,t){if(t)return n.slice();var r=n.length,e=Er?Er(r):new n.constructor(r);return n.copy(e),e}function pi(n){var t=new n.constructor(n.byteLength);return new Rr(t).set(new Rr(n)),t}function vi(n,t){var r=t?pi(n.buffer):n.buffer;return new n.constructor(r,n.byteOffset,n.byteLength)}function _i(n,t){var r=t?pi(n.buffer):n.buffer;return new n.constructor(r,n.byteOffset,n.length)}function gi(n,r){if(n!==r){var e=n!==t,u=null===n,i=n==n,o=ya(n),f=r!==t,a=null===r,c=r==r,l=ya(r);if(!a&&!l&&!o&&n>r||o&&f&&c&&!a&&!l||u&&f&&c||!e&&c||!i)return 1;if(!u&&!o&&!l&&n=f?a:a*('desc'==r[e]?-1:1)}return n.index-t.index}function yi(n,t,r,e){for(var u=-1,i=n.length,o=r.length,f=-1,a=t.length,c=Yr(i-o,0),l=Dn(a+c),s=!e;++f1?e[i-1]:t,f=i>2?e[2]:t;for(o=n.length>3&&'function'==typeof o?(i--,o):t,f&&Ao(e[0],e[1],f)&&(o=i<3?t:o,i=1),r=tt(r);++u-1?i[o?r[f]:f]:t}}function Ci(n){return no(function(r){var e=r.length,u=e,i=me.prototype.thru;for(n&&r.reverse();u--;){var f=r[u];if('function'!=typeof f)throw new ot(o);if(i&&!a&&'wrapper'==uo(f))var a=new me([],!0)}for(u=a?u:e;++u1&&g.reverse(),s&&c<_&&(g.length=c),this&&this!==xt&&this instanceof t&&(A=y||Si(A)),A.apply(j,g)}}function Ui(n,t){return function(r,e){return pu(r,n,t(e),{})}}function Bi(n,r){return function(e,u){var i;if(e===t&&u===t)return r;if(e!==t&&(i=e),u!==t){if(i===t)return u;'string'==typeof e||'string'==typeof u?(e=Qu(e),u=Qu(u)):(e=Yu(e),u=Yu(u)),i=n(e,u)}return i}}function $i(n){return no(function(t){return t=Dt(t,or(oo())),Du(function(r){var e=this;return n(t,function(n){return St(n,e,r)})})})}function Di(n,r){var e=(r=r===t?' ':Qu(r)).length;if(e<2)return e?$u(r,n):r;var u=$u(r,Zr(n/zr(r)));return gr(r)?li(Or(u),0,n).join(''):u.slice(0,n)}function Mi(n,t,r,e){var u=t&_,i=Si(n);return function t(){for(var o=-1,f=arguments.length,a=-1,c=e.length,l=Dn(c+f),s=this&&this!==xt&&this instanceof t?i:n;++aa))return!1;var l=o.get(n),s=o.get(r);if(l&&s)return l==r&&s==n;var h=-1,_=!0,g=e&v?new Oe:t;for(o.set(n,r),o.set(r,n);++h1?'& ':'')+t[e],t=t.join(r>2?', ':' '),n.replace(Un,'{\n/* [wrapped with '+t+'] */\n')}function mo(n){return na(n)||Xf(n)||!!(Br&&n&&n[Br])}function jo(n,t){var r=typeof n;return!!(t=null==t?L:t)&&('number'==r||'symbol'!=r&&Vn.test(n))&&n>-1&&n%1==0&&n0){if(++r>=O)return arguments[0]}else r=0;return n.apply(t,arguments)}}function Po(n,r){var e=-1,u=n.length,i=u-1;for(r=r===t?u:r;++e1?n[r-1]:t;return _f(n,e='function'==typeof e?(n.pop(),e):t)});function mf(n){var t=xe(n);return t.__chain__=!0,t}function jf(n,t){return t(n)}var Af=no(function(n){var r=n.length,e=r?n[0]:0,u=this.__wrapped__,i=function(t){return Me(t,n)};return!(r>1||this.__actions__.length)&&u instanceof je&&jo(e)?((u=u.slice(e,+e+(r?1:0))).__actions__.push({func:jf,args:[i],thisArg:t}),new me(u,this.__chain__).thru(function(n){return r&&!n.length&&n.push(t),n})):this.thru(i)});var kf=Ai(function(n,t,r){yt.call(n,r)?++n[r]:De(n,r,1)});var zf=Wi(Qo),Of=Wi(Xo);function If(n,t){return(na(n)?Wt:Ve)(n,oo(t,3))}function Rf(n,t){return(na(n)?Ct:Ge)(n,oo(t,3))}var Ef=Ai(function(n,t,r){yt.call(n,r)?n[r].push(t):De(n,r,[t])});var Sf=Du(function(n,t,r){var e=-1,u='function'==typeof t,i=ra(n)?Dn(n.length):[];return Ve(n,function(n){i[++e]=u?St(t,n,r):vu(n,t,r)}),i}),Lf=Ai(function(n,t,r){De(n,r,t)});function Wf(n,t){return(na(n)?Dt:Au)(n,oo(t,3))}var Cf=Ai(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]});var Tf=Du(function(n,t){if(null==n)return[];var r=t.length;return r>1&&Ao(n,t[0],t[1])?t=[]:r>2&&Ao(t[0],t[1],t[2])&&(t=[t[0]]),Eu(n,Xe(t,1),[])}),Uf=Nr||function(){return xt.Date.now()};function Bf(n,r,e){return r=e?t:r,r=n&&null==r?n.length:r,Vi(n,m,t,t,t,t,r)}function $f(n,r){var e;if('function'!=typeof r)throw new ot(o);return n=Aa(n),function(){return--n>0&&(e=r.apply(this,arguments)),n<=1&&(r=t),e}}var Df=Du(function(n,t,r){var e=_;if(r.length){var u=wr(r,io(Df));e|=b}return Vi(n,e,t,r,u)}),Mf=Du(function(n,t,r){var e=3;if(r.length){var u=wr(r,io(Mf));e|=b}return Vi(t,e,n,r,u)});function Ff(n,r,e){var u,i,f,a,c,l,s=0,h=!1,p=!1,v=!0;if('function'!=typeof n)throw new ot(o);function _(r){var e=u,o=i;return u=i=t,s=r,a=n.apply(o,e)}function g(n){return s=n,c=Do(x,r),h?_(n):a}function d(n){var t=r-(n-l);return p?Qr(t,f-(n-s)):t}function y(n){var e=n-l;return l===t||e>=r||e<0||p&&n-s>=f}function x(){var n=Uf();if(y(n))return b(n);c=Do(x,d(n))}function b(n){return c=t,v&&u?_(n):(u=i=t,a)}function w(){var n=Uf(),e=y(n);if(u=arguments,i=this,l=n,e){if(c===t)return g(l);if(p)return si(c),c=Do(x,r),_(l)}return c===t&&(c=Do(x,r)),a}return r=za(r)||0,la(e)&&(h=!!e.leading,f=(p='maxWait'in e)?Yr(za(e.maxWait)||0,r):f,v='trailing'in e?!!e.trailing:v),w.cancel=function(){c!==t&&si(c),s=0,u=l=i=c=t},w.flush=function(){return c===t?a:b(Uf())},w}var Nf=Du(function(n,t){return qe(n,1,t)}),Pf=Du(function(n,t,r){return qe(n,za(t)||0,r)});function Zf(n,t){if('function'!=typeof n||null!=t&&'function'!=typeof t)throw new ot(o);var r=function r(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;if(i.has(u))return i.get(u);var o=n.apply(this,e);return r.cache=i.set(u,o)||i,o};return r.cache=new(Zf.Cache||ze),r}function qf(n){if('function'!=typeof n)throw new ot(o);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}Zf.Cache=ze;var Kf=ci(function(n,t){var r=(t=1==t.length&&na(t[0])?Dt(t[0],or(oo())):Dt(Xe(t,1),or(oo()))).length;return Du(function(e){for(var u=-1,i=Qr(e.length,r);++u=t}),Xf=_u((function(){return arguments})())?_u:function(n){return sa(n)&&yt.call(n,'callee')&&!Tr.call(n,'callee')},na=Dn.isArray,ta=kt?or(kt):function(n){return sa(n)&&fu(n)==fn};function ra(n){return null!=n&&ca(n.length)&&!fa(n)}function ea(n){return sa(n)&&ra(n)}var ua=Vr||zc,ia=zt?or(zt):function(n){return sa(n)&&fu(n)==P};function oa(n){if(!sa(n))return!1;var t=fu(n);return t==q||t==Z||'string'==typeof n.message&&'string'==typeof n.name&&!va(n)}function fa(n){if(!la(n))return!1;var t=fu(n);return t==K||t==V||t==F||t==Q}function aa(n){return'number'==typeof n&&n==Aa(n)}function ca(n){return'number'==typeof n&&n>-1&&n%1==0&&n<=L}function la(n){var t=typeof n;return null!=n&&('object'==t||'function'==t)}function sa(n){return null!=n&&'object'==typeof n}var ha=Ot?or(Ot):function(n){return sa(n)&&po(n)==G};function pa(n){return'number'==typeof n||sa(n)&&fu(n)==H}function va(n){if(!sa(n)||fu(n)!=Y)return!1;var t=Wr(n);if(null===t)return!0;var r=yt.call(t,'constructor')&&t.constructor;return'function'==typeof r&&r instanceof r&&dt.call(r)==At}var _a=It?or(It):function(n){return sa(n)&&fu(n)==X};var ga=Rt?or(Rt):function(n){return sa(n)&&po(n)==nn};function da(n){return'string'==typeof n||!na(n)&&sa(n)&&fu(n)==tn}function ya(n){return'symbol'==typeof n||sa(n)&&fu(n)==rn}var xa=Et?or(Et):function(n){return sa(n)&&ca(n.length)&&!!ht[fu(n)]};var ba=Ni(ju),wa=Ni(function(n,t){return n<=t});function ma(n){if(!n)return[];if(ra(n))return da(n)?Or(n):bi(n);if($r&&n[$r])return yr(n[$r]());var t=po(n);return(t==G?xr:t==nn?mr:Ja)(n)}function ja(n){return n?(n=za(n))===S||n===-1/0?(n<0?-1:1)*W:n==n?n:0:0===n?n:0}function Aa(n){var t=ja(n),r=t%1;return t==t?r?t-r:t:0}function ka(n){return n?Fe(Aa(n),0,T):0}function za(n){if('number'==typeof n)return n;if(ya(n))return C;if(la(n)){var t='function'==typeof n.valueOf?n.valueOf():n;n=la(t)?t+'':t}if('string'!=typeof n)return 0===n?n:+n;n=n.replace(Wn,'');var r=Zn.test(n);return r||Kn.test(n)?gt(n.slice(2),r?2:8):Pn.test(n)?C:+n}function Oa(n){return wi(n,Na(n))}function Ia(n){return null==n?'':Qu(n)}var Ra=ki(function(n,t){if(Io(t)||ra(t))wi(t,Fa(t),n);else for(var r in t)yt.call(t,r)&&Ce(n,r,t[r])}),Ea=ki(function(n,t){wi(t,Na(t),n)}),Sa=ki(function(n,t,r,e){wi(t,Na(t),n,e)}),La=ki(function(n,t,r,e){wi(t,Fa(t),n,e)}),Wa=no(Me);var Ca=Du(function(n,r){n=tt(n);var e=-1,u=r.length,i=u>2?r[2]:t;for(i&&Ao(r[0],r[1],i)&&(u=1);++e1),t}),wi(n,ro(n),r),e&&(r=Ne(r,7,Ji));for(var u=t.length;u--;)ni(r,t[u]);return r});var Ka=no(function(n,t){return null==n?{}:Su(n,t)});function Va(n,t){if(null==n)return{};var r=Dt(ro(n),function(n){return[n]});return t=oo(t),Lu(n,r,function(n,r){return t(n,r[0])})}var Ga=Ki(Fa),Ha=Ki(Na);function Ja(n){return null==n?[]:fr(n,Fa(n))}var Ya=Ei(function(n,t,r){return t=t.toLowerCase(),n+(r?Qa(t):t)});function Qa(n){return oc(Ia(n).toLowerCase())}function Xa(n){return(n=Ia(n))&&n.replace(Gn,hr).replace(it,'')}var nc=Ei(function(n,t,r){return n+(r?'-':'')+t.toLowerCase()}),tc=Ei(function(n,t,r){return n+(r?' ':'')+t.toLowerCase()}),rc=Ri('toLowerCase');var ec=Ei(function(n,t,r){return n+(r?'_':'')+t.toLowerCase()});var uc=Ei(function(n,t,r){return n+(r?' ':'')+oc(t)});var ic=Ei(function(n,t,r){return n+(r?' ':'')+t.toUpperCase()}),oc=Ri('toUpperCase');function fc(n,r,e){return n=Ia(n),(r=e?t:r)===t?dr(n)?Sr(n):Kt(n):n.match(r)||[]}var ac=Du(function(n,r){try{return St(n,t,r)}catch(n){return oa(n)?n:new Qn(n)}}),cc=no(function(n,t){return Wt(t,function(t){t=qo(t),De(n,t,Df(n[t],n))}),n});function lc(n){return function(){return n}}var sc=Ci(),hc=Ci(!0);function pc(n){return n}function vc(n){return bu('function'==typeof n?n:Ne(n,l))}var _c=Du(function(n,t){return function(r){return vu(r,n,t)}}),gc=Du(function(n,t){return function(r){return vu(n,r,t)}});function dc(n,t,r){var e=Fa(t),u=uu(t,e);null!=r||la(t)&&(u.length||!e.length)||(r=t,t=n,n=this,u=uu(t,Fa(t)));var i=!(la(r)&&'chain'in r&&!r.chain),o=fa(n);return Wt(u,function(r){var e=t[r];n[r]=e,o&&(n.prototype[r]=function(){var t=this.__chain__;if(i||t){var r=n(this.__wrapped__);return(r.__actions__=bi(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,Mt([this.value()],arguments))})}),n}function yc(){}var xc=$i(Dt),bc=$i(Tt),wc=$i(Pt);function mc(n){return ko(n)?Xt(qo(n)):Wu(n)}var jc=Fi(),Ac=Fi(!0);function kc(){return[]}function zc(){return!1}var Oc=Bi(function(n,t){return n+t},0),Ic=Zi('ceil'),Rc=Bi(function(n,t){return n/t},1),Ec=Zi('floor');var Sc,Lc=Bi(function(n,t){return n*t},1),Wc=Zi('round'),Cc=Bi(function(n,t){return n-t},0);return xe.after=function(n,t){if('function'!=typeof t)throw new ot(o);return n=Aa(n),function(){if(--n<1)return t.apply(this,arguments)}},xe.ary=Bf,xe.assign=Ra,xe.assignIn=Ea,xe.assignInWith=Sa,xe.assignWith=La,xe.at=Wa,xe.before=$f,xe.bind=Df,xe.bindAll=cc,xe.bindKey=Mf,xe.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return na(n)?n:[n]},xe.chain=mf,xe.chunk=function(n,r,e){r=(e?Ao(n,r,e):r===t)?1:Yr(Aa(r),0);var u=null==n?0:n.length;if(!u||r<1)return[];for(var i=0,o=0,f=Dn(Zr(u/r));i>>0)?(n=Ia(n))&&('string'==typeof r||null!=r&&!_a(r))&&!(r=Qu(r))&&gr(n)?li(Or(n),0,e):n.split(r,e):[]},xe.spread=function(n,t){if('function'!=typeof n)throw new ot(o);return t=null==t?0:Yr(Aa(t),0),Du(function(r){var e=r[t],u=li(r,0,t);return e&&Mt(u,e),St(n,this,u)})},xe.tail=function(n){var t=null==n?0:n.length;return t?Ku(n,1,t):[]},xe.take=function(n,r,e){return n&&n.length?Ku(n,0,(r=e||r===t?1:Aa(r))<0?0:r):[]},xe.takeRight=function(n,r,e){var u=null==n?0:n.length;return u?Ku(n,(r=u-(r=e||r===t?1:Aa(r)))<0?0:r,u):[]},xe.takeRightWhile=function(n,t){return n&&n.length?ri(n,oo(t,3),!1,!0):[]},xe.takeWhile=function(n,t){return n&&n.length?ri(n,oo(t,3)):[]},xe.tap=function(n,t){return t(n),n},xe.throttle=function(n,t,r){var e=!0,u=!0;if('function'!=typeof n)throw new ot(o);return la(r)&&(e='leading'in r?!!r.leading:e,u='trailing'in r?!!r.trailing:u),Ff(n,t,{leading:e,maxWait:t,trailing:u})},xe.thru=jf,xe.toArray=ma,xe.toPairs=Ga,xe.toPairsIn=Ha,xe.toPath=function(n){return na(n)?Dt(n,qo):ya(n)?[n]:bi(Zo(Ia(n)))},xe.toPlainObject=Oa,xe.transform=function(n,t,r){var e=na(n),u=e||ua(n)||xa(n);if(t=oo(t,4),null==r){var i=n&&n.constructor;r=u?e?new i:[]:la(n)&&fa(i)?be(Wr(n)):{}}return(u?Wt:ru)(n,function(n,e,u){return t(r,n,e,u)}),r},xe.unary=function(n){return Bf(n,1)},xe.union=sf,xe.unionBy=hf,xe.unionWith=pf,xe.uniq=function(n){return n&&n.length?Xu(n):[]},xe.uniqBy=function(n,t){return n&&n.length?Xu(n,oo(t,2)):[]},xe.uniqWith=function(n,r){return r='function'==typeof r?r:t,n&&n.length?Xu(n,t,r):[]},xe.unset=function(n,t){return null==n||ni(n,t)},xe.unzip=vf,xe.unzipWith=_f,xe.update=function(n,t,r){return null==n?n:ti(n,t,fi(r))},xe.updateWith=function(n,r,e,u){return u='function'==typeof u?u:t,null==n?n:ti(n,r,fi(e),u)},xe.values=Ja,xe.valuesIn=function(n){return null==n?[]:fr(n,Na(n))},xe.without=gf,xe.words=fc,xe.wrap=function(n,t){return Vf(fi(t),n)},xe.xor=df,xe.xorBy=yf,xe.xorWith=xf,xe.zip=bf,xe.zipObject=function(n,t){return ii(n||[],t||[],Ce)},xe.zipObjectDeep=function(n,t){return ii(n||[],t||[],Nu)},xe.zipWith=wf,xe.entries=Ga,xe.entriesIn=Ha,xe.extend=Ea,xe.extendWith=Sa,dc(xe,xe),xe.add=Oc,xe.attempt=ac,xe.camelCase=Ya,xe.capitalize=Qa,xe.ceil=Ic,xe.clamp=function(n,r,e){return e===t&&(e=r,r=t),e!==t&&(e=(e=za(e))==e?e:0),r!==t&&(r=(r=za(r))==r?r:0),Fe(za(n),r,e)},xe.clone=function(n){return Ne(n,h)},xe.cloneDeep=function(n){return Ne(n,5)},xe.cloneDeepWith=function(n,r){return Ne(n,5,r='function'==typeof r?r:t)},xe.cloneWith=function(n,r){return Ne(n,h,r='function'==typeof r?r:t)},xe.conformsTo=function(n,t){return null==t||Ze(n,t,Fa(t))},xe.deburr=Xa,xe.defaultTo=function(n,t){return null==n||n!=n?t:n},xe.divide=Rc,xe.endsWith=function(n,r,e){n=Ia(n),r=Qu(r);var u=n.length,i=e=e===t?u:Fe(Aa(e),0,u);return(e-=r.length)>=0&&n.slice(e,i)==r},xe.eq=Jf,xe.escape=function(n){return(n=Ia(n))&&An.test(n)?n.replace(mn,pr):n},xe.escapeRegExp=function(n){return(n=Ia(n))&&Ln.test(n)?n.replace(Sn,'\\$&'):n},xe.every=function(n,r,e){var u=na(n)?Tt:He;return e&&Ao(n,r,e)&&(r=t),u(n,oo(r,3))},xe.find=zf,xe.findIndex=Qo,xe.findKey=function(n,t){return Vt(n,oo(t,3),ru)},xe.findLast=Of,xe.findLastIndex=Xo,xe.findLastKey=function(n,t){return Vt(n,oo(t,3),eu)},xe.floor=Ec,xe.forEach=If,xe.forEachRight=Rf,xe.forIn=function(n,t){return null==n?n:nu(n,oo(t,3),Na)},xe.forInRight=function(n,t){return null==n?n:tu(n,oo(t,3),Na)},xe.forOwn=function(n,t){return n&&ru(n,oo(t,3))},xe.forOwnRight=function(n,t){return n&&eu(n,oo(t,3))},xe.get=Ua,xe.gt=Yf,xe.gte=Qf,xe.has=function(n,t){return null!=n&&go(n,t,cu)},xe.hasIn=Ba,xe.head=tf,xe.identity=pc,xe.includes=function(n,t,r,e){n=ra(n)?n:Ja(n),r=r&&!e?Aa(r):0;var u=n.length;return r<0&&(r=Yr(u+r,0)),da(n)?r<=u&&n.indexOf(t,r)>-1:!!u&&Ht(n,t,r)>-1},xe.indexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=null==r?0:Aa(r);return u<0&&(u=Yr(e+u,0)),Ht(n,t,u)},xe.inRange=function(n,r,e){return r=ja(r),e===t?(e=r,r=0):e=ja(e),su(n=za(n),r,e)},xe.invoke=Ma,xe.isArguments=Xf,xe.isArray=na,xe.isArrayBuffer=ta,xe.isArrayLike=ra,xe.isArrayLikeObject=ea,xe.isBoolean=function(n){return!0===n||!1===n||sa(n)&&fu(n)==N},xe.isBuffer=ua,xe.isDate=ia,xe.isElement=function(n){return sa(n)&&1===n.nodeType&&!va(n)},xe.isEmpty=function(n){if(null==n)return!0;if(ra(n)&&(na(n)||'string'==typeof n||'function'==typeof n.splice||ua(n)||xa(n)||Xf(n)))return!n.length;var t=po(n);if(t==G||t==nn)return!n.size;if(Io(n))return!wu(n).length;for(var r in n)if(yt.call(n,r))return!1;return!0},xe.isEqual=function(n,t){return gu(n,t)},xe.isEqualWith=function(n,r,e){var u=(e='function'==typeof e?e:t)?e(n,r):t;return u===t?gu(n,r,t,e):!!u},xe.isError=oa,xe.isFinite=function(n){return'number'==typeof n&&Gr(n)},xe.isFunction=fa,xe.isInteger=aa,xe.isLength=ca,xe.isMap=ha,xe.isMatch=function(n,t){return n===t||yu(n,t,ao(t))},xe.isMatchWith=function(n,r,e){return e='function'==typeof e?e:t,yu(n,r,ao(r),e)},xe.isNaN=function(n){return pa(n)&&n!=+n},xe.isNative=function(n){if(Oo(n))throw new Qn(e);return xu(n)},xe.isNil=function(n){return null==n},xe.isNull=function(n){return null===n},xe.isNumber=pa,xe.isObject=la,xe.isObjectLike=sa,xe.isPlainObject=va,xe.isRegExp=_a,xe.isSafeInteger=function(n){return aa(n)&&n>=-9007199254740991&&n<=L},xe.isSet=ga,xe.isString=da,xe.isSymbol=ya,xe.isTypedArray=xa,xe.isUndefined=function(n){return n===t},xe.isWeakMap=function(n){return sa(n)&&po(n)==un},xe.isWeakSet=function(n){return sa(n)&&fu(n)==on},xe.join=function(n,t){return null==n?'':Hr.call(n,t)},xe.kebabCase=nc,xe.last=of,xe.lastIndexOf=function(n,r,e){var u=null==n?0:n.length;if(!u)return-1;var i=u;return e!==t&&(i=(i=Aa(e))<0?Yr(u+i,0):Qr(i,u-1)),r==r?kr(n,r,i):Gt(n,Yt,i,!0)},xe.lowerCase=tc,xe.lowerFirst=rc,xe.lt=ba,xe.lte=wa,xe.max=function(n){return n&&n.length?Je(n,pc,au):t},xe.maxBy=function(n,r){return n&&n.length?Je(n,oo(r,2),au):t},xe.mean=function(n){return Qt(n,pc)},xe.meanBy=function(n,t){return Qt(n,oo(t,2))},xe.min=function(n){return n&&n.length?Je(n,pc,ju):t},xe.minBy=function(n,r){return n&&n.length?Je(n,oo(r,2),ju):t},xe.stubArray=kc,xe.stubFalse=zc,xe.stubObject=function(){return{}},xe.stubString=function(){return''},xe.stubTrue=function(){return!0},xe.multiply=Lc,xe.nth=function(n,r){return n&&n.length?Ru(n,Aa(r)):t},xe.noConflict=function(){return xt._===this&&(xt._=Zt),this},xe.noop=yc,xe.now=Uf,xe.pad=function(n,t,r){n=Ia(n);var e=(t=Aa(t))?zr(n):0;if(!t||e>=t)return n;var u=(t-e)/2;return Di(qr(u),r)+n+Di(Zr(u),r)},xe.padEnd=function(n,t,r){n=Ia(n);var e=(t=Aa(t))?zr(n):0;return t&&er){var u=n;n=r,r=u}if(e||n%1||r%1){var i=te();return Qr(n+i*(r-n+_t('1e-'+((i+'').length-1))),r)}return Uu(n,r)},xe.reduce=function(n,t,r){var e=na(n)?Ft:tr,u=arguments.length<3;return e(n,oo(t,4),r,u,Ve)},xe.reduceRight=function(n,t,r){var e=na(n)?Nt:tr,u=arguments.length<3;return e(n,oo(t,4),r,u,Ge)},xe.repeat=function(n,r,e){return r=(e?Ao(n,r,e):r===t)?1:Aa(r),$u(Ia(n),r)},xe.replace=function(){var n=arguments,t=Ia(n[0]);return n.length<3?t:t.replace(n[1],n[2])},xe.result=function(n,r,e){var u=-1,i=(r=ai(r,n)).length;for(i||(i=1,n=t);++uL)return[];var r=T,e=Qr(n,T);t=oo(t),n-=T;for(var u=ur(e,t);++r=o)return n;var a=e-zr(u);if(a<1)return u;var c=f?li(f,0,a).join(''):n.slice(0,a);if(i===t)return c+u;if(f&&(a+=c.length-a),_a(i)){if(n.slice(a).search(i)){var l,s=c;for(i.global||(i=rt(i.source,Ia(Nn.exec(i))+'g')),i.lastIndex=0;l=i.exec(s);)var h=l.index;c=c.slice(0,h===t?a:h)}}else if(n.indexOf(Qu(i),a)!=a){var p=c.lastIndexOf(i);p>-1&&(c=c.slice(0,p))}return c+u},xe.unescape=function(n){return(n=Ia(n))&&jn.test(n)?n.replace(wn,Ir):n},xe.uniqueId=function(n){var t=++bt;return Ia(n)+t},xe.upperCase=ic,xe.upperFirst=oc,xe.each=If,xe.eachRight=Rf,xe.first=tf,dc(xe,(Sc={},ru(xe,function(n,t){yt.call(xe.prototype,t)||(Sc[t]=n)}),Sc),{chain:!1}),xe.VERSION="4.17.20",Wt(['bind','bindKey','curry','curryRight','partial','partialRight'],function(n){xe[n].placeholder=xe}),Wt(['drop','take'],function(n,r){je.prototype[n]=function(e){e=e===t?1:Yr(Aa(e),0);var u=this.__filtered__&&!r?new je(this):this.clone();return u.__filtered__?u.__takeCount__=Qr(e,u.__takeCount__):u.__views__.push({size:Qr(e,T),type:n+(u.__dir__<0?'Right':'')}),u},je.prototype[n+'Right']=function(t){return this.reverse()[n](t).reverse()}}),Wt(['filter','map','takeWhile'],function(n,t){var r=t+1,e=r==R||3==r;je.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:oo(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),Wt(['head','last'],function(n,t){var r='take'+(t?'Right':'');je.prototype[n]=function(){return this[r](1).value()[0]}}),Wt(['initial','tail'],function(n,t){var r='drop'+(t?'':'Right');je.prototype[n]=function(){return this.__filtered__?new je(this):this[r](1)}}),je.prototype.compact=function(){return this.filter(pc)},je.prototype.find=function(n){return this.filter(n).head()},je.prototype.findLast=function(n){return this.reverse().find(n)},je.prototype.invokeMap=Du(function(n,t){return'function'==typeof n?new je(this):this.map(function(r){return vu(r,n,t)})}),je.prototype.reject=function(n){return this.filter(qf(oo(n)))},je.prototype.slice=function(n,r){n=Aa(n);var e=this;return e.__filtered__&&(n>0||r<0)?new je(e):(n<0?e=e.takeRight(-n):n&&(e=e.drop(n)),r!==t&&(e=(r=Aa(r))<0?e.dropRight(-r):e.take(r-n)),e)},je.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},je.prototype.toArray=function(){return this.take(T)},ru(je.prototype,function(n,r){var e=/^(?:filter|find|map|reject)|While$/.test(r),u=/^(?:head|last)$/.test(r),i=xe[u?'take'+('last'==r?'Right':''):r],o=u||/^find/.test(r);i&&(xe.prototype[r]=function(){var r=this.__wrapped__,f=u?[1]:arguments,a=r instanceof je,c=f[0],l=a||na(r),s=function(n){var t=i.apply(xe,Mt([n],f));return u&&h?t[0]:t};l&&e&&'function'==typeof c&&1!=c.length&&(a=l=!1);var h=this.__chain__,p=!!this.__actions__.length,v=o&&!h,_=a&&!p;if(!o&&l){r=_?r:new je(this);var g=n.apply(r,f);return g.__actions__.push({func:jf,args:[s],thisArg:t}),new me(g,h)}return v&&_?n.apply(this,f):(g=this.thru(s),v?u?g.value()[0]:g.value():g)})}),Wt(['pop','push','shift','sort','splice','unshift'],function(n){var t=ft[n],r=/^(?:push|sort|unshift)$/.test(n)?'tap':'thru',e=/^(?:pop|shift)$/.test(n);xe.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(na(u)?u:[],n)}return this[r](function(r){return t.apply(na(r)?r:[],n)})}}),ru(je.prototype,function(n,t){var r=xe[t];if(r){var e=r.name+'';yt.call(le,e)||(le[e]=[]),le[e].push({name:t,func:r})}}),le[Ti(t,g).name]=[{name:'wrapper',func:t}],je.prototype.clone=function(){var n=new je(this.__wrapped__);return n.__actions__=bi(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=bi(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=bi(this.__views__),n},je.prototype.reverse=function(){if(this.__filtered__){var n=new je(this);n.__dir__=-1,n.__filtered__=!0}else(n=this.clone()).__dir__*=-1;return n},je.prototype.value=function(){var n=this.__wrapped__.value(),t=this.__dir__,r=na(n),e=t<0,u=r?n.length:0,i=vo(0,u,this.__views__),o=i.start,f=i.end,a=f-o,c=e?f:o-1,l=this.__iteratees__,s=l.length,h=0,p=Qr(a,this.__takeCount__);if(!r||!e&&u==a&&p==a)return ei(n,this.__actions__);var v=[];n:for(;a--&&h=this.__values__.length;return{done:n,value:n?t:this.__values__[this.__index__++]}},xe.prototype.plant=function(n){for(var r,e=this;e instanceof we;){var u=Go(e);u.__index__=0,u.__values__=t,r?i.__wrapped__=u:r=u;var i=u;e=e.__wrapped__}return i.__wrapped__=n,r},xe.prototype.reverse=function(){var n=this.__wrapped__;if(n instanceof je){var r=n;return this.__actions__.length&&(r=new je(this)),(r=r.reverse()).__actions__.push({func:jf,args:[lf],thisArg:t}),new me(r,this.__chain__)}return this.thru(lf)},xe.prototype.toJSON=xe.prototype.valueOf=xe.prototype.value=function(){return ei(this.__wrapped__,this.__actions__)},xe.prototype.first=xe.prototype.head,$r&&(xe.prototype[$r]=function(){return this}),xe})();'function'==typeof define&&'object'==typeof define.amd&&define.amd?(xt._=Lr,define(function(){return Lr})):wt?((wt.exports=Lr)._=Lr,bt._=Lr):xt._=Lr}).call(this)},556,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),o=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=o(r(d[2])),s=o(r(d[3])),u=o(r(d[4])),l=o(r(d[5])),f=o(r(d[6])),p=o(r(d[7])),c=t(r(d[8])),h=r(d[9]),v=o(r(d[10])),y=(o(r(d[11])),o(r(d[12]))),P=(function(t){function o(){return(0,s.default)(this,o),(0,l.default)(this,(0,f.default)(o).apply(this,arguments))}return(0,p.default)(o,t),(0,u.default)(o,[{key:"prepareRootProps",value:function(){var t={style:{flex:1,flexDirection:this.ifRow()?'column':'row'}};return(0,v.default)(this.props,t)}},{key:"ifRow",value:function(){var t=!1;return c.default.Children.forEach(this.props.children,function(o){o&&o.type==y.default&&(t=!0)}),t}},{key:"setNativeProps",value:function(t){this._root.setNativeProps(t)}},{key:"render",value:function(){var t=this;return this.props.onPress?c.default.createElement(h.TouchableOpacity,{onPress:this.props.onPress},c.default.createElement(h.View,(0,n.default)({ref:function(o){return t._root=o}},this.props,this.prepareRootProps()),this.props.children)):c.default.createElement(h.View,(0,n.default)({ref:function(o){return t._root=o}},this.props,this.prepareRootProps()),this.props.children)}}]),o})(c.Component);e.default=P},557,[346,1,8,19,20,27,30,33,47,2,555,558,554]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),o=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var s=o(r(d[2])),p=o(r(d[3])),n=o(r(d[4])),u=o(r(d[5])),l=o(r(d[6])),f=o(r(d[7])),h=t(r(d[8])),c=r(d[9]),v=o(r(d[10])),P=(function(t){function o(){return(0,p.default)(this,o),(0,u.default)(this,(0,l.default)(o).apply(this,arguments))}return(0,f.default)(o,t),(0,n.default)(o,[{key:"prepareRootProps",value:function(){var t=c.StyleSheet.flatten(this.props.style),o={style:{flexDirection:'column',flex:this.props.size?this.props.size:t&&t.width?0:1}};return(0,v.default)(this.props,o)}},{key:"setNativeProps",value:function(t){this._root.setNativeProps(t)}},{key:"render",value:function(){var t=this;return this.props.onPress?h.default.createElement(c.TouchableOpacity,(0,s.default)({onPress:this.props.onPress},this.prepareRootProps()),h.default.createElement(c.View,(0,s.default)({ref:function(o){return t._root=o}},this.props,this.prepareRootProps()),this.props.children)):h.default.createElement(c.View,(0,s.default)({ref:function(o){return t._root=o}},this.props,this.prepareRootProps()),this.props.children)}}]),o})(h.Component);e.default=P},558,[346,1,8,19,20,27,30,33,47,2,555]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){var t=(0,f.default)();u.Theme.setDefaultThemeStyle(t)};var t,u=r(d[0]),l=r(d[1]),f=(t=l)&&t.__esModule?t:{default:t}},559,[538,560]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t=Object.assign||function(t){for(var u=1;u0&&void 0!==arguments[0]?arguments[0]:Y.default,$={variables:Z,'NativeBase.Left':t({},(0,l.default)(Z)),'NativeBase.Right':t({},(0,s.default)(Z)),'NativeBase.Body':t({},(0,f.default)(Z)),'NativeBase.Header':t({},(0,B.default)(Z)),'NativeBase.Button':t({},(0,c.default)(Z)),'NativeBase.Title':t({},(0,b.default)(Z)),'NativeBase.Subtitle':t({},(0,T.default)(Z)),'NativeBase.InputGroup':t({},(0,p.default)(Z)),'NativeBase.Input':t({},(0,z.default)(Z)),'NativeBase.Badge':t({},(0,h.default)(Z)),'NativeBase.CheckBox':t({},(0,I.default)(Z)),'NativeBase.Radio':t({},(0,C.default)(Z)),'NativeBase.Card':t({},(0,x.default)(Z)),'NativeBase.CardItem':t({},(0,K.default)(Z)),'NativeBase.Toast':t({},(0,R.default)(Z)),'NativeBase.H1':t({},(0,_.default)(Z)),'NativeBase.H2':t({},(0,S.default)(Z)),'NativeBase.H3':t({},(0,O.default)(Z)),'NativeBase.Form':t({},(0,U.default)(Z)),'NativeBase.Container':t({},(0,n.default)(Z)),'NativeBase.Content':t({},(0,o.default)(Z)),'NativeBase.Footer':t({},(0,w.default)(Z)),'NativeBase.Tabs':{flex:1},'NativeBase.FooterTab':t({},(0,y.default)(Z)),'NativeBase.ListItem':t({},(0,Q.default)(Z)),'NativeBase.ListItem1':t({},(0,Q.default)(Z)),'NativeBase.Icon':t({},(0,q.default)(Z)),'NativeBase.IconNB':t({},(0,q.default)(Z)),'NativeBase.Text':t({},(0,P.default)(Z)),'NativeBase.Spinner':t({},(0,J.default)(Z)),'NativeBase.Fab':t({},(0,H.default)(Z)),'NativeBase.Item':t({},(0,j.default)(Z)),'NativeBase.Label':t({},(0,F.default)(Z)),'NativeBase.Textarea':t({},(0,L.default)(Z)),'NativeBase.PickerNB':t({},(0,X.default)(Z),{'NativeBase.Button':{'NativeBase.Text':{}}}),'NativeBase.Tab':t({},(0,k.default)(Z)),'NativeBase.Segment':t({},(0,D.default)(Z)),'NativeBase.TabBar':t({},(0,M.default)(Z)),'NativeBase.ViewNB':t({},(0,E.default)(Z)),'NativeBase.TabHeading':t({},(0,G.default)(Z)),'NativeBase.TabContainer':t({},(0,V.default)(Z)),'NativeBase.Switch':t({},(0,v.default)(Z)),'NativeBase.Separator':t({},(0,W.default)(Z)),'NativeBase.SwipeRow':t({},(0,A.default)(Z)),'NativeBase.Thumbnail':t({},(0,N.default)(Z))};return(function t(f,l,s){u.default.forEach(l,function(u,B){0===B.indexOf('.')&&s&&0===s.indexOf('.')&&f&&(f[B]?f[B][s]=u:f[B]={}),u&&'object'==typeof u&&'fontVariant'!==B&&'transform'!==B&&t(l,u,B)})})(null,$,null),$}},560,[552,561,562,563,564,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,612,613,611,565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){return{flex:1,alignItems:'center',alignSelf:'center'}}},561,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){return{flex:1,alignSelf:'center',alignItems:'flex-start'}}},562,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){return{'NativeBase.Button':{alignSelf:null},flex:1,alignSelf:'center',alignItems:'flex-end'}}},563,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t,o=r(d[0]),n=r(d[1]),l=(t=n)&&t.__esModule?t:{default:t},s=r(d[2]);e.default=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l.default,n=t.platformStyle,f=t.platform;return{'.span':{height:128,'NativeBase.Left':{alignSelf:'flex-start'},'NativeBase.Body':{alignSelf:'flex-end',alignItems:'flex-start',justifyContent:'center',paddingBottom:26},'NativeBase.Right':{alignSelf:'flex-start'}},'.hasSubtitle':{'NativeBase.Body':{'NativeBase.Title':{fontSize:t.titleFontSize-2,fontFamily:t.titleFontfamily,textAlign:'center',fontWeight:'500',paddingBottom:3},'NativeBase.Subtitle':{fontSize:t.subTitleFontSize,fontFamily:t.titleFontfamily,color:t.subtitleColor,textAlign:'center'}}},'.transparent':{backgroundColor:'transparent',borderBottomColor:'transparent',elevation:0,shadowColor:null,shadowOffset:null,shadowRadius:null,shadowOpacity:null,paddingTop:f===s.PLATFORM.ANDROID?o.StatusBar.currentHeight:void 0,height:f===s.PLATFORM.ANDROID?t.toolbarHeight+o.StatusBar.currentHeight:t.toolbarHeight},'.noShadow':{elevation:0,shadowColor:null,shadowOffset:null,shadowRadius:null,shadowOpacity:null},'.hasTabs':{elevation:0,shadowColor:null,shadowOffset:null,shadowRadius:null,shadowOpacity:null,borderBottomWidth:null},'.hasSegment':{elevation:0,shadowColor:null,shadowOffset:null,shadowRadius:null,shadowOpacity:null,borderBottomWidth:null,'NativeBase.Left':{flex:.3},'NativeBase.Right':{flex:.3},'NativeBase.Body':{flex:1,'NativeBase.Segment':{marginRight:0,alignSelf:'center','NativeBase.Button':{paddingLeft:0,paddingRight:0}}}},'.noLeft':{'NativeBase.Left':{width:f===s.PLATFORM.IOS?void 0:0,flex:f===s.PLATFORM.IOS?1:0},'NativeBase.Body':{'NativeBase.Title':{paddingLeft:f===s.PLATFORM.IOS?void 0:10},'NativeBase.Subtitle':{paddingLeft:f===s.PLATFORM.IOS?void 0:10}}},'NativeBase.Button':{justifyContent:'center',alignSelf:'center',alignItems:'center','.transparent':{'NativeBase.Text':{color:t.toolbarBtnTextColor,fontWeight:'600'},'NativeBase.Icon':{color:t.toolbarBtnColor},'NativeBase.IconNB':{color:t.toolbarBtnColor},paddingHorizontal:t.buttonPadding},paddingHorizontal:15},'.searchBar':{'NativeBase.Item':{'NativeBase.Icon':{backgroundColor:'transparent',color:t.dropdownLinkColor,fontSize:t.toolbarSearchIconSize,alignItems:'center',marginTop:2,paddingRight:10,paddingLeft:10},'NativeBase.IconNB':{backgroundColor:'transparent',color:null,alignSelf:'center'},'NativeBase.Input':{alignSelf:'center',lineHeight:null,height:t.searchBarInputHeight},alignSelf:'center',alignItems:'center',justifyContent:'flex-start',flex:1,height:t.searchBarHeight,borderColor:'transparent',backgroundColor:t.toolbarInputColor},'NativeBase.Button':{'.transparent':{'NativeBase.Text':{fontWeight:'500'},paddingHorizontal:null,paddingLeft:f===s.PLATFORM.IOS?10:null},paddingHorizontal:f===s.PLATFORM.IOS?void 0:null,width:f===s.PLATFORM.IOS?void 0:0,height:f===s.PLATFORM.IOS?void 0:0}},'.rounded':{'NativeBase.Item':{borderRadius:f===s.PLATFORM.IOS&&n!==s.PLATFORM.MATERIAL?25:3}},'NativeBase.Left':{'NativeBase.Button':{'.hasText':{marginLeft:-10,height:30,'NativeBase.Icon':{color:t.toolbarBtnColor,fontSize:t.iconHeaderSize,marginTop:2,marginRight:5,marginLeft:2},'NativeBase.Text':{color:t.toolbarBtnTextColor,fontSize:f===s.PLATFORM.IOS?17:0,marginLeft:7,lineHeight:19.5},'NativeBase.IconNB':{color:t.toolbarBtnColor,fontSize:t.iconHeaderSize,marginTop:2,marginRight:5,marginLeft:2}},'.transparent':{marginLeft:f===s.PLATFORM.IOS&&n!==s.PLATFORM.MATERIAL?-3:0,'NativeBase.Icon':{color:t.toolbarBtnColor,fontSize:f===s.PLATFORM.IOS&&t.platformStyle!==s.PLATFORM.MATERIAL?t.iconHeaderSize+1:t.iconHeaderSize,marginTop:0,marginRight:2,marginLeft:1,paddingTop:1},'NativeBase.IconNB':{color:t.toolbarBtnColor,fontSize:f===s.PLATFORM.IOS&&t.platformStyle!==s.PLATFORM.MATERIAL?t.iconHeaderSize+1:t.iconHeaderSize-2,marginTop:0,marginRight:2,marginLeft:1,paddingTop:1},'NativeBase.Text':{color:t.toolbarBtnTextColor,fontSize:f===s.PLATFORM.IOS?17:14,top:f===s.PLATFORM.IOS?1:-1.5,paddingLeft:f===s.PLATFORM.IOS&&n!==s.PLATFORM.MATERIAL?2:5,paddingRight:f===s.PLATFORM.IOS&&n!==s.PLATFORM.MATERIAL?void 0:10},backgroundColor:'transparent',borderColor:null,elevation:0,shadowColor:null,shadowOffset:null,shadowRadius:null,shadowOpacity:null},'NativeBase.Icon':{color:t.toolbarBtnColor},'NativeBase.IconNB':{color:t.toolbarBtnColor},alignSelf:null,paddingRight:t.buttonPadding,paddingLeft:f===s.PLATFORM.IOS&&n!==s.PLATFORM.MATERIAL?4:8},flex:f===s.PLATFORM.IOS&&n!==s.PLATFORM.MATERIAL?1:.4,alignSelf:'center',alignItems:'flex-start'},'NativeBase.Body':{flex:1,alignItems:f===s.PLATFORM.IOS&&n!==s.PLATFORM.MATERIAL?'center':'flex-start',alignSelf:'center','NativeBase.Segment':{borderWidth:0,alignSelf:'flex-end',marginRight:f===s.PLATFORM.IOS?-40:-55},'NativeBase.Button':{alignSelf:'center','.transparent':{backgroundColor:'transparent'},'NativeBase.Icon':{color:t.toolbarBtnColor},'NativeBase.IconNB':{color:t.toolbarBtnColor},'NativeBase.Text':{color:t.inverseTextColor,backgroundColor:'transparent'}}},'NativeBase.Right':{'NativeBase.Button':{'.hasText':{height:30,'NativeBase.Icon':{color:t.toolbarBtnColor,fontSize:t.iconHeaderSize-2,marginTop:2,marginRight:2,marginLeft:5},'NativeBase.Text':{color:t.toolbarBtnTextColor,fontSize:f===s.PLATFORM.IOS?17:14,lineHeight:19.5},'NativeBase.IconNB':{color:t.toolbarBtnColor,fontSize:t.iconHeaderSize-2,marginTop:2,marginRight:2,marginLeft:5}},'.transparent':{marginRight:f===s.PLATFORM.IOS?-9:-5,paddingLeft:15,paddingRight:12,paddingHorizontal:15,borderRadius:50,'NativeBase.Icon':{color:t.toolbarBtnColor,fontSize:t.iconHeaderSize-2,marginTop:0,marginLeft:2,marginRight:0},'NativeBase.IconNB':{color:t.toolbarBtnColor,fontSize:t.iconHeaderSize-2,marginTop:0,marginLeft:2,marginRight:0},'NativeBase.Text':{color:t.toolbarBtnTextColor,fontSize:f===s.PLATFORM.IOS?17:14,top:f===s.PLATFORM.IOS?1:-1.5,paddingRight:f===s.PLATFORM.IOS&&t.platformStyle!==s.PLATFORM.MATERIAL?0:void 0},backgroundColor:'transparent',borderColor:null,elevation:0,shadowColor:null,shadowOffset:null,shadowRadius:null,shadowOpacity:null},'NativeBase.Icon':{color:t.toolbarBtnColor},'NativeBase.IconNB':{color:t.toolbarBtnColor},alignSelf:null,paddingHorizontal:t.buttonPadding},flex:1,alignSelf:'center',alignItems:'flex-end',flexDirection:'row',justifyContent:'flex-end'},backgroundColor:t.toolbarDefaultBg,flexDirection:'row',paddingLeft:f===s.PLATFORM.IOS&&t.platformStyle!==s.PLATFORM.MATERIAL?6:10,paddingRight:10,justifyContent:'center',borderBottomWidth:f===s.PLATFORM.IOS?1/o.PixelRatio.getPixelSizeForLayoutSize(1):0,borderBottomColor:t.toolbarDefaultBorder,height:t.platform===s.PLATFORM.IOS&&t.platformStyle===s.PLATFORM.MATERIAL?t.toolbarHeight+10:t.toolbarHeight,elevation:3,shadowColor:n===s.PLATFORM.MATERIAL?'#000':void 0,shadowOffset:n===s.PLATFORM.MATERIAL?{width:0,height:2}:void 0,shadowOpacity:n===s.PLATFORM.MATERIAL?.2:void 0,shadowRadius:n===s.PLATFORM.MATERIAL?1.2:void 0,top:0,left:0,right:0}}},564,[2,565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t,o=r(d[0]),n=(t=o)&&t.__esModule?t:{default:t},f=r(d[1]),l=r(d[2]);var b=f.Dimensions.get('window').height,s=f.Dimensions.get('window').width,S=f.Platform.OS,u=S===l.PLATFORM.IOS&&(812===b||812===s||896===b||896===s);e.default={platformStyle:void 0,platform:S,accordionBorderColor:'#d3d3d3',accordionContentPadding:10,accordionIconFontSize:18,contentStyle:'#f5f4f5',expandedIconStyle:'#000',headerStyle:'#edebed',iconStyle:'#000',elevation:4,containerTouchableBackgroundColor:'rgba(0,0,0,0.4)',innerTouchableBackgroundColor:'#fff',listItemHeight:50,listItemBorderColor:'transparent',marginHorizontal:-15,marginLeft:14,marginTop:15,minHeight:56,padding:15,touchableTextColor:'#757575',androidRipple:!0,androidRippleColor:'rgba(256, 256, 256, 0.3)',androidRippleColorDark:'rgba(0, 0, 0, 0.15)',buttonUppercaseAndroidText:!0,badgeBg:'#ED1727',badgeColor:'#fff',badgePadding:S===l.PLATFORM.IOS?3:0,buttonFontFamily:S===l.PLATFORM.IOS?'System':'Roboto_medium',buttonDisabledBg:'#b5b5b5',buttonPadding:6,buttonDefaultActiveOpacity:.5,buttonDefaultFlex:1,buttonDefaultBorderRadius:2,buttonDefaultBorderWidth:1,get buttonPrimaryBg(){return this.brandPrimary},get buttonPrimaryColor(){return this.inverseTextColor},get buttonInfoBg(){return this.brandInfo},get buttonInfoColor(){return this.inverseTextColor},get buttonSuccessBg(){return this.brandSuccess},get buttonSuccessColor(){return this.inverseTextColor},get buttonDangerBg(){return this.brandDanger},get buttonDangerColor(){return this.inverseTextColor},get buttonWarningBg(){return this.brandWarning},get buttonWarningColor(){return this.inverseTextColor},get buttonTextSize(){return S===l.PLATFORM.IOS?1.1*this.fontSizeBase:this.fontSizeBase-1},get buttonTextSizeLarge(){return 1.5*this.fontSizeBase},get buttonTextSizeSmall(){return.8*this.fontSizeBase},get borderRadiusLarge(){return 3.8*this.fontSizeBase},get iconSizeLarge(){return 1.5*this.iconFontSize},get iconSizeSmall(){return.6*this.iconFontSize},cardDefaultBg:'#fff',cardBorderColor:'#ccc',cardBorderRadius:2,cardItemPadding:S===l.PLATFORM.IOS?10:12,CheckboxRadius:S===l.PLATFORM.IOS?13:0,CheckboxBorderWidth:S===l.PLATFORM.IOS?1:2,CheckboxPaddingLeft:S===l.PLATFORM.IOS?4:2,CheckboxPaddingBottom:S===l.PLATFORM.IOS?0:5,CheckboxIconSize:S===l.PLATFORM.IOS?21:16,CheckboxIconMarginTop:S===l.PLATFORM.IOS?void 0:1,CheckboxFontSize:S===l.PLATFORM.IOS?25.555555555555554:17,checkboxBgColor:'#039BE5',checkboxSize:20,checkboxTickColor:'#fff',checkboxDefaultColor:'transparent',checkboxTextShadowRadius:0,brandPrimary:S===l.PLATFORM.IOS?'#007aff':'#3F51B5',brandInfo:'#62B1F6',brandSuccess:'#5cb85c',brandDanger:'#d9534f',brandWarning:'#f0ad4e',brandDark:'#000',brandLight:'#a9a9a9',containerBgColor:'#fff',datePickerFlex:1,datePickerPadding:10,datePickerTextColor:'#000',datePickerBg:'transparent',fabBackgroundColor:'blue',fabBorderRadius:28,fabBottom:0,fabButtonBorderRadius:20,fabButtonHeight:40,fabButtonLeft:7,fabButtonMarginBottom:10,fabContainerBottom:20,fabDefaultPosition:20,fabElevation:4,fabIconColor:'#fff',fabIconSize:24,fabShadowColor:'#000',fabShadowOffsetHeight:2,fabShadowOffsetWidth:0,fabShadowOpacity:.4,fabShadowRadius:2,fabWidth:56,DefaultFontSize:16,fontFamily:S===l.PLATFORM.IOS?'System':'Roboto',fontSizeBase:15,get fontSizeH1(){return 1.8*this.fontSizeBase},get fontSizeH2(){return 1.6*this.fontSizeBase},get fontSizeH3(){return 1.4*this.fontSizeBase},footerHeight:55,footerDefaultBg:S===l.PLATFORM.IOS?'#F8F8F8':'#3F51B5',footerPaddingBottom:0,tabBarTextColor:S===l.PLATFORM.IOS?'#6b6b6b':'#b3c7f9',tabBarTextSize:S===l.PLATFORM.IOS?14:11,activeTab:S===l.PLATFORM.IOS?'#007aff':'#fff',sTabBarActiveTextColor:'#007aff',tabBarActiveTextColor:S===l.PLATFORM.IOS?'#007aff':'#fff',tabActiveBgColor:S===l.PLATFORM.IOS?'#cde1f9':'#3F51B5',toolbarBtnColor:S===l.PLATFORM.IOS?'#007aff':'#fff',toolbarDefaultBg:S===l.PLATFORM.IOS?'#F8F8F8':'#3F51B5',toolbarHeight:S===l.PLATFORM.IOS?64:56,toolbarSearchIconSize:S===l.PLATFORM.IOS?20:23,toolbarInputColor:S===l.PLATFORM.IOS?'#CECDD2':'#fff',searchBarHeight:S===l.PLATFORM.IOS?30:40,searchBarInputHeight:S===l.PLATFORM.IOS?30:50,toolbarBtnTextColor:S===l.PLATFORM.IOS?'#007aff':'#fff',toolbarDefaultBorder:S===l.PLATFORM.IOS?'#a7a6ab':'#3F51B5',iosStatusbar:S===l.PLATFORM.IOS?'dark-content':'light-content',get statusBarColor(){return(0,n.default)(this.toolbarDefaultBg).darken(.2).hex()},get darkenHeader(){return(0,n.default)(this.tabBgColor).darken(.03).hex()},iconFamily:'Ionicons',iconFontSize:S===l.PLATFORM.IOS?30:28,iconHeaderSize:S===l.PLATFORM.IOS?33:24,inputFontSize:17,inputBorderColor:'#D9D5DC',inputSuccessBorderColor:'#2b8339',inputErrorBorderColor:'#ed2f2f',inputHeightBase:50,get inputColor(){return this.textColor},get inputColorPlaceholder(){return'#575757'},buttonLineHeight:19,lineHeightH1:32,lineHeightH2:27,lineHeightH3:25,lineHeight:S===l.PLATFORM.IOS?20:24,listItemSelected:S===l.PLATFORM.IOS?'#007aff':'#3F51B5',listBg:'transparent',listBorderColor:'#c9c9c9',listDividerBg:'#f4f4f4',listBtnUnderlayColor:'#DDD',listItemPadding:S===l.PLATFORM.IOS?10:12,listNoteColor:'#808080',listNoteSize:13,defaultProgressColor:'#E4202D',inverseProgressColor:'#1A191B',radioBtnSize:S===l.PLATFORM.IOS?25:23,radioSelectedColorAndroid:'#3F51B5',radioBtnLineHeight:S===l.PLATFORM.IOS?29:24,get radioColor(){return this.brandPrimary},segmentBackgroundColor:S===l.PLATFORM.IOS?'#F8F8F8':'#3F51B5',segmentActiveBackgroundColor:S===l.PLATFORM.IOS?'#007aff':'#fff',segmentTextColor:S===l.PLATFORM.IOS?'#007aff':'#fff',segmentActiveTextColor:S===l.PLATFORM.IOS?'#fff':'#3F51B5',segmentBorderColor:S===l.PLATFORM.IOS?'#007aff':'#fff',segmentBorderColorMain:S===l.PLATFORM.IOS?'#a7a6ab':'#3F51B5',defaultSpinnerColor:'#45D56E',inverseSpinnerColor:'#1A191B',tabBarDisabledTextColor:'#BDBDBD',tabDefaultBg:S===l.PLATFORM.IOS?'#F8F8F8':'#3F51B5',topTabBarTextColor:S===l.PLATFORM.IOS?'#6b6b6b':'#b3c7f9',topTabBarActiveTextColor:S===l.PLATFORM.IOS?'#007aff':'#fff',topTabBarBorderColor:S===l.PLATFORM.IOS?'#a7a6ab':'#fff',topTabBarActiveBorderColor:S===l.PLATFORM.IOS?'#007aff':'#fff',tabBgColor:'#F8F8F8',tabFontSize:15,textColor:'#000',inverseTextColor:'#fff',noteFontSize:14,get defaultTextColor(){return this.textColor},titleFontfamily:S===l.PLATFORM.IOS?'System':'Roboto_medium',titleFontSize:S===l.PLATFORM.IOS?17:19,subTitleFontSize:S===l.PLATFORM.IOS?11:14,subtitleColor:S===l.PLATFORM.IOS?'#8e8e93':'#FFF',titleFontColor:S===l.PLATFORM.IOS?'#000':'#FFF',borderRadiusBase:S===l.PLATFORM.IOS?5:2,borderWidth:1/f.PixelRatio.getPixelSizeForLayoutSize(1),contentPadding:10,dropdownLinkColor:'#414142',inputLineHeight:24,deviceWidth:s,deviceHeight:b,isIphoneX:u,inputGroupRoundedBorderRadius:30,Inset:{portrait:{topInset:24,leftInset:0,rightInset:0,bottomInset:34},landscape:{topInset:0,leftInset:44,rightInset:44,bottomInset:21}}}},565,[566,2,575]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),o=r(d[1]),n=[].slice,h=['keyword','gray','hex'],l={};Object.keys(o).forEach(function(t){l[n.call(o[t].labels).sort().join('')]=t});var s={};function c(u,f){if(!(this instanceof c))return new c(u,f);if(f&&f in h&&(f=null),f&&!(f in o))throw new Error('Unknown model: '+f);var v,p;if(null==u)this.model='rgb',this.color=[0,0,0],this.valpha=1;else if(u instanceof c)this.model=u.model,this.color=u.color.slice(),this.valpha=u.valpha;else if('string'==typeof u){var y=t.get(u);if(null===y)throw new Error('Unable to parse color from string: '+u);this.model=y.model,p=o[this.model].channels,this.color=y.value.slice(0,p),this.valpha='number'==typeof y.value[p]?y.value[p]:1}else if(u.length){this.model=f||'rgb',p=o[this.model].channels;var w=n.call(u,0,p);this.color=b(w,p),this.valpha='number'==typeof u[p]?u[p]:1}else if('number'==typeof u)u&=16777215,this.model='rgb',this.color=[u>>16&255,u>>8&255,255&u],this.valpha=1;else{this.valpha=1;var k=Object.keys(u);'alpha'in u&&(k.splice(k.indexOf('alpha'),1),this.valpha='number'==typeof u.alpha?u.alpha:0);var x=k.sort().join('');if(!(x in l))throw new Error('Unable to parse color from object: '+JSON.stringify(u));this.model=l[x];var j=o[this.model].labels,A=[];for(v=0;vn?(o+.05)/(n+.05):(n+.05)/(o+.05)},level:function(t){var o=this.contrast(t);return o>=7.1?'AAA':o>=4.5?'AA':''},isDark:function(){var t=this.rgb().color;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},isLight:function(){return!this.isDark()},negate:function(){for(var t=this.rgb(),o=0;o<3;o++)t.color[o]=255-t.color[o];return t},lighten:function(t){var o=this.hsl();return o.color[2]+=o.color[2]*t,o},darken:function(t){var o=this.hsl();return o.color[2]-=o.color[2]*t,o},saturate:function(t){var o=this.hsl();return o.color[1]+=o.color[1]*t,o},desaturate:function(t){var o=this.hsl();return o.color[1]-=o.color[1]*t,o},whiten:function(t){var o=this.hwb();return o.color[1]+=o.color[1]*t,o},blacken:function(t){var o=this.hwb();return o.color[2]+=o.color[2]*t,o},grayscale:function(){var t=this.rgb().color,o=.3*t[0]+.59*t[1]+.11*t[2];return c.rgb(o,o,o)},fade:function(t){return this.alpha(this.valpha-this.valpha*t)},opaquer:function(t){return this.alpha(this.valpha+this.valpha*t)},rotate:function(t){var o=this.hsl(),n=o.color[0];return n=(n=(n+t)%360)<0?360+n:n,o.color[0]=n,o},mix:function(t,o){if(!t||!t.rgb)throw new Error('Argument to "mix" was not a Color instance, but rather an instance of '+typeof t);var n=t.rgb(),h=this.rgb(),l=void 0===o?.5:o,s=2*l-1,u=n.alpha()-h.alpha(),f=((s*u==-1?s:(s+u)/(1+s*u))+1)/2,v=1-f;return c.rgb(f*n.red()+v*h.red(),f*n.green()+v*h.green(),f*n.blue()+v*h.blue(),n.alpha()*l+h.alpha()*(1-l))}},Object.keys(o).forEach(function(t){if(-1===h.indexOf(t)){var l=o[t].channels;c.prototype[t]=function(){if(this.model===t)return new c(this);if(arguments.length)return new c(arguments,t);var n,h='number'==typeof arguments[l]?l:this.valpha;return new c((n=o[this.model][t].raw(this.color),Array.isArray(n)?n:[n]).concat(h),t)},c[t]=function(o){return'number'==typeof o&&(o=b(n.call(arguments),l)),new c(o,t)}}}),m.exports=c},566,[567,571]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]),s={};for(var o in t)t.hasOwnProperty(o)&&(s[t[o]]=o);var u=m.exports={to:{},get:{}};function l(t,n,s){return Math.min(Math.max(n,t),s)}function h(t){var n=t.toString(16).toUpperCase();return n.length<2?'0'+n:n}u.get=function(t){var n,s;switch(t.substring(0,3).toLowerCase()){case'hsl':n=u.get.hsl(t),s='hsl';break;case'hwb':n=u.get.hwb(t),s='hwb';break;default:n=u.get.rgb(t),s='rgb'}return n?{model:s,value:n}:null},u.get.rgb=function(n){if(!n)return null;var s,o,u,h=[0,0,0,1];if(s=n.match(/^#([a-f0-9]{6})([a-f0-9]{2})?$/i)){for(u=s[2],s=s[1],o=0;o<3;o++){var f=2*o;h[o]=parseInt(s.slice(f,f+2),16)}u&&(h[3]=parseInt(u,16)/255)}else if(s=n.match(/^#([a-f0-9]{3,4})$/i)){for(u=(s=s[1])[3],o=0;o<3;o++)h[o]=parseInt(s[o]+s[o],16);u&&(h[3]=parseInt(u+u,16)/255)}else if(s=n.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/)){for(o=0;o<3;o++)h[o]=parseInt(s[o+1],0);s[4]&&(h[3]=parseFloat(s[4]))}else{if(!(s=n.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/)))return(s=n.match(/(\D+)/))?'transparent'===s[1]?[0,0,0,0]:(h=t[s[1]])?(h[3]=1,h):null:null;for(o=0;o<3;o++)h[o]=Math.round(2.55*parseFloat(s[o+1]));s[4]&&(h[3]=parseFloat(s[4]))}for(o=0;o<3;o++)h[o]=l(h[o],0,255);return h[3]=l(h[3],0,1),h},u.get.hsl=function(t){if(!t)return null;var n=t.match(/^hsla?\(\s*([+-]?(?:\d*\.)?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/);if(n){var s=parseFloat(n[4]);return[(parseFloat(n[1])+360)%360,l(parseFloat(n[2]),0,100),l(parseFloat(n[3]),0,100),l(isNaN(s)?1:s,0,1)]}return null},u.get.hwb=function(t){if(!t)return null;var n=t.match(/^hwb\(\s*([+-]?\d*[\.]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/);if(n){var s=parseFloat(n[4]);return[(parseFloat(n[1])%360+360)%360,l(parseFloat(n[2]),0,100),l(parseFloat(n[3]),0,100),l(isNaN(s)?1:s,0,1)]}return null},u.to.hex=function(){var t=n(arguments);return'#'+h(t[0])+h(t[1])+h(t[2])+(t[3]<1?h(Math.round(255*t[3])):'')},u.to.rgb=function(){var t=n(arguments);return t.length<4||1===t[3]?'rgb('+Math.round(t[0])+', '+Math.round(t[1])+', '+Math.round(t[2])+')':'rgba('+Math.round(t[0])+', '+Math.round(t[1])+', '+Math.round(t[2])+', '+t[3]+')'},u.to.rgb.percent=function(){var t=n(arguments),s=Math.round(t[0]/255*100),o=Math.round(t[1]/255*100),u=Math.round(t[2]/255*100);return t.length<4||1===t[3]?'rgb('+s+'%, '+o+'%, '+u+'%)':'rgba('+s+'%, '+o+'%, '+u+'%, '+t[3]+')'},u.to.hsl=function(){var t=n(arguments);return t.length<4||1===t[3]?'hsl('+t[0]+', '+t[1]+'%, '+t[2]+'%)':'hsla('+t[0]+', '+t[1]+'%, '+t[2]+'%, '+t[3]+')'},u.to.hwb=function(){var t=n(arguments),s='';return t.length>=4&&1!==t[3]&&(s=', '+t[3]),'hwb('+t[0]+', '+t[1]+'%, '+t[2]+'%'+s+')'},u.to.keyword=function(t){return s[t.slice(0,3)]}},567,[568,569]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},568,[]); -__d(function(g,r,i,a,m,e,d){'use strict';var t=r(d[0]),n=Array.prototype.concat,o=Array.prototype.slice,c=m.exports=function(c){for(var u=[],p=0,l=c.length;p=0&&(n.splice instanceof Function||Object.getOwnPropertyDescriptor(n,n.length-1)&&'String'!==n.constructor.name))}},570,[]); -__d(function(g,r,i,a,m,e,d){var n=r(d[0]),o=r(d[1]),t={};function c(n){var o=function(o){return void 0===o||null===o?o:(arguments.length>1&&(o=Array.prototype.slice.call(arguments)),n(o))};return'conversion'in n&&(o.conversion=n.conversion),o}function l(n){var o=function(o){if(void 0===o||null===o)return o;arguments.length>1&&(o=Array.prototype.slice.call(arguments));var t=n(o);if('object'==typeof t)for(var c=t.length,l=0;l1&&(o-=1)),[360*o,100*s,100*f]},u.rgb.hwb=function(n){var t=n[0],h=n[1],o=n[2];return[u.rgb.hsl(n)[0],100*(.00392156862745098*Math.min(t,Math.min(h,o))),100*(o=1-.00392156862745098*Math.max(t,Math.max(h,o)))]},u.rgb.cmyk=function(n){var t,h=n[0]/255,u=n[1]/255,o=n[2]/255;return[100*((1-h-(t=Math.min(1-h,1-u,1-o)))/(1-t)||0),100*((1-u-t)/(1-t)||0),100*((1-o-t)/(1-t)||0),100*t]},u.rgb.keyword=function(h){var u=t[h];if(u)return u;var o,s,c,l=1/0;for(var b in n)if(n.hasOwnProperty(b)){var f=n[b],M=(s=h,c=f,Math.pow(s[0]-c[0],2)+Math.pow(s[1]-c[1],2)+Math.pow(s[2]-c[2],2));M.04045?Math.pow((t+.055)/1.055,2.4):t/12.92)+.3576*(h=h>.04045?Math.pow((h+.055)/1.055,2.4):h/12.92)+.1805*(u=u>.04045?Math.pow((u+.055)/1.055,2.4):u/12.92)),100*(.2126*t+.7152*h+.0722*u),100*(.0193*t+.1192*h+.9505*u)]},u.rgb.lab=function(n){var t=u.rgb.xyz(n),h=t[0],o=t[1],s=t[2];return o/=100,s/=108.883,h=(h/=95.047)>.008856?Math.pow(h,.3333333333333333):7.787*h+.13793103448275862,[116*(o=o>.008856?Math.pow(o,.3333333333333333):7.787*o+.13793103448275862)-16,500*(h-o),200*(o-(s=s>.008856?Math.pow(s,.3333333333333333):7.787*s+.13793103448275862))]},u.hsl.rgb=function(n){var t,h,u,o,s,c=n[0]/360,l=n[1]/100,b=n[2]/100;if(0===l)return[s=255*b,s,s];t=2*b-(h=b<.5?b*(1+l):b+l-b*l),o=[0,0,0];for(var f=0;f<3;f++)(u=c+.3333333333333333*-(f-1))<0&&u++,u>1&&u--,s=6*u<1?t+6*(h-t)*u:2*u<1?h:3*u<2?t+(h-t)*(.6666666666666666-u)*6:t,o[f]=255*s;return o},u.hsl.hsv=function(n){var t=n[0],h=n[1]/100,u=n[2]/100,o=h,s=Math.max(u,.01);return h*=(u*=2)<=1?u:2-u,o*=s<=1?s:2-s,[t,100*(0===u?2*o/(s+o):2*h/(u+h)),100*((u+h)/2)]},u.hsv.rgb=function(n){var t=n[0]/60,h=n[1]/100,u=n[2]/100,o=Math.floor(t)%6,s=t-Math.floor(t),c=255*u*(1-h),l=255*u*(1-h*s),b=255*u*(1-h*(1-s));switch(u*=255,o){case 0:return[u,b,c];case 1:return[l,u,c];case 2:return[c,u,b];case 3:return[c,l,u];case 4:return[b,c,u];case 5:return[u,c,l]}},u.hsv.hsl=function(n){var t,h,u,o=n[0],s=n[1]/100,c=n[2]/100,l=Math.max(c,.01);return u=(2-s)*c,h=s*l,[o,100*(h=(h/=(t=(2-s)*l)<=1?t:2-t)||0),100*(u/=2)]},u.hwb.rgb=function(n){var t,h,u,o,s,c,l,b=n[0]/360,f=n[1]/100,M=n[2]/100,v=f+M;switch(v>1&&(f/=v,M/=v),h=1-M,u=6*b-(t=Math.floor(6*b)),0!=(1&t)&&(u=1-u),o=f+u*(h-f),t){default:case 6:case 0:s=h,c=o,l=f;break;case 1:s=o,c=h,l=f;break;case 2:s=f,c=h,l=o;break;case 3:s=f,c=o,l=h;break;case 4:s=o,c=f,l=h;break;case 5:s=h,c=f,l=o}return[255*s,255*c,255*l]},u.cmyk.rgb=function(n){var t=n[0]/100,h=n[1]/100,u=n[2]/100,o=n[3]/100;return[255*(1-Math.min(1,t*(1-o)+o)),255*(1-Math.min(1,h*(1-o)+o)),255*(1-Math.min(1,u*(1-o)+o))]},u.xyz.rgb=function(n){var t,h,u,o=n[0]/100,s=n[1]/100,c=n[2]/100;return h=-.9689*o+1.8758*s+.0415*c,u=.0557*o+-.204*s+1.057*c,t=(t=3.2406*o+-1.5372*s+-.4986*c)>.0031308?1.055*Math.pow(t,.4166666666666667)-.055:12.92*t,h=h>.0031308?1.055*Math.pow(h,.4166666666666667)-.055:12.92*h,u=u>.0031308?1.055*Math.pow(u,.4166666666666667)-.055:12.92*u,[255*(t=Math.min(Math.max(0,t),1)),255*(h=Math.min(Math.max(0,h),1)),255*(u=Math.min(Math.max(0,u),1))]},u.xyz.lab=function(n){var t=n[0],h=n[1],u=n[2];return h/=100,u/=108.883,t=(t/=95.047)>.008856?Math.pow(t,.3333333333333333):7.787*t+.13793103448275862,[116*(h=h>.008856?Math.pow(h,.3333333333333333):7.787*h+.13793103448275862)-16,500*(t-h),200*(h-(u=u>.008856?Math.pow(u,.3333333333333333):7.787*u+.13793103448275862))]},u.lab.xyz=function(n){var t,h,u,o=n[0],s=n[1],c=n[2];t=s/500+(h=(o+16)/116),u=h-c/200;var l=Math.pow(h,3),b=Math.pow(t,3),f=Math.pow(u,3);return h=l>.008856?l:(h-.13793103448275862)/7.787,t=b>.008856?b:(t-.13793103448275862)/7.787,u=f>.008856?f:(u-.13793103448275862)/7.787,[t*=95.047,h*=100,u*=108.883]},u.lab.lch=function(n){var t,h=n[0],u=n[1],o=n[2];return(t=360*Math.atan2(o,u)/2/Math.PI)<0&&(t+=360),[h,Math.sqrt(u*u+o*o),t]},u.lch.lab=function(n){var t,h=n[0],u=n[1];return t=n[2]/360*2*Math.PI,[h,u*Math.cos(t),u*Math.sin(t)]},u.rgb.ansi16=function(n){var t=n[0],h=n[1],o=n[2],s=1 in arguments?arguments[1]:u.rgb.hsv(n)[2];if(0===(s=Math.round(s/50)))return 30;var c=30+(Math.round(o/255)<<2|Math.round(h/255)<<1|Math.round(t/255));return 2===s&&(c+=60),c},u.hsv.ansi16=function(n){return u.rgb.ansi16(u.hsv.rgb(n),n[2])},u.rgb.ansi256=function(n){var t=n[0],h=n[1],u=n[2];return t===h&&h===u?t<8?16:t>248?231:Math.round((t-8)/247*24)+232:16+36*Math.round(t/255*5)+6*Math.round(h/255*5)+Math.round(u/255*5)},u.ansi16.rgb=function(n){var t=n%10;if(0===t||7===t)return n>50&&(t+=3.5),[t=t/10.5*255,t,t];var h=.5*(1+~~(n>50));return[(1&t)*h*255,(t>>1&1)*h*255,(t>>2&1)*h*255]},u.ansi256.rgb=function(n){if(n>=232){var t=10*(n-232)+8;return[t,t,t]}var h;return n-=16,[Math.floor(n/36)/5*255,Math.floor((h=n%36)/6)/5*255,h%6/5*255]},u.rgb.hex=function(n){var t=(((255&Math.round(n[0]))<<16)+((255&Math.round(n[1]))<<8)+(255&Math.round(n[2]))).toString(16).toUpperCase();return'000000'.substring(t.length)+t},u.hex.rgb=function(n){var t=n.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!t)return[0,0,0];var h=t[0];3===t[0].length&&(h=h.split('').map(function(n){return n+n}).join(''));var u=parseInt(h,16);return[u>>16&255,u>>8&255,255&u]},u.rgb.hcg=function(n){var t,h,u=n[0]/255,o=n[1]/255,s=n[2]/255,c=Math.max(Math.max(u,o),s),l=Math.min(Math.min(u,o),s),b=c-l;return t=b<1?l/(1-b):0,h=b<=0?0:c===u?(o-s)/b%6:c===o?2+(s-u)/b:4+(u-o)/b+4,h/=6,[360*(h%=1),100*b,100*t]},u.hsl.hcg=function(n){var t=n[1]/100,h=n[2]/100,u=1,o=0;return(u=h<.5?2*t*h:2*t*(1-h))<1&&(o=(h-.5*u)/(1-u)),[n[0],100*u,100*o]},u.hsv.hcg=function(n){var t=n[1]/100,h=n[2]/100,u=t*h,o=0;return u<1&&(o=(h-u)/(1-u)),[n[0],100*u,100*o]},u.hcg.rgb=function(n){var t=n[0]/360,h=n[1]/100,u=n[2]/100;if(0===h)return[255*u,255*u,255*u];var o,s=[0,0,0],c=t%1*6,l=c%1,b=1-l;switch(Math.floor(c)){case 0:s[0]=1,s[1]=l,s[2]=0;break;case 1:s[0]=b,s[1]=1,s[2]=0;break;case 2:s[0]=0,s[1]=1,s[2]=l;break;case 3:s[0]=0,s[1]=b,s[2]=1;break;case 4:s[0]=l,s[1]=0,s[2]=1;break;default:s[0]=1,s[1]=0,s[2]=b}return o=(1-h)*u,[255*(h*s[0]+o),255*(h*s[1]+o),255*(h*s[2]+o)]},u.hcg.hsv=function(n){var t=n[1]/100,h=t+n[2]/100*(1-t),u=0;return h>0&&(u=t/h),[n[0],100*u,100*h]},u.hcg.hsl=function(n){var t=n[1]/100,h=n[2]/100*(1-t)+.5*t,u=0;return h>0&&h<.5?u=t/(2*h):h>=.5&&h<1&&(u=t/(2*(1-h))),[n[0],100*u,100*h]},u.hcg.hwb=function(n){var t=n[1]/100,h=t+n[2]/100*(1-t);return[n[0],100*(h-t),100*(1-h)]},u.hwb.hcg=function(n){var t=n[1]/100,h=1-n[2]/100,u=h-t,o=0;return u<1&&(o=(h-u)/(1-u)),[n[0],100*u,100*o]},u.apple.rgb=function(n){return[n[0]/65535*255,n[1]/65535*255,n[2]/65535*255]},u.rgb.apple=function(n){return[n[0]/255*65535,n[1]/255*65535,n[2]/255*65535]},u.gray.rgb=function(n){return[n[0]/100*255,n[0]/100*255,n[0]/100*255]},u.gray.hsl=u.gray.hsv=function(n){return[0,0,n[0]]},u.gray.hwb=function(n){return[0,100,n[0]]},u.gray.cmyk=function(n){return[0,0,0,n[0]]},u.gray.lab=function(n){return[n[0],0,0]},u.gray.hex=function(n){var t=255&Math.round(n[0]/100*255),h=((t<<16)+(t<<8)+t).toString(16).toUpperCase();return'000000'.substring(h.length)+h},u.rgb.gray=function(n){return[(n[0]+n[1]+n[2])/3/255*100]}},572,[573]); -__d(function(g,r,i,a,m,e,d){'use strict';m.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},573,[]); -__d(function(g,r,i,a,m,e,d){var n=r(d[0]);function t(){for(var t={},u=Object.keys(n),c=u.length,o=0;o0&&void 0!==arguments[0]?arguments[0]:l.default;return{flex:1,height:t.Platform.OS===u.PLATFORM.IOS?f:f-20,backgroundColor:o.containerBgColor}}},578,[2,565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){return{flex:1,backgroundColor:'transparent','NativeBase.Segment':{borderWidth:0,backgroundColor:'transparent'}}}},579,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var o,t=Object.assign||function(o){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:l.default,n=o.platformStyle,s=o.platform,c={'NativeBase.Text':{color:o.brandDark},'NativeBase.Icon':{color:o.brandDark},'NativeBase.IconNB':{color:o.brandDark}},u={'NativeBase.Text':{color:o.brandLight},'NativeBase.Icon':{color:o.brandLight},'NativeBase.IconNB':{color:o.brandLight}},B={'NativeBase.Text':{color:o.buttonPrimaryBg},'NativeBase.Icon':{color:o.buttonPrimaryBg},'NativeBase.IconNB':{color:o.buttonPrimaryBg}},h={'NativeBase.Text':{color:o.buttonSuccessBg},'NativeBase.Icon':{color:o.buttonSuccessBg},'NativeBase.IconNB':{color:o.buttonSuccessBg}},v={'NativeBase.Text':{color:o.buttonInfoBg},'NativeBase.Icon':{color:o.buttonInfoBg},'NativeBase.IconNB':{color:o.buttonInfoBg}},N={'NativeBase.Text':{color:o.buttonWarningBg},'NativeBase.Icon':{color:o.buttonWarningBg},'NativeBase.IconNB':{color:o.buttonWarningBg}},f={'NativeBase.Text':{color:o.buttonDangerBg},'NativeBase.Icon':{color:o.buttonDangerBg},'NativeBase.IconNB':{color:o.buttonDangerBg}};return{'.disabled':{'.transparent':{backgroundColor:'transparent','NativeBase.Text':{color:o.buttonDisabledBg},'NativeBase.Icon':{color:o.buttonDisabledBg},'NativeBase.IconNB':{color:o.buttonDisabledBg}},'NativeBase.Icon':{color:o.brandLight},'NativeBase.IconNB':{color:o.brandLight},backgroundColor:o.buttonDisabledBg},'.bordered':t({'.dark':t({},c,{backgroundColor:'transparent',borderColor:o.brandDark,borderWidth:2*o.borderWidth}),'.light':t({},u,{backgroundColor:'transparent',borderColor:o.brandLight,borderWidth:2*o.borderWidth}),'.primary':t({},B,{backgroundColor:'transparent',borderColor:o.buttonPrimaryBg,borderWidth:2*o.borderWidth}),'.success':t({},h,{backgroundColor:'transparent',borderColor:o.buttonSuccessBg,borderWidth:2*o.borderWidth}),'.info':t({},v,{backgroundColor:'transparent',borderColor:o.buttonInfoBg,borderWidth:2*o.borderWidth}),'.warning':t({},N,{backgroundColor:'transparent',borderColor:o.buttonWarningBg,borderWidth:2*o.borderWidth}),'.danger':t({},f,{backgroundColor:'transparent',borderColor:o.buttonDangerBg,borderWidth:2*o.borderWidth}),'.disabled':{backgroundColor:'transparent',borderColor:o.buttonDisabledBg,borderWidth:2*o.borderWidth,'NativeBase.Text':{color:o.buttonDisabledBg}}},B,{borderWidth:2*o.borderWidth,elevation:null,shadowColor:null,shadowOffset:null,shadowOpacity:null,shadowRadius:null,backgroundColor:'transparent'}),'.dark':{'.bordered':t({},c),backgroundColor:o.brandDark},'.light':t({'.transparent':t({},u,{backgroundColor:'transparent'}),'.bordered':t({},u)},c,{backgroundColor:o.brandLight}),'.primary':{'.bordered':t({},B),backgroundColor:o.buttonPrimaryBg},'.success':{'.bordered':t({},h),backgroundColor:o.buttonSuccessBg},'.info':{'.bordered':t({},v),backgroundColor:o.buttonInfoBg},'.warning':{'.bordered':t({},N),backgroundColor:o.buttonWarningBg},'.danger':{'.bordered':t({},f),backgroundColor:o.buttonDangerBg},'.block':{justifyContent:'center',alignSelf:'stretch'},'.full':{justifyContent:'center',alignSelf:'stretch',borderRadius:0},'.rounded':{borderRadius:o.borderRadiusLarge},'.transparent':t({backgroundColor:'transparent',elevation:0,shadowColor:null,shadowOffset:null,shadowRadius:null,shadowOpacity:null},B,{'.dark':t({},c),'.danger':t({},f),'.warning':t({},N),'.info':t({},v),'.primary':t({},B),'.success':t({},h),'.light':t({},u),'.disabled':{backgroundColor:'transparent',borderColor:o.buttonDisabledBg,borderWidth:2*o.borderWidth,'NativeBase.Text':{color:o.buttonDisabledBg},'NativeBase.Icon':{color:o.buttonDisabledBg},'NativeBase.IconNB':{color:o.buttonDisabledBg}}}),'.small':{height:30,'NativeBase.Text':{fontSize:14},'NativeBase.Icon':{fontSize:20,paddingTop:0},'NativeBase.IconNB':{fontSize:20,paddingTop:0}},'.large':{height:60,'NativeBase.Text':{fontSize:22}},'.capitalize':{},'.vertical':{flexDirection:'column',height:null},'NativeBase.Text':{fontFamily:o.buttonFontFamily,marginLeft:0,marginRight:0,color:o.inverseTextColor,fontSize:o.buttonTextSize,paddingHorizontal:16,backgroundColor:'transparent'},'NativeBase.Icon':{color:o.inverseTextColor,fontSize:24,marginHorizontal:16,paddingTop:s===b.PLATFORM.IOS?2:void 0},'NativeBase.IconNB':{color:o.inverseTextColor,fontSize:24,marginHorizontal:16,paddingTop:s===b.PLATFORM.IOS?2:void 0},'.iconLeft':{'NativeBase.Text':{marginLeft:0},'NativeBase.IconNB':{marginRight:0,marginLeft:16},'NativeBase.Icon':{marginRight:0,marginLeft:16}},'.iconRight':{'NativeBase.Text':{marginRight:0},'NativeBase.IconNB':{marginLeft:0,marginRight:16},'NativeBase.Icon':{marginLeft:0,marginRight:16}},'.picker':{'NativeBase.Text':{'.note':{fontSize:16,lineHeight:null}}},paddingVertical:o.buttonPadding,backgroundColor:o.buttonPrimaryBg,borderRadius:o.borderRadiusBase,borderColor:o.buttonPrimaryBg,borderWidth:null,height:45,flexDirection:'row',elevation:2,shadowColor:n===b.PLATFORM.MATERIAL?o.brandDark:void 0,shadowOffset:n===b.PLATFORM.MATERIAL?{width:0,height:2}:void 0,shadowOpacity:n===b.PLATFORM.MATERIAL?.2:void 0,shadowRadius:n===b.PLATFORM.MATERIAL?1.2:void 0,alignItems:'center',justifyContent:'space-between',alignSelf:'flex-start'}}},580,[565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t,o=r(d[0]),l=r(d[1]),n=(t=l)&&t.__esModule?t:{default:t},f=r(d[2]);e.default=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n.default;return{fontSize:t.titleFontSize,fontFamily:t.titleFontfamily,color:t.titleFontColor,fontWeight:o.Platform.OS===f.PLATFORM.IOS?'700':void 0,textAlign:o.Platform.OS===f.PLATFORM.IOS?'center':'left',paddingLeft:o.Platform.OS===f.PLATFORM.IOS?4:0,marginLeft:o.Platform.OS===f.PLATFORM.IOS?void 0:-3,paddingTop:1}}},581,[2,565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t,l=r(d[0]),o=r(d[1]),f=(t=o)&&t.__esModule?t:{default:t},n=r(d[2]);e.default=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f.default;return{fontSize:t.subTitleFontSize,fontFamily:t.titleFontfamily,color:t.subtitleColor,textAlign:l.Platform.OS===n.PLATFORM.IOS?'center':'left',paddingLeft:l.Platform.OS===n.PLATFORM.IOS?4:0,marginLeft:l.Platform.OS===n.PLATFORM.IOS?void 0:-3}}},582,[2,565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var o,t=r(d[0]),n=(o=t)&&o.__esModule?o:{default:o};e.default=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n.default;return{'NativeBase.Icon':{fontSize:24,color:o.sTabBarActiveTextColor,paddingHorizontal:5},'NativeBase.IconNB':{fontSize:24,color:o.sTabBarActiveTextColor,paddingHorizontal:5},'NativeBase.Input':{height:o.inputHeightBase,color:o.inputColor,paddingLeft:5,paddingRight:5,flex:1,fontSize:o.inputFontSize,lineHeight:o.inputLineHeight},'.underline':{'.success':{borderColor:o.inputSuccessBorderColor},'.error':{borderColor:o.inputErrorBorderColor},paddingLeft:5,borderWidth:o.borderWidth,borderTopWidth:0,borderRightWidth:0,borderLeftWidth:0,borderColor:o.inputBorderColor},'.regular':{'.success':{borderColor:o.inputSuccessBorderColor},'.error':{borderColor:o.inputErrorBorderColor},paddingLeft:5,borderWidth:o.borderWidth,borderColor:o.inputBorderColor},'.rounded':{'.success':{borderColor:o.inputSuccessBorderColor},'.error':{borderColor:o.inputErrorBorderColor},paddingLeft:5,borderWidth:o.borderWidth,borderRadius:o.inputGroupRoundedBorderRadius,borderColor:o.inputBorderColor},'.success':{'NativeBase.Icon':{color:o.inputSuccessBorderColor},'NativeBase.IconNB':{color:o.inputSuccessBorderColor},'.rounded':{borderRadius:30,borderColor:o.inputSuccessBorderColor},'.regular':{borderColor:o.inputSuccessBorderColor},'.underline':{borderWidth:o.borderWidth,borderTopWidth:0,borderRightWidth:0,borderLeftWidth:0,borderColor:o.inputSuccessBorderColor},borderColor:o.inputSuccessBorderColor},'.error':{'NativeBase.Icon':{color:o.inputErrorBorderColor},'NativeBase.IconNB':{color:o.inputErrorBorderColor},'.rounded':{borderRadius:30,borderColor:o.inputErrorBorderColor},'.regular':{borderColor:o.inputErrorBorderColor},'.underline':{borderWidth:o.borderWidth,borderTopWidth:0,borderRightWidth:0,borderLeftWidth:0,borderColor:o.inputErrorBorderColor},borderColor:o.inputErrorBorderColor},'.disabled':{'NativeBase.Icon':{color:'#384850'},'NativeBase.IconNB':{color:'#384850'}},paddingLeft:5,borderWidth:o.borderWidth,borderTopWidth:0,borderRightWidth:0,borderLeftWidth:0,borderColor:o.inputBorderColor,backgroundColor:'transparent',flexDirection:'row',alignItems:'center'}}},583,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var o,n=r(d[0]),t=(o=n)&&o.__esModule?o:{default:o};e.default=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t.default;return{'.primary':{backgroundColor:o.buttonPrimaryBg},'.warning':{backgroundColor:o.buttonWarningBg},'.info':{backgroundColor:o.buttonInfoBg},'.success':{backgroundColor:o.buttonSuccessBg},'.danger':{backgroundColor:o.buttonDangerBg},'NativeBase.Text':{color:o.badgeColor,fontSize:o.fontSizeBase,lineHeight:o.lineHeight-1,textAlign:'center',paddingHorizontal:3},backgroundColor:o.badgeBg,padding:o.badgePadding,paddingHorizontal:6,alignSelf:'flex-start',justifyContent:'center',borderRadius:13.5,height:27}}},584,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var o,c=r(d[0]),n=(o=c)&&o.__esModule?o:{default:o};e.default=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n.default;return{'.checked':{'NativeBase.Icon':{color:o.checkboxTickColor},'NativeBase.IconNB':{color:o.checkboxTickColor}},'NativeBase.Icon':{color:'transparent',lineHeight:o.CheckboxIconSize,marginTop:o.CheckboxIconMarginTop,fontSize:o.CheckboxFontSize},'NativeBase.IconNB':{color:'transparent',lineHeight:o.CheckboxIconSize,marginTop:o.CheckboxIconMarginTop,fontSize:o.CheckboxFontSize},borderRadius:o.CheckboxRadius,overflow:'hidden',width:o.checkboxSize,height:o.checkboxSize,borderWidth:o.CheckboxBorderWidth,paddingLeft:o.CheckboxPaddingLeft-1,paddingBottom:o.CheckboxPaddingBottom,left:10}}},585,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var o,l=r(d[0]),n=(o=l)&&o.__esModule?o:{default:o};e.default=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n.default;return{'.transparent':{shadowColor:null,shadowOffset:null,shadowOpacity:null,shadowRadius:null,elevation:null,backgroundColor:'transparent',borderWidth:0},'.noShadow':{shadowColor:null,shadowOffset:null,shadowOpacity:null,elevation:null},marginVertical:5,marginHorizontal:2,borderWidth:o.borderWidth,borderRadius:o.cardBorderRadius,borderColor:o.cardBorderColor,flexWrap:'nowrap',backgroundColor:o.cardDefaultBg,shadowColor:'#000',shadowOffset:{width:0,height:2},shadowOpacity:.1,shadowRadius:1.5,elevation:3}}},586,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var o,t=r(d[0]),l=r(d[1]),n=(o=l)&&o.__esModule?o:{default:o},O=r(d[2]);e.default=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n.default;return{'.selected':{'NativeBase.IconNB':{color:t.Platform.OS===O.PLATFORM.IOS?o.radioColor:o.radioSelectedColorAndroid,lineHeight:t.Platform.OS===O.PLATFORM.IOS?25:o.radioBtnLineHeight,height:t.Platform.OS===O.PLATFORM.IOS?20:void 0}},'NativeBase.IconNB':{color:t.Platform.OS===O.PLATFORM.IOS?'transparent':void 0,lineHeight:t.Platform.OS===O.PLATFORM.IOS?void 0:o.radioBtnLineHeight,fontSize:t.Platform.OS===O.PLATFORM.IOS?void 0:o.radioBtnSize}}}},587,[2,565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t,o=r(d[0]),l=(t=o)&&t.__esModule?t:{default:t};e.default=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l.default;return{color:t.textColor,fontSize:t.fontSizeH3,lineHeight:t.lineHeightH3}}},588,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t,o=r(d[0]),l=(t=o)&&t.__esModule?t:{default:t};e.default=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l.default;return{color:t.textColor,fontSize:t.fontSizeH2,lineHeight:t.lineHeightH2}}},589,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t,o=r(d[0]),l=(t=o)&&t.__esModule?t:{default:t};e.default=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l.default;return{color:t.textColor,fontSize:t.fontSizeH1,lineHeight:t.lineHeightH1}}},590,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t,o=Object.assign||function(t){for(var o=1;o0&&void 0!==arguments[0]?arguments[0]:n.default,l=t.platformStyle,f=t.platform,u={'NativeBase.Icon':{color:t.tabBarActiveTextColor}},c={'NativeBase.IconNB':{color:t.tabBarActiveTextColor}},h={'NativeBase.Text':{color:t.tabBarActiveTextColor}};return{'NativeBase.Left':{'NativeBase.Button':o({'.transparent':o({backgroundColor:'transparent',borderColor:null,elevation:0,shadowColor:null,shadowOffset:null,shadowRadius:null,shadowOpacity:null},u,c,h),alignSelf:null},u,c),flex:1,alignSelf:'center',alignItems:'flex-start'},'NativeBase.Body':{flex:1,alignItems:'center',alignSelf:'center',flexDirection:'row','NativeBase.Button':o({alignSelf:'center','.transparent':o({backgroundColor:'transparent',borderColor:null,elevation:0,shadowColor:null,shadowOffset:null,shadowRadius:null,shadowOpacity:null},u,c,h),'.full':{height:t.footerHeight,paddingBottom:t.footerPaddingBottom,flex:1}},u,c)},'NativeBase.Right':{'NativeBase.Button':o({'.transparent':o({backgroundColor:'transparent',borderColor:null,elevation:0,shadowColor:null,shadowOffset:null,shadowRadius:null,shadowOpacity:null},u,c,h),alignSelf:null},u,c),flex:1,alignSelf:'center',alignItems:'flex-end'},backgroundColor:t.footerDefaultBg,flexDirection:'row',justifyContent:'center',borderTopWidth:f===s.PLATFORM.IOS&&l!==s.PLATFORM.MATERIAL?t.borderWidth:void 0,borderColor:f===s.PLATFORM.IOS&&l!==s.PLATFORM.MATERIAL?'#cbcbcb':void 0,height:t.footerHeight,paddingBottom:t.footerPaddingBottom,elevation:3,left:0,right:0}}},591,[565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t,o=r(d[0]),l=r(d[1]),n=(t=l)&&t.__esModule?t:{default:t},c=r(d[2]);e.default=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n.default,l=t.platform;return{'NativeBase.Button':{'.active':{'NativeBase.Text':{color:t.tabBarActiveTextColor,fontSize:t.tabBarTextSize,lineHeight:16},'NativeBase.Icon':{color:t.tabBarActiveTextColor},'NativeBase.IconNB':{color:t.tabBarActiveTextColor},backgroundColor:t.tabActiveBgColor},flexDirection:null,backgroundColor:'transparent',borderColor:null,elevation:0,shadowColor:null,shadowOffset:null,shadowRadius:null,shadowOpacity:null,alignSelf:'center',flex:1,height:t.footerHeight,justifyContent:'center','.badge':{'NativeBase.Badge':{'NativeBase.Text':{fontSize:11,fontWeight:l===c.PLATFORM.IOS?'600':void 0,lineHeight:14},top:-3,alignSelf:'center',left:10,zIndex:99,height:18,padding:1.7,paddingHorizontal:3},'NativeBase.Icon':{marginTop:-18}},'NativeBase.Icon':{color:t.tabBarTextColor},'NativeBase.IconNB':{color:t.tabBarTextColor},'NativeBase.Text':{color:t.tabBarTextColor,fontSize:t.tabBarTextSize,lineHeight:16}},backgroundColor:o.Platform.OS===c.PLATFORM.ANDROID?t.footerDefaultBg:void 0,flexDirection:'row',justifyContent:'space-between',flex:1,alignSelf:'stretch'}}},592,[2,565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){return{'NativeBase.Button':{alignItems:'center',padding:null,justifyContent:'center','NativeBase.Icon':{alignSelf:'center',fontSize:20,marginLeft:0,marginRight:0},'NativeBase.IconNB':{alignSelf:'center',fontSize:20,marginLeft:0,marginRight:0}}}}},593,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var o,t=r(d[0]),n=r(d[1]),l=(o=n)&&o.__esModule?o:{default:o},u=r(d[2]);e.default=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l.default;return{'.floatingLabel':{'NativeBase.Input':{height:50,top:8,paddingTop:3,paddingBottom:7,'.multiline':{minHeight:o.inputHeightBase,paddingTop:t.Platform.OS===u.PLATFORM.IOS?10:3,paddingBottom:t.Platform.OS===u.PLATFORM.IOS?14:10}},'NativeBase.Label':{paddingTop:5},'NativeBase.Icon':{top:6,paddingTop:8},'NativeBase.IconNB':{top:6,paddingTop:8}},'.fixedLabel':{'NativeBase.Label':{position:null,top:null,left:null,right:null,flex:1,height:null,width:null,fontSize:o.inputFontSize},'NativeBase.Input':{flex:2,fontSize:o.inputFontSize}},'.stackedLabel':{'NativeBase.Label':{position:null,top:null,left:null,right:null,paddingTop:5,alignSelf:'flex-start',fontSize:o.inputFontSize-2},'NativeBase.Icon':{marginTop:36},'NativeBase.Input':{alignSelf:'stretch',flex:1,fontSize:o.inputFontSize,lineHeight:o.inputLineHeight-6,'.secureTextEntry':{fontSize:o.inputFontSize},'.multiline':{paddingTop:t.Platform.OS===u.PLATFORM.IOS?9:void 0,paddingBottom:t.Platform.OS===u.PLATFORM.IOS?9:void 0}},flexDirection:null,minHeight:o.inputHeightBase+15},'.inlineLabel':{'NativeBase.Label':{position:null,top:null,left:null,right:null,paddingRight:20,height:null,width:null,fontSize:o.inputFontSize},'NativeBase.Input':{paddingLeft:5,fontSize:o.inputFontSize},flexDirection:'row'},'NativeBase.Label':{fontSize:o.inputFontSize,color:o.inputColorPlaceholder,paddingRight:5},'NativeBase.Icon':{fontSize:24,paddingRight:8},'NativeBase.IconNB':{fontSize:24,paddingRight:8},'NativeBase.Input':{'.multiline':{height:null},height:o.inputHeightBase,color:o.inputColor,flex:1,top:t.Platform.OS===u.PLATFORM.IOS?1.5:void 0,fontSize:o.inputFontSize},'.underline':{'NativeBase.Input':{paddingLeft:15},'.success':{borderColor:o.inputSuccessBorderColor},'.error':{borderColor:o.inputErrorBorderColor},borderWidth:2*o.borderWidth,borderTopWidth:0,borderRightWidth:0,borderLeftWidth:0,borderColor:o.inputBorderColor},'.regular':{'NativeBase.Input':{paddingLeft:8},'NativeBase.Icon':{paddingLeft:10},'.success':{borderColor:o.inputSuccessBorderColor},'.error':{borderColor:o.inputErrorBorderColor},borderWidth:2*o.borderWidth,borderColor:o.inputBorderColor},'.rounded':{'NativeBase.Input':{paddingLeft:8},'NativeBase.Icon':{paddingLeft:10},'.success':{borderColor:o.inputSuccessBorderColor},'.error':{borderColor:o.inputErrorBorderColor},borderWidth:2*o.borderWidth,borderRadius:30,borderColor:o.inputBorderColor},'.success':{'NativeBase.Icon':{color:o.inputSuccessBorderColor},'NativeBase.IconNB':{color:o.inputSuccessBorderColor},'.rounded':{borderRadius:30,borderColor:o.inputSuccessBorderColor},'.regular':{borderColor:o.inputSuccessBorderColor},'.underline':{borderWidth:2*o.borderWidth,borderTopWidth:0,borderRightWidth:0,borderLeftWidth:0,borderColor:o.inputSuccessBorderColor},borderColor:o.inputSuccessBorderColor},'.error':{'NativeBase.Icon':{color:o.inputErrorBorderColor},'NativeBase.IconNB':{color:o.inputErrorBorderColor},'.rounded':{borderRadius:30,borderColor:o.inputErrorBorderColor},'.regular':{borderColor:o.inputErrorBorderColor},'.underline':{borderWidth:2*o.borderWidth,borderTopWidth:0,borderRightWidth:0,borderLeftWidth:0,borderColor:o.inputErrorBorderColor},borderColor:o.inputErrorBorderColor},'.disabled':{'NativeBase.Icon':{color:'#384850'},'NativeBase.IconNB':{color:'#384850'}},'.picker':{marginLeft:0},borderWidth:2*o.borderWidth,borderTopWidth:0,borderRightWidth:0,borderLeftWidth:0,borderColor:o.inputBorderColor,backgroundColor:'transparent',flexDirection:'row',alignItems:'center',marginLeft:2}}},594,[2,565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){return{'.focused':{width:0},fontSize:17}}},595,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var o,t=r(d[0]),n=(o=t)&&o.__esModule?o:{default:o};e.default=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n.default;return{'.underline':{borderBottomWidth:o.borderWidth,marginTop:5,borderColor:o.inputBorderColor},'.bordered':{borderWidth:1,marginTop:5,borderColor:o.inputBorderColor},color:o.textColor,paddingLeft:10,paddingRight:5,fontSize:15,textAlignVertical:'top'}}},596,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var o,t=r(d[0]),n=(o=t)&&o.__esModule?o:{default:o};e.default=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n.default;return{fontSize:o.DefaultFontSize,fontFamily:o.fontFamily,color:o.textColor,'.note':{color:'#a7a7a7',fontSize:o.noteFontSize}}}},597,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var n,o=r(d[0]),t=(n=o)&&n.__esModule?n:{default:n},u=r(d[1]);e.default=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t.default,o=n.platform;return{'.danger':{backgroundColor:n.brandDanger},'.warning':{backgroundColor:n.brandWarning},'.success':{backgroundColor:n.brandSuccess},backgroundColor:'rgba(0,0,0,0.8)',borderRadius:o===u.PLATFORM.IOS?5:0,flexDirection:'row',justifyContent:'space-between',alignItems:'center',padding:10,minHeight:50,'NativeBase.Text':{color:'#fff',flex:1},'NativeBase.Button':{backgroundColor:'transparent',height:30,elevation:0,'NativeBase.Text':{fontSize:14}}}}},598,[565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){return{flex:1,backgroundColor:'#FFF'}}},599,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t,o=r(d[0]),n=(t=o)&&t.__esModule?t:{default:t};e.default=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n.default;return{'.tabIcon':{height:void 0},'.vertical':{height:60},'NativeBase.Button':{'.transparent':{'NativeBase.Text':{fontSize:t.tabFontSize,color:t.sTabBarActiveTextColor,fontWeight:'400'},'NativeBase.IconNB':{color:t.sTabBarActiveTextColor}},'NativeBase.IconNB':{color:t.sTabBarActiveTextColor},'NativeBase.Text':{fontSize:t.tabFontSize,color:t.sTabBarActiveTextColor,fontWeight:'400'},'.isTabActive':{'NativeBase.Text':{fontWeight:'900'}},flex:1,alignSelf:'stretch',alignItems:'center',justifyContent:'center',borderRadius:null,borderBottomColor:'transparent',backgroundColor:t.tabBgColor},height:45,flexDirection:'row',justifyContent:'space-around',borderWidth:1,borderTopWidth:0,borderLeftWidth:0,borderRightWidth:0,borderBottomColor:'#ccc',backgroundColor:t.tabBgColor}}},600,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var o,t=r(d[0]),l=r(d[1]),A=(o=l)&&o.__esModule?o:{default:o},f=r(d[2]);e.default=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:A.default,l=o.platformStyle;return{elevation:3,height:50,flexDirection:'row',shadowColor:l===f.PLATFORM.MATERIAL?'#000':void 0,shadowOffset:l===f.PLATFORM.MATERIAL?{width:0,height:2}:void 0,shadowOpacity:l===f.PLATFORM.MATERIAL?.2:void 0,shadowRadius:l===f.PLATFORM.MATERIAL?1.2:void 0,justifyContent:'space-around',borderBottomWidth:t.Platform.OS===f.PLATFORM.IOS?o.borderWidth:0,borderColor:o.topTabBarBorderColor}}},601,[2,565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var n,t=r(d[0]),u=(n=t)&&n.__esModule?n:{default:n};e.default=function(){return{'.padder':{padding:(arguments.length>0&&void 0!==arguments[0]?arguments[0]:u.default).contentPadding}}}},602,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var o,t=r(d[0]),l=(o=t)&&o.__esModule?o:{default:o},n=r(d[1]);e.default=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l.default,t=o.platform;return{flexDirection:'row',backgroundColor:o.tabDefaultBg,flex:1,alignItems:'center',justifyContent:'center','.scrollable':{paddingHorizontal:20,flex:t===n.PLATFORM.ANDROID?0:1,minWidth:t===n.PLATFORM.ANDROID?void 0:60},'NativeBase.Text':{color:o.topTabBarTextColor,marginHorizontal:7},'NativeBase.Icon':{color:o.topTabBarTextColor,fontSize:t===n.PLATFORM.IOS?26:void 0},'.active':{'NativeBase.Text':{color:o.topTabBarActiveTextColor,fontWeight:'600'},'NativeBase.Icon':{color:o.topTabBarActiveTextColor}}}}},603,[565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var o,t=r(d[0]),n=(o=t)&&o.__esModule?o:{default:o};e.default=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n.default;return{fontSize:o.iconFontSize,color:o.textColor}}},604,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t,n=r(d[0]),l=(t=n)&&t.__esModule?t:{default:t};e.default=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l.default;return{'.multiline':{height:null},height:t.inputHeightBase,color:t.inputColor,paddingLeft:5,paddingRight:5,flex:1,fontSize:t.inputFontSize}}},605,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){return{'NativeBase.ListItem':{'.list':{backgroundColor:'#FFF'},marginLeft:0},'NativeBase.Left':{flex:0,alignSelf:null,alignItems:null,'NativeBase.Button':{flex:1,alignItems:'center',justifyContent:'center',alignSelf:'stretch',borderRadius:0}},'NativeBase.Right':{flex:0,alignSelf:null,alignItems:null,'NativeBase.Button':{flex:1,alignItems:'center',justifyContent:'center',alignSelf:'stretch',borderRadius:0}},'NativeBase.Button':{flex:1,height:null,alignItems:'center',justifyContent:'center',alignSelf:'stretch',borderRadius:0}}}},606,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var o,t=r(d[0]),n=(o=t)&&o.__esModule?o:{default:o},l=r(d[1]);e.default=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n.default,t=o.platform;return{height:45,borderColor:o.segmentBorderColorMain,flexDirection:'row',justifyContent:'center',backgroundColor:o.segmentBackgroundColor,'NativeBase.Button':{alignSelf:'center',borderRadius:0,paddingTop:3,paddingBottom:3,height:30,backgroundColor:'transparent',borderWidth:1,borderLeftWidth:0,borderColor:o.segmentBorderColor,elevation:0,'.active':{backgroundColor:o.segmentActiveBackgroundColor,'NativeBase.Text':{color:o.segmentActiveTextColor},'NativeBase.Icon':{color:o.segmentActiveTextColor}},'.first':{borderTopLeftRadius:t===l.PLATFORM.IOS?5:void 0,borderBottomLeftRadius:t===l.PLATFORM.IOS?5:void 0,borderLeftWidth:1},'.last':{borderTopRightRadius:t===l.PLATFORM.IOS?5:void 0,borderBottomRightRadius:t===l.PLATFORM.IOS?5:void 0},'NativeBase.Text':{color:o.segmentTextColor,fontSize:14},'NativeBase.Icon':{fontSize:22,paddingTop:0,color:o.segmentTextColor}}}}},607,[565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){return{height:80}}},608,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t,o=Object.assign||function(t){for(var o=1;o0&&void 0!==arguments[0]?arguments[0]:c.default,l=t.platform,B={'NativeBase.Text':{fontSize:t.DefaultFontSize-3,color:t.sTabBarActiveTextColor},'NativeBase.Icon':{fontSize:t.iconFontSize-10,color:t.sTabBarActiveTextColor,marginHorizontal:null},'NativeBase.IconNB':{fontSize:t.iconFontSize-10,color:t.sTabBarActiveTextColor},paddingVertical:null,paddingHorizontal:null};return{'NativeBase.Left':{'NativeBase.Body':{'NativeBase.Text':{'.note':{color:t.listNoteColor,fontWeight:'400',marginRight:20}},flex:1,marginLeft:10,alignItems:null},'NativeBase.Icon':{fontSize:t.iconFontSize},'NativeBase.IconNB':{fontSize:t.iconFontSize},'NativeBase.Text':{marginLeft:10,alignSelf:'center'},'NativeBase.Button':{'.transparent':o({},B,{paddingRight:t.cardItemPadding+5})},flex:1,flexDirection:'row',alignItems:'center'},'.content':{'NativeBase.Text':{color:l===s.PLATFORM.IOS?'#555':'#222',fontSize:t.DefaultFontSize-2}},'.cardBody':{padding:-5,'NativeBase.Text':{marginTop:5}},'NativeBase.Body':{'NativeBase.Text':{'.note':{color:t.listNoteColor,fontWeight:'200',marginRight:20}},'NativeBase.Button':{'.transparent':o({},B,{paddingRight:t.cardItemPadding+5,alignSelf:'stretch'})},flex:1,alignSelf:'stretch',alignItems:'flex-start'},'NativeBase.Right':{'NativeBase.Badge':{alignSelf:null},'NativeBase.Button':{'.transparent':o({},B),alignSelf:null},'NativeBase.Icon':{alignSelf:null,fontSize:t.iconFontSize-8,color:t.cardBorderColor},'NativeBase.IconNB':{alignSelf:null,fontSize:t.iconFontSize-8,color:t.cardBorderColor},'NativeBase.Text':{fontSize:t.DefaultFontSize-1,alignSelf:null},'NativeBase.Thumbnail':{alignSelf:null},'NativeBase.Image':{alignSelf:null},'NativeBase.Radio':{alignSelf:null},'NativeBase.Checkbox':{alignSelf:null},'NativeBase.Switch':{alignSelf:null},flex:.8},'.header':{'NativeBase.Text':{fontSize:16,fontWeight:l===s.PLATFORM.IOS?'600':'500'},'.bordered':{'NativeBase.Text':{color:t.brandPrimary,fontWeight:l===s.PLATFORM.IOS?'600':'500'},borderBottomWidth:t.borderWidth},borderBottomWidth:null,paddingVertical:t.cardItemPadding+5},'.footer':{'NativeBase.Text':{fontSize:16,fontWeight:l===s.PLATFORM.IOS?'600':'500'},'.bordered':{'NativeBase.Text':{color:t.brandPrimary,fontWeight:l===s.PLATFORM.IOS?'600':'500'},borderTopWidth:t.borderWidth},borderBottomWidth:null},'NativeBase.Text':{'.note':{color:t.listNoteColor,fontWeight:'200'}},'NativeBase.Icon':{width:t.iconFontSize+5,fontSize:t.iconFontSize-2},'NativeBase.IconNB':{width:t.iconFontSize+5,fontSize:t.iconFontSize-2},'.bordered':{borderBottomWidth:n.StyleSheet.hairlineWidth,borderColor:t.cardBorderColor},'.first':{borderTopLeftRadius:t.cardBorderRadius,borderTopRightRadius:t.cardBorderRadius},'.last':{borderBottomLeftRadius:t.cardBorderRadius,borderBottomRightRadius:t.cardBorderRadius},flexDirection:'row',alignItems:'center',borderRadius:t.cardBorderRadius,padding:t.cardItemPadding+5,paddingVertical:t.cardItemPadding,backgroundColor:t.cardDefaultBg}}},609,[2,565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t=Object.assign||function(t){for(var o=1;o0&&void 0!==arguments[0]?arguments[0]:l.default,c=B.platform,f={'NativeBase.Text':{color:B.listItemSelected},'NativeBase.Icon':{color:B.listItemSelected}};return{'NativeBase.InputGroup':{'NativeBase.Icon':{paddingRight:5},'NativeBase.IconNB':{paddingRight:5},'NativeBase.Input':{paddingHorizontal:5},flex:1,borderWidth:null,margin:-10,borderBottomColor:'transparent'},'.searchBar':{'NativeBase.Item':{'NativeBase.Icon':{backgroundColor:'transparent',color:B.dropdownLinkColor,fontSize:c===s.PLATFORM.IOS?B.iconFontSize-10:B.iconFontSize-5,alignItems:'center',marginTop:2,paddingRight:8},'NativeBase.IconNB':{backgroundColor:'transparent',color:null,alignSelf:'center'},'NativeBase.Input':{alignSelf:'center'},alignSelf:'center',alignItems:'center',justifyContent:'flex-start',flex:1,height:c===s.PLATFORM.IOS?30:40,borderColor:'transparent',backgroundColor:'#fff',borderRadius:5},'NativeBase.Button':{'.transparent':{'NativeBase.Text':{fontWeight:'500'},paddingHorizontal:null,paddingLeft:c===s.PLATFORM.IOS?10:null},paddingHorizontal:c===s.PLATFORM.IOS?void 0:null,width:c===s.PLATFORM.IOS?void 0:0,height:c===s.PLATFORM.IOS?void 0:0},backgroundColor:B.toolbarInputColor,padding:10,marginLeft:null},'NativeBase.CheckBox':{marginLeft:-10,marginRight:10},'.first':{'.itemHeader':{paddingTop:B.listItemPadding+3}},'.itemHeader':{'.first':{paddingTop:B.listItemPadding+3},borderBottomWidth:c===s.PLATFORM.IOS?B.borderWidth:null,marginLeft:null,padding:B.listItemPadding,paddingLeft:B.listItemPadding+5,paddingTop:c===s.PLATFORM.IOS?B.listItemPadding+25:void 0,paddingBottom:c===s.PLATFORM.ANDROID?B.listItemPadding+20:void 0,flexDirection:'row',borderColor:B.listBorderColor,'NativeBase.Text':{fontSize:14,color:c===s.PLATFORM.IOS?void 0:B.listNoteColor}},'.itemDivider':{borderBottomWidth:null,marginLeft:null,padding:B.listItemPadding,paddingLeft:B.listItemPadding+5,backgroundColor:B.listDividerBg,flexDirection:'row',borderColor:B.listBorderColor},'.selected':t({'NativeBase.Left':t({},f),'NativeBase.Body':t({},f),'NativeBase.Right':t({},f)},f),'NativeBase.Left':{'NativeBase.Body':{'NativeBase.Text':{'.note':{color:B.listNoteColor,fontWeight:'200'},fontWeight:'600'},marginLeft:10,alignItems:null,alignSelf:null},'NativeBase.Icon':{width:B.iconFontSize-10,fontSize:B.iconFontSize-10},'NativeBase.IconNB':{width:B.iconFontSize-10,fontSize:B.iconFontSize-10},'NativeBase.Text':{alignSelf:'center'},flexDirection:'row'},'NativeBase.Body':{'NativeBase.Text':{marginHorizontal:B.listItemPadding,'.note':{color:B.listNoteColor,fontWeight:'200'}},alignSelf:null,alignItems:null},'NativeBase.Right':{'NativeBase.Badge':{alignSelf:null},'NativeBase.PickerNB':{'NativeBase.Button':{marginRight:-15,'NativeBase.Text':{color:B.topTabBarActiveTextColor}}},'NativeBase.Button':{alignSelf:null,'.transparent':{'NativeBase.Text':{color:B.topTabBarActiveTextColor}}},'NativeBase.Icon':{alignSelf:null,fontSize:B.iconFontSize-8,color:'#c9c8cd'},'NativeBase.IconNB':{alignSelf:null,fontSize:B.iconFontSize-8,color:'#c9c8cd'},'NativeBase.Text':{'.note':{color:B.listNoteColor,fontWeight:'200'},alignSelf:null},'NativeBase.Thumbnail':{alignSelf:null},'NativeBase.Image':{alignSelf:null},'NativeBase.Radio':{alignSelf:null},'NativeBase.Checkbox':{alignSelf:null},'NativeBase.Switch':{alignSelf:null},padding:null,flex:.28},'NativeBase.Text':{'.note':{color:B.listNoteColor,fontWeight:'200'},alignSelf:'center'},'.last':{marginLeft:-(B.listItemPadding+5),paddingLeft:2*(B.listItemPadding+5),top:1},'.avatar':{'NativeBase.Left':{flex:0,alignSelf:'flex-start',paddingTop:14},'NativeBase.Body':{'NativeBase.Text':{marginLeft:null},flex:1,paddingVertical:B.listItemPadding,borderBottomWidth:B.borderWidth,borderColor:B.listBorderColor,marginLeft:B.listItemPadding+5},'NativeBase.Right':{'NativeBase.Text':{'.note':{fontSize:B.noteFontSize-2}},flex:0,paddingRight:B.listItemPadding+5,alignSelf:'stretch',paddingVertical:B.listItemPadding,borderBottomWidth:B.borderWidth,borderColor:B.listBorderColor},'.noBorder':{'NativeBase.Body':{borderBottomWidth:null},'NativeBase.Right':{borderBottomWidth:null}},borderBottomWidth:null,paddingVertical:null,paddingRight:null},'.thumbnail':{'NativeBase.Left':{flex:0},'NativeBase.Body':{'NativeBase.Text':{marginLeft:null},flex:1,paddingVertical:B.listItemPadding+8,borderBottomWidth:B.borderWidth,borderColor:B.listBorderColor,marginLeft:B.listItemPadding+5},'NativeBase.Right':{'NativeBase.Button':{'.transparent':{'NativeBase.Text':{fontSize:B.listNoteSize,color:B.sTabBarActiveTextColor}},height:null},flex:0,justifyContent:'center',alignSelf:'stretch',paddingRight:B.listItemPadding+5,paddingVertical:B.listItemPadding+5,borderBottomWidth:B.borderWidth,borderColor:B.listBorderColor},'.noBorder':{'NativeBase.Body':{borderBottomWidth:null},'NativeBase.Right':{borderBottomWidth:null}},borderBottomWidth:null,paddingVertical:null,paddingRight:null},'.icon':{'.last':{'NativeBase.Body':{borderBottomWidth:null},'NativeBase.Right':{borderBottomWidth:null},borderBottomWidth:B.borderWidth,borderColor:B.listBorderColor},'NativeBase.Left':{'NativeBase.Button':{'NativeBase.IconNB':{marginHorizontal:null,fontSize:B.iconFontSize-5},'NativeBase.Icon':{marginHorizontal:null,fontSize:B.iconFontSize-8},alignSelf:'center',height:29,width:29,borderRadius:6,paddingVertical:null,paddingHorizontal:null,alignItems:'center',justifyContent:'center'},'NativeBase.Icon':{width:B.iconFontSize-5,fontSize:B.iconFontSize-2},'NativeBase.IconNB':{width:B.iconFontSize-5,fontSize:B.iconFontSize-2},paddingRight:B.listItemPadding+5,flex:0,height:44,justifyContent:'center',alignItems:'center'},'NativeBase.Body':{'NativeBase.Text':{marginLeft:null,fontSize:17},flex:1,height:44,justifyContent:'center',borderBottomWidth:1/o.PixelRatio.getPixelSizeForLayoutSize(1),borderColor:B.listBorderColor},'NativeBase.Right':{'NativeBase.Text':{textAlign:'center',color:'#8F8E95',fontSize:17},'NativeBase.IconNB':{color:'#C8C7CC',fontSize:B.iconFontSize-10,alignSelf:'center',paddingLeft:10,paddingTop:3},'NativeBase.Icon':{color:'#C8C7CC',fontSize:B.iconFontSize-10,alignSelf:'center',paddingLeft:10,paddingTop:3},'NativeBase.Switch':{marginRight:o.Platform.OS===s.PLATFORM.IOS?void 0:-5,alignSelf:null},'NativeBase.PickerNB':t({},(0,n.default)()),flexDirection:'row',alignItems:'center',flex:0,alignSelf:'stretch',height:44,justifyContent:'flex-end',borderBottomWidth:1/o.PixelRatio.getPixelSizeForLayoutSize(1),borderColor:B.listBorderColor,paddingRight:B.listItemPadding+5},'.noBorder':{'NativeBase.Body':{borderBottomWidth:null},'NativeBase.Right':{borderBottomWidth:null}},borderBottomWidth:null,paddingVertical:null,paddingRight:null,height:44,justifyContent:'center'},'.noBorder':{borderBottomWidth:null},'.noIndent':{marginLeft:null,padding:B.listItemPadding,paddingLeft:B.listItemPadding+6},alignItems:'center',flexDirection:'row',paddingRight:B.listItemPadding+6,paddingVertical:B.listItemPadding+3,marginLeft:B.listItemPadding+6,borderBottomWidth:1/o.PixelRatio.getPixelSizeForLayoutSize(1),backgroundColor:B.listBg,borderColor:B.listBorderColor}}},610,[2,611,565,575]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){return{'.note':{color:'#8F8E95'},marginRight:-4,flexGrow:1}}},611,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){return{'NativeBase.Item':{'.fixedLabel':{'NativeBase.Label':{paddingLeft:null},marginLeft:15},'.inlineLabel':{'NativeBase.Label':{paddingLeft:null},marginLeft:15},'.placeholderLabel':{'NativeBase.Input':{}},'.stackedLabel':{'NativeBase.Label':{top:5,paddingLeft:null},'NativeBase.Input':{paddingLeft:null,marginLeft:null},'NativeBase.Icon':{marginTop:36},marginLeft:15},'.floatingLabel':{'NativeBase.Input':{paddingLeft:null,top:10,marginLeft:null},'NativeBase.Label':{left:0,top:6},'NativeBase.Icon':{top:6},marginTop:15,marginLeft:15},'.regular':{'NativeBase.Label':{left:0},marginLeft:0},'.rounded':{'NativeBase.Label':{left:0},marginLeft:0},'.underline':{'NativeBase.Label':{left:0,top:0,position:'relative'},'NativeBase.Input':{left:-15},marginLeft:15},'.last':{marginLeft:0,paddingLeft:15},'NativeBase.Label':{paddingRight:5},marginLeft:15}}}},612,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t,o=r(d[0]),n=(t=o)&&t.__esModule?t:{default:t};e.default=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:n.default;return{'.group':{height:50,paddingVertical:t.listItemPadding-8,paddingTop:t.listItemPadding+12,'.bordered':{height:50,paddingVertical:t.listItemPadding-8,paddingTop:t.listItemPadding+12}},'.bordered':{'.noTopBorder':{borderTopWidth:0},'.noBottomBorder':{borderBottomWidth:0},height:35,paddingTop:t.listItemPadding+2,paddingBottom:t.listItemPadding,borderBottomWidth:t.borderWidth,borderTopWidth:t.borderWidth,borderColor:t.listBorderColor},'NativeBase.Text':{fontSize:t.tabBarTextSize-2,color:'#777'},'.noTopBorder':{borderTopWidth:0},'.noBottomBorder':{borderBottomWidth:0},height:38,backgroundColor:'#F0EFF5',flex:1,justifyContent:'center',paddingLeft:t.listItemPadding+5}}},613,[565]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t=Object.assign||function(t){for(var n=1;n=Math.abs(n.dx))&&(o._panStartTime=Date.now(),!(!s||!o.shouldCaptureGestures())||!o.props.negotiatePan&&(!!o.props.acceptPan&&(o.terminateActiveTween(),!0))))},o.processMoveShouldSet=function(t,n){if(!(o.testPanResponderMask(t,n)||o.props.acceptPanOnDrawer&&!1!==o._open))return!1;if(!o.props.acceptPan)return!1;if(!o.props.negotiatePan||o.props.disabled||!o.props.acceptPan||o._panning)return!1;var s=o.getGestureDelta(n),p=o.getGestureDeltaOppositeAxis(n),l=s<0,u=s>0,f=Math.abs(p)>=Math.abs(s),c=o.isLeftOrTopSide()?l:u;return!(f||o._open&&!c||!o._open&&c)&&(o.terminateActiveTween(),!0)},o.processTapGestures=function(){if(o._activeTween)return!1;if(o.props.acceptTap||o.props.tapToClose&&o._open)return o._open?o.close():o.open(),!0;if(o.props.acceptDoubleTap){var t=(new Date).getTime(),n=t-o._lastPress;if(o._lastPress=t,no.getOpenMask())&&!(!o._open&&l>o.getClosedMask())},o.terminateActiveTween=function(){o._activeTween&&(o._activeTween.terminate(),o._activeTween=null)},o.open=function(t,n){var s=o._length,p=o.getOpenLength();o._activeTween||'force'!==t&&s-p==0&&!0===o._open||(o.props.onOpenStart&&o.props.onOpenStart(),o.setInteractionHandle(),o._activeTween=(0,O.default)({start:o._length,end:o.getOpenLength(),duration:o.props.tweenDuration,easingType:o.props.tweenEasing,onFrame:function(t){o._length=Math.round(2*t)/2,o.updatePosition()},onEnd:function(){o._activeTween=null,o._open=!0,o._prevLength=o._length,o.adjustForCaptureGestures(),o.props.onOpen(),o.clearInteractionHandle(),'function'==typeof t?t():n&&n()}}))},o.close=function(t,n){var s=o._length,p=o.getClosedLength();o._activeTween||'force'!==t&&s-p==0&&!1===o._open||(o.props.onCloseStart&&o.props.onCloseStart(),o.setInteractionHandle(),o._activeTween=(0,O.default)({start:s,end:p,easingType:o.props.tweenEasing,duration:o.props.tweenDuration,onFrame:function(t){o._length=Math.round(2*t)/2,o.updatePosition()},onEnd:function(){o._activeTween=null,o._open=!1,o._prevLength=o._length,o.adjustForCaptureGestures(),o.props.onClose(),o.clearInteractionHandle(),'function'==typeof t?t():n&&n()}}))},o.toggle=function(){o._open?o.close():o.open()},o.handleSetViewport=function(t){var n=t.nativeEvent.layout,s=o.state.viewport;if(n.width!==s.width||n.height!==s.height){var p=n.width!==s.width;o.resync(n,null,p)}},o.resync=function(t,n,s){s&&(o._syncAfterUpdate=!0),t=t||o.state.viewport,n=n||o.props,o._offsetClosed=o.getClosedOffset(n,t),o._offsetOpen=o.getOpenOffset(n,t),o.setState({viewport:t})},o.requiresResync=function(t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:o.state.viewport;return o.isLeftOrRightSide()?t.width:t.height},o.getOpenLength=function(){return o.getDeviceLength()-o._offsetOpen},o.getClosedLength=function(){return o._offsetClosed},o.getMainWidth=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.state.viewport;return o.isLeftOrRightSide()?t.width-o._offsetClosed:t.width},o.getMainHeight=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.state.viewport;return o.isTopOrBottomSide()?t.height-o._offsetClosed:t.height},o.getDrawerWidth=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.state.viewport;return o.isLeftOrRightSide()?t.width-o._offsetOpen:t.width},o.getDrawerHeight=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.state.viewport;return o.isTopOrBottomSide()?t.height-o._offsetOpen:t.height},o.getOpenMask=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.state.viewport;return o.props.panCloseMask&&o.props.panCloseMask%1==0?o.props.panCloseMask:o.props.panCloseMask?o.getDeviceLength(t)*o.props.panCloseMask:Math.max(.05,o._offsetOpen)},o.getClosedMask=function(){return o.props.panOpenMask&&o.props.panOpenMask%1==0?o.props.panOpenMask:o.props.panOpenMask?o.getDeviceLength()*o.props.panOpenMask:Math.max(.05,o._offsetClosed)},o.getOpenOffset=function(t,n){return'function'==typeof t.openDrawerOffset?t.openDrawerOffset(n):t.openDrawerOffset>1||t.openDrawerOffset<0?t.openDrawerOffset:t.openDrawerOffset*o.getDeviceLength(n)},o.getClosedOffset=function(t,n){return'function'==typeof t.closedDrawerOffset?t.closedDrawerOffset(n):t.closedDrawerOffset>1||t.closedDrawerOffset<0?t.closedDrawerOffset:t.closedDrawerOffset*o.getDeviceLength(n)},o.getGestureDelta=function(t){return o.isLeftOrRightSide()?t.dx:t.dy},o.getGestureDeltaOppositeAxis=function(t){return o.isLeftOrRightSide()?t.dy:t.dx},o.isLeftOrRightSide=function(){return _.I18nManager.isRTL?["right","left"].includes(o.props.side):["left","right"].includes(o.props.side)},o.isTopOrBottomSide=function(){return["top","bottom"].includes(o.props.side)},o.isLeftOrTopSide=function(){var t="left";return _.I18nManager.isRTL&&(t="right"),[t,"top"].includes(o.props.side)},o.isRightOrBottomSide=function(){var t="right";return _.I18nManager.isRTL&&(t="left"),[t,"bottom"].includes(o.props.side)},o}return(0,c.default)(n,t),(0,l.default)(n,[{key:"_registerChildDrawer",value:function(t){this._childDrawer=t}},{key:"componentWillMount",value:function(){this.context.drawer&&this.context.drawer._registerChildDrawer(this),this.props.openDrawerThreshold,this.props.panStartCompensation,this.props.relativeDrag,this.initialize(this.props)}},{key:"componentWillReceiveProps",value:function(t){this.requiresResync(t)&&this.resync(null,t),null!==t.open&&this._open!==t.open&&(this._syncAfterUpdate=!0,this._open=t.open)}},{key:"componentDidUpdate",value:function(){this._syncAfterUpdate&&(this._syncAfterUpdate=!1,this._open?this.open('force'):this.close('force'))}},{key:"shouldOpenDrawer",value:function(t){return this._open^t>0^this.isRightOrBottomSide()?this._open^Math.abs(t)>this.getDeviceLength()*this.props.panThreshold:this._open}},{key:"shouldCaptureGestures",value:function(){return!0===this.props.captureGestures||('closed'===this.props.captureGestures&&!1===this._open||'open'===this.props.captureGestures&&!0===this._open)}},{key:"adjustForCaptureGestures",value:function(){if(this.props.captureGestures){var t=this.shouldCaptureGestures();this.mainOverlay&&this.drawerOverlay&&(this.mainOverlay.setNativeProps({pointerEvents:t&&this._open?'auto':'none'}),this.drawerOverlay.setNativeProps({pointerEvents:t&&!this._open?'auto':'none'}))}}},{key:"setInteractionHandle",value:function(){this._interactionHandle&&_.InteractionManager.clearInteractionHandle(this._interactionHandle),this.props.useInteractionManager&&(this._interactionHandle=_.InteractionManager.createInteractionHandle())}},{key:"clearInteractionHandle",value:function(){this._interactionHandle&&_.InteractionManager.clearInteractionHandle(this._interactionHandle)}},{key:"render",value:function(){var t='overlay'===this.props.type?this.renderMain():this.renderDrawer(),n='overlay'===this.props.type?this.renderDrawer():this.renderMain();return v.default.createElement(_.View,{key:"drawerContainer",onLayout:this.handleSetViewport,style:this.stylesheet.container},t,n)}},{key:"renderMain",value:function(){var t=this;return v.default.createElement(_.View,(0,s.default)({},this.responder.panHandlers,{key:"main",ref:function(n){return t.main=n},style:[this.stylesheet.main,{height:this.getMainHeight(),width:this.getMainWidth()}]}),this.props.children,v.default.createElement(_.View,{pointerEvents:this._open&&this.shouldCaptureGestures()?'auto':'none',ref:function(n){return t.mainOverlay=n},style:[P.overlay,this.props.styles&&this.props.styles.mainOverlay]}))}},{key:"renderDrawer",value:function(){var t=this;return v.default.createElement(_.View,(0,s.default)({},this.responder.panHandlers,{key:"drawer",ref:function(n){return t.drawer=n},elevation:this.props.elevation,style:[this.stylesheet.drawer,{height:this.getDrawerHeight(),width:this.getDrawerWidth()}]}),this.props.content,v.default.createElement(_.View,{pointerEvents:!this._open&&this.shouldCaptureGestures()?'auto':'none',ref:function(n){return t.drawerOverlay=n},style:[P.overlay,this.props.styles&&this.props.styles.drawerOverlay]}))}}]),n})(v.Component);e.default=M,M.tweenPresets={parallax:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:'left';return{drawer:(0,o.default)({},n,-150*(1-t))}}},M.propTypes={acceptDoubleTap:w.default.bool,acceptPan:w.default.bool,acceptTap:w.default.bool,acceptPanOnDrawer:w.default.bool,captureGestures:w.default.oneOf([!0,!1,'open','closed']),children:w.default.node,closedDrawerOffset:w.default.oneOfType([w.default.number,w.default.func]),content:w.default.node,disabled:w.default.bool,elevation:w.default.number,initializeOpen:w.default.bool,open:w.default.bool,negotiatePan:w.default.bool,onClose:w.default.func,onCloseStart:w.default.func,onOpen:w.default.func,onOpenStart:w.default.func,onDragStart:w.default.func,openDrawerOffset:w.default.oneOfType([w.default.number,w.default.func]),panThreshold:w.default.number,panCloseMask:w.default.number,panOpenMask:w.default.number,side:w.default.oneOf(['left','right','top','bottom']),styles:w.default.object,tapToClose:w.default.bool,tweenDuration:w.default.number,tweenEasing:w.default.string,tweenHandler:w.default.func,type:w.default.oneOf(['overlay','static','displace']),useInteractionManager:w.default.bool,panStartCompensation:w.default.bool,openDrawerThreshold:w.default.any},M.defaultProps={open:null,initializeOpen:!1,type:'displace',closedDrawerOffset:0,openDrawerOffset:0,panThreshold:.25,panOpenMask:null,panCloseMask:null,tweenHandler:null,tweenDuration:250,tweenEasing:'linear',disabled:!1,negotiatePan:!1,captureGestures:'open',acceptDoubleTap:!1,acceptTap:!1,acceptPan:!0,acceptPanOnDrawer:!0,tapToClose:!1,styles:{},elevation:0,onOpen:function(){},onClose:function(){},side:'left',useInteractionManager:!1},M.contextTypes={drawer:w.default.object},M.childContextTypes={drawer:w.default.object};var P=_.StyleSheet.create({overlay:{right:0,left:0,top:0,bottom:0,position:'absolute',backgroundColor:'transparent'}})},615,[346,1,45,8,19,20,27,30,33,29,47,59,2,616]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);function n(t){this._rafLoop=this._rafLoop.bind(this),this.terminate=this.terminate.bind(this),this._t0=Date.now(),this._config=t,this._rafLoop()}m.exports=function(t){return new n(t)},n.prototype._rafLoop=function(){if(!this._break){var n=this._config,o=n.duration,s=n.start,f=n.end,h=n.easingType,_=Date.now()-this._t0;if(_>=o)return this._config.onFrame(f),void this._config.onEnd();var p=t[h](_,s,f,o);this._config.onFrame(p),requestAnimationFrame(this._rafLoop)}},n.prototype.terminate=function(){this._break=!0}},616,[617]); -__d(function(g,r,i,a,m,e,d){'use strict';var n={linear:function(n,t,u,s){return(u-t)*n/s+t},easeInQuad:function(n,t,u,s){return(u-t)*(n/=s)*n+t},easeOutQuad:function(n,t,u,s){return-(u-t)*(n/=s)*(n-2)+t},easeInOutQuad:function(n,t,u,s){var o=u-t;return(n/=s/2)<1?o/2*n*n+t:-o/2*(--n*(n-2)-1)+t},easeInCubic:function(n,t,u,s){return(u-t)*(n/=s)*n*n+t},easeOutCubic:function(n,t,u,s){return(u-t)*((n=n/s-1)*n*n+1)+t},easeInOutCubic:function(n,t,u,s){var o=u-t;return(n/=s/2)<1?o/2*n*n*n+t:o/2*((n-=2)*n*n+2)+t},easeInQuart:function(n,t,u,s){return(u-t)*(n/=s)*n*n*n+t},easeOutQuart:function(n,t,u,s){return-(u-t)*((n=n/s-1)*n*n*n-1)+t},easeInOutQuart:function(n,t,u,s){var o=u-t;return(n/=s/2)<1?o/2*n*n*n*n+t:-o/2*((n-=2)*n*n*n-2)+t},easeInQuint:function(n,t,u,s){return(u-t)*(n/=s)*n*n*n*n+t},easeOutQuint:function(n,t,u,s){return(u-t)*((n=n/s-1)*n*n*n*n+1)+t},easeInOutQuint:function(n,t,u,s){var o=u-t;return(n/=s/2)<1?o/2*n*n*n*n*n+t:o/2*((n-=2)*n*n*n*n+2)+t},easeInSine:function(n,t,u,s){var o=u-t;return-o*Math.cos(n/s*(Math.PI/2))+o+t},easeOutSine:function(n,t,u,s){return(u-t)*Math.sin(n/s*(Math.PI/2))+t},easeInOutSine:function(n,t,u,s){return-(u-t)/2*(Math.cos(Math.PI*n/s)-1)+t},easeInExpo:function(n,t,u,s){return 0==n?t:(u-t)*Math.pow(2,10*(n/s-1))+t},easeOutExpo:function(n,t,u,s){var o=u-t;return n==s?t+o:o*(1-Math.pow(2,-10*n/s))+t},easeInOutExpo:function(n,t,u,s){var o=u-t;return 0===n?t:n===s?t+o:(n/=s/2)<1?o/2*Math.pow(2,10*(n-1))+t:o/2*(2-Math.pow(2,-10*--n))+t},easeInCirc:function(n,t,u,s){return-(u-t)*(Math.sqrt(1-(n/=s)*n)-1)+t},easeOutCirc:function(n,t,u,s){return(u-t)*Math.sqrt(1-(n=n/s-1)*n)+t},easeInOutCirc:function(n,t,u,s){var o=u-t;return(n/=s/2)<1?-o/2*(Math.sqrt(1-n*n)-1)+t:o/2*(Math.sqrt(1-(n-=2)*n)+1)+t},easeInElastic:function(n,t,u,s){var o,c,h,M=u-t;return h=1.70158,c=0,o=M,0===n?t:1==(n/=s)?t+M:(c||(c=.3*s),othis.props.directionalDistanceChangeThreshold}},{key:'handlePanResponderMove',value:function(t,n){var o=n.dx,s=n.dy,l=Math.abs(o),p=Math.abs(s);if(l>this.props.directionalDistanceChangeThreshold||p>this.props.directionalDistanceChangeThreshold){if(p>l&&!this.horizontalSwipeGestureBegan)return;this.parentScrollEnabled&&(this.parentScrollEnabled=!1,this.props.setScrollEnabled&&this.props.setScrollEnabled(!1)),null===this.swipeInitialX&&(this.swipeInitialX=this._translateX._value),this.horizontalSwipeGestureBegan||(this.horizontalSwipeGestureBegan=!0,this.props.swipeGestureBegan&&this.props.swipeGestureBegan());var u=this.swipeInitialX+o;this.props.disableLeftSwipe&&u<0&&(u=0),this.props.disableRightSwipe&&u>0&&(u=0),this.props.stopLeftSwipe&&u>this.props.stopLeftSwipe&&(u=this.props.stopLeftSwipe),this.props.stopRightSwipe&&u=0?this._translateX._value>this.props.leftOpenValue*(this.props.swipeToOpenPercent/100)&&(o=this.props.leftOpenValue):this._translateX._value=0||Object.prototype.hasOwnProperty.call(t,u)&&(o[u]=t[u]);return o}function h(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}function v(t,n){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!n||"object"!=typeof n&&"function"!=typeof n?t:n}function _(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function, not "+typeof n);t.prototype=Object.create(n&&n.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),n&&(Object.setPrototypeOf?Object.setPrototypeOf(t,n):t.__proto__=n)}var O=(function(f){function l(){return h(this,l),v(this,(l.__proto__||Object.getPrototypeOf(l)).apply(this,arguments))}return _(l,o.Component),n(l,[{key:'render',value:function(){var n=this,o=this.props,f=o.uppercase,l=o.children,s=b(o,['uppercase','children']),y=void 0;return y=f?u.default.Children.map(l,function(t){return p.default.isString(t)?p.default.toUpper(t):t}):l,u.default.createElement(c.Text,t({ref:function(t){return n._root=t}},s,{__source:{fileName:"src/basic/Text.js",lineNumber:26}}),y)}}]),l})();O.propTypes=t({},c.Text.propTypes,{uppercase:f.default.bool,style:f.default.oneOfType([f.default.object,f.default.number,f.default.array])}),O.defaultProps={uppercase:!1};var j=(0,l.connectStyle)('NativeBase.Text',{},s.default)(O);e.Text=j},624,[47,59,2,552,538,619]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.ViewNB=void 0;var t=Object.assign||function(t){for(var n=1;n0?this.props.activeOpacity:f.default.buttonDefaultActiveOpacity,__source:{fileName:t,lineNumber:80}}),p);if(this.props.rounded){var c=o({},this.prepareRootProps().style),h=this.props.full||this.props.block?f.default.buttonDefaultFlex:c.flex;return u.default.createElement(s.View,{style:[{maxHeight:c.height},c,{paddingTop:void 0,paddingBottom:void 0}],__source:{fileName:t,lineNumber:100}},u.default.createElement(s.TouchableNativeFeedback,o({ref:function(t){return n._root=t},background:s.TouchableNativeFeedback.Ripple(this.props.androidRippleColor||l.androidRippleColor,!0)},this.prepareRootProps(),{__source:{fileName:t,lineNumber:107}}),u.default.createElement(s.View,{style:[N.childContainer,{paddingTop:c.paddingTop,paddingBottom:c.paddingBottom,height:c.height,flexGrow:h}],__source:{fileName:t,lineNumber:115}},p)))}return u.default.createElement(s.TouchableNativeFeedback,o({ref:function(t){return n._root=t},onPress:this.props.onPress,background:this.props.transparent?s.TouchableNativeFeedback.Ripple('transparent'):s.TouchableNativeFeedback.Ripple(l.androidRippleColor,!1)},this.prepareRootProps(),{__source:{fileName:t,lineNumber:134}}),u.default.createElement(s.View,o({},this.prepareRootProps(),{__source:{fileName:t,lineNumber:147}}),p))}}]),c})();R.contextTypes={theme:p.default.object},R.propTypes=o({},s.TouchableOpacity.propTypes,{style:p.default.oneOfType([p.default.object,p.default.number,p.default.array]),block:p.default.bool,primary:p.default.bool,transparent:p.default.bool,success:p.default.bool,danger:p.default.bool,warning:p.default.bool,info:p.default.bool,bordered:p.default.bool,disabled:p.default.bool,rounded:p.default.bool,large:p.default.bool,small:p.default.bool,active:p.default.bool});var N=s.StyleSheet.create({childContainer:{flexShrink:1,flexDirection:'row',justifyContent:'center',alignItems:'center'}}),w=(0,c.connectStyle)('NativeBase.Button',{},y.default)(R);e.Button=w},626,[47,59,2,538,565,575,627,619,624]); -__d(function(g,r,i,a,m,e,d){'use_strict';var t,l=r(d[0]),f=(t=l)&&t.__esModule?t:{default:t},u=r(d[1]);m.exports=function(t,l){var n={},s=f.default.clone(t);delete s.children;var y=t.style;if(delete s.style,t?f.default.assign(n,l,t):n=l,y){var o={};n.style={},Array.isArray(y)?f.default.forEach(y,function(t){'number'==typeof t?f.default.merge(o,u.StyleSheet.flatten(t)):f.default.merge(o,t)}):o='number'==typeof y?u.StyleSheet.flatten(y):y,f.default.merge(n.style,l.style,o)}return n}},627,[552,2]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.DatePicker=void 0;var n='src/basic/DatePicker.js',o=(function(){function t(t,n){for(var o=0;o1&&void 0!==v[1]?v[1]:S,o=v.length>2&&void 0!==v[2]?v[2]:N,(0,b.default)(),u=k(t),c=(0,I.processColor)(o),s=u+":"+n+":"+c,!A.has(s)){h.next=8;break}return h.abrupt("return",A.get(s));case 8:return h.prev=8,h.next=11,l.default.awrap(P.getImageForFont(E,u,n,c));case 11:return f=h.sent,p={uri:f,scale:I.PixelRatio.get()},A.setValue(s,p),h.abrupt("return",p);case 17:throw h.prev=17,h.t0=h.catch(8),A.setError(s,h.t0),h.t0;case 21:case"end":return h.stop()}},null,this,[[8,17]])}return T.Button=(0,F.default)(T),T.TabBarItem=(0,O.default)(R,L),T.TabBarItemIOS=T.TabBarItem,T.getImageSource=L,T.getImageSourceSync=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:S,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:N;(0,b.default)();var l=k(t),u=(0,I.processColor)(o),c=l+":"+n+":"+u;if(A.has(c))return A.get(c);try{var s=P.getImageForFontSync(E,l,n,u),f={uri:s,scale:I.PixelRatio.get()};return A.setValue(c,f),f}catch(t){throw A.setError(c,t),t}},T.loadFont=function(){var t,n=arguments;return l.default.async(function(u){for(;;)switch(u.prev=u.next){case 0:if(t=n.length>0&&void 0!==n[0]?n[0]:_,'ios'!==I.Platform.OS){u.next=7;break}if((0,b.default)(),t){u.next=5;break}throw new Error('Unable to load font, because no file was specified. ');case 5:return u.next=7,l.default.awrap(P.loadFontWithFileName.apply(P,(0,o.default)(t.split('.'))));case 7:case"end":return u.stop()}},null,this)},T.hasIcon=function(n){return Object.prototype.hasOwnProperty.call(t,n)},T.getRawGlyphMap=function(){return t},T.getFontFamily=function(){return E},T},e.DEFAULT_ICON_COLOR=e.DEFAULT_ICON_SIZE=e.NativeIconAPI=void 0;var o=n(r(d[2])),l=n(r(d[3])),u=n(r(d[4])),c=n(r(d[5])),s=n(r(d[6])),f=n(r(d[7])),p=n(r(d[8])),v=n(r(d[9])),h=t(r(d[10])),y=n(r(d[11])),I=r(d[12]),b=n(r(d[13])),w=n(r(d[14])),F=n(r(d[15])),O=n(r(d[16])),P=I.NativeModules.RNVectorIconsManager||I.NativeModules.RNVectorIconsModule;e.NativeIconAPI=P;var S=12;e.DEFAULT_ICON_SIZE=S;var N='black';e.DEFAULT_ICON_COLOR=N},633,[346,1,15,139,6,19,20,27,30,33,47,59,634,635,636,637,641]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0});var t=r(d[0]);Object.keys(t).forEach(function(n){"default"!==n&&"__esModule"!==n&&Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[n]}})})},634,[2]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){if(!n){if('android'===o.Platform.OS)throw new Error('RNVectorIconsModule not available, did you properly integrate the module? Try running `react-native link react-native-vector-icons` and recompiling.');throw new Error('RNVectorIconsManager not available, did you add the library to your project and link with libRNVectorIcons.a? Try running `react-native link react-native-vector-icons` and recompiling.')}};var o=r(d[0]),n=o.NativeModules.RNVectorIconsManager||o.NativeModules.RNVectorIconsModule},635,[634]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){var u=new Map;return{setValue:function(n,o){return u.set(n,{type:t,data:o})},setError:function(t,o){return u.set(t,{type:n,data:o})},has:function(t){return u.has(t)},get:function(t){if(u.has(t)){var o=u.get(t),f=o.type,s=o.data;if(f===n)throw s;return s}}}};var t='value',n='error'},636,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]),l=r(d[1]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){var l,T;return T=l=(function(l){function S(){return(0,s.default)(this,S),(0,c.default)(this,(0,f.default)(S).apply(this,arguments))}return(0,y.default)(S,l),(0,u.default)(S,[{key:"render",value:function(){var l=this.props,s=l.style,u=l.iconStyle,c=l.children,f=(0,o.default)(l,["style","iconStyle","children"]),y=(0,h.default)(f,F,'style','name','size','color'),S=(0,h.default)(f,O),k=(0,p.default)(f,Object.keys(y),Object.keys(S),'iconStyle','borderRadius','backgroundColor');y.style=u?[C.icon,u]:C.icon;var T=(0,h.default)(this.props,'color'),x=(0,h.default)(this.props,'backgroundColor','borderRadius');return P.default.createElement(v.TouchableHighlight,(0,n.default)({style:[C.touchable,x]},S),P.default.createElement(v.View,(0,n.default)({style:[C.container,x,s]},k),P.default.createElement(t,y),(0,b.default)(c)?P.default.createElement(v.Text,{style:[C.text,T]},c):c))}}]),S})(P.PureComponent),l.propTypes={backgroundColor:S.default.oneOfType([S.default.string,S.default.number]),borderRadius:S.default.number,color:S.default.any,size:S.default.number,iconStyle:S.default.any,style:S.default.any,children:S.default.node},l.defaultProps={backgroundColor:k,borderRadius:5,color:'white',size:20},T};var n=l(r(d[2])),o=l(r(d[3])),s=l(r(d[4])),u=l(r(d[5])),c=l(r(d[6])),f=l(r(d[7])),y=l(r(d[8])),b=l(r(d[9])),p=l(r(d[10])),h=l(r(d[11])),P=t(r(d[12])),S=l(r(d[13])),v=r(d[14]),C=v.StyleSheet.create({container:{flexDirection:'row',justifyContent:'flex-start',alignItems:'center',padding:8},touchable:{overflow:'hidden'},icon:{marginRight:10},text:{fontWeight:'600',backgroundColor:'transparent'}}),k='#007AFF',F=['ellipsizeMode','numberOfLines','textBreakStrategy','selectable','suppressHighlighting','allowFontScaling','adjustsFontSizeToFit','minimumFontScale'],O=['accessible','accessibilityLabel','accessibilityHint','accessibilityComponentType','accessibilityRole','accessibilityStates','accessibilityTraits','onFocus','onBlur','disabled','onPress','onPressIn','onPressOut','onLayout','onLongPress','nativeID','testID','delayPressIn','delayPressOut','delayLongPress','activeOpacity','underlayColor','selectionColor','onShowUnderlay','onHideUnderlay','hasTVPreferredFocus','tvParallaxProperties']},637,[346,1,8,6,19,20,27,30,33,638,639,640,47,59,634]); -__d(function(g,r,i,a,m,e,d){var t='[object String]',n=Object.prototype.toString,o=Array.isArray;function c(t){return!!t&&'object'==typeof t}m.exports=function(f){return'string'==typeof f||!o(f)&&c(f)&&n.call(f)==t}},638,[]); -__d(function(g,r,i,a,m,e,d){var t=200,n='__lodash_hash_undefined__',o=9007199254740991,u='[object Arguments]',c='[object Function]',f='[object GeneratorFunction]',l='[object Symbol]',s=/^\[object .+?Constructor\]$/,h=/^(?:0|[1-9]\d*)$/,p='object'==typeof g&&g&&g.Object===Object&&g,_='object'==typeof self&&self&&self.Object===Object&&self,y=p||_||Function('return this')();function v(t,n,o){switch(o.length){case 0:return t.call(n);case 1:return t.call(n,o[0]);case 2:return t.call(n,o[0],o[1]);case 3:return t.call(n,o[0],o[1],o[2])}return t.apply(n,o)}function b(t,n){return!!(t?t.length:0)&&A(t,n,0)>-1}function j(t,n,o){for(var u=-1,c=t?t.length:0;++u=t&&(s=x,h=!1,o=new tt(o));t:for(;++l0&&o(s)?n>1?ot(s,n-1,o,u,c):S(c,s):u||(c[c.length]=s)}return c}function ut(t,n,o){var u=n(t);return Ot(t)?u:S(u,o(t))}function it(t){return!(!$t(t)||T&&T in t)&&(wt(t)||C(t)?D:s).test(bt(t))}function at(t){if(!$t(t))return gt(t);var n,o,u,c=(o=(n=t)&&n.constructor,u='function'==typeof o&&o.prototype||R,n===u),f=[];for(var l in t)('constructor'!=l||!c&&z.call(t,l))&&f.push(l);return f}function ct(t,n){return ft(t=Object(t),n,function(n,o){return o in t})}function ft(t,n,o){for(var u=-1,c=n.length,f={};++u-1},Y.prototype.set=function(t,n){var o=this.__data__,u=nt(o,t);return u<0?o.push([t,n]):o[u][1]=n,this},Z.prototype.clear=function(){this.__data__={hash:new X,map:new(V||Y),string:new X}},Z.prototype.delete=function(t){return st(this,t).delete(t)},Z.prototype.get=function(t){return st(this,t).get(t)},Z.prototype.has=function(t){return st(this,t).has(t)},Z.prototype.set=function(t,n){return st(this,t).set(t,n),this},tt.prototype.add=tt.prototype.push=function(t){return this.__data__.set(t,n),this},tt.prototype.has=function(t){return this.__data__.has(t)};var pt=Q?E(Q,Object):It,_t=Q?function(t){for(var n=[];t;)S(n,pt(t)),t=J(t);return n}:It;function yt(t){return Ot(t)||jt(t)||!!(N&&t&&t[N])}function vt(t,n){return!!(n=null==n?o:n)&&('number'==typeof t||h.test(t))&&t>-1&&t%1==0&&t-1&&t%1==0&&t<=o}function $t(t){var n=typeof t;return!!t&&('object'==n||'function'==n)}function Pt(t){return!!t&&'object'==typeof t}function xt(t){return'symbol'==typeof t||Pt(t)&&B.call(t)==l}function Ft(t){return mt(t)?rt(t,!0):at(t)}var Ct,Et,kt=(Ct=function(t,n){return null==t?{}:(n=O(ot(n,1),dt),ct(t,et(lt(t),n)))},Et=U(void 0===Et?Ct.length-1:Et,0),function(){for(var t=arguments,n=-1,o=U(t.length-Et,0),u=Array(o);++n0&&o(b)?n>1?w(b,n-1,o,c,u):p(u,b):c||(u[u.length]=b)}return u}function x(t,n){return C(t=Object(t),n,function(n,o){return o in t})}function C(t,n,o){for(var c=-1,u=n.length,l={};++c-1&&n%1==0&&n<=t}function z(t){var n=typeof t;return!!t&&('object'==n||'function'==n)}function B(t){return!!t&&'object'==typeof t}function D(t){return'symbol'==typeof t||B(t)&&j.call(t)==u}var H,J,K=(H=function(t,n){return null==t?{}:x(t,y(w(n,1),E))},J=F(void 0===J?H.length-1:J,0),function(){for(var t=arguments,n=-1,o=F(t.length-J,0),c=Array(o);++nh))return!1;var v=l.get(t);if(v&&l.get(u))return v==u;var y=-1,b=!0,j=c&o?new Mt:void 0;for(l.set(t,u),l.set(u,t);++y-1},$t.prototype.set=function(t,n){var o=this.__data__,u=Bt(o,t);return u<0?(++this.size,o.push([t,n])):o[u][1]=n,this},xt.prototype.clear=function(){this.size=0,this.__data__={hash:new Ft,map:new(dt||$t),string:new Ft}},xt.prototype.delete=function(t){var n=Jt(this,t).delete(t);return this.size-=n?1:0,n},xt.prototype.get=function(t){return Jt(this,t).get(t)},xt.prototype.has=function(t){return Jt(this,t).has(t)},xt.prototype.set=function(t,n){var o=Jt(this,t),u=o.size;return o.set(t,n),this.size+=o.size==u?0:1,this},Mt.prototype.add=Mt.prototype.push=function(n){return this.__data__.set(n,t),this},Mt.prototype.has=function(t){return this.__data__.has(t)},Tt.prototype.clear=function(){this.__data__=new $t,this.size=0},Tt.prototype.delete=function(t){var n=this.__data__,o=n.delete(t);return this.size=n.size,o},Tt.prototype.get=function(t){return this.__data__.get(t)},Tt.prototype.has=function(t){return this.__data__.has(t)},Tt.prototype.set=function(t,n){var o=this.__data__;if(o instanceof $t){var u=o.__data__;if(!dt||u.length<199)return u.push([t,n]),this.size=++o.size,this;o=this.__data__=new xt(u)}return o.set(t,n),this.size=o.size,this};var Xt=pt?function(t){return null==t?[]:(t=Object(t),N(pt(t),function(n){return lt.call(t,n)}))}:function(){return[]},Yt=Lt;function Zt(t,n){return!!(n=null==n?u:n)&&('number'==typeof t||x.test(t))&&t>-1&&t%1==0&&t-1&&t%1==0&&t<=u}function ce(t){var n=typeof t;return null!=t&&('object'==n||'function'==n)}function se(t){return null!=t&&'object'==typeof t}var fe=C?(function(t){return function(n){return t(n)}})(C):function(t){return se(t)&&ue(t.length)&&!!M[Lt(t)]};function le(t){return null!=(n=t)&&ue(n.length)&&!ae(n)?Ut(t):Nt(t);var n}m.exports=function(t,n){return Dt(t,n)}},642,[]); -__d(function(e,o,r,a,c,l,i){c.exports={stepforward:58880,stepbackward:58881,forward:58882,banckward:58883,caretright:58884,caretleft:58885,caretdown:58886,caretup:58887,rightcircle:58888,leftcircle:58889,upcircle:58890,downcircle:58891,rightcircleo:58892,leftcircleo:58893,upcircleo:58894,downcircleo:58895,verticleleft:58896,verticleright:58897,back:58898,retweet:58899,shrink:58900,arrowsalt:58901,doubleright:58903,doubleleft:58904,arrowdown:58905,arrowup:58906,arrowright:58907,arrowleft:58908,down:58909,up:58910,right:58911,left:58912,minussquareo:58913,minuscircle:58914,minuscircleo:58915,minus:58916,pluscircleo:58917,pluscircle:58918,plus:58919,infocirlce:58920,infocirlceo:58921,info:58922,exclamation:58923,exclamationcircle:58924,exclamationcircleo:58925,closecircle:58926,closecircleo:58927,checkcircle:58928,checkcircleo:58929,check:58930,close:58931,customerservice:58932,creditcard:58933,codesquareo:58934,book:58935,barschart:58936,bars:58937,question:58938,questioncircle:58939,questioncircleo:58940,pause:58941,pausecircle:58942,pausecircleo:58943,clockcircle:58944,clockcircleo:58945,swap:58946,swapleft:58947,swapright:58948,plussquareo:58949,frown:58950,menufold:58968,mail:58969,link:58971,areachart:58972,linechart:58973,home:58974,laptop:58975,star:58976,staro:58977,filter:58979,meho:58982,meh:58983,shoppingcart:58984,save:58985,user:58986,videocamera:58987,totop:58988,team:58989,sharealt:58993,setting:58994,picture:58996,phone:58997,paperclip:58998,notification:58999,menuunfold:59001,inbox:59002,lock:59003,qrcode:59004,tags:59005,tagso:59006,cloudo:59007,cloud:59008,cloudupload:59009,clouddownload:59010,clouddownloado:59011,clouduploado:59012,enviroment:59013,enviromento:59014,eye:59015,eyeo:59016,camera:59017,camerao:59018,windows:59019,export2:59024,export:59025,circledowno:59027,circledown:59028,hdd:59034,ie:59035,delete:59039,enter:59040,pushpino:59041,pushpin:59042,heart:59043,hearto:59044,"smile-circle":59047,smileo:59048,frowno:59049,calculator:59050,chrome:59052,github:59053,iconfontdesktop:59060,caretcircleoup:59061,upload:59062,download:59063,piechart:59064,lock1:59065,unlock:59066,windowso:59068,dotchart:59069,barchart:59070,codesquare:59071,plussquare:59072,minussquare:59073,closesquare:59074,closesquareo:59075,checksquare:59076,checksquareo:59077,fastbackward:59078,fastforward:59079,upsquare:59080,downsquare:59081,leftsquare:59082,rightsquare:59083,rightsquareo:59084,leftsquareo:59085,"down-square-o":59086,"up-square-o":59087,play:59088,playcircleo:59089,tag:59090,tago:59091,addfile:59664,folder1:58978,file1:58980,switcher:59667,addfolder:59668,folderopen:59033,search1:58992,ellipsis1:58951,calendar:59067,filetext1:59032,copy1:58952,jpgfile1:59036,pdffile1:59059,exclefile1:59056,pptfile1:59057,unknowfile1:59055,wordfile1:59058,dingding:59683,"dingding-o":59685,mobile1:59e3,tablet1:58990,bells:58958,disconnect:58959,database:58960,barcode:58962,hourglass:58963,key:58964,flag:58965,layout:58966,printer:58995,USB:59095,skin:59096,tool:59097,car:59100,addusergroup:59101,carryout:59103,deleteuser:59104,deleteusergroup:59105,man:59106,isv:59107,gift:59108,idcard:59109,medicinebox:59110,redenvelopes:59111,rest:59112,Safety:59114,wallet:59115,woman:59116,adduser:59117,bank:59118,Trophy:59119,loading1:59054,loading2:58957,like2:59037,dislike2:59038,like1:58956,dislike1:58955,bulb1:58953,rocket1:59663,select1:58954,apple1:59020,"apple-o":59092,android1:59704,android:59021,"aliwangwang-o1":59023,aliwangwang:59022,"pay-circle1":59045,"pay-circle-o1":59046,poweroff:59093,trademark:58961,find:59099,copyright:59102,sound:59113,earth:59121,wifi:59094,sync:59098,login:58967,logout:58970,reload1:58902,message1:59051,shake:59727,API:59729,"appstore-o":59029,appstore1:59030,scan1:59031,exception1:58981,contacts:59120,solution1:58991,fork:59122,edit:59026,form:59798,warning:59799,table:59800,profile:59801,dashboard:59802,"indent-left":59814,"indent-right":59815,"menu-unfold":59820,"menu-fold":59821,antdesign:59826,"alipay-square":59827,"codepen-circle":59828,google:59829,amazon:59830,codepen:59831,"facebook-square":59832,dropbox:59833,googleplus:59834,"linkedin-square":59835,"medium-monogram":59836,gitlab:59837,"medium-wordmark":59838,QQ:59839,skype:59840,"taobao-square":59841,"alipay-circle":59842,youtube:59843,wechat:59844,twitter:59845,weibo:59846,HTML:59847,"taobao-circle":59123,"weibo-circle":59124,"weibo-square":59125,CodeSandbox:59860,aliyun:59892,zhihu:59139,behance:59143,dribbble:59145,"dribbble-square":59146,"behance-square":59144,"file-markdown":59140,instagram:59147,yuque:59148,slack:59141,"slack-square":59142}},643,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.getImageSourceSync=e.getImageSource=e.TabBarItemIOS=e.TabBarItem=e.Button=e.default=void 0;var u=t(r(d[1])),o=t(r(d[2])),I=(0,u.default)(o.default,'Entypo','Entypo.ttf'),S=I;e.default=S;var c=I.Button,n=I.TabBarItem,B=I.TabBarItemIOS,b=I.getImageSource,f=I.getImageSourceSync;e.getImageSourceSync=f,e.getImageSource=b,e.TabBarItemIOS=B,e.TabBarItem=n,e.Button=c},644,[1,633,645]); -__d(function(e,r,o,i,t,l,a){t.exports={"500px":61696,"500px-with-circle":61697,"add-to-list":61698,"add-user":61699,address:61700,adjust:61701,air:61702,aircraft:61703,"aircraft-landing":61704,"aircraft-take-off":61705,"align-bottom":61706,"align-horizontal-middle":61707,"align-left":61708,"align-right":61709,"align-top":61710,"align-vertical-middle":61711,"app-store":61712,archive:61713,"area-graph":61714,"arrow-bold-down":61715,"arrow-bold-left":61716,"arrow-bold-right":61717,"arrow-bold-up":61718,"arrow-down":61719,"arrow-left":61720,"arrow-long-down":61721,"arrow-long-left":61722,"arrow-long-right":61723,"arrow-long-up":61724,"arrow-right":61725,"arrow-up":61726,"arrow-with-circle-down":61727,"arrow-with-circle-left":61728,"arrow-with-circle-right":61729,"arrow-with-circle-up":61730,attachment:61731,"awareness-ribbon":61732,back:61733,"back-in-time":61734,baidu:61735,"bar-graph":61736,basecamp:61737,battery:61738,"beamed-note":61739,behance:61740,bell:61741,blackboard:61742,block:61743,book:61744,bookmark:61745,bookmarks:61746,bowl:61747,box:61748,briefcase:61749,browser:61750,brush:61751,bucket:61752,bug:61753,cake:61754,calculator:61755,calendar:61756,camera:61757,ccw:61758,chat:61759,check:61760,"chevron-down":61761,"chevron-left":61762,"chevron-right":61763,"chevron-small-down":61764,"chevron-small-left":61765,"chevron-small-right":61766,"chevron-small-up":61767,"chevron-thin-down":61768,"chevron-thin-left":61769,"chevron-thin-right":61770,"chevron-thin-up":61771,"chevron-up":61772,"chevron-with-circle-down":61773,"chevron-with-circle-left":61774,"chevron-with-circle-right":61775,"chevron-with-circle-up":61776,circle:61777,"circle-with-cross":61778,"circle-with-minus":61779,"circle-with-plus":61780,"circular-graph":61781,clapperboard:61782,"classic-computer":61783,clipboard:61784,clock:61785,cloud:61786,code:61787,cog:61788,colours:61789,compass:61790,"controller-fast-backward":61791,"controller-fast-forward":61792,"controller-jump-to-start":61793,"controller-next":61794,"controller-paus":61795,"controller-play":61796,"controller-record":61797,"controller-stop":61798,"controller-volume":61799,copy:61800,"creative-cloud":61801,"creative-commons":61802,"creative-commons-attribution":61803,"creative-commons-noderivs":61804,"creative-commons-noncommercial-eu":61805,"creative-commons-noncommercial-us":61806,"creative-commons-public-domain":61807,"creative-commons-remix":61808,"creative-commons-share":61809,"creative-commons-sharealike":61810,credit:61811,"credit-card":61812,crop:61813,cross:61814,cup:61815,cw:61816,cycle:61817,database:61818,"dial-pad":61819,direction:61820,document:61821,"document-landscape":61822,documents:61823,"dot-single":61824,"dots-three-horizontal":61825,"dots-three-vertical":61826,"dots-two-horizontal":61827,"dots-two-vertical":61828,download:61829,dribbble:61830,"dribbble-with-circle":61831,drink:61832,drive:61833,drop:61834,dropbox:61835,edit:61836,email:61837,"emoji-flirt":61838,"emoji-happy":61839,"emoji-neutral":61840,"emoji-sad":61841,erase:61842,eraser:61843,evernote:61844,export:61845,eye:61846,"eye-with-line":61847,facebook:61848,"facebook-with-circle":61849,feather:61850,fingerprint:61851,flag:61852,flash:61853,flashlight:61854,"flat-brush":61855,flattr:61856,flickr:61857,"flickr-with-circle":61858,"flow-branch":61859,"flow-cascade":61860,"flow-line":61861,"flow-parallel":61862,"flow-tree":61863,flower:61864,folder:61865,"folder-images":61866,"folder-music":61867,"folder-video":61868,forward:61869,foursquare:61870,funnel:61871,"game-controller":61872,gauge:61873,github:61874,"github-with-circle":61875,globe:61876,"google-":61877,"google--with-circle":61878,"google-drive":61879,"google-hangouts":61880,"google-play":61881,"graduation-cap":61882,grid:61883,grooveshark:61884,"hair-cross":61885,hand:61886,heart:61887,"heart-outlined":61888,help:61889,"help-with-circle":61890,home:61891,"hour-glass":61892,houzz:61893,icloud:61894,image:61895,"image-inverted":61896,images:61897,inbox:61898,infinity:61899,info:61900,"info-with-circle":61901,instagram:61902,"instagram-with-circle":61903,install:61904,key:61905,keyboard:61906,"lab-flask":61907,landline:61908,language:61909,laptop:61910,lastfm:61911,"lastfm-with-circle":61912,layers:61913,leaf:61914,"level-down":61915,"level-up":61916,lifebuoy:61917,"light-bulb":61918,"light-down":61919,"light-up":61920,"line-graph":61921,link:61922,linkedin:61923,"linkedin-with-circle":61924,list:61925,location:61926,"location-pin":61927,lock:61928,"lock-open":61929,"log-out":61930,login:61931,loop:61932,magnet:61933,"magnifying-glass":61934,mail:61935,"mail-with-circle":61936,man:61937,map:61938,mask:61939,medal:61940,medium:61941,"medium-with-circle":61942,megaphone:61943,menu:61944,merge:61945,message:61946,mic:61947,minus:61948,mixi:61949,mobile:61950,"modern-mic":61951,moon:61952,mouse:61953,"mouse-pointer":61954,music:61955,network:61956,new:61957,"new-message":61958,news:61959,newsletter:61960,note:61961,notification:61962,"notifications-off":61963,"old-mobile":61964,"old-phone":61965,onedrive:61966,"open-book":61967,palette:61968,"paper-plane":61969,paypal:61970,pencil:61971,phone:61972,picasa:61973,"pie-chart":61974,pin:61975,pinterest:61976,"pinterest-with-circle":61977,plus:61978,popup:61979,"power-plug":61980,"price-ribbon":61981,"price-tag":61982,print:61983,"progress-empty":61984,"progress-full":61985,"progress-one":61986,"progress-two":61987,publish:61988,qq:61989,"qq-with-circle":61990,quote:61991,radio:61992,raft:61993,"raft-with-circle":61994,rainbow:61995,rdio:61996,"rdio-with-circle":61997,"remove-user":61998,renren:61999,reply:62e3,"reply-all":62001,"resize-100-":62002,"resize-full-screen":62003,retweet:62004,rocket:62005,"round-brush":62006,rss:62007,ruler:62008,save:62009,scissors:62010,scribd:62011,"select-arrows":62012,share:62013,"share-alternative":62014,shareable:62015,shield:62016,shop:62017,"shopping-bag":62018,"shopping-basket":62019,"shopping-cart":62020,shuffle:62021,signal:62022,"sina-weibo":62023,skype:62024,"skype-with-circle":62025,slideshare:62026,smashing:62027,sound:62028,"sound-mix":62029,"sound-mute":62030,soundcloud:62031,"sports-club":62032,spotify:62033,"spotify-with-circle":62034,spreadsheet:62035,"squared-cross":62036,"squared-minus":62037,"squared-plus":62038,star:62039,"star-outlined":62040,stopwatch:62041,stumbleupon:62042,"stumbleupon-with-circle":62043,suitcase:62044,swap:62045,swarm:62046,sweden:62047,switch:62048,tablet:62049,"tablet-mobile-combo":62050,tag:62051,text:62052,"text-document":62053,"text-document-inverted":62054,thermometer:62055,"thumbs-down":62056,"thumbs-up":62057,"thunder-cloud":62058,ticket:62059,"time-slot":62060,tools:62061,"traffic-cone":62062,trash:62063,tree:62064,"triangle-down":62065,"triangle-left":62066,"triangle-right":62067,"triangle-up":62068,tripadvisor:62069,trophy:62070,tumblr:62071,"tumblr-with-circle":62072,tv:62073,twitter:62074,"twitter-with-circle":62075,typing:62076,uninstall:62077,unread:62078,untag:62079,upload:62080,"upload-to-cloud":62081,user:62082,users:62083,"v-card":62084,video:62085,"video-camera":62086,vimeo:62087,"vimeo-with-circle":62088,vine:62089,"vine-with-circle":62090,vinyl:62091,vk:62092,"vk-alternitive":62093,"vk-with-circle":62094,voicemail:62095,wallet:62096,warning:62097,water:62098,"windows-store":62099,xing:62100,"xing-with-circle":62101,yelp:62102,youko:62103,"youko-with-circle":62104,youtube:62105,"youtube-with-circle":62106}},645,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.getImageSourceSync=e.getImageSource=e.TabBarItemIOS=e.TabBarItem=e.Button=e.default=void 0;var I=t(r(d[1])),u=t(r(d[2])),o=(0,I.default)(u.default,'EvilIcons','EvilIcons.ttf'),c=o;e.default=c;var S=o.Button,n=o.TabBarItem,B=o.TabBarItemIOS,l=o.getImageSource,b=o.getImageSourceSync;e.getImageSourceSync=b,e.getImageSource=l,e.TabBarItemIOS=B,e.TabBarItem=n,e.Button=S},646,[1,633,647]); -__d(function(e,r,c,o,s,n,a){s.exports={archive:61696,"arrow-down":61697,"arrow-left":61698,"arrow-right":61699,"arrow-up":61700,bell:61701,calendar:61702,camera:61703,cart:61704,chart:61705,check:61706,"chevron-down":61707,"chevron-left":61708,"chevron-right":61709,"chevron-up":61710,clock:61711,close:61712,"close-o":61713,comment:61714,"credit-card":61715,envelope:61716,exclamation:61717,"external-link":61718,eye:61719,gear:61720,heart:61721,image:61722,like:61723,link:61724,location:61725,lock:61726,minus:61727,navicon:61728,paperclip:61729,pencil:61730,play:61731,plus:61732,pointer:61733,question:61734,redo:61735,refresh:61736,retweet:61737,"sc-facebook":61738,"sc-github":61739,"sc-google-plus":61740,"sc-instagram":61741,"sc-linkedin":61742,"sc-odnoklassniki":61743,"sc-pinterest":61744,"sc-skype":61745,"sc-soundcloud":61746,"sc-telegram":61747,"sc-tumblr":61748,"sc-twitter":61749,"sc-vimeo":61750,"sc-vk":61751,"sc-youtube":61752,search:61753,"share-apple":61754,"share-google":61755,spinner:61756,"spinner-2":61757,"spinner-3":61758,star:61759,tag:61760,trash:61761,trophy:61762,undo:61763,unlock:61764,user:61765}},647,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.getImageSourceSync=e.getImageSource=e.TabBarItemIOS=e.TabBarItem=e.Button=e.default=void 0;var u=t(r(d[1])),I=t(r(d[2])),o=(0,u.default)(I.default,'Feather','Feather.ttf'),S=o;e.default=S;var c=o.Button,n=o.TabBarItem,B=o.TabBarItemIOS,b=o.getImageSource,f=o.getImageSourceSync;e.getImageSourceSync=f,e.getImageSource=b,e.TabBarItemIOS=B,e.TabBarItem=n,e.Button=c},648,[1,633,649]); -__d(function(e,r,o,i,a,l,t){a.exports={activity:61696,airplay:61697,"alert-circle":61698,"alert-octagon":61699,"alert-triangle":61700,"align-center":61701,"align-justify":61702,"align-left":61703,"align-right":61704,anchor:61705,aperture:61706,archive:61707,"arrow-down":61708,"arrow-down-circle":61709,"arrow-down-left":61710,"arrow-down-right":61711,"arrow-left":61712,"arrow-left-circle":61713,"arrow-right":61714,"arrow-right-circle":61715,"arrow-up":61716,"arrow-up-circle":61717,"arrow-up-left":61718,"arrow-up-right":61719,"at-sign":61720,award:61721,"bar-chart":61722,"bar-chart-2":61723,battery:61724,"battery-charging":61725,bell:61726,"bell-off":61727,bluetooth:61728,bold:61729,book:61730,"book-open":61731,bookmark:61732,box:61733,briefcase:61734,calendar:61735,camera:61736,"camera-off":61737,cast:61738,check:61739,"check-circle":61740,"check-square":61741,"chevron-down":61742,"chevron-left":61743,"chevron-right":61744,"chevron-up":61745,"chevrons-down":61746,"chevrons-left":61747,"chevrons-right":61748,"chevrons-up":61749,chrome:61750,circle:61751,clipboard:61752,clock:61753,cloud:61754,"cloud-drizzle":61755,"cloud-lightning":61756,"cloud-off":61757,"cloud-rain":61758,"cloud-snow":61759,code:61760,codepen:61761,codesandbox:61762,coffee:61763,columns:61764,command:61765,compass:61766,copy:61767,"corner-down-left":61768,"corner-down-right":61769,"corner-left-down":61770,"corner-left-up":61771,"corner-right-down":61772,"corner-right-up":61773,"corner-up-left":61774,"corner-up-right":61775,cpu:61776,"credit-card":61777,crop:61778,crosshair:61779,database:61780,delete:61781,disc:61782,divide:61783,"divide-circle":61784,"divide-square":61785,"dollar-sign":61786,download:61787,"download-cloud":61788,dribbble:61789,droplet:61790,edit:61791,"edit-2":61792,"edit-3":61793,"external-link":61794,eye:61795,"eye-off":61796,facebook:61797,"fast-forward":61798,feather:61799,figma:61800,file:61801,"file-minus":61802,"file-plus":61803,"file-text":61804,film:61805,filter:61806,flag:61807,folder:61808,"folder-minus":61809,"folder-plus":61810,framer:61811,frown:61812,gift:61813,"git-branch":61814,"git-commit":61815,"git-merge":61816,"git-pull-request":61817,github:61818,gitlab:61819,globe:61820,grid:61821,"hard-drive":61822,hash:61823,headphones:61824,heart:61825,"help-circle":61826,hexagon:61827,home:61828,image:61829,inbox:61830,info:61831,instagram:61832,italic:61833,key:61834,layers:61835,layout:61836,"life-buoy":61837,link:61838,"link-2":61839,linkedin:61840,list:61841,loader:61842,lock:61843,"log-in":61844,"log-out":61845,mail:61846,map:61847,"map-pin":61848,maximize:61849,"maximize-2":61850,meh:61851,menu:61852,"message-circle":61853,"message-square":61854,mic:61855,"mic-off":61856,minimize:61857,"minimize-2":61858,minus:61859,"minus-circle":61860,"minus-square":61861,monitor:61862,moon:61863,"more-horizontal":61864,"more-vertical":61865,"mouse-pointer":61866,move:61867,music:61868,navigation:61869,"navigation-2":61870,octagon:61871,package:61872,paperclip:61873,pause:61874,"pause-circle":61875,"pen-tool":61876,percent:61877,phone:61878,"phone-call":61879,"phone-forwarded":61880,"phone-incoming":61881,"phone-missed":61882,"phone-off":61883,"phone-outgoing":61884,"pie-chart":61885,play:61886,"play-circle":61887,plus:61888,"plus-circle":61889,"plus-square":61890,pocket:61891,power:61892,printer:61893,radio:61894,"refresh-ccw":61895,"refresh-cw":61896,repeat:61897,rewind:61898,"rotate-ccw":61899,"rotate-cw":61900,rss:61901,save:61902,scissors:61903,search:61904,send:61905,server:61906,settings:61907,share:61908,"share-2":61909,shield:61910,"shield-off":61911,"shopping-bag":61912,"shopping-cart":61913,shuffle:61914,sidebar:61915,"skip-back":61916,"skip-forward":61917,slack:61918,slash:61919,sliders:61920,smartphone:61921,smile:61922,speaker:61923,square:61924,star:61925,"stop-circle":61926,sun:61927,sunrise:61928,sunset:61929,tablet:61930,tag:61931,target:61932,terminal:61933,thermometer:61934,"thumbs-down":61935,"thumbs-up":61936,"toggle-left":61937,"toggle-right":61938,tool:61939,trash:61940,"trash-2":61941,trello:61942,"trending-down":61943,"trending-up":61944,triangle:61945,truck:61946,tv:61947,twitch:61948,twitter:61949,type:61950,umbrella:61951,underline:61952,unlock:61953,upload:61954,"upload-cloud":61955,user:61956,"user-check":61957,"user-minus":61958,"user-plus":61959,"user-x":61960,users:61961,video:61962,"video-off":61963,voicemail:61964,volume:61965,"volume-1":61966,"volume-2":61967,"volume-x":61968,watch:61969,wifi:61970,"wifi-off":61971,wind:61972,x:61973,"x-circle":61974,"x-octagon":61975,"x-square":61976,youtube:61977,zap:61978,"zap-off":61979,"zoom-in":61980,"zoom-out":61981}},649,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.getImageSourceSync=e.getImageSource=e.TabBarItemIOS=e.TabBarItem=e.Button=e.default=void 0;var o=t(r(d[1])),u=t(r(d[2])),I=(0,o.default)(u.default,'FontAwesome','FontAwesome.ttf'),S=I;e.default=S;var c=I.Button,n=I.TabBarItem,B=I.TabBarItemIOS,b=I.getImageSource,f=I.getImageSourceSync;e.getImageSourceSync=f,e.getImageSource=b,e.TabBarItemIOS=B,e.TabBarItem=n,e.Button=c},650,[1,633,651]); -__d(function(e,r,o,a,t,s,l){t.exports={glass:61440,music:61441,search:61442,"envelope-o":61443,heart:61444,star:61445,"star-o":61446,user:61447,film:61448,"th-large":61449,th:61450,"th-list":61451,check:61452,remove:61453,close:61453,times:61453,"search-plus":61454,"search-minus":61456,"power-off":61457,signal:61458,gear:61459,cog:61459,"trash-o":61460,home:61461,"file-o":61462,"clock-o":61463,road:61464,download:61465,"arrow-circle-o-down":61466,"arrow-circle-o-up":61467,inbox:61468,"play-circle-o":61469,"rotate-right":61470,repeat:61470,refresh:61473,"list-alt":61474,lock:61475,flag:61476,headphones:61477,"volume-off":61478,"volume-down":61479,"volume-up":61480,qrcode:61481,barcode:61482,tag:61483,tags:61484,book:61485,bookmark:61486,print:61487,camera:61488,font:61489,bold:61490,italic:61491,"text-height":61492,"text-width":61493,"align-left":61494,"align-center":61495,"align-right":61496,"align-justify":61497,list:61498,dedent:61499,outdent:61499,indent:61500,"video-camera":61501,photo:61502,image:61502,"picture-o":61502,pencil:61504,"map-marker":61505,adjust:61506,tint:61507,edit:61508,"pencil-square-o":61508,"share-square-o":61509,"check-square-o":61510,arrows:61511,"step-backward":61512,"fast-backward":61513,backward:61514,play:61515,pause:61516,stop:61517,forward:61518,"fast-forward":61520,"step-forward":61521,eject:61522,"chevron-left":61523,"chevron-right":61524,"plus-circle":61525,"minus-circle":61526,"times-circle":61527,"check-circle":61528,"question-circle":61529,"info-circle":61530,crosshairs:61531,"times-circle-o":61532,"check-circle-o":61533,ban:61534,"arrow-left":61536,"arrow-right":61537,"arrow-up":61538,"arrow-down":61539,"mail-forward":61540,share:61540,expand:61541,compress:61542,plus:61543,minus:61544,asterisk:61545,"exclamation-circle":61546,gift:61547,leaf:61548,fire:61549,eye:61550,"eye-slash":61552,warning:61553,"exclamation-triangle":61553,plane:61554,calendar:61555,random:61556,comment:61557,magnet:61558,"chevron-up":61559,"chevron-down":61560,retweet:61561,"shopping-cart":61562,folder:61563,"folder-open":61564,"arrows-v":61565,"arrows-h":61566,"bar-chart-o":61568,"bar-chart":61568,"twitter-square":61569,"facebook-square":61570,"camera-retro":61571,key:61572,gears:61573,cogs:61573,comments:61574,"thumbs-o-up":61575,"thumbs-o-down":61576,"star-half":61577,"heart-o":61578,"sign-out":61579,"linkedin-square":61580,"thumb-tack":61581,"external-link":61582,"sign-in":61584,trophy:61585,"github-square":61586,upload:61587,"lemon-o":61588,phone:61589,"square-o":61590,"bookmark-o":61591,"phone-square":61592,twitter:61593,"facebook-f":61594,facebook:61594,github:61595,unlock:61596,"credit-card":61597,feed:61598,rss:61598,"hdd-o":61600,bullhorn:61601,bell:61683,certificate:61603,"hand-o-right":61604,"hand-o-left":61605,"hand-o-up":61606,"hand-o-down":61607,"arrow-circle-left":61608,"arrow-circle-right":61609,"arrow-circle-up":61610,"arrow-circle-down":61611,globe:61612,wrench:61613,tasks:61614,filter:61616,briefcase:61617,"arrows-alt":61618,group:61632,users:61632,chain:61633,link:61633,cloud:61634,flask:61635,cut:61636,scissors:61636,copy:61637,"files-o":61637,paperclip:61638,save:61639,"floppy-o":61639,square:61640,navicon:61641,reorder:61641,bars:61641,"list-ul":61642,"list-ol":61643,strikethrough:61644,underline:61645,table:61646,magic:61648,truck:61649,pinterest:61650,"pinterest-square":61651,"google-plus-square":61652,"google-plus":61653,money:61654,"caret-down":61655,"caret-up":61656,"caret-left":61657,"caret-right":61658,columns:61659,unsorted:61660,sort:61660,"sort-down":61661,"sort-desc":61661,"sort-up":61662,"sort-asc":61662,envelope:61664,linkedin:61665,"rotate-left":61666,undo:61666,legal:61667,gavel:61667,dashboard:61668,tachometer:61668,"comment-o":61669,"comments-o":61670,flash:61671,bolt:61671,sitemap:61672,umbrella:61673,paste:61674,clipboard:61674,"lightbulb-o":61675,exchange:61676,"cloud-download":61677,"cloud-upload":61678,"user-md":61680,stethoscope:61681,suitcase:61682,"bell-o":61602,coffee:61684,cutlery:61685,"file-text-o":61686,"building-o":61687,"hospital-o":61688,ambulance:61689,medkit:61690,"fighter-jet":61691,beer:61692,"h-square":61693,"plus-square":61694,"angle-double-left":61696,"angle-double-right":61697,"angle-double-up":61698,"angle-double-down":61699,"angle-left":61700,"angle-right":61701,"angle-up":61702,"angle-down":61703,desktop:61704,laptop:61705,tablet:61706,"mobile-phone":61707,mobile:61707,"circle-o":61708,"quote-left":61709,"quote-right":61710,spinner:61712,circle:61713,"mail-reply":61714,reply:61714,"github-alt":61715,"folder-o":61716,"folder-open-o":61717,"smile-o":61720,"frown-o":61721,"meh-o":61722,gamepad:61723,"keyboard-o":61724,"flag-o":61725,"flag-checkered":61726,terminal:61728,code:61729,"mail-reply-all":61730,"reply-all":61730,"star-half-empty":61731,"star-half-full":61731,"star-half-o":61731,"location-arrow":61732,crop:61733,"code-fork":61734,unlink:61735,"chain-broken":61735,question:61736,info:61737,exclamation:61738,superscript:61739,subscript:61740,eraser:61741,"puzzle-piece":61742,microphone:61744,"microphone-slash":61745,shield:61746,"calendar-o":61747,"fire-extinguisher":61748,rocket:61749,maxcdn:61750,"chevron-circle-left":61751,"chevron-circle-right":61752,"chevron-circle-up":61753,"chevron-circle-down":61754,html5:61755,css3:61756,anchor:61757,"unlock-alt":61758,bullseye:61760,"ellipsis-h":61761,"ellipsis-v":61762,"rss-square":61763,"play-circle":61764,ticket:61765,"minus-square":61766,"minus-square-o":61767,"level-up":61768,"level-down":61769,"check-square":61770,"pencil-square":61771,"external-link-square":61772,"share-square":61773,compass:61774,"toggle-down":61776,"caret-square-o-down":61776,"toggle-up":61777,"caret-square-o-up":61777,"toggle-right":61778,"caret-square-o-right":61778,euro:61779,eur:61779,gbp:61780,dollar:61781,usd:61781,rupee:61782,inr:61782,cny:61783,rmb:61783,yen:61783,jpy:61783,ruble:61784,rouble:61784,rub:61784,won:61785,krw:61785,bitcoin:61786,btc:61786,file:61787,"file-text":61788,"sort-alpha-asc":61789,"sort-alpha-desc":61790,"sort-amount-asc":61792,"sort-amount-desc":61793,"sort-numeric-asc":61794,"sort-numeric-desc":61795,"thumbs-up":61796,"thumbs-down":61797,"youtube-square":61798,youtube:61799,xing:61800,"xing-square":61801,"youtube-play":61802,dropbox:61803,"stack-overflow":61804,instagram:61805,flickr:61806,adn:61808,bitbucket:61809,"bitbucket-square":61810,tumblr:61811,"tumblr-square":61812,"long-arrow-down":61813,"long-arrow-up":61814,"long-arrow-left":61815,"long-arrow-right":61816,apple:61817,windows:61818,android:61819,linux:61820,dribbble:61821,skype:61822,foursquare:61824,trello:61825,female:61826,male:61827,gittip:61828,gratipay:61828,"sun-o":61829,"moon-o":61830,archive:61831,bug:61832,vk:61833,weibo:61834,renren:61835,pagelines:61836,"stack-exchange":61837,"arrow-circle-o-right":61838,"arrow-circle-o-left":61840,"toggle-left":61841,"caret-square-o-left":61841,"dot-circle-o":61842,wheelchair:61843,"vimeo-square":61844,"turkish-lira":61845,try:61845,"plus-square-o":61846,"space-shuttle":61847,slack:61848,"envelope-square":61849,wordpress:61850,openid:61851,institution:61852,bank:61852,university:61852,"mortar-board":61853,"graduation-cap":61853,yahoo:61854,google:61856,reddit:61857,"reddit-square":61858,"stumbleupon-circle":61859,stumbleupon:61860,delicious:61861,digg:61862,"pied-piper-pp":61863,"pied-piper-alt":61864,drupal:61865,joomla:61866,language:61867,fax:61868,building:61869,child:61870,paw:61872,spoon:61873,cube:61874,cubes:61875,behance:61876,"behance-square":61877,steam:61878,"steam-square":61879,recycle:61880,automobile:61881,car:61881,cab:61882,taxi:61882,tree:61883,spotify:61884,deviantart:61885,soundcloud:61886,database:61888,"file-pdf-o":61889,"file-word-o":61890,"file-excel-o":61891,"file-powerpoint-o":61892,"file-photo-o":61893,"file-picture-o":61893,"file-image-o":61893,"file-zip-o":61894,"file-archive-o":61894,"file-sound-o":61895,"file-audio-o":61895,"file-movie-o":61896,"file-video-o":61896,"file-code-o":61897,vine:61898,codepen:61899,jsfiddle:61900,"life-bouy":61901,"life-buoy":61901,"life-saver":61901,support:61901,"life-ring":61901,"circle-o-notch":61902,ra:61904,resistance:61904,rebel:61904,ge:61905,empire:61905,"git-square":61906,git:61907,"y-combinator-square":61908,"yc-square":61908,"hacker-news":61908,"tencent-weibo":61909,qq:61910,wechat:61911,weixin:61911,send:61912,"paper-plane":61912,"send-o":61913,"paper-plane-o":61913,history:61914,"circle-thin":61915,header:61916,paragraph:61917,sliders:61918,"share-alt":61920,"share-alt-square":61921,bomb:61922,"soccer-ball-o":61923,"futbol-o":61923,tty:61924,binoculars:61925,plug:61926,slideshare:61927,twitch:61928,yelp:61929,"newspaper-o":61930,wifi:61931,calculator:61932,paypal:61933,"google-wallet":61934,"cc-visa":61936,"cc-mastercard":61937,"cc-discover":61938,"cc-amex":61939,"cc-paypal":61940,"cc-stripe":61941,"bell-slash":61942,"bell-slash-o":61943,trash:61944,copyright:61945,at:61946,eyedropper:61947,"paint-brush":61948,"birthday-cake":61949,"area-chart":61950,"pie-chart":61952,"line-chart":61953,lastfm:61954,"lastfm-square":61955,"toggle-off":61956,"toggle-on":61957,bicycle:61958,bus:61959,ioxhost:61960,angellist:61961,cc:61962,shekel:61963,sheqel:61963,ils:61963,meanpath:61964,buysellads:61965,connectdevelop:61966,dashcube:61968,forumbee:61969,leanpub:61970,sellsy:61971,shirtsinbulk:61972,simplybuilt:61973,skyatlas:61974,"cart-plus":61975,"cart-arrow-down":61976,diamond:61977,ship:61978,"user-secret":61979,motorcycle:61980,"street-view":61981,heartbeat:61982,venus:61985,mars:61986,mercury:61987,intersex:61988,transgender:61988,"transgender-alt":61989,"venus-double":61990,"mars-double":61991,"venus-mars":61992,"mars-stroke":61993,"mars-stroke-v":61994,"mars-stroke-h":61995,neuter:61996,genderless:61997,"facebook-official":62e3,"pinterest-p":62001,whatsapp:62002,server:62003,"user-plus":62004,"user-times":62005,hotel:62006,bed:62006,viacoin:62007,train:62008,subway:62009,medium:62010,yc:62011,"y-combinator":62011,"optin-monster":62012,opencart:62013,expeditedssl:62014,"battery-4":62016,battery:62016,"battery-full":62016,"battery-3":62017,"battery-three-quarters":62017,"battery-2":62018,"battery-half":62018,"battery-1":62019,"battery-quarter":62019,"battery-0":62020,"battery-empty":62020,"mouse-pointer":62021,"i-cursor":62022,"object-group":62023,"object-ungroup":62024,"sticky-note":62025,"sticky-note-o":62026,"cc-jcb":62027,"cc-diners-club":62028,clone:62029,"balance-scale":62030,"hourglass-o":62032,"hourglass-1":62033,"hourglass-start":62033,"hourglass-2":62034,"hourglass-half":62034,"hourglass-3":62035,"hourglass-end":62035,hourglass:62036,"hand-grab-o":62037,"hand-rock-o":62037,"hand-stop-o":62038,"hand-paper-o":62038,"hand-scissors-o":62039,"hand-lizard-o":62040,"hand-spock-o":62041,"hand-pointer-o":62042,"hand-peace-o":62043,trademark:62044,registered:62045,"creative-commons":62046,gg:62048,"gg-circle":62049,tripadvisor:62050,odnoklassniki:62051,"odnoklassniki-square":62052,"get-pocket":62053,"wikipedia-w":62054,safari:62055,chrome:62056,firefox:62057,opera:62058,"internet-explorer":62059,tv:62060,television:62060,contao:62061,"500px":62062,amazon:62064,"calendar-plus-o":62065,"calendar-minus-o":62066,"calendar-times-o":62067,"calendar-check-o":62068,industry:62069,"map-pin":62070,"map-signs":62071,"map-o":62072,map:62073,commenting:62074,"commenting-o":62075,houzz:62076,vimeo:62077,"black-tie":62078,fonticons:62080,"reddit-alien":62081,edge:62082,"credit-card-alt":62083,codiepie:62084,modx:62085,"fort-awesome":62086,usb:62087,"product-hunt":62088,mixcloud:62089,scribd:62090,"pause-circle":62091,"pause-circle-o":62092,"stop-circle":62093,"stop-circle-o":62094,"shopping-bag":62096,"shopping-basket":62097,hashtag:62098,bluetooth:62099,"bluetooth-b":62100,percent:62101,gitlab:62102,wpbeginner:62103,wpforms:62104,envira:62105,"universal-access":62106,"wheelchair-alt":62107,"question-circle-o":62108,blind:62109,"audio-description":62110,"volume-control-phone":62112,braille:62113,"assistive-listening-systems":62114,"asl-interpreting":62115,"american-sign-language-interpreting":62115,deafness:62116,"hard-of-hearing":62116,deaf:62116,glide:62117,"glide-g":62118,signing:62119,"sign-language":62119,"low-vision":62120,viadeo:62121,"viadeo-square":62122,snapchat:62123,"snapchat-ghost":62124,"snapchat-square":62125,"pied-piper":62126,"first-order":62128,yoast:62129,themeisle:62130,"google-plus-circle":62131,"google-plus-official":62131,fa:62132,"font-awesome":62132,"handshake-o":62133,"envelope-open":62134,"envelope-open-o":62135,linode:62136,"address-book":62137,"address-book-o":62138,vcard:62139,"address-card":62139,"vcard-o":62140,"address-card-o":62140,"user-circle":62141,"user-circle-o":62142,"user-o":62144,"id-badge":62145,"drivers-license":62146,"id-card":62146,"drivers-license-o":62147,"id-card-o":62147,quora:62148,"free-code-camp":62149,telegram:62150,"thermometer-4":62151,thermometer:62151,"thermometer-full":62151,"thermometer-3":62152,"thermometer-three-quarters":62152,"thermometer-2":62153,"thermometer-half":62153,"thermometer-1":62154,"thermometer-quarter":62154,"thermometer-0":62155,"thermometer-empty":62155,shower:62156,bathtub:62157,s15:62157,bath:62157,podcast:62158,"window-maximize":62160,"window-minimize":62161,"window-restore":62162,"times-rectangle":62163,"window-close":62163,"times-rectangle-o":62164,"window-close-o":62164,bandcamp:62165,grav:62166,etsy:62167,imdb:62168,ravelry:62169,eercast:62170,microchip:62171,"snowflake-o":62172,superpowers:62173,wpexplorer:62174,meetup:62176}},651,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"FA5Style",{enumerable:!0,get:function(){return u.FA5Style}}),e.getImageSourceSync=e.getImageSource=e.TabBarItemIOS=e.TabBarItem=e.Button=e.default=void 0;var u=r(d[1]),o=t(r(d[2])),c=t(r(d[3])),n=(0,u.createFA5iconSet)(o.default,c.default,!1),I=n;e.default=I;var S=n.Button,b=n.TabBarItem,l=n.TabBarItemIOS,B=n.getImageSource,f=n.getImageSourceSync;e.getImageSourceSync=f,e.getImageSource=B,e.TabBarItemIOS=l,e.TabBarItem=b,e.Button=S},652,[1,653,655,656]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.createFA5iconSet=function(t){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},f=arguments.length>2&&void 0!==arguments[2]&&arguments[2],u=Object.keys(o),s="FontAwesome5"+(f?'Pro':'Free');function v(l,o){var u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:s,v=l,c="FontAwesome5_"+(f?"Pro_"+v:v)+".ttf";return'Brands'===v&&(v='Regular',c='FontAwesome5_Brands.ttf'),{fontFamily:u+"-"+v,fontFile:c,fontStyle:n.Platform.select({ios:{fontWeight:o},default:{}}),glyphMap:t}}var c=v('Brands','400','FontAwesome5Brands'),h=v('Light','300'),F=v('Regular','400'),b=v('Solid','900');return(0,l.default)({brand:c,light:h,regular:F,solid:b},{defaultStyle:'regular',fallbackFamily:function(t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{},S=Object.keys(t);if(0===S.length)throw new Error('You need to add at least one style');var O=(0,h.default)({defaultStyle:S[0],fallbackFamily:function(){return S[0]},glyphValidator:function(){return!0}},n),I=S.reduce(function(n,u){var l=t[u];return n[u]=(0,s.default)(l.glyphMap||{},l.fontFamily||'',l.fontFile||'',l.fontStyle||{}),n},{});function b(t){return Object.keys(t).reduce(function(n,u){return-1!==S.indexOf(u)&&!0===t[u]?u:n},O.defaultStyle)}function F(t){var n=t.name,u=b(t);if(O.glyphValidator(n,u))return I[u];var l=O.fallbackFamily(n);return-1===S.indexOf(l)?O.defaultStyle:I[l]}function _(t){return Object.keys(t).reduce(function(n,u){return-1===S.indexOf(u)&&(n[u]=t[u]),n},{})}function T(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:'';return-1===S.indexOf(t)?I[O.defaultStyle]:n?F((0,y.default)({name:n},t,!0)):I[b((0,y.default)({},t,!0))]}function k(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:'',n=(function(n){function y(){return(0,u.default)(this,y),(0,o.default)(this,(0,f.default)(y).apply(this,arguments))}return(0,c.default)(y,n),(0,l.default)(y,[{key:"render",value:function(){var n,u,l=F(this.props),o=(n=l,(u=t).length>0?n[u]:n),f=_(this.props);return v.default.createElement(o,f)}}]),y})(v.PureComponent);return n.propTypes=S.reduce(function(t,n){return t[n]=p.default.bool,t},{}),n.defaultProps=S.reduce(function(t,n){return t[n]=!1,t},{}),n}var B=k();return B.Button=k('Button'),B.TabBarItem=k('TabBarItem'),B.TabBarItemIOS=k('TabBarItemIOS'),B.getStyledIconSet=T,B.getImageSource=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:s.DEFAULT_ICON_SIZE,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:s.DEFAULT_ICON_COLOR;return T(arguments.length>3&&void 0!==arguments[3]?arguments[3]:O.defaultStyle,t).getImageSource(t,n,u)},B.getFontFamily=function(){return T(arguments.length>0&&void 0!==arguments[0]?arguments[0]:O.defaultStyle).getFontFamily()},B.getRawGlyphMap=function(){return T(arguments.length>0&&void 0!==arguments[0]?arguments[0]:O.defaultStyle).getRawGlyphMap()},B.hasIcon=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:O.defaultStyle;return O.glyphValidator(t,n)},B};var u=n(r(d[2])),l=n(r(d[3])),o=n(r(d[4])),f=n(r(d[5])),c=n(r(d[6])),y=n(r(d[7])),h=n(r(d[8])),v=t(r(d[9])),p=n(r(d[10])),s=t(r(d[11]))},654,[346,1,19,20,27,30,33,45,44,47,59,633]); -__d(function(e,a,r,o,s,t,i){s.exports={"500px":62062,"accessible-icon":62312,accusoft:62313,"acquisitions-incorporated":63151,ad:63041,"address-book":62137,"address-card":62139,adjust:61506,adn:61808,adobe:63352,adversal:62314,affiliatetheme:62315,"air-freshener":62928,airbnb:63540,algolia:62316,"align-center":61495,"align-justify":61497,"align-left":61494,"align-right":61496,alipay:63042,allergies:62561,amazon:62064,"amazon-pay":62508,ambulance:61689,"american-sign-language-interpreting":62115,amilia:62317,anchor:61757,android:61819,angellist:61961,"angle-double-down":61699,"angle-double-left":61696,"angle-double-right":61697,"angle-double-up":61698,"angle-down":61703,"angle-left":61700,"angle-right":61701,"angle-up":61702,angry:62806,angrycreative:62318,angular:62496,ankh:63044,"app-store":62319,"app-store-ios":62320,apper:62321,apple:61817,"apple-alt":62929,"apple-pay":62485,archive:61831,archway:62807,"arrow-alt-circle-down":62296,"arrow-alt-circle-left":62297,"arrow-alt-circle-right":62298,"arrow-alt-circle-up":62299,"arrow-circle-down":61611,"arrow-circle-left":61608,"arrow-circle-right":61609,"arrow-circle-up":61610,"arrow-down":61539,"arrow-left":61536,"arrow-right":61537,"arrow-up":61538,"arrows-alt":61618,"arrows-alt-h":62263,"arrows-alt-v":62264,artstation:63354,"assistive-listening-systems":62114,asterisk:61545,asymmetrik:62322,at:61946,atlas:62808,atlassian:63355,atom:62930,audible:62323,"audio-description":62110,autoprefixer:62492,avianex:62324,aviato:62497,award:62809,aws:62325,baby:63356,"baby-carriage":63357,backspace:62810,backward:61514,bacon:63461,bahai:63078,"balance-scale":62030,"balance-scale-left":62741,"balance-scale-right":62742,ban:61534,"band-aid":62562,bandcamp:62165,barcode:61482,bars:61641,"baseball-ball":62515,"basketball-ball":62516,bath:62157,"battery-empty":62020,"battery-full":62016,"battery-half":62018,"battery-quarter":62019,"battery-three-quarters":62017,"battle-net":63541,bed:62006,beer:61692,behance:61876,"behance-square":61877,bell:61683,"bell-slash":61942,"bezier-curve":62811,bible:63047,bicycle:61958,biking:63562,bimobject:62328,binoculars:61925,biohazard:63360,"birthday-cake":61949,bitbucket:61809,bitcoin:62329,bity:62330,"black-tie":62078,blackberry:62331,blender:62743,"blender-phone":63158,blind:62109,blog:63361,blogger:62332,"blogger-b":62333,bluetooth:62099,"bluetooth-b":62100,bold:61490,bolt:61671,bomb:61922,bone:62935,bong:62812,book:61485,"book-dead":63159,"book-medical":63462,"book-open":62744,"book-reader":62938,bookmark:61486,bootstrap:63542,"border-all":63564,"border-none":63568,"border-style":63571,"bowling-ball":62518,box:62566,"box-open":62622,"box-tissue":63835,boxes:62568,braille:62113,brain:62940,"bread-slice":63468,briefcase:61617,"briefcase-medical":62569,"broadcast-tower":62745,broom:62746,brush:62813,btc:61786,buffer:63543,bug:61832,building:61869,bullhorn:61601,bullseye:61760,burn:62570,buromobelexperte:62335,bus:61959,"bus-alt":62814,"business-time":63050,"buy-n-large":63654,buysellads:61965,calculator:61932,calendar:61747,"calendar-alt":61555,"calendar-check":62068,"calendar-day":63363,"calendar-minus":62066,"calendar-plus":62065,"calendar-times":62067,"calendar-week":63364,camera:61488,"camera-retro":61571,campground:63163,"canadian-maple-leaf":63365,"candy-cane":63366,cannabis:62815,capsules:62571,car:61881,"car-alt":62942,"car-battery":62943,"car-crash":62945,"car-side":62948,caravan:63743,"caret-down":61655,"caret-left":61657,"caret-right":61658,"caret-square-down":61776,"caret-square-left":61841,"caret-square-right":61778,"caret-square-up":61777,"caret-up":61656,carrot:63367,"cart-arrow-down":61976,"cart-plus":61975,"cash-register":63368,cat:63166,"cc-amazon-pay":62509,"cc-amex":61939,"cc-apple-pay":62486,"cc-diners-club":62028,"cc-discover":61938,"cc-jcb":62027,"cc-mastercard":61937,"cc-paypal":61940,"cc-stripe":61941,"cc-visa":61936,centercode:62336,centos:63369,certificate:61603,chair:63168,chalkboard:62747,"chalkboard-teacher":62748,"charging-station":62951,"chart-area":61950,"chart-bar":61568,"chart-line":61953,"chart-pie":61952,check:61452,"check-circle":61528,"check-double":62816,"check-square":61770,cheese:63471,chess:62521,"chess-bishop":62522,"chess-board":62524,"chess-king":62527,"chess-knight":62529,"chess-pawn":62531,"chess-queen":62533,"chess-rook":62535,"chevron-circle-down":61754,"chevron-circle-left":61751,"chevron-circle-right":61752,"chevron-circle-up":61753,"chevron-down":61560,"chevron-left":61523,"chevron-right":61524,"chevron-up":61559,child:61870,chrome:62056,chromecast:63544,church:62749,circle:61713,"circle-notch":61902,city:63055,"clinic-medical":63474,clipboard:62248,"clipboard-check":62572,"clipboard-list":62573,clock:61463,clone:62029,"closed-captioning":61962,cloud:61634,"cloud-download-alt":62337,"cloud-meatball":63291,"cloud-moon":63171,"cloud-moon-rain":63292,"cloud-rain":63293,"cloud-showers-heavy":63296,"cloud-sun":63172,"cloud-sun-rain":63299,"cloud-upload-alt":62338,cloudscale:62339,cloudsmith:62340,cloudversify:62341,cocktail:62817,code:61729,"code-branch":61734,codepen:61899,codiepie:62084,coffee:61684,cog:61459,cogs:61573,coins:62750,columns:61659,comment:61557,"comment-alt":62074,"comment-dollar":63057,"comment-dots":62637,"comment-medical":63477,"comment-slash":62643,comments:61574,"comments-dollar":63059,"compact-disc":62751,compass:61774,compress:61542,"compress-alt":62498,"compress-arrows-alt":63372,"concierge-bell":62818,confluence:63373,connectdevelop:61966,contao:62061,cookie:62819,"cookie-bite":62820,copy:61637,copyright:61945,"cotton-bureau":63646,couch:62648,cpanel:62344,"creative-commons":62046,"creative-commons-by":62695,"creative-commons-nc":62696,"creative-commons-nc-eu":62697,"creative-commons-nc-jp":62698,"creative-commons-nd":62699,"creative-commons-pd":62700,"creative-commons-pd-alt":62701,"creative-commons-remix":62702,"creative-commons-sa":62703,"creative-commons-sampling":62704,"creative-commons-sampling-plus":62705,"creative-commons-share":62706,"creative-commons-zero":62707,"credit-card":61597,"critical-role":63177,crop:61733,"crop-alt":62821,cross:63060,crosshairs:61531,crow:62752,crown:62753,crutch:63479,css3:61756,"css3-alt":62347,cube:61874,cubes:61875,cut:61636,cuttlefish:62348,"d-and-d":62349,"d-and-d-beyond":63178,dailymotion:63826,dashcube:61968,database:61888,deaf:62116,delicious:61861,democrat:63303,deploydog:62350,deskpro:62351,desktop:61704,dev:63180,deviantart:61885,dharmachakra:63061,dhl:63376,diagnoses:62576,diaspora:63377,dice:62754,"dice-d20":63183,"dice-d6":63185,"dice-five":62755,"dice-four":62756,"dice-one":62757,"dice-six":62758,"dice-three":62759,"dice-two":62760,digg:61862,"digital-ocean":62353,"digital-tachograph":62822,directions:62955,discord:62354,discourse:62355,disease:63482,divide:62761,dizzy:62823,dna:62577,dochub:62356,docker:62357,dog:63187,"dollar-sign":61781,dolly:62578,"dolly-flatbed":62580,donate:62649,"door-closed":62762,"door-open":62763,"dot-circle":61842,dove:62650,download:61465,draft2digital:62358,"drafting-compass":62824,dragon:63189,"draw-polygon":62958,dribbble:61821,"dribbble-square":62359,dropbox:61803,drum:62825,"drum-steelpan":62826,"drumstick-bite":63191,drupal:61865,dumbbell:62539,dumpster:63379,"dumpster-fire":63380,dungeon:63193,dyalog:62361,earlybirds:62362,ebay:62708,edge:62082,edit:61508,egg:63483,eject:61522,elementor:62512,"ellipsis-h":61761,"ellipsis-v":61762,ello:62961,ember:62499,empire:61905,envelope:61664,"envelope-open":62134,"envelope-open-text":63064,"envelope-square":61849,envira:62105,equals:62764,eraser:61741,erlang:62365,ethereum:62510,ethernet:63382,etsy:62167,"euro-sign":61779,evernote:63545,"exchange-alt":62306,exclamation:61738,"exclamation-circle":61546,"exclamation-triangle":61553,expand:61541,"expand-alt":62500,"expand-arrows-alt":62238,expeditedssl:62014,"external-link-alt":62301,"external-link-square-alt":62304,eye:61550,"eye-dropper":61947,"eye-slash":61552,facebook:61594,"facebook-f":62366,"facebook-messenger":62367,"facebook-square":61570,fan:63587,"fantasy-flight-games":63196,"fast-backward":61513,"fast-forward":61520,faucet:63749,fax:61868,feather:62765,"feather-alt":62827,fedex:63383,fedora:63384,female:61826,"fighter-jet":61691,figma:63385,file:61787,"file-alt":61788,"file-archive":61894,"file-audio":61895,"file-code":61897,"file-contract":62828,"file-csv":63197,"file-download":62829,"file-excel":61891,"file-export":62830,"file-image":61893,"file-import":62831,"file-invoice":62832,"file-invoice-dollar":62833,"file-medical":62583,"file-medical-alt":62584,"file-pdf":61889,"file-powerpoint":61892,"file-prescription":62834,"file-signature":62835,"file-upload":62836,"file-video":61896,"file-word":61890,fill:62837,"fill-drip":62838,film:61448,filter:61616,fingerprint:62839,fire:61549,"fire-alt":63460,"fire-extinguisher":61748,firefox:62057,"firefox-browser":63751,"first-aid":62585,"first-order":62128,"first-order-alt":62730,firstdraft:62369,fish:62840,"fist-raised":63198,flag:61476,"flag-checkered":61726,"flag-usa":63309,flask:61635,flickr:61806,flipboard:62541,flushed:62841,fly:62487,folder:61563,"folder-minus":63069,"folder-open":61564,"folder-plus":63070,font:61489,"font-awesome":62132,"font-awesome-alt":62300,"font-awesome-flag":62501,"font-awesome-logo-full":62694,fonticons:62080,"fonticons-fi":62370,"football-ball":62542,"fort-awesome":62086,"fort-awesome-alt":62371,forumbee:61969,forward:61518,foursquare:61824,"free-code-camp":62149,freebsd:62372,frog:62766,frown:61721,"frown-open":62842,fulcrum:62731,"funnel-dollar":63074,futbol:61923,"galactic-republic":62732,"galactic-senate":62733,gamepad:61723,"gas-pump":62767,gavel:61667,gem:62373,genderless:61997,"get-pocket":62053,gg:62048,"gg-circle":62049,ghost:63202,gift:61547,gifts:63388,git:61907,"git-alt":63553,"git-square":61906,github:61595,"github-alt":61715,"github-square":61586,gitkraken:62374,gitlab:62102,gitter:62502,"glass-cheers":63391,"glass-martini":61440,"glass-martini-alt":62843,"glass-whiskey":63392,glasses:62768,glide:62117,"glide-g":62118,globe:61612,"globe-africa":62844,"globe-americas":62845,"globe-asia":62846,"globe-europe":63394,gofore:62375,"golf-ball":62544,goodreads:62376,"goodreads-g":62377,google:61856,"google-drive":62378,"google-play":62379,"google-plus":62131,"google-plus-g":61653,"google-plus-square":61652,"google-wallet":61934,gopuram:63076,"graduation-cap":61853,gratipay:61828,grav:62166,"greater-than":62769,"greater-than-equal":62770,grimace:62847,grin:62848,"grin-alt":62849,"grin-beam":62850,"grin-beam-sweat":62851,"grin-hearts":62852,"grin-squint":62853,"grin-squint-tears":62854,"grin-stars":62855,"grin-tears":62856,"grin-tongue":62857,"grin-tongue-squint":62858,"grin-tongue-wink":62859,"grin-wink":62860,"grip-horizontal":62861,"grip-lines":63396,"grip-lines-vertical":63397,"grip-vertical":62862,gripfire:62380,grunt:62381,guitar:63398,gulp:62382,"h-square":61693,"hacker-news":61908,"hacker-news-square":62383,hackerrank:62967,hamburger:63493,hammer:63203,hamsa:63077,"hand-holding":62653,"hand-holding-heart":62654,"hand-holding-medical":63836,"hand-holding-usd":62656,"hand-holding-water":62657,"hand-lizard":62040,"hand-middle-finger":63494,"hand-paper":62038,"hand-peace":62043,"hand-point-down":61607,"hand-point-left":61605,"hand-point-right":61604,"hand-point-up":61606,"hand-pointer":62042,"hand-rock":62037,"hand-scissors":62039,"hand-sparkles":63837,"hand-spock":62041,hands:62658,"hands-helping":62660,"hands-wash":63838,handshake:62133,"handshake-alt-slash":63839,"handshake-slash":63840,hanukiah:63206,"hard-hat":63495,hashtag:62098,"hat-cowboy":63680,"hat-cowboy-side":63681,"hat-wizard":63208,hdd:61600,"head-side-cough":63841,"head-side-cough-slash":63842,"head-side-mask":63843,"head-side-virus":63844,heading:61916,headphones:61477,"headphones-alt":62863,headset:62864,heart:61444,"heart-broken":63401,heartbeat:61982,helicopter:62771,highlighter:62865,hiking:63212,hippo:63213,hips:62546,"hire-a-helper":62384,history:61914,"hockey-puck":62547,"holly-berry":63402,home:61461,hooli:62503,hornbill:62866,horse:63216,"horse-head":63403,hospital:61688,"hospital-alt":62589,"hospital-symbol":62590,"hospital-user":63501,"hot-tub":62867,hotdog:63503,hotel:62868,hotjar:62385,hourglass:62036,"hourglass-end":62035,"hourglass-half":62034,"hourglass-start":62033,"house-damage":63217,"house-user":63845,houzz:62076,hryvnia:63218,html5:61755,hubspot:62386,"i-cursor":62022,"ice-cream":63504,icicles:63405,icons:63597,"id-badge":62145,"id-card":62146,"id-card-alt":62591,ideal:63763,igloo:63406,image:61502,images:62210,imdb:62168,inbox:61468,indent:61500,industry:62069,infinity:62772,info:61737,"info-circle":61530,instagram:61805,"instagram-square":63829,intercom:63407,"internet-explorer":62059,invision:63408,ioxhost:61960,italic:61491,"itch-io":63546,itunes:62388,"itunes-note":62389,java:62692,jedi:63081,"jedi-order":62734,jenkins:62390,jira:63409,joget:62391,joint:62869,joomla:61866,"journal-whills":63082,js:62392,"js-square":62393,jsfiddle:61900,kaaba:63083,kaggle:62970,key:61572,keybase:62709,keyboard:61724,keycdn:62394,khanda:63085,kickstarter:62395,"kickstarter-k":62396,kiss:62870,"kiss-beam":62871,"kiss-wink-heart":62872,"kiwi-bird":62773,korvue:62511,landmark:63087,language:61867,laptop:61705,"laptop-code":62972,"laptop-house":63846,"laptop-medical":63506,laravel:62397,lastfm:61954,"lastfm-square":61955,laugh:62873,"laugh-beam":62874,"laugh-squint":62875,"laugh-wink":62876,"layer-group":62973,leaf:61548,leanpub:61970,lemon:61588,less:62493,"less-than":62774,"less-than-equal":62775,"level-down-alt":62398,"level-up-alt":62399,"life-ring":61901,lightbulb:61675,line:62400,link:61633,linkedin:61580,"linkedin-in":61665,linode:62136,linux:61820,"lira-sign":61845,list:61498,"list-alt":61474,"list-ol":61643,"list-ul":61642,"location-arrow":61732,lock:61475,"lock-open":62401,"long-arrow-alt-down":62217,"long-arrow-alt-left":62218,"long-arrow-alt-right":62219,"long-arrow-alt-up":62220,"low-vision":62120,"luggage-cart":62877,lungs:62980,"lungs-virus":63847,lyft:62403,magento:62404,magic:61648,magnet:61558,"mail-bulk":63092,mailchimp:62878,male:61827,mandalorian:62735,map:62073,"map-marked":62879,"map-marked-alt":62880,"map-marker":61505,"map-marker-alt":62405,"map-pin":62070,"map-signs":62071,markdown:62991,marker:62881,mars:61986,"mars-double":61991,"mars-stroke":61993,"mars-stroke-h":61995,"mars-stroke-v":61994,mask:63226,mastodon:62710,maxcdn:61750,mdb:63690,medal:62882,medapps:62406,medium:62010,"medium-m":62407,medkit:61690,medrt:62408,meetup:62176,megaport:62883,meh:61722,"meh-blank":62884,"meh-rolling-eyes":62885,memory:62776,mendeley:63411,menorah:63094,mercury:61987,meteor:63315,microblog:63770,microchip:62171,microphone:61744,"microphone-alt":62409,"microphone-alt-slash":62777,"microphone-slash":61745,microscope:62992,microsoft:62410,minus:61544,"minus-circle":61526,"minus-square":61766,mitten:63413,mix:62411,mixcloud:62089,mixer:63830,mizuni:62412,mobile:61707,"mobile-alt":62413,modx:62085,monero:62416,"money-bill":61654,"money-bill-alt":62417,"money-bill-wave":62778,"money-bill-wave-alt":62779,"money-check":62780,"money-check-alt":62781,monument:62886,moon:61830,"mortar-pestle":62887,mosque:63096,motorcycle:61980,mountain:63228,mouse:63692,"mouse-pointer":62021,"mug-hot":63414,music:61441,napster:62418,neos:62994,"network-wired":63231,neuter:61996,newspaper:61930,nimblr:62888,node:62489,"node-js":62419,"not-equal":62782,"notes-medical":62593,npm:62420,ns8:62421,nutritionix:62422,"object-group":62023,"object-ungroup":62024,odnoklassniki:62051,"odnoklassniki-square":62052,"oil-can":62995,"old-republic":62736,om:63097,opencart:62013,openid:61851,opera:62058,"optin-monster":62012,orcid:63698,osi:62490,otter:63232,outdent:61499,page4:62423,pagelines:61836,pager:63509,"paint-brush":61948,"paint-roller":62890,palette:62783,palfed:62424,pallet:62594,"paper-plane":61912,paperclip:61638,"parachute-box":62669,paragraph:61917,parking:62784,passport:62891,pastafarianism:63099,paste:61674,patreon:62425,pause:61516,"pause-circle":62091,paw:61872,paypal:61933,peace:63100,pen:62212,"pen-alt":62213,"pen-fancy":62892,"pen-nib":62893,"pen-square":61771,"pencil-alt":62211,"pencil-ruler":62894,"penny-arcade":63236,"people-arrows":63848,"people-carry":62670,"pepper-hot":63510,percent:62101,percentage:62785,periscope:62426,"person-booth":63318,phabricator:62427,"phoenix-framework":62428,"phoenix-squadron":62737,phone:61589,"phone-alt":63609,"phone-slash":62429,"phone-square":61592,"phone-square-alt":63611,"phone-volume":62112,"photo-video":63612,php:62551,"pied-piper":62126,"pied-piper-alt":61864,"pied-piper-hat":62693,"pied-piper-pp":61863,"pied-piper-square":63774,"piggy-bank":62675,pills:62596,pinterest:61650,"pinterest-p":62001,"pinterest-square":61651,"pizza-slice":63512,"place-of-worship":63103,plane:61554,"plane-arrival":62895,"plane-departure":62896,"plane-slash":63849,play:61515,"play-circle":61764,playstation:62431,plug:61926,plus:61543,"plus-circle":61525,"plus-square":61694,podcast:62158,poll:63105,"poll-h":63106,poo:62206,"poo-storm":63322,poop:63001,portrait:62432,"pound-sign":61780,"power-off":61457,pray:63107,"praying-hands":63108,prescription:62897,"prescription-bottle":62597,"prescription-bottle-alt":62598,print:61487,procedures:62599,"product-hunt":62088,"project-diagram":62786,"pump-medical":63850,"pump-soap":63851,pushed:62433,"puzzle-piece":61742,python:62434,qq:61910,qrcode:61481,question:61736,"question-circle":61529,quidditch:62552,quinscape:62553,quora:62148,"quote-left":61709,"quote-right":61710,quran:63111,"r-project":62711,radiation:63417,"radiation-alt":63418,rainbow:63323,random:61556,"raspberry-pi":63419,ravelry:62169,react:62491,reacteurope:63325,readme:62677,rebel:61904,receipt:62787,"record-vinyl":63705,recycle:61880,"red-river":62435,reddit:61857,"reddit-alien":62081,"reddit-square":61858,redhat:63420,redo:61470,"redo-alt":62201,registered:62045,"remove-format":63613,renren:61835,reply:62437,"reply-all":61730,replyd:62438,republican:63326,researchgate:62712,resolving:62439,restroom:63421,retweet:61561,rev:62898,ribbon:62678,ring:63243,road:61464,robot:62788,rocket:61749,rocketchat:62440,rockrms:62441,route:62679,rss:61598,"rss-square":61763,"ruble-sign":61784,ruler:62789,"ruler-combined":62790,"ruler-horizontal":62791,"ruler-vertical":62792,running:63244,"rupee-sign":61782,"sad-cry":62899,"sad-tear":62900,safari:62055,salesforce:63547,sass:62494,satellite:63423,"satellite-dish":63424,save:61639,schlix:62442,school:62793,screwdriver:62794,scribd:62090,scroll:63246,"sd-card":63426,search:61442,"search-dollar":63112,"search-location":63113,"search-minus":61456,"search-plus":61454,searchengin:62443,seedling:62680,sellcast:62170,sellsy:61971,server:62003,servicestack:62444,shapes:63007,share:61540,"share-alt":61920,"share-alt-square":61921,"share-square":61773,"shekel-sign":61963,"shield-alt":62445,"shield-virus":63852,ship:61978,"shipping-fast":62603,shirtsinbulk:61972,"shoe-prints":62795,shopify:63831,"shopping-bag":62096,"shopping-basket":62097,"shopping-cart":61562,shopware:62901,shower:62156,"shuttle-van":62902,sign:62681,"sign-in-alt":62198,"sign-language":62119,"sign-out-alt":62197,signal:61458,signature:62903,"sim-card":63428,simplybuilt:61973,sistrix:62446,sitemap:61672,sith:62738,skating:63429,sketch:63430,skiing:63433,"skiing-nordic":63434,skull:62796,"skull-crossbones":63252,skyatlas:61974,skype:61822,slack:61848,"slack-hash":62447,slash:63253,sleigh:63436,"sliders-h":61918,slideshare:61927,smile:61720,"smile-beam":62904,"smile-wink":62682,smog:63327,smoking:62605,"smoking-ban":62797,sms:63437,snapchat:62123,"snapchat-ghost":62124,"snapchat-square":62125,snowboarding:63438,snowflake:62172,snowman:63440,snowplow:63442,soap:63854,socks:63126,"solar-panel":62906,sort:61660,"sort-alpha-down":61789,"sort-alpha-down-alt":63617,"sort-alpha-up":61790,"sort-alpha-up-alt":63618,"sort-amount-down":61792,"sort-amount-down-alt":63620,"sort-amount-up":61793,"sort-amount-up-alt":63621,"sort-down":61661,"sort-numeric-down":61794,"sort-numeric-down-alt":63622,"sort-numeric-up":61795,"sort-numeric-up-alt":63623,"sort-up":61662,soundcloud:61886,sourcetree:63443,spa:62907,"space-shuttle":61847,speakap:62451,"speaker-deck":63548,"spell-check":63633,spider:63255,spinner:61712,splotch:62908,spotify:61884,"spray-can":62909,square:61640,"square-full":62556,"square-root-alt":63128,squarespace:62910,"stack-exchange":61837,"stack-overflow":61804,stackpath:63554,stamp:62911,star:61445,"star-and-crescent":63129,"star-half":61577,"star-half-alt":62912,"star-of-david":63130,"star-of-life":63009,staylinked:62453,steam:61878,"steam-square":61879,"steam-symbol":62454,"step-backward":61512,"step-forward":61521,stethoscope:61681,"sticker-mule":62455,"sticky-note":62025,stop:61517,"stop-circle":62093,stopwatch:62194,"stopwatch-20":63855,store:62798,"store-alt":62799,"store-alt-slash":63856,"store-slash":63857,strava:62504,stream:62800,"street-view":61981,strikethrough:61644,stripe:62505,"stripe-s":62506,stroopwafel:62801,studiovinari:62456,stumbleupon:61860,"stumbleupon-circle":61859,subscript:61740,subway:62009,suitcase:61682,"suitcase-rolling":62913,sun:61829,superpowers:62173,superscript:61739,supple:62457,surprise:62914,suse:63446,swatchbook:62915,swift:63713,swimmer:62916,"swimming-pool":62917,symfony:63549,synagogue:63131,sync:61473,"sync-alt":62193,syringe:62606,table:61646,"table-tennis":62557,tablet:61706,"tablet-alt":62458,tablets:62608,"tachometer-alt":62461,tag:61483,tags:61484,tape:62683,tasks:61614,taxi:61882,teamspeak:62713,teeth:63022,"teeth-open":63023,telegram:62150,"telegram-plane":62462,"temperature-high":63337,"temperature-low":63339,"tencent-weibo":61909,tenge:63447,terminal:61728,"text-height":61492,"text-width":61493,th:61450,"th-large":61449,"th-list":61451,"the-red-yeti":63133,"theater-masks":63024,themeco:62918,themeisle:62130,thermometer:62609,"thermometer-empty":62155,"thermometer-full":62151,"thermometer-half":62153,"thermometer-quarter":62154,"thermometer-three-quarters":62152,"think-peaks":63281,"thumbs-down":61797,"thumbs-up":61796,thumbtack:61581,"ticket-alt":62463,times:61453,"times-circle":61527,tint:61507,"tint-slash":62919,tired:62920,"toggle-off":61956,"toggle-on":61957,toilet:63448,"toilet-paper":63262,"toilet-paper-slash":63858,toolbox:62802,tools:63449,tooth:62921,torah:63136,"torii-gate":63137,tractor:63266,"trade-federation":62739,trademark:62044,"traffic-light":63031,trailer:63809,train:62008,tram:63450,transgender:61988,"transgender-alt":61989,trash:61944,"trash-alt":62189,"trash-restore":63529,"trash-restore-alt":63530,tree:61883,trello:61825,tripadvisor:62050,trophy:61585,truck:61649,"truck-loading":62686,"truck-monster":63035,"truck-moving":62687,"truck-pickup":63036,tshirt:62803,tty:61924,tumblr:61811,"tumblr-square":61812,tv:62060,twitch:61928,twitter:61593,"twitter-square":61569,typo3:62507,uber:62466,ubuntu:63455,uikit:62467,umbraco:63720,umbrella:61673,"umbrella-beach":62922,underline:61645,undo:61666,"undo-alt":62186,uniregistry:62468,unity:63817,"universal-access":62106,university:61852,unlink:61735,unlock:61596,"unlock-alt":61758,untappd:62469,upload:61587,ups:63456,usb:62087,user:61447,"user-alt":62470,"user-alt-slash":62714,"user-astronaut":62715,"user-check":62716,"user-circle":62141,"user-clock":62717,"user-cog":62718,"user-edit":62719,"user-friends":62720,"user-graduate":62721,"user-injured":63272,"user-lock":62722,"user-md":61680,"user-minus":62723,"user-ninja":62724,"user-nurse":63535,"user-plus":62004,"user-secret":61979,"user-shield":62725,"user-slash":62726,"user-tag":62727,"user-tie":62728,"user-times":62005,users:61632,"users-cog":62729,usps:63457,ussunnah:62471,"utensil-spoon":62181,utensils:62183,vaadin:62472,"vector-square":62923,venus:61985,"venus-double":61990,"venus-mars":61992,viacoin:62007,viadeo:62121,"viadeo-square":62122,vial:62610,vials:62611,viber:62473,video:61501,"video-slash":62690,vihara:63143,vimeo:62474,"vimeo-square":61844,"vimeo-v":62077,vine:61898,virus:63860,"virus-slash":63861,viruses:63862,vk:61833,vnv:62475,voicemail:63639,"volleyball-ball":62559,"volume-down":61479,"volume-mute":63145,"volume-off":61478,"volume-up":61480,"vote-yea":63346,"vr-cardboard":63273,vuejs:62495,walking:62804,wallet:62805,warehouse:62612,water:63347,"wave-square":63550,waze:63551,weebly:62924,weibo:61834,weight:62614,"weight-hanging":62925,weixin:61911,whatsapp:62002,"whatsapp-square":62476,wheelchair:61843,whmcs:62477,wifi:61931,"wikipedia-w":62054,wind:63278,"window-close":62480,"window-maximize":62160,"window-minimize":62161,"window-restore":62162,windows:61818,"wine-bottle":63279,"wine-glass":62691,"wine-glass-alt":62926,wix:62927,"wizards-of-the-coast":63280,"wolf-pack-battalion":62740,"won-sign":61785,wordpress:61850,"wordpress-simple":62481,wpbeginner:62103,wpexplorer:62174,wpforms:62104,wpressr:62436,wrench:61613,"x-ray":62615,xbox:62482,xing:61800,"xing-square":61801,"y-combinator":62011,yahoo:61854,yammer:63552,yandex:62483,"yandex-international":62484,yarn:63459,yelp:61929,"yen-sign":61783,"yin-yang":63149,yoast:62129,youtube:61799,"youtube-square":62513,zhihu:63039}},655,[]); -__d(function(e,a,r,o,s,i,t){s.exports={brands:["500px","accessible-icon","accusoft","acquisitions-incorporated","adn","adobe","adversal","affiliatetheme","airbnb","algolia","alipay","amazon-pay","amazon","amilia","android","angellist","angrycreative","angular","app-store-ios","app-store","apper","apple-pay","apple","artstation","asymmetrik","atlassian","audible","autoprefixer","avianex","aviato","aws","bandcamp","battle-net","behance-square","behance","bimobject","bitbucket","bitcoin","bity","black-tie","blackberry","blogger-b","blogger","bluetooth-b","bluetooth","bootstrap","btc","buffer","buromobelexperte","buy-n-large","buysellads","canadian-maple-leaf","cc-amazon-pay","cc-amex","cc-apple-pay","cc-diners-club","cc-discover","cc-jcb","cc-mastercard","cc-paypal","cc-stripe","cc-visa","centercode","centos","chrome","chromecast","cloudscale","cloudsmith","cloudversify","codepen","codiepie","confluence","connectdevelop","contao","cotton-bureau","cpanel","creative-commons-by","creative-commons-nc-eu","creative-commons-nc-jp","creative-commons-nc","creative-commons-nd","creative-commons-pd-alt","creative-commons-pd","creative-commons-remix","creative-commons-sa","creative-commons-sampling-plus","creative-commons-sampling","creative-commons-share","creative-commons-zero","creative-commons","critical-role","css3-alt","css3","cuttlefish","d-and-d-beyond","d-and-d","dailymotion","dashcube","delicious","deploydog","deskpro","dev","deviantart","dhl","diaspora","digg","digital-ocean","discord","discourse","dochub","docker","draft2digital","dribbble-square","dribbble","dropbox","drupal","dyalog","earlybirds","ebay","edge","elementor","ello","ember","empire","envira","erlang","ethereum","etsy","evernote","expeditedssl","facebook-f","facebook-messenger","facebook-square","facebook","fantasy-flight-games","fedex","fedora","figma","firefox-browser","firefox","first-order-alt","first-order","firstdraft","flickr","flipboard","fly","font-awesome-alt","font-awesome-flag","font-awesome-logo-full","font-awesome","fonticons-fi","fonticons","fort-awesome-alt","fort-awesome","forumbee","foursquare","free-code-camp","freebsd","fulcrum","galactic-republic","galactic-senate","get-pocket","gg-circle","gg","git-alt","git-square","git","github-alt","github-square","github","gitkraken","gitlab","gitter","glide-g","glide","gofore","goodreads-g","goodreads","google-drive","google-play","google-plus-g","google-plus-square","google-plus","google-wallet","google","gratipay","grav","gripfire","grunt","gulp","hacker-news-square","hacker-news","hackerrank","hips","hire-a-helper","hooli","hornbill","hotjar","houzz","html5","hubspot","ideal","imdb","instagram-square","instagram","intercom","internet-explorer","invision","ioxhost","itch-io","itunes-note","itunes","java","jedi-order","jenkins","jira","joget","joomla","js-square","js","jsfiddle","kaggle","keybase","keycdn","kickstarter-k","kickstarter","korvue","laravel","lastfm-square","lastfm","leanpub","less","line","linkedin-in","linkedin","linode","linux","lyft","magento","mailchimp","mandalorian","markdown","mastodon","maxcdn","mdb","medapps","medium-m","medium","medrt","meetup","megaport","mendeley","microblog","microsoft","mix","mixcloud","mixer","mizuni","modx","monero","napster","neos","nimblr","node-js","node","npm","ns8","nutritionix","odnoklassniki-square","odnoklassniki","old-republic","opencart","openid","opera","optin-monster","orcid","osi","page4","pagelines","palfed","patreon","paypal","penny-arcade","periscope","phabricator","phoenix-framework","phoenix-squadron","php","pied-piper-alt","pied-piper-hat","pied-piper-pp","pied-piper-square","pied-piper","pinterest-p","pinterest-square","pinterest","playstation","product-hunt","pushed","python","qq","quinscape","quora","r-project","raspberry-pi","ravelry","react","reacteurope","readme","rebel","red-river","reddit-alien","reddit-square","reddit","redhat","renren","replyd","researchgate","resolving","rev","rocketchat","rockrms","safari","salesforce","sass","schlix","scribd","searchengin","sellcast","sellsy","servicestack","shirtsinbulk","shopify","shopware","simplybuilt","sistrix","sith","sketch","skyatlas","skype","slack-hash","slack","slideshare","snapchat-ghost","snapchat-square","snapchat","soundcloud","sourcetree","speakap","speaker-deck","spotify","squarespace","stack-exchange","stack-overflow","stackpath","staylinked","steam-square","steam-symbol","steam","sticker-mule","strava","stripe-s","stripe","studiovinari","stumbleupon-circle","stumbleupon","superpowers","supple","suse","swift","symfony","teamspeak","telegram-plane","telegram","tencent-weibo","the-red-yeti","themeco","themeisle","think-peaks","trade-federation","trello","tripadvisor","tumblr-square","tumblr","twitch","twitter-square","twitter","typo3","uber","ubuntu","uikit","umbraco","uniregistry","unity","untappd","ups","usb","usps","ussunnah","vaadin","viacoin","viadeo-square","viadeo","viber","vimeo-square","vimeo-v","vimeo","vine","vk","vnv","vuejs","waze","weebly","weibo","weixin","whatsapp-square","whatsapp","whmcs","wikipedia-w","windows","wix","wizards-of-the-coast","wolf-pack-battalion","wordpress-simple","wordpress","wpbeginner","wpexplorer","wpforms","wpressr","xbox","xing-square","xing","y-combinator","yahoo","yammer","yandex-international","yandex","yarn","yelp","yoast","youtube-square","youtube","zhihu"],regular:["address-book","address-card","angry","arrow-alt-circle-down","arrow-alt-circle-left","arrow-alt-circle-right","arrow-alt-circle-up","bell-slash","bell","bookmark","building","calendar-alt","calendar-check","calendar-minus","calendar-plus","calendar-times","calendar","caret-square-down","caret-square-left","caret-square-right","caret-square-up","chart-bar","check-circle","check-square","circle","clipboard","clock","clone","closed-captioning","comment-alt","comment-dots","comment","comments","compass","copy","copyright","credit-card","dizzy","dot-circle","edit","envelope-open","envelope","eye-slash","eye","file-alt","file-archive","file-audio","file-code","file-excel","file-image","file-pdf","file-powerpoint","file-video","file-word","file","flag","flushed","folder-open","folder","font-awesome-logo-full","frown-open","frown","futbol","gem","grimace","grin-alt","grin-beam-sweat","grin-beam","grin-hearts","grin-squint-tears","grin-squint","grin-stars","grin-tears","grin-tongue-squint","grin-tongue-wink","grin-tongue","grin-wink","grin","hand-lizard","hand-paper","hand-peace","hand-point-down","hand-point-left","hand-point-right","hand-point-up","hand-pointer","hand-rock","hand-scissors","hand-spock","handshake","hdd","heart","hospital","hourglass","id-badge","id-card","image","images","keyboard","kiss-beam","kiss-wink-heart","kiss","laugh-beam","laugh-squint","laugh-wink","laugh","lemon","life-ring","lightbulb","list-alt","map","meh-blank","meh-rolling-eyes","meh","minus-square","money-bill-alt","moon","newspaper","object-group","object-ungroup","paper-plane","pause-circle","play-circle","plus-square","question-circle","registered","sad-cry","sad-tear","save","share-square","smile-beam","smile-wink","smile","snowflake","square","star-half","star","sticky-note","stop-circle","sun","surprise","thumbs-down","thumbs-up","times-circle","tired","trash-alt","user-circle","user","window-close","window-maximize","window-minimize","window-restore"],solid:["ad","address-book","address-card","adjust","air-freshener","align-center","align-justify","align-left","align-right","allergies","ambulance","american-sign-language-interpreting","anchor","angle-double-down","angle-double-left","angle-double-right","angle-double-up","angle-down","angle-left","angle-right","angle-up","angry","ankh","apple-alt","archive","archway","arrow-alt-circle-down","arrow-alt-circle-left","arrow-alt-circle-right","arrow-alt-circle-up","arrow-circle-down","arrow-circle-left","arrow-circle-right","arrow-circle-up","arrow-down","arrow-left","arrow-right","arrow-up","arrows-alt-h","arrows-alt-v","arrows-alt","assistive-listening-systems","asterisk","at","atlas","atom","audio-description","award","baby-carriage","baby","backspace","backward","bacon","bahai","balance-scale-left","balance-scale-right","balance-scale","ban","band-aid","barcode","bars","baseball-ball","basketball-ball","bath","battery-empty","battery-full","battery-half","battery-quarter","battery-three-quarters","bed","beer","bell-slash","bell","bezier-curve","bible","bicycle","biking","binoculars","biohazard","birthday-cake","blender-phone","blender","blind","blog","bold","bolt","bomb","bone","bong","book-dead","book-medical","book-open","book-reader","book","bookmark","border-all","border-none","border-style","bowling-ball","box-open","box-tissue","box","boxes","braille","brain","bread-slice","briefcase-medical","briefcase","broadcast-tower","broom","brush","bug","building","bullhorn","bullseye","burn","bus-alt","bus","business-time","calculator","calendar-alt","calendar-check","calendar-day","calendar-minus","calendar-plus","calendar-times","calendar-week","calendar","camera-retro","camera","campground","candy-cane","cannabis","capsules","car-alt","car-battery","car-crash","car-side","car","caravan","caret-down","caret-left","caret-right","caret-square-down","caret-square-left","caret-square-right","caret-square-up","caret-up","carrot","cart-arrow-down","cart-plus","cash-register","cat","certificate","chair","chalkboard-teacher","chalkboard","charging-station","chart-area","chart-bar","chart-line","chart-pie","check-circle","check-double","check-square","check","cheese","chess-bishop","chess-board","chess-king","chess-knight","chess-pawn","chess-queen","chess-rook","chess","chevron-circle-down","chevron-circle-left","chevron-circle-right","chevron-circle-up","chevron-down","chevron-left","chevron-right","chevron-up","child","church","circle-notch","circle","city","clinic-medical","clipboard-check","clipboard-list","clipboard","clock","clone","closed-captioning","cloud-download-alt","cloud-meatball","cloud-moon-rain","cloud-moon","cloud-rain","cloud-showers-heavy","cloud-sun-rain","cloud-sun","cloud-upload-alt","cloud","cocktail","code-branch","code","coffee","cog","cogs","coins","columns","comment-alt","comment-dollar","comment-dots","comment-medical","comment-slash","comment","comments-dollar","comments","compact-disc","compass","compress-alt","compress-arrows-alt","compress","concierge-bell","cookie-bite","cookie","copy","copyright","couch","credit-card","crop-alt","crop","cross","crosshairs","crow","crown","crutch","cube","cubes","cut","database","deaf","democrat","desktop","dharmachakra","diagnoses","dice-d20","dice-d6","dice-five","dice-four","dice-one","dice-six","dice-three","dice-two","dice","digital-tachograph","directions","disease","divide","dizzy","dna","dog","dollar-sign","dolly-flatbed","dolly","donate","door-closed","door-open","dot-circle","dove","download","drafting-compass","dragon","draw-polygon","drum-steelpan","drum","drumstick-bite","dumbbell","dumpster-fire","dumpster","dungeon","edit","egg","eject","ellipsis-h","ellipsis-v","envelope-open-text","envelope-open","envelope-square","envelope","equals","eraser","ethernet","euro-sign","exchange-alt","exclamation-circle","exclamation-triangle","exclamation","expand-alt","expand-arrows-alt","expand","external-link-alt","external-link-square-alt","eye-dropper","eye-slash","eye","fan","fast-backward","fast-forward","faucet","fax","feather-alt","feather","female","fighter-jet","file-alt","file-archive","file-audio","file-code","file-contract","file-csv","file-download","file-excel","file-export","file-image","file-import","file-invoice-dollar","file-invoice","file-medical-alt","file-medical","file-pdf","file-powerpoint","file-prescription","file-signature","file-upload","file-video","file-word","file","fill-drip","fill","film","filter","fingerprint","fire-alt","fire-extinguisher","fire","first-aid","fish","fist-raised","flag-checkered","flag-usa","flag","flask","flushed","folder-minus","folder-open","folder-plus","folder","font-awesome-logo-full","font","football-ball","forward","frog","frown-open","frown","funnel-dollar","futbol","gamepad","gas-pump","gavel","gem","genderless","ghost","gift","gifts","glass-cheers","glass-martini-alt","glass-martini","glass-whiskey","glasses","globe-africa","globe-americas","globe-asia","globe-europe","globe","golf-ball","gopuram","graduation-cap","greater-than-equal","greater-than","grimace","grin-alt","grin-beam-sweat","grin-beam","grin-hearts","grin-squint-tears","grin-squint","grin-stars","grin-tears","grin-tongue-squint","grin-tongue-wink","grin-tongue","grin-wink","grin","grip-horizontal","grip-lines-vertical","grip-lines","grip-vertical","guitar","h-square","hamburger","hammer","hamsa","hand-holding-heart","hand-holding-medical","hand-holding-usd","hand-holding-water","hand-holding","hand-lizard","hand-middle-finger","hand-paper","hand-peace","hand-point-down","hand-point-left","hand-point-right","hand-point-up","hand-pointer","hand-rock","hand-scissors","hand-sparkles","hand-spock","hands-helping","hands-wash","hands","handshake-alt-slash","handshake-slash","handshake","hanukiah","hard-hat","hashtag","hat-cowboy-side","hat-cowboy","hat-wizard","hdd","head-side-cough-slash","head-side-cough","head-side-mask","head-side-virus","heading","headphones-alt","headphones","headset","heart-broken","heart","heartbeat","helicopter","highlighter","hiking","hippo","history","hockey-puck","holly-berry","home","horse-head","horse","hospital-alt","hospital-symbol","hospital-user","hospital","hot-tub","hotdog","hotel","hourglass-end","hourglass-half","hourglass-start","hourglass","house-damage","house-user","hryvnia","i-cursor","ice-cream","icicles","icons","id-badge","id-card-alt","id-card","igloo","image","images","inbox","indent","industry","infinity","info-circle","info","italic","jedi","joint","journal-whills","kaaba","key","keyboard","khanda","kiss-beam","kiss-wink-heart","kiss","kiwi-bird","landmark","language","laptop-code","laptop-house","laptop-medical","laptop","laugh-beam","laugh-squint","laugh-wink","laugh","layer-group","leaf","lemon","less-than-equal","less-than","level-down-alt","level-up-alt","life-ring","lightbulb","link","lira-sign","list-alt","list-ol","list-ul","list","location-arrow","lock-open","lock","long-arrow-alt-down","long-arrow-alt-left","long-arrow-alt-right","long-arrow-alt-up","low-vision","luggage-cart","lungs-virus","lungs","magic","magnet","mail-bulk","male","map-marked-alt","map-marked","map-marker-alt","map-marker","map-pin","map-signs","map","marker","mars-double","mars-stroke-h","mars-stroke-v","mars-stroke","mars","mask","medal","medkit","meh-blank","meh-rolling-eyes","meh","memory","menorah","mercury","meteor","microchip","microphone-alt-slash","microphone-alt","microphone-slash","microphone","microscope","minus-circle","minus-square","minus","mitten","mobile-alt","mobile","money-bill-alt","money-bill-wave-alt","money-bill-wave","money-bill","money-check-alt","money-check","monument","moon","mortar-pestle","mosque","motorcycle","mountain","mouse-pointer","mouse","mug-hot","music","network-wired","neuter","newspaper","not-equal","notes-medical","object-group","object-ungroup","oil-can","om","otter","outdent","pager","paint-brush","paint-roller","palette","pallet","paper-plane","paperclip","parachute-box","paragraph","parking","passport","pastafarianism","paste","pause-circle","pause","paw","peace","pen-alt","pen-fancy","pen-nib","pen-square","pen","pencil-alt","pencil-ruler","people-arrows","people-carry","pepper-hot","percent","percentage","person-booth","phone-alt","phone-slash","phone-square-alt","phone-square","phone-volume","phone","photo-video","piggy-bank","pills","pizza-slice","place-of-worship","plane-arrival","plane-departure","plane-slash","plane","play-circle","play","plug","plus-circle","plus-square","plus","podcast","poll-h","poll","poo-storm","poo","poop","portrait","pound-sign","power-off","pray","praying-hands","prescription-bottle-alt","prescription-bottle","prescription","print","procedures","project-diagram","pump-medical","pump-soap","puzzle-piece","qrcode","question-circle","question","quidditch","quote-left","quote-right","quran","radiation-alt","radiation","rainbow","random","receipt","record-vinyl","recycle","redo-alt","redo","registered","remove-format","reply-all","reply","republican","restroom","retweet","ribbon","ring","road","robot","rocket","route","rss-square","rss","ruble-sign","ruler-combined","ruler-horizontal","ruler-vertical","ruler","running","rupee-sign","sad-cry","sad-tear","satellite-dish","satellite","save","school","screwdriver","scroll","sd-card","search-dollar","search-location","search-minus","search-plus","search","seedling","server","shapes","share-alt-square","share-alt","share-square","share","shekel-sign","shield-alt","shield-virus","ship","shipping-fast","shoe-prints","shopping-bag","shopping-basket","shopping-cart","shower","shuttle-van","sign-in-alt","sign-language","sign-out-alt","sign","signal","signature","sim-card","sitemap","skating","skiing-nordic","skiing","skull-crossbones","skull","slash","sleigh","sliders-h","smile-beam","smile-wink","smile","smog","smoking-ban","smoking","sms","snowboarding","snowflake","snowman","snowplow","soap","socks","solar-panel","sort-alpha-down-alt","sort-alpha-down","sort-alpha-up-alt","sort-alpha-up","sort-amount-down-alt","sort-amount-down","sort-amount-up-alt","sort-amount-up","sort-down","sort-numeric-down-alt","sort-numeric-down","sort-numeric-up-alt","sort-numeric-up","sort-up","sort","spa","space-shuttle","spell-check","spider","spinner","splotch","spray-can","square-full","square-root-alt","square","stamp","star-and-crescent","star-half-alt","star-half","star-of-david","star-of-life","star","step-backward","step-forward","stethoscope","sticky-note","stop-circle","stop","stopwatch-20","stopwatch","store-alt-slash","store-alt","store-slash","store","stream","street-view","strikethrough","stroopwafel","subscript","subway","suitcase-rolling","suitcase","sun","superscript","surprise","swatchbook","swimmer","swimming-pool","synagogue","sync-alt","sync","syringe","table-tennis","table","tablet-alt","tablet","tablets","tachometer-alt","tag","tags","tape","tasks","taxi","teeth-open","teeth","temperature-high","temperature-low","tenge","terminal","text-height","text-width","th-large","th-list","th","theater-masks","thermometer-empty","thermometer-full","thermometer-half","thermometer-quarter","thermometer-three-quarters","thermometer","thumbs-down","thumbs-up","thumbtack","ticket-alt","times-circle","times","tint-slash","tint","tired","toggle-off","toggle-on","toilet-paper-slash","toilet-paper","toilet","toolbox","tools","tooth","torah","torii-gate","tractor","trademark","traffic-light","trailer","train","tram","transgender-alt","transgender","trash-alt","trash-restore-alt","trash-restore","trash","tree","trophy","truck-loading","truck-monster","truck-moving","truck-pickup","truck","tshirt","tty","tv","umbrella-beach","umbrella","underline","undo-alt","undo","universal-access","university","unlink","unlock-alt","unlock","upload","user-alt-slash","user-alt","user-astronaut","user-check","user-circle","user-clock","user-cog","user-edit","user-friends","user-graduate","user-injured","user-lock","user-md","user-minus","user-ninja","user-nurse","user-plus","user-secret","user-shield","user-slash","user-tag","user-tie","user-times","user","users-cog","users","utensil-spoon","utensils","vector-square","venus-double","venus-mars","venus","vial","vials","video-slash","video","vihara","virus-slash","virus","viruses","voicemail","volleyball-ball","volume-down","volume-mute","volume-off","volume-up","vote-yea","vr-cardboard","walking","wallet","warehouse","water","wave-square","weight-hanging","weight","wheelchair","wifi","wind","window-close","window-maximize","window-minimize","window-restore","wine-bottle","wine-glass-alt","wine-glass","won-sign","wrench","x-ray","yen-sign","yin-yang"]}},656,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.getImageSourceSync=e.getImageSource=e.TabBarItemIOS=e.TabBarItem=e.Button=e.default=void 0;var o=t(r(d[1])),u=t(r(d[2])),I=(0,o.default)(u.default,'Fontisto','Fontisto.ttf'),S=I;e.default=S;var c=I.Button,n=I.TabBarItem,B=I.TabBarItemIOS,b=I.getImageSource,f=I.getImageSourceSync;e.getImageSourceSync=f,e.getImageSource=b,e.TabBarItemIOS=B,e.TabBarItem=n,e.Button=c},657,[1,633,658]); -__d(function(e,a,r,o,t,s,i){t.exports={"acrobat-reader":60095,applemusic:60096,atlassian:60097,aws:60098,baidu:60099,bing:60100,bower:60101,dailymotion:60102,delicious:60103,deviantart:60104,disqus:60105,flipboard:60106,graphql:60107,hexo:60108,hipchat:60109,icq:60110,invision:60111,jekyll:60112,jira:60113,json:60114,livestream:60115,messenger:60116,meteor:60117,onenote:60118,mongodb:60119,netflix:60120,nginx:60121,odnoklassniki:60122,onedrive:60123,origin:60124,pingdom:60125,rails:60126,"raspberry-pi":60127,redis:60128,redux:60129,saucelabs:60130,scorp:60131,sentry:60132,shazam:60133,shopify:60134,sinaweibo:60135,slides:60136,sublimetext:60137,swift:60138,ted:60139,telegram:60140,tesla:60141,tinder:60142,treehouse:60143,twoo:60144,udacity:60145,webstorm:60146,wix:60147,"yandex-international":60148,yandex:60149,ember:60087,cpanel:60088,viber:60089,deskpro:60090,discord:60091,discourse:60092,adobe:60059,algolia:60060,atom:60061,babel:60062,coffeescript:60063,electronjs:60064,mysql:60065,oracle:60066,php:60067,sourcetree:60068,ubuntu:60069,unity:60070,"unreal-engine":60071,webpack:60072,angelist:60026,"app-store":60027,digg:60030,dockers:60031,envato:60032,gitlab:60033,"google-drive":60034,"google-play":60035,grunt:60036,gulp:60037,"hacker-news":60038,imdb:60039,jenkins:60040,joomla:60041,kickstarter:60042,laravel:60043,less:60044,line:60045,npm:60046,periscope:60047,"product-hunt":60048,quora:60049,skyatlas:60050,stylus:60051,travis:60052,trello:60053,uber:60054,vine:60055,"visual-studio":60056,vk:60057,vuejs:60058,microsoft:60025,blogger:60028,"500px":59658,amazon:59659,ampproject:59660,android:59661,angularjs:59662,apple:59663,behance:59664,bitbucket:59665,"bluetooth-b":59666,cloudflare:59667,codepen:59668,css3:59669,dribbble:59670,dropbox:59671,facebook:59672,flickr:59673,foursquare:59674,git:59675,github:59676,"google-plus":59677,google:59678,hangout:59679,houzz:59680,html5:59681,instagram:59682,java:59683,jquery:59684,jsfiddle:59685,linkedin:59686,linux:59687,magento:59688,maxcdn:59689,medium:59690,meetup:59691,nodejs:59692,opencart:59693,pinterest:59694,playstation:59695,python:59696,react:59697,reddit:59698,ruby:59699,sass:59700,skype:59701,slack:59702,snapchat:59703,soundcloud:59704,spotify:59705,"stack-overflow":59706,steam:59707,stumbleupon:59708,svn:59709,swarm:59710,tripadvisor:59711,tumblr:59712,twitch:59713,twitter:59714,vimeo:59715,wetransfer:59716,whatsapp:59717,"wifi-logo":59718,wikipedia:59719,windows:59720,wordpress:59721,xbox:59722,yahoo:59723,yelp:59724,"youtube-play":59725,cocoapods:60200,composer:60201,yarn:60202,language:59943,"toggle-off":59948,"toggle-on":60029,anchor:60094,archive:60150,at:60151,ban:60152,"battery-half":60153,"battery-full":60154,"battery-empty":60155,"battery-quarter":60156,"battery-three-quarters":60157,"bell-alt":60158,bell:60159,"bookmark-alt":60160,bookmark:60161,bug:60162,calculator:60163,calendar:60164,crosshairs:60165,desktop:60166,download:60167,film:60168,history:60169,"hourglass-end":60170,"hourglass-half":60171,"hourglass-start":60172,hourglass:60173,info:60174,key:60175,keyboard:60176,laptop:60177,lightbulb:60178,magnet:60179,"map-marker-alt":60180,"map-marker":60181,map:60182,"mobile-alt":60183,mobile:60184,paw:60185,phone:60186,power:60187,qrcode:60188,question:60189,search:60190,sitemap:60191,"star-half":60192,stopwatch:60193,"tablet-alt":60194,tablet:60195,ticket:60196,tv:60197,upload:60198,"user-secret":60199,camera:59798,clock:59799,"close-a":59800,code:59801,comment:59802,commenting:59803,comments:59804,crop:59805,cursor:59806,database:59807,date:59808,earth:59809,email:59810,eye:59811,female:59812,favorite:59813,filter:59814,fire:59815,flag:59816,flash:59817,home:59818,link:59819,locked:59820,male:59821,"minus-a":59822,"more-v-a":59823,"more-v":59824,"move-h-a":59825,"move-h":59826,"nav-icon-a":59827,"nav-icon-grid-a":59828,"nav-icon-grid":59829,"nav-icon-list-a":59830,"nav-icon-list":59831,"nav-icon":59832,navigate:59833,"paper-plane":59834,person:59835,persons:59836,picture:59837,"plus-a":59838,print:59839,"quote-a-left":59840,"quote-a-right":59841,"quote-left":59842,"quote-right":59843,reply:59844,rss:59845,scissors:59846,"share-a":59847,share:59848,trash:59849,unlocked:59850,usb:59851,wifi:59852,"world-o":59853,world:59854,zoom:59855,adjust:60015,recycle:60016,pinboard:60093,"zoom-minus":60082,"zoom-plus":60083,check:60084,asterisk:60085,hashtag:60086,"checkbox-active":59778,"checkbox-passive":59779,"radio-btn-active":59780,"radio-btn-passive":59781,"shopping-bag-1":60011,"shopping-bag":60012,"shopping-barcode":60017,"shopping-basket-add":60018,"shopping-basket-remove":60019,"shopping-basket":60020,"shopping-package":60021,"shopping-pos-machine":60022,"shopping-sale":60023,"shopping-store":60024,"angle-dobule-down":59748,"angle-dobule-left":59749,"angle-dobule-right":59750,"angle-dobule-up":59751,"angle-down":59752,"angle-left":59753,"angle-right":59754,"angle-up":59755,"arrow-down-l":59756,"arrow-down":59757,"arrow-expand":59758,"arrow-h":59759,"arrow-left-l":59760,"arrow-left":59761,"arrow-move":59762,"arrow-resize":59763,"arrow-return-left":59764,"arrow-return-right":59765,"arrow-right-l":59766,"arrow-right":59767,"arrow-swap":59768,"arrow-up-l":59769,"arrow-up":59770,"arrow-v":59771,"caret-down":59772,"caret-left":59773,"caret-right":59774,"caret-up":59775,fi:59776,fontisto:59777,backward:59866,eject:59867,equalizer:59868,forward:59869,headphone:59870,heart:59871,mic:59872,"music-note":59873,pause:59874,"play-list":59875,play:59876,"player-settings":59877,podcast:59878,random:59879,record:59880,star:59881,"step-backwrad":59882,"step-forward":59883,stop:59884,"volume-down":59885,"volume-mute":59886,"volume-off":59887,"volume-up":59888,airplay:60008,bold:59918,"broken-link":59919,"center-align":59920,close:59921,columns:59922,copy:59923,eraser:59924,export:59925,"file-1":59926,"file-2":59927,folder:59928,font:59929,import:59930,indent:59931,italic:59932,justify:59933,"left-align":59934,link2:59935,"list-1":59936,"list-2":59937,outdent:59938,paperclip:59939,paragraph:59940,paste:59941,preview:59942,print2:59943,redo:59944,"right-align":59945,"save-1":59946,save:59947,scissors2:59948,strikethrough:59949,subscript:59950,superscript:59951,"table-1":59952,"table-2":59953,"text-height":59954,"text-width":59955,underline:59956,undo:59957,"cloud-down":59958,"cloud-refresh":59959,"cloud-up":59960,"cloudy-gusts":59961,cloudy:59962,compass:59963,"day-cloudy":59964,"day-haze":59965,"day-lightning":59966,"day-rain":59967,"day-snow":59968,"day-sunny":59969,fog:59970,"horizon-alt":59971,horizon:59972,lightning:59973,lightnings:59974,"night-alt-cloudy":59975,"night-alt-lightning":59976,"night-alt-rain":59977,"night-alt-snow":59978,"night-clear":59979,rain:59980,rainbow:59981,rains:59982,snow:59983,snows:59984,thermometer:59985,umbrella:59986,wind:59987,confused:59988,dizzy:59989,expressionless:59990,frowning:59991,"heart-eyes":59992,laughing:59993,mad:59994,nervous:59995,neutral:59996,"open-mouth":59997,rage:59998,"slightly-smile":59999,smiley:6e4,smiling:60001,"stuck-out-tongue":60002,sunglasses:60003,surprised:60004,tongue:60005,wink:60006,"zipper-mouth":60007,aids:60233,ambulance:60234,bandage:60235,"bed-patient":60236,"blood-drop":60237,"blood-test":60238,blood:60239,dna:60240,doctor:60241,"drug-pack":60242,"first-aid-alt":60243,"heart-alt":60244,"heartbeat-alt":60245,heartbeat:60246,"helicopter-ambulance":60247,hospital:60248,"injection-syringe":60249,laboratory:60250,nurse:60251,"nursing-home":60252,"paralysis-disability":60253,pills:60254,prescription:60255,pulse:60256,stethoscope:60257,"surgical-knife":60258,tablets:60259,"test-bottle":60260,"test-tube-alt":60261,"test-tube":60262,"thermometer-alt":60263,"american-express":59856,"credit-card":59857,"google-wallet":59858,iyzigo:59859,mastercard:59860,"paypal-p":59861,paypal:59862,payu:59863,troy:59864,visa:59865,"dinners-club":60010,"apple-pay":60009,discover:60013,jcb:60014,dislike:59796,like:59797,"audio-description":59648,blind:59649,braille:59650,deaf:59651,"fa-american-sign-language-interpreting":59652,"low-vision":59654,tty:59655,"universal-acces":59656,wheelchair:59657,"area-chart":59732,"bar-chart":59733,"line-chart":59734,"pie-chart-1":59735,"pie-chart-2":59736,chrome:59726,edge:59727,firefox:59728,"internet-explorer":59729,opera:59730,safari:59731,bitcoin:59737,dollar:59738,euro:59739,gbp:59740,gg:59741,ils:59742,inr:59743,krw:59744,rouble:59745,tl:59746,yen:59747,genderless:59782,intersex:59783,"mars-double":59784,"mars-stroke-h":59785,"mars-stroke-v":59786,"mars-stroke":59787,mars:59788,mercury:59789,neuter:59790,"transgender-alt":59791,transgender:59792,"venus-double":59793,"venus-mars":59794,venus:59795,automobile:59899,bicycle:59900,bus:59901,car:59902,helicopter:59903,metro:59904,motorcycle:59905,plane:59906,rocket:59907,ship:59908,subway:59909,taxi:59910,train:59911,truck:59912,yacht:59913,"beach-slipper":60203,"bus-ticket":60204,cocktail:60205,"compass-alt":60206,"direction-sign":60207,"do-not-disturb":60208,"flotation-ring":60209,"holiday-village":60210,"hot-air-balloon":60211,"hotel-alt":60212,hotel:60213,island:60214,"money-symbol":60215,parasol:60216,"passport-alt":60217,passport:60218,photograph:60219,"plane-ticket":60220,room:60221,"sait-boat":60222,snorkel:60223,"suitcase-alt":60224,suitcase:60225,sun:60226,"sunglasses-alt":60227,swimsuit:60228,tent:60229,"ticket-alt":60230,"train-ticket":60231,wallet:60232,"circle-o-notch":59889,"propeller-1":59890,"propeller-2":59891,"propeller-3":59892,"propeller-4":59893,"spinner-cog":59894,"spinner-fidget":59895,"spinner-refresh":59896,"spinner-rotate-forward":59897,spinner:59898,snowflake:60081,"snowflake-1":60073,"snowflake-2":60074,"snowflake-3":60075,"snowflake-4":60076,"snowflake-5":60077,"snowflake-6":60078,"snowflake-7":60079,"snowflake-8":60080,curve:59915,ellipse:59916,rectangle:59917,shield:59914}},658,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.getImageSourceSync=e.getImageSource=e.TabBarItemIOS=e.TabBarItem=e.Button=e.default=void 0;var u=t(r(d[1])),o=t(r(d[2])),I=(0,u.default)(o.default,'fontcustom','Foundation.ttf'),c=I;e.default=c;var n=I.Button,S=I.TabBarItem,B=I.TabBarItemIOS,f=I.getImageSource,b=I.getImageSourceSync;e.getImageSourceSync=b,e.getImageSource=f,e.TabBarItemIOS=B,e.TabBarItem=S,e.Button=n},659,[1,633,660]); -__d(function(o,e,a,l,i,s,r){i.exports={"address-book":61696,alert:61697,"align-center":61698,"align-justify":61699,"align-left":61700,"align-right":61701,anchor:61702,annotate:61703,archive:61704,"arrow-down":61705,"arrow-left":61706,"arrow-right":61707,"arrow-up":61708,"arrows-compress":61709,"arrows-expand":61710,"arrows-in":61711,"arrows-out":61712,asl:61713,asterisk:61714,"at-sign":61715,"background-color":61716,"battery-empty":61717,"battery-full":61718,"battery-half":61719,"bitcoin-circle":61720,bitcoin:61721,blind:61722,bluetooth:61723,bold:61724,"book-bookmark":61725,book:61726,bookmark:61727,braille:61728,"burst-new":61729,"burst-sale":61730,burst:61731,calendar:61732,camera:61733,check:61734,checkbox:61735,"clipboard-notes":61736,"clipboard-pencil":61737,clipboard:61738,clock:61739,"closed-caption":61740,cloud:61741,"comment-minus":61742,"comment-quotes":61743,"comment-video":61744,comment:61745,comments:61746,compass:61747,contrast:61748,"credit-card":61749,crop:61750,crown:61751,css3:61752,database:61753,"die-five":61754,"die-four":61755,"die-one":61756,"die-six":61757,"die-three":61758,"die-two":61759,dislike:61760,"dollar-bill":61761,dollar:61762,download:61763,eject:61764,elevator:61765,euro:61766,eye:61767,"fast-forward":61768,"female-symbol":61769,female:61770,filter:61771,"first-aid":61772,flag:61773,"folder-add":61774,"folder-lock":61775,folder:61776,foot:61777,foundation:61778,"graph-bar":61779,"graph-horizontal":61780,"graph-pie":61781,"graph-trend":61782,"guide-dog":61783,"hearing-aid":61784,heart:61785,home:61786,html5:61787,"indent-less":61788,"indent-more":61789,info:61790,italic:61791,key:61792,laptop:61793,layout:61794,lightbulb:61795,like:61796,link:61797,"list-bullet":61798,"list-number":61799,"list-thumbnails":61800,list:61801,lock:61802,loop:61803,"magnifying-glass":61804,mail:61805,"male-female":61806,"male-symbol":61807,male:61808,map:61809,marker:61810,megaphone:61811,microphone:61812,"minus-circle":61813,minus:61814,"mobile-signal":61815,mobile:61816,monitor:61817,mountains:61818,music:61819,next:61820,"no-dogs":61821,"no-smoking":61822,"page-add":61823,"page-copy":61824,"page-csv":61825,"page-delete":61826,"page-doc":61827,"page-edit":61828,"page-export-csv":61829,"page-export-doc":61830,"page-export-pdf":61831,"page-export":61832,"page-filled":61833,"page-multiple":61834,"page-pdf":61835,"page-remove":61836,"page-search":61837,page:61838,"paint-bucket":61839,paperclip:61840,pause:61841,paw:61842,paypal:61843,pencil:61844,photo:61845,"play-circle":61846,"play-video":61847,play:61848,plus:61849,pound:61850,power:61851,previous:61852,"price-tag":61853,"pricetag-multiple":61854,print:61855,prohibited:61856,"projection-screen":61857,puzzle:61858,quote:61859,record:61860,refresh:61861,"results-demographics":61862,results:61863,"rewind-ten":61864,rewind:61865,rss:61866,"safety-cone":61867,save:61868,share:61869,"sheriff-badge":61870,shield:61871,"shopping-bag":61872,"shopping-cart":61873,shuffle:61874,skull:61875,"social-500px":61876,"social-adobe":61877,"social-amazon":61878,"social-android":61879,"social-apple":61880,"social-behance":61881,"social-bing":61882,"social-blogger":61883,"social-delicious":61884,"social-designer-news":61885,"social-deviant-art":61886,"social-digg":61887,"social-dribbble":61888,"social-drive":61889,"social-dropbox":61890,"social-evernote":61891,"social-facebook":61892,"social-flickr":61893,"social-forrst":61894,"social-foursquare":61895,"social-game-center":61896,"social-github":61897,"social-google-plus":61898,"social-hacker-news":61899,"social-hi5":61900,"social-instagram":61901,"social-joomla":61902,"social-lastfm":61903,"social-linkedin":61904,"social-medium":61905,"social-myspace":61906,"social-orkut":61907,"social-path":61908,"social-picasa":61909,"social-pinterest":61910,"social-rdio":61911,"social-reddit":61912,"social-skillshare":61913,"social-skype":61914,"social-smashing-mag":61915,"social-snapchat":61916,"social-spotify":61917,"social-squidoo":61918,"social-stack-overflow":61919,"social-steam":61920,"social-stumbleupon":61921,"social-treehouse":61922,"social-tumblr":61923,"social-twitter":61924,"social-vimeo":61925,"social-windows":61926,"social-xbox":61927,"social-yahoo":61928,"social-yelp":61929,"social-youtube":61930,"social-zerply":61931,"social-zurb":61932,sound:61933,star:61934,stop:61935,strikethrough:61936,subscript:61937,superscript:61938,"tablet-landscape":61939,"tablet-portrait":61940,"target-two":61941,target:61942,"telephone-accessible":61943,telephone:61944,"text-color":61945,thumbnails:61946,ticket:61947,"torso-business":61948,"torso-female":61949,torso:61950,"torsos-all-female":61951,"torsos-all":61952,"torsos-female-male":61953,"torsos-male-female":61954,torsos:61955,trash:61956,trees:61957,trophy:61958,underline:61959,"universal-access":61960,unlink:61961,unlock:61962,"upload-cloud":61963,upload:61964,usb:61965,video:61966,"volume-none":61967,"volume-strike":61968,volume:61969,web:61970,wheelchair:61971,widget:61972,wrench:61973,"x-circle":61974,x:61975,yen:61976,"zoom-in":61977,"zoom-out":61978}},660,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.getImageSourceSync=e.getImageSource=e.TabBarItemIOS=e.TabBarItem=e.Button=e.default=void 0;var o=t(r(d[1])),I=t(r(d[2])),u=(0,o.default)(I.default,'Ionicons','Ionicons.ttf'),c=u;e.default=c;var n=u.Button,S=u.TabBarItem,B=u.TabBarItemIOS,b=u.getImageSource,f=u.getImageSourceSync;e.getImageSourceSync=f,e.getImageSource=b,e.TabBarItemIOS=B,e.TabBarItem=S,e.Button=n},661,[1,633,662]); -__d(function(o,e,i,r,a,s,l){a.exports={add:61696,"add-circle":61697,"add-circle-outline":61698,"add-circle-sharp":61699,"add-outline":61700,"add-sharp":61701,airplane:61702,"airplane-outline":61703,"airplane-sharp":61704,alarm:61705,"alarm-outline":61706,"alarm-sharp":61707,albums:61708,"albums-outline":61709,"albums-sharp":61710,alert:61711,"alert-circle":61712,"alert-circle-outline":61713,"alert-circle-sharp":61714,"alert-outline":61715,"alert-sharp":61716,"american-football":61717,"american-football-outline":61718,"american-football-sharp":61719,analytics:61720,"analytics-outline":61721,"analytics-sharp":61722,aperture:61723,"aperture-outline":61724,"aperture-sharp":61725,apps:61726,"apps-outline":61727,"apps-sharp":61728,archive:61729,"archive-outline":61730,"archive-sharp":61731,"arrow-back":61732,"arrow-back-circle":61733,"arrow-back-circle-outline":61734,"arrow-back-circle-sharp":61735,"arrow-back-outline":61736,"arrow-back-sharp":61737,"arrow-down":61738,"arrow-down-circle":61739,"arrow-down-circle-outline":61740,"arrow-down-circle-sharp":61741,"arrow-down-outline":61742,"arrow-down-sharp":61743,"arrow-forward":61744,"arrow-forward-circle":61745,"arrow-forward-circle-outline":61746,"arrow-forward-circle-sharp":61747,"arrow-forward-outline":61748,"arrow-forward-sharp":61749,"arrow-redo":61750,"arrow-redo-circle":61751,"arrow-redo-circle-outline":61752,"arrow-redo-circle-sharp":61753,"arrow-redo-outline":61754,"arrow-redo-sharp":61755,"arrow-undo":61756,"arrow-undo-circle":61757,"arrow-undo-circle-outline":61758,"arrow-undo-circle-sharp":61759,"arrow-undo-outline":61760,"arrow-undo-sharp":61761,"arrow-up":61762,"arrow-up-circle":61763,"arrow-up-circle-outline":61764,"arrow-up-circle-sharp":61765,"arrow-up-outline":61766,"arrow-up-sharp":61767,at:61768,"at-circle":61769,"at-circle-outline":61770,"at-circle-sharp":61771,"at-outline":61772,"at-sharp":61773,attach:61774,"attach-outline":61775,"attach-sharp":61776,backspace:61777,"backspace-outline":61778,"backspace-sharp":61779,bandage:61780,"bandage-outline":61781,"bandage-sharp":61782,"bar-chart":61783,"bar-chart-outline":61784,"bar-chart-sharp":61785,barbell:61786,"barbell-outline":61787,"barbell-sharp":61788,barcode:61789,"barcode-outline":61790,"barcode-sharp":61791,baseball:61792,"baseball-outline":61793,"baseball-sharp":61794,basket:61795,"basket-outline":61796,"basket-sharp":61797,basketball:61798,"basketball-outline":61799,"basketball-sharp":61800,"battery-charging":61801,"battery-charging-outline":61802,"battery-charging-sharp":61803,"battery-dead":61804,"battery-dead-outline":61805,"battery-dead-sharp":61806,"battery-full":61807,"battery-full-outline":61808,"battery-full-sharp":61809,"battery-half":61810,"battery-half-outline":61811,"battery-half-sharp":61812,beaker:61813,"beaker-outline":61814,"beaker-sharp":61815,bed:61816,"bed-outline":61817,"bed-sharp":61818,beer:61819,"beer-outline":61820,"beer-sharp":61821,bicycle:61822,"bicycle-outline":61823,"bicycle-sharp":61824,bluetooth:61825,"bluetooth-outline":61826,"bluetooth-sharp":61827,boat:61828,"boat-outline":61829,"boat-sharp":61830,body:61831,"body-outline":61832,"body-sharp":61833,bonfire:61834,"bonfire-outline":61835,"bonfire-sharp":61836,book:61837,"book-outline":61838,"book-sharp":61839,bookmark:61840,"bookmark-outline":61841,"bookmark-sharp":61842,bookmarks:61843,"bookmarks-outline":61844,"bookmarks-sharp":61845,briefcase:61846,"briefcase-outline":61847,"briefcase-sharp":61848,browsers:61849,"browsers-outline":61850,"browsers-sharp":61851,brush:61852,"brush-outline":61853,"brush-sharp":61854,bug:61855,"bug-outline":61856,"bug-sharp":61857,build:61858,"build-outline":61859,"build-sharp":61860,bulb:61861,"bulb-outline":61862,"bulb-sharp":61863,bus:61864,"bus-outline":61865,"bus-sharp":61866,business:61867,"business-outline":61868,"business-sharp":61869,cafe:61870,"cafe-outline":61871,"cafe-sharp":61872,calculator:61873,"calculator-outline":61874,"calculator-sharp":61875,calendar:61876,"calendar-outline":61877,"calendar-sharp":61878,call:61879,"call-outline":61880,"call-sharp":61881,camera:61882,"camera-outline":61883,"camera-reverse":61884,"camera-reverse-outline":61885,"camera-reverse-sharp":61886,"camera-sharp":61887,car:61888,"car-outline":61889,"car-sharp":61890,"car-sport":61891,"car-sport-outline":61892,"car-sport-sharp":61893,card:61894,"card-outline":61895,"card-sharp":61896,"caret-back":61897,"caret-back-circle":61898,"caret-back-circle-outline":61899,"caret-back-circle-sharp":61900,"caret-back-outline":61901,"caret-back-sharp":61902,"caret-down":61903,"caret-down-circle":61904,"caret-down-circle-outline":61905,"caret-down-circle-sharp":61906,"caret-down-outline":61907,"caret-down-sharp":61908,"caret-forward":61909,"caret-forward-circle":61910,"caret-forward-circle-outline":61911,"caret-forward-circle-sharp":61912,"caret-forward-outline":61913,"caret-forward-sharp":61914,"caret-up":61915,"caret-up-circle":61916,"caret-up-circle-outline":61917,"caret-up-circle-sharp":61918,"caret-up-outline":61919,"caret-up-sharp":61920,cart:61921,"cart-outline":61922,"cart-sharp":61923,cash:61924,"cash-outline":61925,"cash-sharp":61926,cellular:61927,"cellular-outline":61928,"cellular-sharp":61929,chatbox:61930,"chatbox-ellipses":61931,"chatbox-ellipses-outline":61932,"chatbox-ellipses-sharp":61933,"chatbox-outline":61934,"chatbox-sharp":61935,chatbubble:61936,"chatbubble-ellipses":61937,"chatbubble-ellipses-outline":61938,"chatbubble-ellipses-sharp":61939,"chatbubble-outline":61940,"chatbubble-sharp":61941,chatbubbles:61942,"chatbubbles-outline":61943,"chatbubbles-sharp":61944,checkbox:61945,"checkbox-outline":61946,"checkbox-sharp":61947,checkmark:61948,"checkmark-circle":61949,"checkmark-circle-outline":61950,"checkmark-circle-sharp":61951,"checkmark-done":61952,"checkmark-done-circle":61953,"checkmark-done-circle-outline":61954,"checkmark-done-circle-sharp":61955,"checkmark-done-outline":61956,"checkmark-done-sharp":61957,"checkmark-outline":61958,"checkmark-sharp":61959,"chevron-back":61960,"chevron-back-circle":61961,"chevron-back-circle-outline":61962,"chevron-back-circle-sharp":61963,"chevron-back-outline":61964,"chevron-back-sharp":61965,"chevron-down":61966,"chevron-down-circle":61967,"chevron-down-circle-outline":61968,"chevron-down-circle-sharp":61969,"chevron-down-outline":61970,"chevron-down-sharp":61971,"chevron-forward":61972,"chevron-forward-circle":61973,"chevron-forward-circle-outline":61974,"chevron-forward-circle-sharp":61975,"chevron-forward-outline":61976,"chevron-forward-sharp":61977,"chevron-up":61978,"chevron-up-circle":61979,"chevron-up-circle-outline":61980,"chevron-up-circle-sharp":61981,"chevron-up-outline":61982,"chevron-up-sharp":61983,clipboard:61984,"clipboard-outline":61985,"clipboard-sharp":61986,close:61987,"close-circle":61988,"close-circle-outline":61989,"close-circle-sharp":61990,"close-outline":61991,"close-sharp":61992,cloud:61993,"cloud-circle":61994,"cloud-circle-outline":61995,"cloud-circle-sharp":61996,"cloud-done":61997,"cloud-done-outline":61998,"cloud-done-sharp":61999,"cloud-download":62e3,"cloud-download-outline":62001,"cloud-download-sharp":62002,"cloud-offline":62003,"cloud-offline-outline":62004,"cloud-offline-sharp":62005,"cloud-outline":62006,"cloud-sharp":62007,"cloud-upload":62008,"cloud-upload-outline":62009,"cloud-upload-sharp":62010,cloudy:62011,"cloudy-night":62012,"cloudy-night-outline":62013,"cloudy-night-sharp":62014,"cloudy-outline":62015,"cloudy-sharp":62016,code:62017,"code-download":62018,"code-download-outline":62019,"code-download-sharp":62020,"code-outline":62021,"code-sharp":62022,"code-slash":62023,"code-slash-outline":62024,"code-slash-sharp":62025,"code-working":62026,"code-working-outline":62027,"code-working-sharp":62028,cog:62029,"cog-outline":62030,"cog-sharp":62031,"color-fill":62032,"color-fill-outline":62033,"color-fill-sharp":62034,"color-filter":62035,"color-filter-outline":62036,"color-filter-sharp":62037,"color-palette":62038,"color-palette-outline":62039,"color-palette-sharp":62040,"color-wand":62041,"color-wand-outline":62042,"color-wand-sharp":62043,compass:62044,"compass-outline":62045,"compass-sharp":62046,construct:62047,"construct-outline":62048,"construct-sharp":62049,contract:62050,"contract-outline":62051,"contract-sharp":62052,contrast:62053,"contrast-outline":62054,"contrast-sharp":62055,copy:62056,"copy-outline":62057,"copy-sharp":62058,create:62059,"create-outline":62060,"create-sharp":62061,crop:62062,"crop-outline":62063,"crop-sharp":62064,cube:62065,"cube-outline":62066,"cube-sharp":62067,cut:62068,"cut-outline":62069,"cut-sharp":62070,desktop:62071,"desktop-outline":62072,"desktop-sharp":62073,disc:62074,"disc-outline":62075,"disc-sharp":62076,document:62077,"document-attach":62078,"document-attach-outline":62079,"document-attach-sharp":62080,"document-outline":62081,"document-sharp":62082,"document-text":62083,"document-text-outline":62084,"document-text-sharp":62085,documents:62086,"documents-outline":62087,"documents-sharp":62088,download:62089,"download-outline":62090,"download-sharp":62091,duplicate:62092,"duplicate-outline":62093,"duplicate-sharp":62094,ear:62095,"ear-outline":62096,"ear-sharp":62097,earth:62098,"earth-outline":62099,"earth-sharp":62100,easel:62101,"easel-outline":62102,"easel-sharp":62103,egg:62104,"egg-outline":62105,"egg-sharp":62106,ellipse:62107,"ellipse-outline":62108,"ellipse-sharp":62109,"ellipsis-horizontal":62110,"ellipsis-horizontal-circle":62111,"ellipsis-horizontal-circle-outline":62112,"ellipsis-horizontal-circle-sharp":62113,"ellipsis-horizontal-outline":62114,"ellipsis-horizontal-sharp":62115,"ellipsis-vertical":62116,"ellipsis-vertical-circle":62117,"ellipsis-vertical-circle-outline":62118,"ellipsis-vertical-circle-sharp":62119,"ellipsis-vertical-outline":62120,"ellipsis-vertical-sharp":62121,enter:62122,"enter-outline":62123,"enter-sharp":62124,exit:62125,"exit-outline":62126,"exit-sharp":62127,expand:62128,"expand-outline":62129,"expand-sharp":62130,eye:62131,"eye-off":62132,"eye-off-outline":62133,"eye-off-sharp":62134,"eye-outline":62135,"eye-sharp":62136,eyedrop:62137,"eyedrop-outline":62138,"eyedrop-sharp":62139,"fast-food":62140,"fast-food-outline":62141,"fast-food-sharp":62142,female:62143,"female-outline":62144,"female-sharp":62145,"file-tray":62146,"file-tray-full":62147,"file-tray-full-outline":62148,"file-tray-full-sharp":62149,"file-tray-outline":62150,"file-tray-sharp":62151,"file-tray-stacked":62152,"file-tray-stacked-outline":62153,"file-tray-stacked-sharp":62154,film:62155,"film-outline":62156,"film-sharp":62157,filter:62158,"filter-outline":62159,"filter-sharp":62160,"finger-print":62161,"finger-print-outline":62162,"finger-print-sharp":62163,fitness:62164,"fitness-outline":62165,"fitness-sharp":62166,flag:62167,"flag-outline":62168,"flag-sharp":62169,flame:62170,"flame-outline":62171,"flame-sharp":62172,flash:62173,"flash-off":62174,"flash-off-outline":62175,"flash-off-sharp":62176,"flash-outline":62177,"flash-sharp":62178,flashlight:62179,"flashlight-outline":62180,"flashlight-sharp":62181,flask:62182,"flask-outline":62183,"flask-sharp":62184,flower:62185,"flower-outline":62186,"flower-sharp":62187,folder:62188,"folder-open":62189,"folder-open-outline":62190,"folder-open-sharp":62191,"folder-outline":62192,"folder-sharp":62193,football:62194,"football-outline":62195,"football-sharp":62196,funnel:62197,"funnel-outline":62198,"funnel-sharp":62199,"game-controller":62200,"game-controller-outline":62201,"game-controller-sharp":62202,gift:62203,"gift-outline":62204,"gift-sharp":62205,"git-branch":62206,"git-branch-outline":62207,"git-branch-sharp":62208,"git-commit":62209,"git-commit-outline":62210,"git-commit-sharp":62211,"git-compare":62212,"git-compare-outline":62213,"git-compare-sharp":62214,"git-merge":62215,"git-merge-outline":62216,"git-merge-sharp":62217,"git-network":62218,"git-network-outline":62219,"git-network-sharp":62220,"git-pull-request":62221,"git-pull-request-outline":62222,"git-pull-request-sharp":62223,glasses:62224,"glasses-outline":62225,"glasses-sharp":62226,globe:62227,"globe-outline":62228,"globe-sharp":62229,golf:62230,"golf-outline":62231,"golf-sharp":62232,grid:62233,"grid-outline":62234,"grid-sharp":62235,hammer:62236,"hammer-outline":62237,"hammer-sharp":62238,"hand-left":62239,"hand-left-outline":62240,"hand-left-sharp":62241,"hand-right":62242,"hand-right-outline":62243,"hand-right-sharp":62244,happy:62245,"happy-outline":62246,"happy-sharp":62247,"hardware-chip":62248,"hardware-chip-outline":62249,"hardware-chip-sharp":62250,headset:62251,"headset-outline":62252,"headset-sharp":62253,heart:62254,"heart-circle":62255,"heart-circle-outline":62256,"heart-circle-sharp":62257,"heart-dislike":62258,"heart-dislike-circle":62259,"heart-dislike-circle-outline":62260,"heart-dislike-circle-sharp":62261,"heart-dislike-outline":62262,"heart-dislike-sharp":62263,"heart-half":62264,"heart-half-outline":62265,"heart-half-sharp":62266,"heart-outline":62267,"heart-sharp":62268,help:62269,"help-buoy":62270,"help-buoy-outline":62271,"help-buoy-sharp":62272,"help-circle":62273,"help-circle-outline":62274,"help-circle-sharp":62275,"help-outline":62276,"help-sharp":62277,home:62278,"home-outline":62279,"home-sharp":62280,hourglass:62281,"hourglass-outline":62282,"hourglass-sharp":62283,"ice-cream":62284,"ice-cream-outline":62285,"ice-cream-sharp":62286,image:62287,"image-outline":62288,"image-sharp":62289,images:62290,"images-outline":62291,"images-sharp":62292,infinite:62293,"infinite-outline":62294,"infinite-sharp":62295,information:62296,"information-circle":62297,"information-circle-outline":62298,"information-circle-sharp":62299,"information-outline":62300,"information-sharp":62301,journal:62302,"journal-outline":62303,"journal-sharp":62304,key:62305,"key-outline":62306,"key-sharp":62307,keypad:62308,"keypad-outline":62309,"keypad-sharp":62310,language:62311,"language-outline":62312,"language-sharp":62313,laptop:62314,"laptop-outline":62315,"laptop-sharp":62316,layers:62317,"layers-outline":62318,"layers-sharp":62319,leaf:62320,"leaf-outline":62321,"leaf-sharp":62322,library:62323,"library-outline":62324,"library-sharp":62325,link:62326,"link-outline":62327,"link-sharp":62328,list:62329,"list-circle":62330,"list-circle-outline":62331,"list-circle-sharp":62332,"list-outline":62333,"list-sharp":62334,locate:62335,"locate-outline":62336,"locate-sharp":62337,location:62338,"location-outline":62339,"location-sharp":62340,"lock-closed":62341,"lock-closed-outline":62342,"lock-closed-sharp":62343,"lock-open":62344,"lock-open-outline":62345,"lock-open-sharp":62346,"log-in":62347,"log-in-outline":62348,"log-in-sharp":62349,"log-out":62350,"log-out-outline":62351,"log-out-sharp":62352,"logo-amazon":62353,"logo-amplify":62354,"logo-android":62355,"logo-angular":62356,"logo-apple":62357,"logo-apple-appstore":62358,"logo-bitbucket":62359,"logo-bitcoin":62360,"logo-buffer":62361,"logo-capacitor":62362,"logo-chrome":62363,"logo-closed-captioning":62364,"logo-codepen":62365,"logo-css3":62366,"logo-designernews":62367,"logo-dribbble":62368,"logo-dropbox":62369,"logo-edge":62370,"logo-electron":62371,"logo-euro":62372,"logo-facebook":62373,"logo-firebase":62374,"logo-firefox":62375,"logo-flickr":62376,"logo-foursquare":62377,"logo-github":62378,"logo-google":62379,"logo-google-playstore":62380,"logo-hackernews":62381,"logo-html5":62382,"logo-instagram":62383,"logo-ionic":62384,"logo-ionitron":62385,"logo-javascript":62386,"logo-laravel":62387,"logo-linkedin":62388,"logo-markdown":62389,"logo-no-smoking":62390,"logo-nodejs":62391,"logo-npm":62392,"logo-octocat":62393,"logo-pinterest":62394,"logo-playstation":62395,"logo-pwa":62396,"logo-python":62397,"logo-react":62398,"logo-reddit":62399,"logo-rss":62400,"logo-sass":62401,"logo-skype":62402,"logo-slack":62403,"logo-snapchat":62404,"logo-stackoverflow":62405,"logo-steam":62406,"logo-stencil":62407,"logo-tumblr":62408,"logo-tux":62409,"logo-twitch":62410,"logo-twitter":62411,"logo-usd":62412,"logo-vimeo":62413,"logo-vk":62414,"logo-vue":62415,"logo-web-component":62416,"logo-whatsapp":62417,"logo-windows":62418,"logo-wordpress":62419,"logo-xbox":62420,"logo-xing":62421,"logo-yahoo":62422,"logo-yen":62423,"logo-youtube":62424,magnet:62425,"magnet-outline":62426,"magnet-sharp":62427,mail:62428,"mail-open":62429,"mail-open-outline":62430,"mail-open-sharp":62431,"mail-outline":62432,"mail-sharp":62433,"mail-unread":62434,"mail-unread-outline":62435,"mail-unread-sharp":62436,male:62437,"male-female":62438,"male-female-outline":62439,"male-female-sharp":62440,"male-outline":62441,"male-sharp":62442,man:62443,"man-outline":62444,"man-sharp":62445,map:62446,"map-outline":62447,"map-sharp":62448,medal:62449,"medal-outline":62450,"medal-sharp":62451,medical:62452,"medical-outline":62453,"medical-sharp":62454,medkit:62455,"medkit-outline":62456,"medkit-sharp":62457,megaphone:62458,"megaphone-outline":62459,"megaphone-sharp":62460,menu:62461,"menu-outline":62462,"menu-sharp":62463,mic:62464,"mic-circle":62465,"mic-circle-outline":62466,"mic-circle-sharp":62467,"mic-off":62468,"mic-off-circle":62469,"mic-off-circle-outline":62470,"mic-off-circle-sharp":62471,"mic-off-outline":62472,"mic-off-sharp":62473,"mic-outline":62474,"mic-sharp":62475,moon:62476,"moon-outline":62477,"moon-sharp":62478,move:62479,"move-outline":62480,"move-sharp":62481,"musical-note":62482,"musical-note-outline":62483,"musical-note-sharp":62484,"musical-notes":62485,"musical-notes-outline":62486,"musical-notes-sharp":62487,navigate:62488,"navigate-circle":62489,"navigate-circle-outline":62490,"navigate-circle-sharp":62491,"navigate-outline":62492,"navigate-sharp":62493,newspaper:62494,"newspaper-outline":62495,"newspaper-sharp":62496,notifications:62497,"notifications-circle":62498,"notifications-circle-outline":62499,"notifications-circle-sharp":62500,"notifications-off":62501,"notifications-off-circle":62502,"notifications-off-circle-outline":62503,"notifications-off-circle-sharp":62504,"notifications-off-outline":62505,"notifications-off-sharp":62506,"notifications-outline":62507,"notifications-sharp":62508,nuclear:62509,"nuclear-outline":62510,"nuclear-sharp":62511,nutrition:62512,"nutrition-outline":62513,"nutrition-sharp":62514,open:62515,"open-outline":62516,"open-sharp":62517,options:62518,"options-outline":62519,"options-sharp":62520,"paper-plane":62521,"paper-plane-outline":62522,"paper-plane-sharp":62523,"partly-sunny":62524,"partly-sunny-outline":62525,"partly-sunny-sharp":62526,pause:62527,"pause-circle":62528,"pause-circle-outline":62529,"pause-circle-sharp":62530,"pause-outline":62531,"pause-sharp":62532,paw:62533,"paw-outline":62534,"paw-sharp":62535,pencil:62536,"pencil-outline":62537,"pencil-sharp":62538,people:62539,"people-circle":62540,"people-circle-outline":62541,"people-circle-sharp":62542,"people-outline":62543,"people-sharp":62544,person:62545,"person-add":62546,"person-add-outline":62547,"person-add-sharp":62548,"person-circle":62549,"person-circle-outline":62550,"person-circle-sharp":62551,"person-outline":62552,"person-remove":62553,"person-remove-outline":62554,"person-remove-sharp":62555,"person-sharp":62556,"phone-landscape":62557,"phone-landscape-outline":62558,"phone-landscape-sharp":62559,"phone-portrait":62560,"phone-portrait-outline":62561,"phone-portrait-sharp":62562,"pie-chart":62563,"pie-chart-outline":62564,"pie-chart-sharp":62565,pin:62566,"pin-outline":62567,"pin-sharp":62568,pint:62569,"pint-outline":62570,"pint-sharp":62571,pizza:62572,"pizza-outline":62573,"pizza-sharp":62574,planet:62575,"planet-outline":62576,"planet-sharp":62577,play:62578,"play-back":62579,"play-back-circle":62580,"play-back-circle-outline":62581,"play-back-circle-sharp":62582,"play-back-outline":62583,"play-back-sharp":62584,"play-circle":62585,"play-circle-outline":62586,"play-circle-sharp":62587,"play-forward":62588,"play-forward-circle":62589,"play-forward-circle-outline":62590,"play-forward-circle-sharp":62591,"play-forward-outline":62592,"play-forward-sharp":62593,"play-outline":62594,"play-sharp":62595,"play-skip-back":62596,"play-skip-back-circle":62597,"play-skip-back-circle-outline":62598,"play-skip-back-circle-sharp":62599,"play-skip-back-outline":62600,"play-skip-back-sharp":62601,"play-skip-forward":62602,"play-skip-forward-circle":62603,"play-skip-forward-circle-outline":62604,"play-skip-forward-circle-sharp":62605,"play-skip-forward-outline":62606,"play-skip-forward-sharp":62607,podium:62608,"podium-outline":62609,"podium-sharp":62610,power:62611,"power-outline":62612,"power-sharp":62613,pricetag:62614,"pricetag-outline":62615,"pricetag-sharp":62616,pricetags:62617,"pricetags-outline":62618,"pricetags-sharp":62619,print:62620,"print-outline":62621,"print-sharp":62622,pulse:62623,"pulse-outline":62624,"pulse-sharp":62625,push:62626,"push-outline":62627,"push-sharp":62628,"qr-code":62629,"qr-code-outline":62630,"qr-code-sharp":62631,radio:62632,"radio-button-off":62633,"radio-button-off-outline":62634,"radio-button-off-sharp":62635,"radio-button-on":62636,"radio-button-on-outline":62637,"radio-button-on-sharp":62638,"radio-outline":62639,"radio-sharp":62640,rainy:62641,"rainy-outline":62642,"rainy-sharp":62643,reader:62644,"reader-outline":62645,"reader-sharp":62646,receipt:62647,"receipt-outline":62648,"receipt-sharp":62649,recording:62650,"recording-outline":62651,"recording-sharp":62652,refresh:62653,"refresh-circle":62654,"refresh-circle-outline":62655,"refresh-circle-sharp":62656,"refresh-outline":62657,"refresh-sharp":62658,reload:62659,"reload-circle":62660,"reload-circle-outline":62661,"reload-circle-sharp":62662,"reload-outline":62663,"reload-sharp":62664,remove:62665,"remove-circle":62666,"remove-circle-outline":62667,"remove-circle-sharp":62668,"remove-outline":62669,"remove-sharp":62670,"reorder-four":62671,"reorder-four-outline":62672,"reorder-four-sharp":62673,"reorder-three":62674,"reorder-three-outline":62675,"reorder-three-sharp":62676,"reorder-two":62677,"reorder-two-outline":62678,"reorder-two-sharp":62679,repeat:62680,"repeat-outline":62681,"repeat-sharp":62682,resize:62683,"resize-outline":62684,"resize-sharp":62685,restaurant:62686,"restaurant-outline":62687,"restaurant-sharp":62688,"return-down-back":62689,"return-down-back-outline":62690,"return-down-back-sharp":62691,"return-down-forward":62692,"return-down-forward-outline":62693,"return-down-forward-sharp":62694,"return-up-back":62695,"return-up-back-outline":62696,"return-up-back-sharp":62697,"return-up-forward":62698,"return-up-forward-outline":62699,"return-up-forward-sharp":62700,ribbon:62701,"ribbon-outline":62702,"ribbon-sharp":62703,rocket:62704,"rocket-outline":62705,"rocket-sharp":62706,rose:62707,"rose-outline":62708,"rose-sharp":62709,sad:62710,"sad-outline":62711,"sad-sharp":62712,save:62713,"save-outline":62714,"save-sharp":62715,scan:62716,"scan-circle":62717,"scan-circle-outline":62718,"scan-circle-sharp":62719,"scan-outline":62720,"scan-sharp":62721,school:62722,"school-outline":62723,"school-sharp":62724,search:62725,"search-circle":62726,"search-circle-outline":62727,"search-circle-sharp":62728,"search-outline":62729,"search-sharp":62730,send:62731,"send-outline":62732,"send-sharp":62733,server:62734,"server-outline":62735,"server-sharp":62736,settings:62737,"settings-outline":62738,"settings-sharp":62739,shapes:62740,"shapes-outline":62741,"shapes-sharp":62742,share:62743,"share-outline":62744,"share-sharp":62745,"share-social":62746,"share-social-outline":62747,"share-social-sharp":62748,shield:62749,"shield-checkmark":62750,"shield-checkmark-outline":62751,"shield-checkmark-sharp":62752,"shield-outline":62753,"shield-sharp":62754,shirt:62755,"shirt-outline":62756,"shirt-sharp":62757,shuffle:62758,"shuffle-outline":62759,"shuffle-sharp":62760,skull:62761,"skull-outline":62762,"skull-sharp":62763,snow:62764,"snow-outline":62765,"snow-sharp":62766,speedometer:62767,"speedometer-outline":62768,"speedometer-sharp":62769,square:62770,"square-outline":62771,"square-sharp":62772,star:62773,"star-half":62774,"star-half-outline":62775,"star-half-sharp":62776,"star-outline":62777,"star-sharp":62778,"stats-chart":62779,"stats-chart-outline":62780,"stats-chart-sharp":62781,stop:62782,"stop-circle":62783,"stop-circle-outline":62784,"stop-circle-sharp":62785,"stop-outline":62786,"stop-sharp":62787,stopwatch:62788,"stopwatch-outline":62789,"stopwatch-sharp":62790,subway:62791,"subway-outline":62792,"subway-sharp":62793,sunny:62794,"sunny-outline":62795,"sunny-sharp":62796,"swap-horizontal":62797,"swap-horizontal-outline":62798,"swap-horizontal-sharp":62799,"swap-vertical":62800,"swap-vertical-outline":62801,"swap-vertical-sharp":62802,sync:62803,"sync-circle":62804,"sync-circle-outline":62805,"sync-circle-sharp":62806,"sync-outline":62807,"sync-sharp":62808,"tablet-landscape":62809,"tablet-landscape-outline":62810,"tablet-landscape-sharp":62811,"tablet-portrait":62812,"tablet-portrait-outline":62813,"tablet-portrait-sharp":62814,tennisball:62815,"tennisball-outline":62816,"tennisball-sharp":62817,terminal:62818,"terminal-outline":62819,"terminal-sharp":62820,text:62821,"text-outline":62822,"text-sharp":62823,thermometer:62824,"thermometer-outline":62825,"thermometer-sharp":62826,"thumbs-down":62827,"thumbs-down-outline":62828,"thumbs-down-sharp":62829,"thumbs-up":62830,"thumbs-up-outline":62831,"thumbs-up-sharp":62832,thunderstorm:62833,"thunderstorm-outline":62834,"thunderstorm-sharp":62835,time:62836,"time-outline":62837,"time-sharp":62838,timer:62839,"timer-outline":62840,"timer-sharp":62841,today:62842,"today-outline":62843,"today-sharp":62844,toggle:62845,"toggle-outline":62846,"toggle-sharp":62847,"trail-sign":62848,"trail-sign-outline":62849,"trail-sign-sharp":62850,train:62851,"train-outline":62852,"train-sharp":62853,transgender:62854,"transgender-outline":62855,"transgender-sharp":62856,trash:62857,"trash-bin":62858,"trash-bin-outline":62859,"trash-bin-sharp":62860,"trash-outline":62861,"trash-sharp":62862,"trending-down":62863,"trending-down-outline":62864,"trending-down-sharp":62865,"trending-up":62866,"trending-up-outline":62867,"trending-up-sharp":62868,triangle:62869,"triangle-outline":62870,"triangle-sharp":62871,trophy:62872,"trophy-outline":62873,"trophy-sharp":62874,tv:62875,"tv-outline":62876,"tv-sharp":62877,umbrella:62878,"umbrella-outline":62879,"umbrella-sharp":62880,videocam:62881,"videocam-outline":62882,"videocam-sharp":62883,"volume-high":62884,"volume-high-outline":62885,"volume-high-sharp":62886,"volume-low":62887,"volume-low-outline":62888,"volume-low-sharp":62889,"volume-medium":62890,"volume-medium-outline":62891,"volume-medium-sharp":62892,"volume-mute":62893,"volume-mute-outline":62894,"volume-mute-sharp":62895,"volume-off":62896,"volume-off-outline":62897,"volume-off-sharp":62898,walk:62899,"walk-outline":62900,"walk-sharp":62901,wallet:62902,"wallet-outline":62903,"wallet-sharp":62904,warning:62905,"warning-outline":62906,"warning-sharp":62907,watch:62908,"watch-outline":62909,"watch-sharp":62910,water:62911,"water-outline":62912,"water-sharp":62913,wifi:62914,"wifi-outline":62915,"wifi-sharp":62916,wine:62917,"wine-outline":62918,"wine-sharp":62919,woman:62920,"woman-outline":62921,"woman-sharp":62922,"ios-add":61696,"ios-add-circle":61697,"ios-add-circle-outline":61698,"ios-add-circle-sharp":61699,"ios-add-outline":61700,"ios-add-sharp":61701,"ios-airplane":61702,"ios-airplane-outline":61703,"ios-airplane-sharp":61704,"ios-alarm":61705,"ios-alarm-outline":61706,"ios-alarm-sharp":61707,"ios-albums":61708,"ios-albums-outline":61709,"ios-albums-sharp":61710,"ios-alert":61711,"ios-alert-circle":61712,"ios-alert-circle-outline":61713,"ios-alert-circle-sharp":61714,"ios-alert-outline":61715,"ios-alert-sharp":61716,"ios-american-football":61717,"ios-american-football-outline":61718,"ios-american-football-sharp":61719,"ios-analytics":61720,"ios-analytics-outline":61721,"ios-analytics-sharp":61722,"ios-aperture":61723,"ios-aperture-outline":61724,"ios-aperture-sharp":61725,"ios-apps":61726,"ios-apps-outline":61727,"ios-apps-sharp":61728,"ios-archive":61729,"ios-archive-outline":61730,"ios-archive-sharp":61731,"ios-arrow-back":61732,"ios-arrow-back-circle":61733,"ios-arrow-back-circle-outline":61734,"ios-arrow-back-circle-sharp":61735,"ios-arrow-back-outline":61736,"ios-arrow-back-sharp":61737,"ios-arrow-down":61738,"ios-arrow-down-circle":61739,"ios-arrow-down-circle-outline":61740,"ios-arrow-down-circle-sharp":61741,"ios-arrow-down-outline":61742,"ios-arrow-down-sharp":61743,"ios-arrow-forward":61744,"ios-arrow-forward-circle":61745,"ios-arrow-forward-circle-outline":61746,"ios-arrow-forward-circle-sharp":61747,"ios-arrow-forward-outline":61748,"ios-arrow-forward-sharp":61749,"ios-arrow-redo":61750,"ios-arrow-redo-circle":61751,"ios-arrow-redo-circle-outline":61752,"ios-arrow-redo-circle-sharp":61753,"ios-arrow-redo-outline":61754,"ios-arrow-redo-sharp":61755,"ios-arrow-undo":61756,"ios-arrow-undo-circle":61757,"ios-arrow-undo-circle-outline":61758,"ios-arrow-undo-circle-sharp":61759,"ios-arrow-undo-outline":61760,"ios-arrow-undo-sharp":61761,"ios-arrow-up":61762,"ios-arrow-up-circle":61763,"ios-arrow-up-circle-outline":61764,"ios-arrow-up-circle-sharp":61765,"ios-arrow-up-outline":61766,"ios-arrow-up-sharp":61767,"ios-at":61768,"ios-at-circle":61769,"ios-at-circle-outline":61770,"ios-at-circle-sharp":61771,"ios-at-outline":61772,"ios-at-sharp":61773,"ios-attach":61774,"ios-attach-outline":61775,"ios-attach-sharp":61776,"ios-backspace":61777,"ios-backspace-outline":61778,"ios-backspace-sharp":61779,"ios-bandage":61780,"ios-bandage-outline":61781,"ios-bandage-sharp":61782,"ios-bar-chart":61783,"ios-bar-chart-outline":61784,"ios-bar-chart-sharp":61785,"ios-barbell":61786,"ios-barbell-outline":61787,"ios-barbell-sharp":61788,"ios-barcode":61789,"ios-barcode-outline":61790,"ios-barcode-sharp":61791,"ios-baseball":61792,"ios-baseball-outline":61793,"ios-baseball-sharp":61794,"ios-basket":61795,"ios-basket-outline":61796,"ios-basket-sharp":61797,"ios-basketball":61798,"ios-basketball-outline":61799,"ios-basketball-sharp":61800,"ios-battery-charging":61801,"ios-battery-charging-outline":61802,"ios-battery-charging-sharp":61803,"ios-battery-dead":61804,"ios-battery-dead-outline":61805,"ios-battery-dead-sharp":61806,"ios-battery-full":61807,"ios-battery-full-outline":61808,"ios-battery-full-sharp":61809,"ios-battery-half":61810,"ios-battery-half-outline":61811,"ios-battery-half-sharp":61812,"ios-beaker":61813,"ios-beaker-outline":61814,"ios-beaker-sharp":61815,"ios-bed":61816,"ios-bed-outline":61817,"ios-bed-sharp":61818,"ios-beer":61819,"ios-beer-outline":61820,"ios-beer-sharp":61821,"ios-bicycle":61822,"ios-bicycle-outline":61823,"ios-bicycle-sharp":61824,"ios-bluetooth":61825,"ios-bluetooth-outline":61826,"ios-bluetooth-sharp":61827,"ios-boat":61828,"ios-boat-outline":61829,"ios-boat-sharp":61830,"ios-body":61831,"ios-body-outline":61832,"ios-body-sharp":61833,"ios-bonfire":61834,"ios-bonfire-outline":61835,"ios-bonfire-sharp":61836,"ios-book":61837,"ios-book-outline":61838,"ios-book-sharp":61839,"ios-bookmark":61840,"ios-bookmark-outline":61841,"ios-bookmark-sharp":61842,"ios-bookmarks":61843,"ios-bookmarks-outline":61844,"ios-bookmarks-sharp":61845,"ios-briefcase":61846,"ios-briefcase-outline":61847,"ios-briefcase-sharp":61848,"ios-browsers":61849,"ios-browsers-outline":61850,"ios-browsers-sharp":61851,"ios-brush":61852,"ios-brush-outline":61853,"ios-brush-sharp":61854,"ios-bug":61855,"ios-bug-outline":61856,"ios-bug-sharp":61857,"ios-build":61858,"ios-build-outline":61859,"ios-build-sharp":61860,"ios-bulb":61861,"ios-bulb-outline":61862,"ios-bulb-sharp":61863,"ios-bus":61864,"ios-bus-outline":61865,"ios-bus-sharp":61866,"ios-business":61867,"ios-business-outline":61868,"ios-business-sharp":61869,"ios-cafe":61870,"ios-cafe-outline":61871,"ios-cafe-sharp":61872,"ios-calculator":61873,"ios-calculator-outline":61874,"ios-calculator-sharp":61875,"ios-calendar":61876,"ios-calendar-outline":61877,"ios-calendar-sharp":61878,"ios-call":61879,"ios-call-outline":61880,"ios-call-sharp":61881,"ios-camera":61882,"ios-camera-outline":61883,"ios-camera-reverse":61884,"ios-camera-reverse-outline":61885,"ios-camera-reverse-sharp":61886,"ios-camera-sharp":61887,"ios-car":61888,"ios-car-outline":61889,"ios-car-sharp":61890,"ios-car-sport":61891,"ios-car-sport-outline":61892,"ios-car-sport-sharp":61893,"ios-card":61894,"ios-card-outline":61895,"ios-card-sharp":61896,"ios-caret-back":61897,"ios-caret-back-circle":61898,"ios-caret-back-circle-outline":61899,"ios-caret-back-circle-sharp":61900,"ios-caret-back-outline":61901,"ios-caret-back-sharp":61902,"ios-caret-down":61903,"ios-caret-down-circle":61904,"ios-caret-down-circle-outline":61905,"ios-caret-down-circle-sharp":61906,"ios-caret-down-outline":61907,"ios-caret-down-sharp":61908,"ios-caret-forward":61909,"ios-caret-forward-circle":61910,"ios-caret-forward-circle-outline":61911,"ios-caret-forward-circle-sharp":61912,"ios-caret-forward-outline":61913,"ios-caret-forward-sharp":61914,"ios-caret-up":61915,"ios-caret-up-circle":61916,"ios-caret-up-circle-outline":61917,"ios-caret-up-circle-sharp":61918,"ios-caret-up-outline":61919,"ios-caret-up-sharp":61920,"ios-cart":61921,"ios-cart-outline":61922,"ios-cart-sharp":61923,"ios-cash":61924,"ios-cash-outline":61925,"ios-cash-sharp":61926,"ios-cellular":61927,"ios-cellular-outline":61928,"ios-cellular-sharp":61929,"ios-chatbox":61930,"ios-chatbox-ellipses":61931,"ios-chatbox-ellipses-outline":61932,"ios-chatbox-ellipses-sharp":61933,"ios-chatbox-outline":61934,"ios-chatbox-sharp":61935,"ios-chatbubble":61936,"ios-chatbubble-ellipses":61937,"ios-chatbubble-ellipses-outline":61938,"ios-chatbubble-ellipses-sharp":61939,"ios-chatbubble-outline":61940,"ios-chatbubble-sharp":61941,"ios-chatbubbles":61942,"ios-chatbubbles-outline":61943,"ios-chatbubbles-sharp":61944,"ios-checkbox":61945,"ios-checkbox-outline":61946,"ios-checkbox-sharp":61947,"ios-checkmark":61948,"ios-checkmark-circle":61949,"ios-checkmark-circle-outline":61950,"ios-checkmark-circle-sharp":61951,"ios-checkmark-done":61952,"ios-checkmark-done-circle":61953,"ios-checkmark-done-circle-outline":61954,"ios-checkmark-done-circle-sharp":61955,"ios-checkmark-done-outline":61956,"ios-checkmark-done-sharp":61957,"ios-checkmark-outline":61958,"ios-checkmark-sharp":61959,"ios-chevron-back":61960,"ios-chevron-back-circle":61961,"ios-chevron-back-circle-outline":61962,"ios-chevron-back-circle-sharp":61963,"ios-chevron-back-outline":61964,"ios-chevron-back-sharp":61965,"ios-chevron-down":61966,"ios-chevron-down-circle":61967,"ios-chevron-down-circle-outline":61968,"ios-chevron-down-circle-sharp":61969,"ios-chevron-down-outline":61970,"ios-chevron-down-sharp":61971,"ios-chevron-forward":61972,"ios-chevron-forward-circle":61973,"ios-chevron-forward-circle-outline":61974,"ios-chevron-forward-circle-sharp":61975,"ios-chevron-forward-outline":61976,"ios-chevron-forward-sharp":61977,"ios-chevron-up":61978,"ios-chevron-up-circle":61979,"ios-chevron-up-circle-outline":61980,"ios-chevron-up-circle-sharp":61981,"ios-chevron-up-outline":61982,"ios-chevron-up-sharp":61983,"ios-clipboard":61984,"ios-clipboard-outline":61985,"ios-clipboard-sharp":61986,"ios-close":61987,"ios-close-circle":61988,"ios-close-circle-outline":61989,"ios-close-circle-sharp":61990,"ios-close-outline":61991,"ios-close-sharp":61992,"ios-cloud":61993,"ios-cloud-circle":61994,"ios-cloud-circle-outline":61995,"ios-cloud-circle-sharp":61996,"ios-cloud-done":61997,"ios-cloud-done-outline":61998,"ios-cloud-done-sharp":61999,"ios-cloud-download":62e3,"ios-cloud-download-outline":62001,"ios-cloud-download-sharp":62002,"ios-cloud-offline":62003,"ios-cloud-offline-outline":62004,"ios-cloud-offline-sharp":62005,"ios-cloud-outline":62006,"ios-cloud-sharp":62007,"ios-cloud-upload":62008,"ios-cloud-upload-outline":62009,"ios-cloud-upload-sharp":62010,"ios-cloudy":62011,"ios-cloudy-night":62012,"ios-cloudy-night-outline":62013,"ios-cloudy-night-sharp":62014,"ios-cloudy-outline":62015,"ios-cloudy-sharp":62016,"ios-code":62017,"ios-code-download":62018,"ios-code-download-outline":62019,"ios-code-download-sharp":62020,"ios-code-outline":62021,"ios-code-sharp":62022,"ios-code-slash":62023,"ios-code-slash-outline":62024,"ios-code-slash-sharp":62025,"ios-code-working":62026,"ios-code-working-outline":62027,"ios-code-working-sharp":62028,"ios-cog":62029,"ios-cog-outline":62030,"ios-cog-sharp":62031,"ios-color-fill":62032,"ios-color-fill-outline":62033,"ios-color-fill-sharp":62034,"ios-color-filter":62035,"ios-color-filter-outline":62036,"ios-color-filter-sharp":62037,"ios-color-palette":62038,"ios-color-palette-outline":62039,"ios-color-palette-sharp":62040,"ios-color-wand":62041,"ios-color-wand-outline":62042,"ios-color-wand-sharp":62043,"ios-compass":62044,"ios-compass-outline":62045,"ios-compass-sharp":62046,"ios-construct":62047,"ios-construct-outline":62048,"ios-construct-sharp":62049,"ios-contract":62050,"ios-contract-outline":62051,"ios-contract-sharp":62052,"ios-contrast":62053,"ios-contrast-outline":62054,"ios-contrast-sharp":62055,"ios-copy":62056,"ios-copy-outline":62057,"ios-copy-sharp":62058,"ios-create":62059,"ios-create-outline":62060,"ios-create-sharp":62061,"ios-crop":62062,"ios-crop-outline":62063,"ios-crop-sharp":62064,"ios-cube":62065,"ios-cube-outline":62066,"ios-cube-sharp":62067,"ios-cut":62068,"ios-cut-outline":62069,"ios-cut-sharp":62070,"ios-desktop":62071,"ios-desktop-outline":62072,"ios-desktop-sharp":62073,"ios-disc":62074,"ios-disc-outline":62075,"ios-disc-sharp":62076,"ios-document":62077,"ios-document-attach":62078,"ios-document-attach-outline":62079,"ios-document-attach-sharp":62080,"ios-document-outline":62081,"ios-document-sharp":62082,"ios-document-text":62083,"ios-document-text-outline":62084,"ios-document-text-sharp":62085,"ios-documents":62086,"ios-documents-outline":62087,"ios-documents-sharp":62088,"ios-download":62089,"ios-download-outline":62090,"ios-download-sharp":62091,"ios-duplicate":62092,"ios-duplicate-outline":62093,"ios-duplicate-sharp":62094,"ios-ear":62095,"ios-ear-outline":62096,"ios-ear-sharp":62097,"ios-earth":62098,"ios-earth-outline":62099,"ios-earth-sharp":62100,"ios-easel":62101,"ios-easel-outline":62102,"ios-easel-sharp":62103,"ios-egg":62104,"ios-egg-outline":62105,"ios-egg-sharp":62106,"ios-ellipse":62107,"ios-ellipse-outline":62108,"ios-ellipse-sharp":62109,"ios-ellipsis-horizontal":62110,"ios-ellipsis-horizontal-circle":62111,"ios-ellipsis-horizontal-circle-outline":62112,"ios-ellipsis-horizontal-circle-sharp":62113,"ios-ellipsis-horizontal-outline":62114,"ios-ellipsis-horizontal-sharp":62115,"ios-ellipsis-vertical":62116,"ios-ellipsis-vertical-circle":62117,"ios-ellipsis-vertical-circle-outline":62118,"ios-ellipsis-vertical-circle-sharp":62119,"ios-ellipsis-vertical-outline":62120,"ios-ellipsis-vertical-sharp":62121,"ios-enter":62122,"ios-enter-outline":62123,"ios-enter-sharp":62124,"ios-exit":62125,"ios-exit-outline":62126,"ios-exit-sharp":62127,"ios-expand":62128,"ios-expand-outline":62129,"ios-expand-sharp":62130,"ios-eye":62131,"ios-eye-off":62132,"ios-eye-off-outline":62133,"ios-eye-off-sharp":62134,"ios-eye-outline":62135,"ios-eye-sharp":62136,"ios-eyedrop":62137,"ios-eyedrop-outline":62138,"ios-eyedrop-sharp":62139,"ios-fast-food":62140,"ios-fast-food-outline":62141,"ios-fast-food-sharp":62142,"ios-female":62143,"ios-female-outline":62144,"ios-female-sharp":62145,"ios-file-tray":62146,"ios-file-tray-full":62147,"ios-file-tray-full-outline":62148,"ios-file-tray-full-sharp":62149,"ios-file-tray-outline":62150,"ios-file-tray-sharp":62151,"ios-file-tray-stacked":62152,"ios-file-tray-stacked-outline":62153,"ios-file-tray-stacked-sharp":62154,"ios-film":62155,"ios-film-outline":62156,"ios-film-sharp":62157,"ios-filter":62158,"ios-filter-outline":62159,"ios-filter-sharp":62160,"ios-finger-print":62161,"ios-finger-print-outline":62162,"ios-finger-print-sharp":62163,"ios-fitness":62164,"ios-fitness-outline":62165,"ios-fitness-sharp":62166,"ios-flag":62167,"ios-flag-outline":62168,"ios-flag-sharp":62169,"ios-flame":62170,"ios-flame-outline":62171,"ios-flame-sharp":62172,"ios-flash":62173,"ios-flash-off":62174,"ios-flash-off-outline":62175,"ios-flash-off-sharp":62176,"ios-flash-outline":62177,"ios-flash-sharp":62178,"ios-flashlight":62179,"ios-flashlight-outline":62180,"ios-flashlight-sharp":62181,"ios-flask":62182,"ios-flask-outline":62183,"ios-flask-sharp":62184,"ios-flower":62185,"ios-flower-outline":62186,"ios-flower-sharp":62187,"ios-folder":62188,"ios-folder-open":62189,"ios-folder-open-outline":62190,"ios-folder-open-sharp":62191,"ios-folder-outline":62192,"ios-folder-sharp":62193,"ios-football":62194,"ios-football-outline":62195,"ios-football-sharp":62196,"ios-funnel":62197,"ios-funnel-outline":62198,"ios-funnel-sharp":62199,"ios-game-controller":62200,"ios-game-controller-outline":62201,"ios-game-controller-sharp":62202,"ios-gift":62203,"ios-gift-outline":62204,"ios-gift-sharp":62205,"ios-git-branch":62206,"ios-git-branch-outline":62207,"ios-git-branch-sharp":62208,"ios-git-commit":62209,"ios-git-commit-outline":62210,"ios-git-commit-sharp":62211,"ios-git-compare":62212,"ios-git-compare-outline":62213,"ios-git-compare-sharp":62214,"ios-git-merge":62215,"ios-git-merge-outline":62216,"ios-git-merge-sharp":62217,"ios-git-network":62218,"ios-git-network-outline":62219,"ios-git-network-sharp":62220,"ios-git-pull-request":62221,"ios-git-pull-request-outline":62222,"ios-git-pull-request-sharp":62223,"ios-glasses":62224,"ios-glasses-outline":62225,"ios-glasses-sharp":62226,"ios-globe":62227,"ios-globe-outline":62228,"ios-globe-sharp":62229,"ios-golf":62230,"ios-golf-outline":62231,"ios-golf-sharp":62232,"ios-grid":62233,"ios-grid-outline":62234,"ios-grid-sharp":62235,"ios-hammer":62236,"ios-hammer-outline":62237,"ios-hammer-sharp":62238,"ios-hand-left":62239,"ios-hand-left-outline":62240,"ios-hand-left-sharp":62241,"ios-hand-right":62242,"ios-hand-right-outline":62243,"ios-hand-right-sharp":62244,"ios-happy":62245,"ios-happy-outline":62246,"ios-happy-sharp":62247,"ios-hardware-chip":62248,"ios-hardware-chip-outline":62249,"ios-hardware-chip-sharp":62250,"ios-headset":62251,"ios-headset-outline":62252,"ios-headset-sharp":62253,"ios-heart":62254,"ios-heart-circle":62255,"ios-heart-circle-outline":62256,"ios-heart-circle-sharp":62257,"ios-heart-dislike":62258,"ios-heart-dislike-circle":62259,"ios-heart-dislike-circle-outline":62260,"ios-heart-dislike-circle-sharp":62261,"ios-heart-dislike-outline":62262,"ios-heart-dislike-sharp":62263,"ios-heart-half":62264,"ios-heart-half-outline":62265,"ios-heart-half-sharp":62266,"ios-heart-outline":62267,"ios-heart-sharp":62268,"ios-help":62269,"ios-help-buoy":62270,"ios-help-buoy-outline":62271,"ios-help-buoy-sharp":62272,"ios-help-circle":62273,"ios-help-circle-outline":62274,"ios-help-circle-sharp":62275,"ios-help-outline":62276,"ios-help-sharp":62277,"ios-home":62278,"ios-home-outline":62279,"ios-home-sharp":62280,"ios-hourglass":62281,"ios-hourglass-outline":62282,"ios-hourglass-sharp":62283,"ios-ice-cream":62284,"ios-ice-cream-outline":62285,"ios-ice-cream-sharp":62286,"ios-image":62287,"ios-image-outline":62288,"ios-image-sharp":62289,"ios-images":62290,"ios-images-outline":62291,"ios-images-sharp":62292,"ios-infinite":62293,"ios-infinite-outline":62294,"ios-infinite-sharp":62295,"ios-information":62296,"ios-information-circle":62297,"ios-information-circle-outline":62298,"ios-information-circle-sharp":62299,"ios-information-outline":62300,"ios-information-sharp":62301,"ios-journal":62302,"ios-journal-outline":62303,"ios-journal-sharp":62304,"ios-key":62305,"ios-key-outline":62306,"ios-key-sharp":62307,"ios-keypad":62308,"ios-keypad-outline":62309,"ios-keypad-sharp":62310,"ios-language":62311,"ios-language-outline":62312,"ios-language-sharp":62313,"ios-laptop":62314,"ios-laptop-outline":62315,"ios-laptop-sharp":62316,"ios-layers":62317,"ios-layers-outline":62318,"ios-layers-sharp":62319,"ios-leaf":62320,"ios-leaf-outline":62321,"ios-leaf-sharp":62322,"ios-library":62323,"ios-library-outline":62324,"ios-library-sharp":62325,"ios-link":62326,"ios-link-outline":62327,"ios-link-sharp":62328,"ios-list":62329,"ios-list-circle":62330,"ios-list-circle-outline":62331,"ios-list-circle-sharp":62332,"ios-list-outline":62333,"ios-list-sharp":62334,"ios-locate":62335,"ios-locate-outline":62336,"ios-locate-sharp":62337,"ios-location":62338,"ios-location-outline":62339,"ios-location-sharp":62340,"ios-lock-closed":62341,"ios-lock-closed-outline":62342,"ios-lock-closed-sharp":62343,"ios-lock-open":62344,"ios-lock-open-outline":62345,"ios-lock-open-sharp":62346,"ios-log-in":62347,"ios-log-in-outline":62348,"ios-log-in-sharp":62349,"ios-log-out":62350,"ios-log-out-outline":62351,"ios-log-out-sharp":62352,"ios-logo-amazon":62353,"ios-logo-amplify":62354,"ios-logo-android":62355,"ios-logo-angular":62356,"ios-logo-apple":62357,"ios-logo-apple-appstore":62358,"ios-logo-bitbucket":62359,"ios-logo-bitcoin":62360,"ios-logo-buffer":62361,"ios-logo-capacitor":62362,"ios-logo-chrome":62363,"ios-logo-closed-captioning":62364,"ios-logo-codepen":62365,"ios-logo-css3":62366,"ios-logo-designernews":62367,"ios-logo-dribbble":62368,"ios-logo-dropbox":62369,"ios-logo-edge":62370,"ios-logo-electron":62371,"ios-logo-euro":62372,"ios-logo-facebook":62373,"ios-logo-firebase":62374,"ios-logo-firefox":62375,"ios-logo-flickr":62376,"ios-logo-foursquare":62377,"ios-logo-github":62378,"ios-logo-google":62379,"ios-logo-google-playstore":62380,"ios-logo-hackernews":62381,"ios-logo-html5":62382,"ios-logo-instagram":62383,"ios-logo-ionic":62384,"ios-logo-ionitron":62385,"ios-logo-javascript":62386,"ios-logo-laravel":62387,"ios-logo-linkedin":62388,"ios-logo-markdown":62389,"ios-logo-no-smoking":62390,"ios-logo-nodejs":62391,"ios-logo-npm":62392,"ios-logo-octocat":62393,"ios-logo-pinterest":62394,"ios-logo-playstation":62395,"ios-logo-pwa":62396,"ios-logo-python":62397,"ios-logo-react":62398,"ios-logo-reddit":62399,"ios-logo-rss":62400,"ios-logo-sass":62401,"ios-logo-skype":62402,"ios-logo-slack":62403,"ios-logo-snapchat":62404,"ios-logo-stackoverflow":62405,"ios-logo-steam":62406,"ios-logo-stencil":62407,"ios-logo-tumblr":62408,"ios-logo-tux":62409,"ios-logo-twitch":62410,"ios-logo-twitter":62411,"ios-logo-usd":62412,"ios-logo-vimeo":62413,"ios-logo-vk":62414,"ios-logo-vue":62415,"ios-logo-web-component":62416,"ios-logo-whatsapp":62417,"ios-logo-windows":62418,"ios-logo-wordpress":62419,"ios-logo-xbox":62420,"ios-logo-xing":62421,"ios-logo-yahoo":62422,"ios-logo-yen":62423,"ios-logo-youtube":62424,"ios-magnet":62425,"ios-magnet-outline":62426,"ios-magnet-sharp":62427,"ios-mail":62428,"ios-mail-open":62429,"ios-mail-open-outline":62430,"ios-mail-open-sharp":62431,"ios-mail-outline":62432,"ios-mail-sharp":62433,"ios-mail-unread":62434,"ios-mail-unread-outline":62435,"ios-mail-unread-sharp":62436,"ios-male":62437,"ios-male-female":62438,"ios-male-female-outline":62439,"ios-male-female-sharp":62440,"ios-male-outline":62441,"ios-male-sharp":62442,"ios-man":62443,"ios-man-outline":62444,"ios-man-sharp":62445,"ios-map":62446,"ios-map-outline":62447,"ios-map-sharp":62448,"ios-medal":62449,"ios-medal-outline":62450,"ios-medal-sharp":62451,"ios-medical":62452,"ios-medical-outline":62453,"ios-medical-sharp":62454,"ios-medkit":62455,"ios-medkit-outline":62456,"ios-medkit-sharp":62457,"ios-megaphone":62458,"ios-megaphone-outline":62459,"ios-megaphone-sharp":62460,"ios-menu":62461,"ios-menu-outline":62462,"ios-menu-sharp":62463,"ios-mic":62464,"ios-mic-circle":62465,"ios-mic-circle-outline":62466,"ios-mic-circle-sharp":62467,"ios-mic-off":62468,"ios-mic-off-circle":62469,"ios-mic-off-circle-outline":62470,"ios-mic-off-circle-sharp":62471,"ios-mic-off-outline":62472,"ios-mic-off-sharp":62473,"ios-mic-outline":62474,"ios-mic-sharp":62475,"ios-moon":62476,"ios-moon-outline":62477,"ios-moon-sharp":62478,"ios-move":62479,"ios-move-outline":62480,"ios-move-sharp":62481,"ios-musical-note":62482,"ios-musical-note-outline":62483,"ios-musical-note-sharp":62484,"ios-musical-notes":62485,"ios-musical-notes-outline":62486,"ios-musical-notes-sharp":62487,"ios-navigate":62488,"ios-navigate-circle":62489,"ios-navigate-circle-outline":62490,"ios-navigate-circle-sharp":62491,"ios-navigate-outline":62492,"ios-navigate-sharp":62493,"ios-newspaper":62494,"ios-newspaper-outline":62495,"ios-newspaper-sharp":62496,"ios-notifications":62497,"ios-notifications-circle":62498,"ios-notifications-circle-outline":62499,"ios-notifications-circle-sharp":62500,"ios-notifications-off":62501,"ios-notifications-off-circle":62502,"ios-notifications-off-circle-outline":62503,"ios-notifications-off-circle-sharp":62504,"ios-notifications-off-outline":62505,"ios-notifications-off-sharp":62506,"ios-notifications-outline":62507,"ios-notifications-sharp":62508,"ios-nuclear":62509,"ios-nuclear-outline":62510,"ios-nuclear-sharp":62511,"ios-nutrition":62512,"ios-nutrition-outline":62513,"ios-nutrition-sharp":62514,"ios-open":62515,"ios-open-outline":62516,"ios-open-sharp":62517,"ios-options":62518,"ios-options-outline":62519,"ios-options-sharp":62520,"ios-paper-plane":62521,"ios-paper-plane-outline":62522,"ios-paper-plane-sharp":62523,"ios-partly-sunny":62524,"ios-partly-sunny-outline":62525,"ios-partly-sunny-sharp":62526,"ios-pause":62527,"ios-pause-circle":62528,"ios-pause-circle-outline":62529,"ios-pause-circle-sharp":62530,"ios-pause-outline":62531,"ios-pause-sharp":62532,"ios-paw":62533,"ios-paw-outline":62534,"ios-paw-sharp":62535,"ios-pencil":62536,"ios-pencil-outline":62537,"ios-pencil-sharp":62538,"ios-people":62539,"ios-people-circle":62540,"ios-people-circle-outline":62541,"ios-people-circle-sharp":62542,"ios-people-outline":62543,"ios-people-sharp":62544,"ios-person":62545,"ios-person-add":62546,"ios-person-add-outline":62547,"ios-person-add-sharp":62548,"ios-person-circle":62549,"ios-person-circle-outline":62550,"ios-person-circle-sharp":62551,"ios-person-outline":62552,"ios-person-remove":62553,"ios-person-remove-outline":62554,"ios-person-remove-sharp":62555,"ios-person-sharp":62556,"ios-phone-landscape":62557,"ios-phone-landscape-outline":62558,"ios-phone-landscape-sharp":62559,"ios-phone-portrait":62560,"ios-phone-portrait-outline":62561,"ios-phone-portrait-sharp":62562,"ios-pie-chart":62563,"ios-pie-chart-outline":62564,"ios-pie-chart-sharp":62565,"ios-pin":62566,"ios-pin-outline":62567,"ios-pin-sharp":62568,"ios-pint":62569,"ios-pint-outline":62570,"ios-pint-sharp":62571,"ios-pizza":62572,"ios-pizza-outline":62573,"ios-pizza-sharp":62574,"ios-planet":62575,"ios-planet-outline":62576,"ios-planet-sharp":62577,"ios-play":62578,"ios-play-back":62579,"ios-play-back-circle":62580,"ios-play-back-circle-outline":62581,"ios-play-back-circle-sharp":62582,"ios-play-back-outline":62583,"ios-play-back-sharp":62584,"ios-play-circle":62585,"ios-play-circle-outline":62586,"ios-play-circle-sharp":62587,"ios-play-forward":62588,"ios-play-forward-circle":62589,"ios-play-forward-circle-outline":62590,"ios-play-forward-circle-sharp":62591,"ios-play-forward-outline":62592,"ios-play-forward-sharp":62593,"ios-play-outline":62594,"ios-play-sharp":62595,"ios-play-skip-back":62596,"ios-play-skip-back-circle":62597,"ios-play-skip-back-circle-outline":62598,"ios-play-skip-back-circle-sharp":62599,"ios-play-skip-back-outline":62600,"ios-play-skip-back-sharp":62601,"ios-play-skip-forward":62602,"ios-play-skip-forward-circle":62603,"ios-play-skip-forward-circle-outline":62604,"ios-play-skip-forward-circle-sharp":62605,"ios-play-skip-forward-outline":62606,"ios-play-skip-forward-sharp":62607,"ios-podium":62608,"ios-podium-outline":62609,"ios-podium-sharp":62610,"ios-power":62611,"ios-power-outline":62612,"ios-power-sharp":62613,"ios-pricetag":62614,"ios-pricetag-outline":62615,"ios-pricetag-sharp":62616,"ios-pricetags":62617,"ios-pricetags-outline":62618,"ios-pricetags-sharp":62619,"ios-print":62620,"ios-print-outline":62621,"ios-print-sharp":62622,"ios-pulse":62623,"ios-pulse-outline":62624,"ios-pulse-sharp":62625,"ios-push":62626,"ios-push-outline":62627,"ios-push-sharp":62628,"ios-qr-code":62629,"ios-qr-code-outline":62630,"ios-qr-code-sharp":62631,"ios-radio":62632,"ios-radio-button-off":62633,"ios-radio-button-off-outline":62634,"ios-radio-button-off-sharp":62635,"ios-radio-button-on":62636,"ios-radio-button-on-outline":62637,"ios-radio-button-on-sharp":62638,"ios-radio-outline":62639,"ios-radio-sharp":62640,"ios-rainy":62641,"ios-rainy-outline":62642,"ios-rainy-sharp":62643,"ios-reader":62644,"ios-reader-outline":62645,"ios-reader-sharp":62646,"ios-receipt":62647,"ios-receipt-outline":62648,"ios-receipt-sharp":62649,"ios-recording":62650,"ios-recording-outline":62651,"ios-recording-sharp":62652,"ios-refresh":62653,"ios-refresh-circle":62654,"ios-refresh-circle-outline":62655,"ios-refresh-circle-sharp":62656,"ios-refresh-outline":62657,"ios-refresh-sharp":62658,"ios-reload":62659,"ios-reload-circle":62660,"ios-reload-circle-outline":62661,"ios-reload-circle-sharp":62662,"ios-reload-outline":62663,"ios-reload-sharp":62664,"ios-remove":62665,"ios-remove-circle":62666,"ios-remove-circle-outline":62667,"ios-remove-circle-sharp":62668,"ios-remove-outline":62669,"ios-remove-sharp":62670,"ios-reorder-four":62671,"ios-reorder-four-outline":62672,"ios-reorder-four-sharp":62673,"ios-reorder-three":62674,"ios-reorder-three-outline":62675,"ios-reorder-three-sharp":62676,"ios-reorder-two":62677,"ios-reorder-two-outline":62678,"ios-reorder-two-sharp":62679,"ios-repeat":62680,"ios-repeat-outline":62681,"ios-repeat-sharp":62682,"ios-resize":62683,"ios-resize-outline":62684,"ios-resize-sharp":62685,"ios-restaurant":62686,"ios-restaurant-outline":62687,"ios-restaurant-sharp":62688,"ios-return-down-back":62689,"ios-return-down-back-outline":62690,"ios-return-down-back-sharp":62691,"ios-return-down-forward":62692,"ios-return-down-forward-outline":62693,"ios-return-down-forward-sharp":62694,"ios-return-up-back":62695,"ios-return-up-back-outline":62696,"ios-return-up-back-sharp":62697,"ios-return-up-forward":62698,"ios-return-up-forward-outline":62699,"ios-return-up-forward-sharp":62700,"ios-ribbon":62701,"ios-ribbon-outline":62702,"ios-ribbon-sharp":62703,"ios-rocket":62704,"ios-rocket-outline":62705,"ios-rocket-sharp":62706,"ios-rose":62707,"ios-rose-outline":62708,"ios-rose-sharp":62709,"ios-sad":62710,"ios-sad-outline":62711,"ios-sad-sharp":62712,"ios-save":62713,"ios-save-outline":62714,"ios-save-sharp":62715,"ios-scan":62716,"ios-scan-circle":62717,"ios-scan-circle-outline":62718,"ios-scan-circle-sharp":62719,"ios-scan-outline":62720,"ios-scan-sharp":62721,"ios-school":62722,"ios-school-outline":62723,"ios-school-sharp":62724,"ios-search":62725,"ios-search-circle":62726,"ios-search-circle-outline":62727,"ios-search-circle-sharp":62728,"ios-search-outline":62729,"ios-search-sharp":62730,"ios-send":62731,"ios-send-outline":62732,"ios-send-sharp":62733,"ios-server":62734,"ios-server-outline":62735,"ios-server-sharp":62736,"ios-settings":62737,"ios-settings-outline":62738,"ios-settings-sharp":62739,"ios-shapes":62740,"ios-shapes-outline":62741,"ios-shapes-sharp":62742,"ios-share":62743,"ios-share-outline":62744,"ios-share-sharp":62745,"ios-share-social":62746,"ios-share-social-outline":62747,"ios-share-social-sharp":62748,"ios-shield":62749,"ios-shield-checkmark":62750,"ios-shield-checkmark-outline":62751,"ios-shield-checkmark-sharp":62752,"ios-shield-outline":62753,"ios-shield-sharp":62754,"ios-shirt":62755,"ios-shirt-outline":62756,"ios-shirt-sharp":62757,"ios-shuffle":62758,"ios-shuffle-outline":62759,"ios-shuffle-sharp":62760,"ios-skull":62761,"ios-skull-outline":62762,"ios-skull-sharp":62763,"ios-snow":62764,"ios-snow-outline":62765,"ios-snow-sharp":62766,"ios-speedometer":62767,"ios-speedometer-outline":62768,"ios-speedometer-sharp":62769,"ios-square":62770,"ios-square-outline":62771,"ios-square-sharp":62772,"ios-star":62773,"ios-star-half":62774,"ios-star-half-outline":62775,"ios-star-half-sharp":62776,"ios-star-outline":62777,"ios-star-sharp":62778,"ios-stats-chart":62779,"ios-stats-chart-outline":62780,"ios-stats-chart-sharp":62781,"ios-stop":62782,"ios-stop-circle":62783,"ios-stop-circle-outline":62784,"ios-stop-circle-sharp":62785,"ios-stop-outline":62786,"ios-stop-sharp":62787,"ios-stopwatch":62788,"ios-stopwatch-outline":62789,"ios-stopwatch-sharp":62790,"ios-subway":62791,"ios-subway-outline":62792,"ios-subway-sharp":62793,"ios-sunny":62794,"ios-sunny-outline":62795,"ios-sunny-sharp":62796,"ios-swap-horizontal":62797,"ios-swap-horizontal-outline":62798,"ios-swap-horizontal-sharp":62799,"ios-swap-vertical":62800,"ios-swap-vertical-outline":62801,"ios-swap-vertical-sharp":62802,"ios-sync":62803,"ios-sync-circle":62804,"ios-sync-circle-outline":62805,"ios-sync-circle-sharp":62806,"ios-sync-outline":62807,"ios-sync-sharp":62808,"ios-tablet-landscape":62809,"ios-tablet-landscape-outline":62810,"ios-tablet-landscape-sharp":62811,"ios-tablet-portrait":62812,"ios-tablet-portrait-outline":62813,"ios-tablet-portrait-sharp":62814,"ios-tennisball":62815,"ios-tennisball-outline":62816,"ios-tennisball-sharp":62817,"ios-terminal":62818,"ios-terminal-outline":62819,"ios-terminal-sharp":62820,"ios-text":62821,"ios-text-outline":62822,"ios-text-sharp":62823,"ios-thermometer":62824,"ios-thermometer-outline":62825,"ios-thermometer-sharp":62826,"ios-thumbs-down":62827,"ios-thumbs-down-outline":62828,"ios-thumbs-down-sharp":62829,"ios-thumbs-up":62830,"ios-thumbs-up-outline":62831,"ios-thumbs-up-sharp":62832,"ios-thunderstorm":62833,"ios-thunderstorm-outline":62834,"ios-thunderstorm-sharp":62835,"ios-time":62836,"ios-time-outline":62837,"ios-time-sharp":62838,"ios-timer":62839,"ios-timer-outline":62840,"ios-timer-sharp":62841,"ios-today":62842,"ios-today-outline":62843,"ios-today-sharp":62844,"ios-toggle":62845,"ios-toggle-outline":62846,"ios-toggle-sharp":62847,"ios-trail-sign":62848,"ios-trail-sign-outline":62849,"ios-trail-sign-sharp":62850,"ios-train":62851,"ios-train-outline":62852,"ios-train-sharp":62853,"ios-transgender":62854,"ios-transgender-outline":62855,"ios-transgender-sharp":62856,"ios-trash":62857,"ios-trash-bin":62858,"ios-trash-bin-outline":62859,"ios-trash-bin-sharp":62860,"ios-trash-outline":62861,"ios-trash-sharp":62862,"ios-trending-down":62863,"ios-trending-down-outline":62864,"ios-trending-down-sharp":62865,"ios-trending-up":62866,"ios-trending-up-outline":62867,"ios-trending-up-sharp":62868,"ios-triangle":62869,"ios-triangle-outline":62870,"ios-triangle-sharp":62871,"ios-trophy":62872,"ios-trophy-outline":62873,"ios-trophy-sharp":62874,"ios-tv":62875,"ios-tv-outline":62876,"ios-tv-sharp":62877,"ios-umbrella":62878,"ios-umbrella-outline":62879,"ios-umbrella-sharp":62880,"ios-videocam":62881,"ios-videocam-outline":62882,"ios-videocam-sharp":62883,"ios-volume-high":62884,"ios-volume-high-outline":62885,"ios-volume-high-sharp":62886,"ios-volume-low":62887,"ios-volume-low-outline":62888,"ios-volume-low-sharp":62889,"ios-volume-medium":62890,"ios-volume-medium-outline":62891,"ios-volume-medium-sharp":62892,"ios-volume-mute":62893,"ios-volume-mute-outline":62894,"ios-volume-mute-sharp":62895,"ios-volume-off":62896,"ios-volume-off-outline":62897,"ios-volume-off-sharp":62898,"ios-walk":62899,"ios-walk-outline":62900,"ios-walk-sharp":62901,"ios-wallet":62902,"ios-wallet-outline":62903,"ios-wallet-sharp":62904,"ios-warning":62905,"ios-warning-outline":62906,"ios-warning-sharp":62907,"ios-watch":62908,"ios-watch-outline":62909,"ios-watch-sharp":62910,"ios-water":62911,"ios-water-outline":62912,"ios-water-sharp":62913,"ios-wifi":62914,"ios-wifi-outline":62915,"ios-wifi-sharp":62916,"ios-wine":62917,"ios-wine-outline":62918,"ios-wine-sharp":62919,"ios-woman":62920,"ios-woman-outline":62921,"ios-woman-sharp":62922,"md-add":61696,"md-add-circle":61697,"md-add-circle-outline":61698,"md-add-circle-sharp":61699,"md-add-outline":61700,"md-add-sharp":61701,"md-airplane":61702,"md-airplane-outline":61703,"md-airplane-sharp":61704,"md-alarm":61705,"md-alarm-outline":61706,"md-alarm-sharp":61707,"md-albums":61708,"md-albums-outline":61709,"md-albums-sharp":61710,"md-alert":61711,"md-alert-circle":61712,"md-alert-circle-outline":61713,"md-alert-circle-sharp":61714,"md-alert-outline":61715,"md-alert-sharp":61716,"md-american-football":61717,"md-american-football-outline":61718,"md-american-football-sharp":61719,"md-analytics":61720,"md-analytics-outline":61721,"md-analytics-sharp":61722,"md-aperture":61723,"md-aperture-outline":61724,"md-aperture-sharp":61725,"md-apps":61726,"md-apps-outline":61727,"md-apps-sharp":61728,"md-archive":61729,"md-archive-outline":61730,"md-archive-sharp":61731,"md-arrow-back":61732,"md-arrow-back-circle":61733,"md-arrow-back-circle-outline":61734,"md-arrow-back-circle-sharp":61735,"md-arrow-back-outline":61736,"md-arrow-back-sharp":61737,"md-arrow-down":61738,"md-arrow-down-circle":61739,"md-arrow-down-circle-outline":61740,"md-arrow-down-circle-sharp":61741,"md-arrow-down-outline":61742,"md-arrow-down-sharp":61743,"md-arrow-forward":61744,"md-arrow-forward-circle":61745,"md-arrow-forward-circle-outline":61746,"md-arrow-forward-circle-sharp":61747,"md-arrow-forward-outline":61748,"md-arrow-forward-sharp":61749,"md-arrow-redo":61750,"md-arrow-redo-circle":61751,"md-arrow-redo-circle-outline":61752,"md-arrow-redo-circle-sharp":61753,"md-arrow-redo-outline":61754,"md-arrow-redo-sharp":61755,"md-arrow-undo":61756,"md-arrow-undo-circle":61757,"md-arrow-undo-circle-outline":61758,"md-arrow-undo-circle-sharp":61759,"md-arrow-undo-outline":61760,"md-arrow-undo-sharp":61761,"md-arrow-up":61762,"md-arrow-up-circle":61763,"md-arrow-up-circle-outline":61764,"md-arrow-up-circle-sharp":61765,"md-arrow-up-outline":61766,"md-arrow-up-sharp":61767,"md-at":61768,"md-at-circle":61769,"md-at-circle-outline":61770,"md-at-circle-sharp":61771,"md-at-outline":61772,"md-at-sharp":61773,"md-attach":61774,"md-attach-outline":61775,"md-attach-sharp":61776,"md-backspace":61777,"md-backspace-outline":61778,"md-backspace-sharp":61779,"md-bandage":61780,"md-bandage-outline":61781,"md-bandage-sharp":61782,"md-bar-chart":61783,"md-bar-chart-outline":61784,"md-bar-chart-sharp":61785,"md-barbell":61786,"md-barbell-outline":61787,"md-barbell-sharp":61788,"md-barcode":61789,"md-barcode-outline":61790,"md-barcode-sharp":61791,"md-baseball":61792,"md-baseball-outline":61793,"md-baseball-sharp":61794,"md-basket":61795,"md-basket-outline":61796,"md-basket-sharp":61797,"md-basketball":61798,"md-basketball-outline":61799,"md-basketball-sharp":61800,"md-battery-charging":61801,"md-battery-charging-outline":61802,"md-battery-charging-sharp":61803,"md-battery-dead":61804,"md-battery-dead-outline":61805,"md-battery-dead-sharp":61806,"md-battery-full":61807,"md-battery-full-outline":61808,"md-battery-full-sharp":61809,"md-battery-half":61810,"md-battery-half-outline":61811,"md-battery-half-sharp":61812,"md-beaker":61813,"md-beaker-outline":61814,"md-beaker-sharp":61815,"md-bed":61816,"md-bed-outline":61817,"md-bed-sharp":61818,"md-beer":61819,"md-beer-outline":61820,"md-beer-sharp":61821,"md-bicycle":61822,"md-bicycle-outline":61823,"md-bicycle-sharp":61824,"md-bluetooth":61825,"md-bluetooth-outline":61826,"md-bluetooth-sharp":61827,"md-boat":61828,"md-boat-outline":61829,"md-boat-sharp":61830,"md-body":61831,"md-body-outline":61832,"md-body-sharp":61833,"md-bonfire":61834,"md-bonfire-outline":61835,"md-bonfire-sharp":61836,"md-book":61837,"md-book-outline":61838,"md-book-sharp":61839,"md-bookmark":61840,"md-bookmark-outline":61841,"md-bookmark-sharp":61842,"md-bookmarks":61843,"md-bookmarks-outline":61844,"md-bookmarks-sharp":61845,"md-briefcase":61846,"md-briefcase-outline":61847,"md-briefcase-sharp":61848,"md-browsers":61849,"md-browsers-outline":61850,"md-browsers-sharp":61851,"md-brush":61852,"md-brush-outline":61853,"md-brush-sharp":61854,"md-bug":61855,"md-bug-outline":61856,"md-bug-sharp":61857,"md-build":61858,"md-build-outline":61859,"md-build-sharp":61860,"md-bulb":61861,"md-bulb-outline":61862,"md-bulb-sharp":61863,"md-bus":61864,"md-bus-outline":61865,"md-bus-sharp":61866,"md-business":61867,"md-business-outline":61868,"md-business-sharp":61869,"md-cafe":61870,"md-cafe-outline":61871,"md-cafe-sharp":61872,"md-calculator":61873,"md-calculator-outline":61874,"md-calculator-sharp":61875,"md-calendar":61876,"md-calendar-outline":61877,"md-calendar-sharp":61878,"md-call":61879,"md-call-outline":61880,"md-call-sharp":61881,"md-camera":61882,"md-camera-outline":61883,"md-camera-reverse":61884,"md-camera-reverse-outline":61885,"md-camera-reverse-sharp":61886,"md-camera-sharp":61887,"md-car":61888,"md-car-outline":61889,"md-car-sharp":61890,"md-car-sport":61891,"md-car-sport-outline":61892,"md-car-sport-sharp":61893,"md-card":61894,"md-card-outline":61895,"md-card-sharp":61896,"md-caret-back":61897,"md-caret-back-circle":61898,"md-caret-back-circle-outline":61899,"md-caret-back-circle-sharp":61900,"md-caret-back-outline":61901,"md-caret-back-sharp":61902,"md-caret-down":61903,"md-caret-down-circle":61904,"md-caret-down-circle-outline":61905,"md-caret-down-circle-sharp":61906,"md-caret-down-outline":61907,"md-caret-down-sharp":61908,"md-caret-forward":61909,"md-caret-forward-circle":61910,"md-caret-forward-circle-outline":61911,"md-caret-forward-circle-sharp":61912,"md-caret-forward-outline":61913,"md-caret-forward-sharp":61914,"md-caret-up":61915,"md-caret-up-circle":61916,"md-caret-up-circle-outline":61917,"md-caret-up-circle-sharp":61918,"md-caret-up-outline":61919,"md-caret-up-sharp":61920,"md-cart":61921,"md-cart-outline":61922,"md-cart-sharp":61923,"md-cash":61924,"md-cash-outline":61925,"md-cash-sharp":61926,"md-cellular":61927,"md-cellular-outline":61928,"md-cellular-sharp":61929,"md-chatbox":61930,"md-chatbox-ellipses":61931,"md-chatbox-ellipses-outline":61932,"md-chatbox-ellipses-sharp":61933,"md-chatbox-outline":61934,"md-chatbox-sharp":61935,"md-chatbubble":61936,"md-chatbubble-ellipses":61937,"md-chatbubble-ellipses-outline":61938,"md-chatbubble-ellipses-sharp":61939,"md-chatbubble-outline":61940,"md-chatbubble-sharp":61941,"md-chatbubbles":61942,"md-chatbubbles-outline":61943,"md-chatbubbles-sharp":61944,"md-checkbox":61945,"md-checkbox-outline":61946,"md-checkbox-sharp":61947,"md-checkmark":61948,"md-checkmark-circle":61949,"md-checkmark-circle-outline":61950,"md-checkmark-circle-sharp":61951,"md-checkmark-done":61952,"md-checkmark-done-circle":61953,"md-checkmark-done-circle-outline":61954,"md-checkmark-done-circle-sharp":61955,"md-checkmark-done-outline":61956,"md-checkmark-done-sharp":61957,"md-checkmark-outline":61958,"md-checkmark-sharp":61959,"md-chevron-back":61960,"md-chevron-back-circle":61961,"md-chevron-back-circle-outline":61962,"md-chevron-back-circle-sharp":61963,"md-chevron-back-outline":61964,"md-chevron-back-sharp":61965,"md-chevron-down":61966,"md-chevron-down-circle":61967,"md-chevron-down-circle-outline":61968,"md-chevron-down-circle-sharp":61969,"md-chevron-down-outline":61970,"md-chevron-down-sharp":61971,"md-chevron-forward":61972,"md-chevron-forward-circle":61973,"md-chevron-forward-circle-outline":61974,"md-chevron-forward-circle-sharp":61975,"md-chevron-forward-outline":61976,"md-chevron-forward-sharp":61977,"md-chevron-up":61978,"md-chevron-up-circle":61979,"md-chevron-up-circle-outline":61980,"md-chevron-up-circle-sharp":61981,"md-chevron-up-outline":61982,"md-chevron-up-sharp":61983,"md-clipboard":61984,"md-clipboard-outline":61985,"md-clipboard-sharp":61986,"md-close":61987,"md-close-circle":61988,"md-close-circle-outline":61989,"md-close-circle-sharp":61990,"md-close-outline":61991,"md-close-sharp":61992,"md-cloud":61993,"md-cloud-circle":61994,"md-cloud-circle-outline":61995,"md-cloud-circle-sharp":61996,"md-cloud-done":61997,"md-cloud-done-outline":61998,"md-cloud-done-sharp":61999,"md-cloud-download":62e3,"md-cloud-download-outline":62001,"md-cloud-download-sharp":62002,"md-cloud-offline":62003,"md-cloud-offline-outline":62004,"md-cloud-offline-sharp":62005,"md-cloud-outline":62006,"md-cloud-sharp":62007,"md-cloud-upload":62008,"md-cloud-upload-outline":62009,"md-cloud-upload-sharp":62010,"md-cloudy":62011,"md-cloudy-night":62012,"md-cloudy-night-outline":62013,"md-cloudy-night-sharp":62014,"md-cloudy-outline":62015,"md-cloudy-sharp":62016,"md-code":62017,"md-code-download":62018,"md-code-download-outline":62019,"md-code-download-sharp":62020,"md-code-outline":62021,"md-code-sharp":62022,"md-code-slash":62023,"md-code-slash-outline":62024,"md-code-slash-sharp":62025,"md-code-working":62026,"md-code-working-outline":62027,"md-code-working-sharp":62028,"md-cog":62029,"md-cog-outline":62030,"md-cog-sharp":62031,"md-color-fill":62032,"md-color-fill-outline":62033,"md-color-fill-sharp":62034,"md-color-filter":62035,"md-color-filter-outline":62036,"md-color-filter-sharp":62037,"md-color-palette":62038,"md-color-palette-outline":62039,"md-color-palette-sharp":62040,"md-color-wand":62041,"md-color-wand-outline":62042,"md-color-wand-sharp":62043,"md-compass":62044,"md-compass-outline":62045,"md-compass-sharp":62046,"md-construct":62047,"md-construct-outline":62048,"md-construct-sharp":62049,"md-contract":62050,"md-contract-outline":62051,"md-contract-sharp":62052,"md-contrast":62053,"md-contrast-outline":62054,"md-contrast-sharp":62055,"md-copy":62056,"md-copy-outline":62057,"md-copy-sharp":62058,"md-create":62059,"md-create-outline":62060,"md-create-sharp":62061,"md-crop":62062,"md-crop-outline":62063,"md-crop-sharp":62064,"md-cube":62065,"md-cube-outline":62066,"md-cube-sharp":62067,"md-cut":62068,"md-cut-outline":62069,"md-cut-sharp":62070,"md-desktop":62071,"md-desktop-outline":62072,"md-desktop-sharp":62073,"md-disc":62074,"md-disc-outline":62075,"md-disc-sharp":62076,"md-document":62077,"md-document-attach":62078,"md-document-attach-outline":62079,"md-document-attach-sharp":62080,"md-document-outline":62081,"md-document-sharp":62082,"md-document-text":62083,"md-document-text-outline":62084,"md-document-text-sharp":62085,"md-documents":62086,"md-documents-outline":62087,"md-documents-sharp":62088,"md-download":62089,"md-download-outline":62090,"md-download-sharp":62091,"md-duplicate":62092,"md-duplicate-outline":62093,"md-duplicate-sharp":62094,"md-ear":62095,"md-ear-outline":62096,"md-ear-sharp":62097,"md-earth":62098,"md-earth-outline":62099,"md-earth-sharp":62100,"md-easel":62101,"md-easel-outline":62102,"md-easel-sharp":62103,"md-egg":62104,"md-egg-outline":62105,"md-egg-sharp":62106,"md-ellipse":62107,"md-ellipse-outline":62108,"md-ellipse-sharp":62109,"md-ellipsis-horizontal":62110,"md-ellipsis-horizontal-circle":62111,"md-ellipsis-horizontal-circle-outline":62112,"md-ellipsis-horizontal-circle-sharp":62113,"md-ellipsis-horizontal-outline":62114,"md-ellipsis-horizontal-sharp":62115,"md-ellipsis-vertical":62116,"md-ellipsis-vertical-circle":62117,"md-ellipsis-vertical-circle-outline":62118,"md-ellipsis-vertical-circle-sharp":62119,"md-ellipsis-vertical-outline":62120,"md-ellipsis-vertical-sharp":62121,"md-enter":62122,"md-enter-outline":62123,"md-enter-sharp":62124,"md-exit":62125,"md-exit-outline":62126,"md-exit-sharp":62127,"md-expand":62128,"md-expand-outline":62129,"md-expand-sharp":62130,"md-eye":62131,"md-eye-off":62132,"md-eye-off-outline":62133,"md-eye-off-sharp":62134,"md-eye-outline":62135,"md-eye-sharp":62136,"md-eyedrop":62137,"md-eyedrop-outline":62138,"md-eyedrop-sharp":62139,"md-fast-food":62140,"md-fast-food-outline":62141,"md-fast-food-sharp":62142,"md-female":62143,"md-female-outline":62144,"md-female-sharp":62145,"md-file-tray":62146,"md-file-tray-full":62147,"md-file-tray-full-outline":62148,"md-file-tray-full-sharp":62149,"md-file-tray-outline":62150,"md-file-tray-sharp":62151,"md-file-tray-stacked":62152,"md-file-tray-stacked-outline":62153,"md-file-tray-stacked-sharp":62154,"md-film":62155,"md-film-outline":62156,"md-film-sharp":62157,"md-filter":62158,"md-filter-outline":62159,"md-filter-sharp":62160,"md-finger-print":62161,"md-finger-print-outline":62162,"md-finger-print-sharp":62163,"md-fitness":62164,"md-fitness-outline":62165,"md-fitness-sharp":62166,"md-flag":62167,"md-flag-outline":62168,"md-flag-sharp":62169,"md-flame":62170,"md-flame-outline":62171,"md-flame-sharp":62172,"md-flash":62173,"md-flash-off":62174,"md-flash-off-outline":62175,"md-flash-off-sharp":62176,"md-flash-outline":62177,"md-flash-sharp":62178,"md-flashlight":62179,"md-flashlight-outline":62180,"md-flashlight-sharp":62181,"md-flask":62182,"md-flask-outline":62183,"md-flask-sharp":62184,"md-flower":62185,"md-flower-outline":62186,"md-flower-sharp":62187,"md-folder":62188,"md-folder-open":62189,"md-folder-open-outline":62190,"md-folder-open-sharp":62191,"md-folder-outline":62192,"md-folder-sharp":62193,"md-football":62194,"md-football-outline":62195,"md-football-sharp":62196,"md-funnel":62197,"md-funnel-outline":62198,"md-funnel-sharp":62199,"md-game-controller":62200,"md-game-controller-outline":62201,"md-game-controller-sharp":62202,"md-gift":62203,"md-gift-outline":62204,"md-gift-sharp":62205,"md-git-branch":62206,"md-git-branch-outline":62207,"md-git-branch-sharp":62208,"md-git-commit":62209,"md-git-commit-outline":62210,"md-git-commit-sharp":62211,"md-git-compare":62212,"md-git-compare-outline":62213,"md-git-compare-sharp":62214,"md-git-merge":62215,"md-git-merge-outline":62216,"md-git-merge-sharp":62217,"md-git-network":62218,"md-git-network-outline":62219,"md-git-network-sharp":62220,"md-git-pull-request":62221,"md-git-pull-request-outline":62222,"md-git-pull-request-sharp":62223,"md-glasses":62224,"md-glasses-outline":62225,"md-glasses-sharp":62226,"md-globe":62227,"md-globe-outline":62228,"md-globe-sharp":62229,"md-golf":62230,"md-golf-outline":62231,"md-golf-sharp":62232,"md-grid":62233,"md-grid-outline":62234,"md-grid-sharp":62235,"md-hammer":62236,"md-hammer-outline":62237,"md-hammer-sharp":62238,"md-hand-left":62239,"md-hand-left-outline":62240,"md-hand-left-sharp":62241,"md-hand-right":62242,"md-hand-right-outline":62243,"md-hand-right-sharp":62244,"md-happy":62245,"md-happy-outline":62246,"md-happy-sharp":62247,"md-hardware-chip":62248,"md-hardware-chip-outline":62249,"md-hardware-chip-sharp":62250,"md-headset":62251,"md-headset-outline":62252,"md-headset-sharp":62253,"md-heart":62254,"md-heart-circle":62255,"md-heart-circle-outline":62256,"md-heart-circle-sharp":62257,"md-heart-dislike":62258,"md-heart-dislike-circle":62259,"md-heart-dislike-circle-outline":62260,"md-heart-dislike-circle-sharp":62261,"md-heart-dislike-outline":62262,"md-heart-dislike-sharp":62263,"md-heart-half":62264,"md-heart-half-outline":62265,"md-heart-half-sharp":62266,"md-heart-outline":62267,"md-heart-sharp":62268,"md-help":62269,"md-help-buoy":62270,"md-help-buoy-outline":62271,"md-help-buoy-sharp":62272,"md-help-circle":62273,"md-help-circle-outline":62274,"md-help-circle-sharp":62275,"md-help-outline":62276,"md-help-sharp":62277,"md-home":62278,"md-home-outline":62279,"md-home-sharp":62280,"md-hourglass":62281,"md-hourglass-outline":62282,"md-hourglass-sharp":62283,"md-ice-cream":62284,"md-ice-cream-outline":62285,"md-ice-cream-sharp":62286,"md-image":62287,"md-image-outline":62288,"md-image-sharp":62289,"md-images":62290,"md-images-outline":62291,"md-images-sharp":62292,"md-infinite":62293,"md-infinite-outline":62294,"md-infinite-sharp":62295,"md-information":62296,"md-information-circle":62297,"md-information-circle-outline":62298,"md-information-circle-sharp":62299,"md-information-outline":62300,"md-information-sharp":62301,"md-journal":62302,"md-journal-outline":62303,"md-journal-sharp":62304,"md-key":62305,"md-key-outline":62306,"md-key-sharp":62307,"md-keypad":62308,"md-keypad-outline":62309,"md-keypad-sharp":62310,"md-language":62311,"md-language-outline":62312,"md-language-sharp":62313,"md-laptop":62314,"md-laptop-outline":62315,"md-laptop-sharp":62316,"md-layers":62317,"md-layers-outline":62318,"md-layers-sharp":62319,"md-leaf":62320,"md-leaf-outline":62321,"md-leaf-sharp":62322,"md-library":62323,"md-library-outline":62324,"md-library-sharp":62325,"md-link":62326,"md-link-outline":62327,"md-link-sharp":62328,"md-list":62329,"md-list-circle":62330,"md-list-circle-outline":62331,"md-list-circle-sharp":62332,"md-list-outline":62333,"md-list-sharp":62334,"md-locate":62335,"md-locate-outline":62336,"md-locate-sharp":62337,"md-location":62338,"md-location-outline":62339,"md-location-sharp":62340,"md-lock-closed":62341,"md-lock-closed-outline":62342,"md-lock-closed-sharp":62343,"md-lock-open":62344,"md-lock-open-outline":62345,"md-lock-open-sharp":62346,"md-log-in":62347,"md-log-in-outline":62348,"md-log-in-sharp":62349,"md-log-out":62350,"md-log-out-outline":62351,"md-log-out-sharp":62352,"md-logo-amazon":62353,"md-logo-amplify":62354,"md-logo-android":62355,"md-logo-angular":62356,"md-logo-apple":62357,"md-logo-apple-appstore":62358,"md-logo-bitbucket":62359,"md-logo-bitcoin":62360,"md-logo-buffer":62361,"md-logo-capacitor":62362,"md-logo-chrome":62363,"md-logo-closed-captioning":62364,"md-logo-codepen":62365,"md-logo-css3":62366,"md-logo-designernews":62367,"md-logo-dribbble":62368,"md-logo-dropbox":62369,"md-logo-edge":62370,"md-logo-electron":62371,"md-logo-euro":62372,"md-logo-facebook":62373,"md-logo-firebase":62374,"md-logo-firefox":62375,"md-logo-flickr":62376,"md-logo-foursquare":62377,"md-logo-github":62378,"md-logo-google":62379,"md-logo-google-playstore":62380,"md-logo-hackernews":62381,"md-logo-html5":62382,"md-logo-instagram":62383,"md-logo-ionic":62384,"md-logo-ionitron":62385,"md-logo-javascript":62386,"md-logo-laravel":62387,"md-logo-linkedin":62388,"md-logo-markdown":62389,"md-logo-no-smoking":62390,"md-logo-nodejs":62391,"md-logo-npm":62392,"md-logo-octocat":62393,"md-logo-pinterest":62394,"md-logo-playstation":62395,"md-logo-pwa":62396,"md-logo-python":62397,"md-logo-react":62398,"md-logo-reddit":62399,"md-logo-rss":62400,"md-logo-sass":62401,"md-logo-skype":62402,"md-logo-slack":62403,"md-logo-snapchat":62404,"md-logo-stackoverflow":62405,"md-logo-steam":62406,"md-logo-stencil":62407,"md-logo-tumblr":62408,"md-logo-tux":62409,"md-logo-twitch":62410,"md-logo-twitter":62411,"md-logo-usd":62412,"md-logo-vimeo":62413,"md-logo-vk":62414,"md-logo-vue":62415,"md-logo-web-component":62416,"md-logo-whatsapp":62417,"md-logo-windows":62418,"md-logo-wordpress":62419,"md-logo-xbox":62420,"md-logo-xing":62421,"md-logo-yahoo":62422,"md-logo-yen":62423,"md-logo-youtube":62424,"md-magnet":62425,"md-magnet-outline":62426,"md-magnet-sharp":62427,"md-mail":62428,"md-mail-open":62429,"md-mail-open-outline":62430,"md-mail-open-sharp":62431,"md-mail-outline":62432,"md-mail-sharp":62433,"md-mail-unread":62434,"md-mail-unread-outline":62435,"md-mail-unread-sharp":62436,"md-male":62437,"md-male-female":62438,"md-male-female-outline":62439,"md-male-female-sharp":62440,"md-male-outline":62441,"md-male-sharp":62442,"md-man":62443,"md-man-outline":62444,"md-man-sharp":62445,"md-map":62446,"md-map-outline":62447,"md-map-sharp":62448,"md-medal":62449,"md-medal-outline":62450,"md-medal-sharp":62451,"md-medical":62452,"md-medical-outline":62453,"md-medical-sharp":62454,"md-medkit":62455,"md-medkit-outline":62456,"md-medkit-sharp":62457,"md-megaphone":62458,"md-megaphone-outline":62459,"md-megaphone-sharp":62460,"md-menu":62461,"md-menu-outline":62462,"md-menu-sharp":62463,"md-mic":62464,"md-mic-circle":62465,"md-mic-circle-outline":62466,"md-mic-circle-sharp":62467,"md-mic-off":62468,"md-mic-off-circle":62469,"md-mic-off-circle-outline":62470,"md-mic-off-circle-sharp":62471,"md-mic-off-outline":62472,"md-mic-off-sharp":62473,"md-mic-outline":62474,"md-mic-sharp":62475,"md-moon":62476,"md-moon-outline":62477,"md-moon-sharp":62478,"md-move":62479,"md-move-outline":62480,"md-move-sharp":62481,"md-musical-note":62482,"md-musical-note-outline":62483,"md-musical-note-sharp":62484,"md-musical-notes":62485,"md-musical-notes-outline":62486,"md-musical-notes-sharp":62487,"md-navigate":62488,"md-navigate-circle":62489,"md-navigate-circle-outline":62490,"md-navigate-circle-sharp":62491,"md-navigate-outline":62492,"md-navigate-sharp":62493,"md-newspaper":62494,"md-newspaper-outline":62495,"md-newspaper-sharp":62496,"md-notifications":62497,"md-notifications-circle":62498,"md-notifications-circle-outline":62499,"md-notifications-circle-sharp":62500,"md-notifications-off":62501,"md-notifications-off-circle":62502,"md-notifications-off-circle-outline":62503,"md-notifications-off-circle-sharp":62504,"md-notifications-off-outline":62505,"md-notifications-off-sharp":62506,"md-notifications-outline":62507,"md-notifications-sharp":62508,"md-nuclear":62509,"md-nuclear-outline":62510,"md-nuclear-sharp":62511,"md-nutrition":62512,"md-nutrition-outline":62513,"md-nutrition-sharp":62514,"md-open":62515,"md-open-outline":62516,"md-open-sharp":62517,"md-options":62518,"md-options-outline":62519,"md-options-sharp":62520,"md-paper-plane":62521,"md-paper-plane-outline":62522,"md-paper-plane-sharp":62523,"md-partly-sunny":62524,"md-partly-sunny-outline":62525,"md-partly-sunny-sharp":62526,"md-pause":62527,"md-pause-circle":62528,"md-pause-circle-outline":62529,"md-pause-circle-sharp":62530,"md-pause-outline":62531,"md-pause-sharp":62532,"md-paw":62533,"md-paw-outline":62534,"md-paw-sharp":62535,"md-pencil":62536,"md-pencil-outline":62537,"md-pencil-sharp":62538,"md-people":62539,"md-people-circle":62540,"md-people-circle-outline":62541,"md-people-circle-sharp":62542,"md-people-outline":62543,"md-people-sharp":62544,"md-person":62545,"md-person-add":62546,"md-person-add-outline":62547,"md-person-add-sharp":62548,"md-person-circle":62549,"md-person-circle-outline":62550,"md-person-circle-sharp":62551,"md-person-outline":62552,"md-person-remove":62553,"md-person-remove-outline":62554,"md-person-remove-sharp":62555,"md-person-sharp":62556,"md-phone-landscape":62557,"md-phone-landscape-outline":62558,"md-phone-landscape-sharp":62559,"md-phone-portrait":62560,"md-phone-portrait-outline":62561,"md-phone-portrait-sharp":62562,"md-pie-chart":62563,"md-pie-chart-outline":62564,"md-pie-chart-sharp":62565,"md-pin":62566,"md-pin-outline":62567,"md-pin-sharp":62568,"md-pint":62569,"md-pint-outline":62570,"md-pint-sharp":62571,"md-pizza":62572,"md-pizza-outline":62573,"md-pizza-sharp":62574,"md-planet":62575,"md-planet-outline":62576,"md-planet-sharp":62577,"md-play":62578,"md-play-back":62579,"md-play-back-circle":62580,"md-play-back-circle-outline":62581,"md-play-back-circle-sharp":62582,"md-play-back-outline":62583,"md-play-back-sharp":62584,"md-play-circle":62585,"md-play-circle-outline":62586,"md-play-circle-sharp":62587,"md-play-forward":62588,"md-play-forward-circle":62589,"md-play-forward-circle-outline":62590,"md-play-forward-circle-sharp":62591,"md-play-forward-outline":62592,"md-play-forward-sharp":62593,"md-play-outline":62594,"md-play-sharp":62595,"md-play-skip-back":62596,"md-play-skip-back-circle":62597,"md-play-skip-back-circle-outline":62598,"md-play-skip-back-circle-sharp":62599,"md-play-skip-back-outline":62600,"md-play-skip-back-sharp":62601,"md-play-skip-forward":62602,"md-play-skip-forward-circle":62603,"md-play-skip-forward-circle-outline":62604,"md-play-skip-forward-circle-sharp":62605,"md-play-skip-forward-outline":62606,"md-play-skip-forward-sharp":62607,"md-podium":62608,"md-podium-outline":62609,"md-podium-sharp":62610,"md-power":62611,"md-power-outline":62612,"md-power-sharp":62613,"md-pricetag":62614,"md-pricetag-outline":62615,"md-pricetag-sharp":62616,"md-pricetags":62617,"md-pricetags-outline":62618,"md-pricetags-sharp":62619,"md-print":62620,"md-print-outline":62621,"md-print-sharp":62622,"md-pulse":62623,"md-pulse-outline":62624,"md-pulse-sharp":62625,"md-push":62626,"md-push-outline":62627,"md-push-sharp":62628,"md-qr-code":62629,"md-qr-code-outline":62630,"md-qr-code-sharp":62631,"md-radio":62632,"md-radio-button-off":62633,"md-radio-button-off-outline":62634,"md-radio-button-off-sharp":62635,"md-radio-button-on":62636,"md-radio-button-on-outline":62637,"md-radio-button-on-sharp":62638,"md-radio-outline":62639,"md-radio-sharp":62640,"md-rainy":62641,"md-rainy-outline":62642,"md-rainy-sharp":62643,"md-reader":62644,"md-reader-outline":62645,"md-reader-sharp":62646,"md-receipt":62647,"md-receipt-outline":62648,"md-receipt-sharp":62649,"md-recording":62650,"md-recording-outline":62651,"md-recording-sharp":62652,"md-refresh":62653,"md-refresh-circle":62654,"md-refresh-circle-outline":62655,"md-refresh-circle-sharp":62656,"md-refresh-outline":62657,"md-refresh-sharp":62658,"md-reload":62659,"md-reload-circle":62660,"md-reload-circle-outline":62661,"md-reload-circle-sharp":62662,"md-reload-outline":62663,"md-reload-sharp":62664,"md-remove":62665,"md-remove-circle":62666,"md-remove-circle-outline":62667,"md-remove-circle-sharp":62668,"md-remove-outline":62669,"md-remove-sharp":62670,"md-reorder-four":62671,"md-reorder-four-outline":62672,"md-reorder-four-sharp":62673,"md-reorder-three":62674,"md-reorder-three-outline":62675,"md-reorder-three-sharp":62676,"md-reorder-two":62677,"md-reorder-two-outline":62678,"md-reorder-two-sharp":62679,"md-repeat":62680,"md-repeat-outline":62681,"md-repeat-sharp":62682,"md-resize":62683,"md-resize-outline":62684,"md-resize-sharp":62685,"md-restaurant":62686,"md-restaurant-outline":62687,"md-restaurant-sharp":62688,"md-return-down-back":62689,"md-return-down-back-outline":62690,"md-return-down-back-sharp":62691,"md-return-down-forward":62692,"md-return-down-forward-outline":62693,"md-return-down-forward-sharp":62694,"md-return-up-back":62695,"md-return-up-back-outline":62696,"md-return-up-back-sharp":62697,"md-return-up-forward":62698,"md-return-up-forward-outline":62699,"md-return-up-forward-sharp":62700,"md-ribbon":62701,"md-ribbon-outline":62702,"md-ribbon-sharp":62703,"md-rocket":62704,"md-rocket-outline":62705,"md-rocket-sharp":62706,"md-rose":62707,"md-rose-outline":62708,"md-rose-sharp":62709,"md-sad":62710,"md-sad-outline":62711,"md-sad-sharp":62712,"md-save":62713,"md-save-outline":62714,"md-save-sharp":62715,"md-scan":62716,"md-scan-circle":62717,"md-scan-circle-outline":62718,"md-scan-circle-sharp":62719,"md-scan-outline":62720,"md-scan-sharp":62721,"md-school":62722,"md-school-outline":62723,"md-school-sharp":62724,"md-search":62725,"md-search-circle":62726,"md-search-circle-outline":62727,"md-search-circle-sharp":62728,"md-search-outline":62729,"md-search-sharp":62730,"md-send":62731,"md-send-outline":62732,"md-send-sharp":62733,"md-server":62734,"md-server-outline":62735,"md-server-sharp":62736,"md-settings":62737,"md-settings-outline":62738,"md-settings-sharp":62739,"md-shapes":62740,"md-shapes-outline":62741,"md-shapes-sharp":62742,"md-share":62743,"md-share-outline":62744,"md-share-sharp":62745,"md-share-social":62746,"md-share-social-outline":62747,"md-share-social-sharp":62748,"md-shield":62749,"md-shield-checkmark":62750,"md-shield-checkmark-outline":62751,"md-shield-checkmark-sharp":62752,"md-shield-outline":62753,"md-shield-sharp":62754,"md-shirt":62755,"md-shirt-outline":62756,"md-shirt-sharp":62757,"md-shuffle":62758,"md-shuffle-outline":62759,"md-shuffle-sharp":62760,"md-skull":62761,"md-skull-outline":62762,"md-skull-sharp":62763,"md-snow":62764,"md-snow-outline":62765,"md-snow-sharp":62766,"md-speedometer":62767,"md-speedometer-outline":62768,"md-speedometer-sharp":62769,"md-square":62770,"md-square-outline":62771,"md-square-sharp":62772,"md-star":62773,"md-star-half":62774,"md-star-half-outline":62775,"md-star-half-sharp":62776,"md-star-outline":62777,"md-star-sharp":62778,"md-stats-chart":62779,"md-stats-chart-outline":62780,"md-stats-chart-sharp":62781,"md-stop":62782,"md-stop-circle":62783,"md-stop-circle-outline":62784,"md-stop-circle-sharp":62785,"md-stop-outline":62786,"md-stop-sharp":62787,"md-stopwatch":62788,"md-stopwatch-outline":62789,"md-stopwatch-sharp":62790,"md-subway":62791,"md-subway-outline":62792,"md-subway-sharp":62793,"md-sunny":62794,"md-sunny-outline":62795,"md-sunny-sharp":62796,"md-swap-horizontal":62797,"md-swap-horizontal-outline":62798,"md-swap-horizontal-sharp":62799,"md-swap-vertical":62800,"md-swap-vertical-outline":62801,"md-swap-vertical-sharp":62802,"md-sync":62803,"md-sync-circle":62804,"md-sync-circle-outline":62805,"md-sync-circle-sharp":62806,"md-sync-outline":62807,"md-sync-sharp":62808,"md-tablet-landscape":62809,"md-tablet-landscape-outline":62810,"md-tablet-landscape-sharp":62811,"md-tablet-portrait":62812,"md-tablet-portrait-outline":62813,"md-tablet-portrait-sharp":62814,"md-tennisball":62815,"md-tennisball-outline":62816,"md-tennisball-sharp":62817,"md-terminal":62818,"md-terminal-outline":62819,"md-terminal-sharp":62820,"md-text":62821,"md-text-outline":62822,"md-text-sharp":62823,"md-thermometer":62824,"md-thermometer-outline":62825,"md-thermometer-sharp":62826,"md-thumbs-down":62827,"md-thumbs-down-outline":62828,"md-thumbs-down-sharp":62829,"md-thumbs-up":62830,"md-thumbs-up-outline":62831,"md-thumbs-up-sharp":62832,"md-thunderstorm":62833,"md-thunderstorm-outline":62834,"md-thunderstorm-sharp":62835,"md-time":62836,"md-time-outline":62837,"md-time-sharp":62838,"md-timer":62839,"md-timer-outline":62840,"md-timer-sharp":62841,"md-today":62842,"md-today-outline":62843,"md-today-sharp":62844,"md-toggle":62845,"md-toggle-outline":62846,"md-toggle-sharp":62847,"md-trail-sign":62848,"md-trail-sign-outline":62849,"md-trail-sign-sharp":62850,"md-train":62851,"md-train-outline":62852,"md-train-sharp":62853,"md-transgender":62854,"md-transgender-outline":62855,"md-transgender-sharp":62856,"md-trash":62857,"md-trash-bin":62858,"md-trash-bin-outline":62859,"md-trash-bin-sharp":62860,"md-trash-outline":62861,"md-trash-sharp":62862,"md-trending-down":62863,"md-trending-down-outline":62864,"md-trending-down-sharp":62865,"md-trending-up":62866,"md-trending-up-outline":62867,"md-trending-up-sharp":62868,"md-triangle":62869,"md-triangle-outline":62870,"md-triangle-sharp":62871,"md-trophy":62872,"md-trophy-outline":62873,"md-trophy-sharp":62874,"md-tv":62875,"md-tv-outline":62876,"md-tv-sharp":62877,"md-umbrella":62878,"md-umbrella-outline":62879,"md-umbrella-sharp":62880,"md-videocam":62881,"md-videocam-outline":62882,"md-videocam-sharp":62883,"md-volume-high":62884,"md-volume-high-outline":62885,"md-volume-high-sharp":62886,"md-volume-low":62887,"md-volume-low-outline":62888,"md-volume-low-sharp":62889,"md-volume-medium":62890,"md-volume-medium-outline":62891,"md-volume-medium-sharp":62892,"md-volume-mute":62893,"md-volume-mute-outline":62894,"md-volume-mute-sharp":62895,"md-volume-off":62896,"md-volume-off-outline":62897,"md-volume-off-sharp":62898,"md-walk":62899,"md-walk-outline":62900,"md-walk-sharp":62901,"md-wallet":62902,"md-wallet-outline":62903,"md-wallet-sharp":62904,"md-warning":62905,"md-warning-outline":62906,"md-warning-sharp":62907,"md-watch":62908,"md-watch-outline":62909,"md-watch-sharp":62910,"md-water":62911,"md-water-outline":62912,"md-water-sharp":62913,"md-wifi":62914,"md-wifi-outline":62915,"md-wifi-sharp":62916,"md-wine":62917,"md-wine-outline":62918,"md-wine-sharp":62919,"md-woman":62920,"md-woman-outline":62921,"md-woman-sharp":62922}},662,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.getImageSourceSync=e.getImageSource=e.TabBarItemIOS=e.TabBarItem=e.Button=e.default=void 0;var u=t(r(d[1])),I=t(r(d[2])),o=(0,u.default)(I.default,'Material Design Icons','MaterialCommunityIcons.ttf'),c=o;e.default=c;var n=o.Button,S=o.TabBarItem,B=o.TabBarItemIOS,l=o.getImageSource,b=o.getImageSourceSync;e.getImageSourceSync=b,e.getImageSource=l,e.TabBarItemIOS=B,e.TabBarItem=S,e.Button=n},663,[1,633,664]); -__d(function(e,o,t,l,a,i,r){a.exports={"ab-testing":983497,"abjad-arabic":987944,"abjad-hebrew":987945,"abugida-devanagari":987946,"abugida-thai":987947,"access-point":983043,"access-point-network":983042,"access-point-network-off":986081,account:983044,"account-alert":983045,"account-alert-outline":985936,"account-arrow-left":985937,"account-arrow-left-outline":985938,"account-arrow-right":985939,"account-arrow-right-outline":985940,"account-box":983046,"account-box-multiple":985396,"account-box-multiple-outline":987146,"account-box-outline":983047,"account-cancel":987871,"account-cancel-outline":987872,"account-cash":987287,"account-cash-outline":987288,"account-check":983048,"account-check-outline":986082,"account-child":985737,"account-child-circle":985738,"account-child-outline":987336,"account-circle":983049,"account-circle-outline":985941,"account-clock":985942,"account-clock-outline":985943,"account-cog":988016,"account-cog-outline":988017,"account-convert":983050,"account-convert-outline":987905,"account-cowboy-hat":986779,"account-details":984625,"account-details-outline":988018,"account-edit":984764,"account-edit-outline":987131,"account-group":985161,"account-group-outline":985944,"account-hard-hat":984501,"account-heart":985241,"account-heart-outline":986083,"account-key":983051,"account-key-outline":986084,"account-lock":987486,"account-lock-outline":987487,"account-minus":983053,"account-minus-outline":985836,"account-multiple":983054,"account-multiple-check":985285,"account-multiple-check-outline":987646,"account-multiple-minus":984531,"account-multiple-minus-outline":986085,"account-multiple-outline":983055,"account-multiple-plus":983056,"account-multiple-plus-outline":985088,"account-multiple-remove":987658,"account-multiple-remove-outline":987659,"account-music":985091,"account-music-outline":986345,"account-network":983057,"account-network-outline":986086,"account-off":983058,"account-off-outline":986087,"account-outline":983059,"account-plus":983060,"account-plus-outline":985089,"account-question":985945,"account-question-outline":985946,"account-remove":983061,"account-remove-outline":985837,"account-search":983062,"account-search-outline":985397,"account-settings":984624,"account-settings-outline":987337,"account-star":983063,"account-star-outline":986088,"account-supervisor":985739,"account-supervisor-circle":985740,"account-supervisor-outline":987437,"account-switch":983065,"account-switch-outline":984267,"account-tie":986339,"account-tie-outline":987338,"account-tie-voice":987912,"account-tie-voice-off":987914,"account-tie-voice-off-outline":987915,"account-tie-voice-outline":987913,"account-voice":984523,adjust:983066,adobe:985398,"adobe-acrobat":987037,"air-conditioner":983067,"air-filter":986435,"air-horn":986540,"air-humidifier":987289,"air-humidifier-off":988262,"air-purifier":986436,airbag:986089,airballoon:983068,"airballoon-outline":987147,airplane:983069,"airplane-landing":984532,"airplane-off":983070,"airplane-takeoff":984533,airport:985163,alarm:983072,"alarm-bell":984974,"alarm-check":983073,"alarm-light":984975,"alarm-light-outline":986090,"alarm-multiple":983074,"alarm-note":986737,"alarm-note-off":986738,"alarm-off":983075,"alarm-plus":983076,"alarm-snooze":984718,album:983077,alert:983078,"alert-box":983079,"alert-box-outline":986340,"alert-circle":983080,"alert-circle-check":987629,"alert-circle-check-outline":987630,"alert-circle-outline":984534,"alert-decagram":984765,"alert-decagram-outline":986341,"alert-minus":988347,"alert-minus-outline":988350,"alert-octagon":983081,"alert-octagon-outline":986342,"alert-octagram":984935,"alert-octagram-outline":986343,"alert-outline":983082,"alert-plus":988346,"alert-plus-outline":988349,"alert-remove":988348,"alert-remove-outline":988351,"alert-rhombus":987598,"alert-rhombus-outline":987599,alien:985242,"alien-outline":987339,"align-horizontal-center":987587,"align-horizontal-left":987586,"align-horizontal-right":987588,"align-vertical-bottom":987589,"align-vertical-center":987590,"align-vertical-top":987591,"all-inclusive":984766,allergy:987736,alpha:983083,"alpha-a":985838,"alpha-a-box":985864,"alpha-a-box-outline":986091,"alpha-a-circle":986092,"alpha-a-circle-outline":986093,"alpha-b":985839,"alpha-b-box":985865,"alpha-b-box-outline":986094,"alpha-b-circle":986095,"alpha-b-circle-outline":986096,"alpha-c":985840,"alpha-c-box":985866,"alpha-c-box-outline":986097,"alpha-c-circle":986098,"alpha-c-circle-outline":986099,"alpha-d":985841,"alpha-d-box":985867,"alpha-d-box-outline":986100,"alpha-d-circle":986101,"alpha-d-circle-outline":986102,"alpha-e":985842,"alpha-e-box":985868,"alpha-e-box-outline":986103,"alpha-e-circle":986104,"alpha-e-circle-outline":986105,"alpha-f":985843,"alpha-f-box":985869,"alpha-f-box-outline":986106,"alpha-f-circle":986107,"alpha-f-circle-outline":986108,"alpha-g":985844,"alpha-g-box":985870,"alpha-g-box-outline":986109,"alpha-g-circle":986110,"alpha-g-circle-outline":986111,"alpha-h":985845,"alpha-h-box":985871,"alpha-h-box-outline":986112,"alpha-h-circle":986113,"alpha-h-circle-outline":986114,"alpha-i":985846,"alpha-i-box":985872,"alpha-i-box-outline":986115,"alpha-i-circle":986116,"alpha-i-circle-outline":986117,"alpha-j":985847,"alpha-j-box":985873,"alpha-j-box-outline":986118,"alpha-j-circle":986119,"alpha-j-circle-outline":986120,"alpha-k":985848,"alpha-k-box":985874,"alpha-k-box-outline":986121,"alpha-k-circle":986122,"alpha-k-circle-outline":986123,"alpha-l":985849,"alpha-l-box":985875,"alpha-l-box-outline":986124,"alpha-l-circle":986125,"alpha-l-circle-outline":986126,"alpha-m":985850,"alpha-m-box":985876,"alpha-m-box-outline":986127,"alpha-m-circle":986128,"alpha-m-circle-outline":986129,"alpha-n":985851,"alpha-n-box":985877,"alpha-n-box-outline":986130,"alpha-n-circle":986131,"alpha-n-circle-outline":986132,"alpha-o":985852,"alpha-o-box":985878,"alpha-o-box-outline":986133,"alpha-o-circle":986134,"alpha-o-circle-outline":986135,"alpha-p":985853,"alpha-p-box":985879,"alpha-p-box-outline":986136,"alpha-p-circle":986137,"alpha-p-circle-outline":986138,"alpha-q":985854,"alpha-q-box":985880,"alpha-q-box-outline":986139,"alpha-q-circle":986140,"alpha-q-circle-outline":986141,"alpha-r":985855,"alpha-r-box":985881,"alpha-r-box-outline":986142,"alpha-r-circle":986143,"alpha-r-circle-outline":986144,"alpha-s":985856,"alpha-s-box":985882,"alpha-s-box-outline":986145,"alpha-s-circle":986146,"alpha-s-circle-outline":986147,"alpha-t":985857,"alpha-t-box":985883,"alpha-t-box-outline":986148,"alpha-t-circle":986149,"alpha-t-circle-outline":986150,"alpha-u":985858,"alpha-u-box":985884,"alpha-u-box-outline":986151,"alpha-u-circle":986152,"alpha-u-circle-outline":986153,"alpha-v":985859,"alpha-v-box":985885,"alpha-v-box-outline":986154,"alpha-v-circle":986155,"alpha-v-circle-outline":986156,"alpha-w":985860,"alpha-w-box":985886,"alpha-w-box-outline":986157,"alpha-w-circle":986158,"alpha-w-circle-outline":986159,"alpha-x":985861,"alpha-x-box":985887,"alpha-x-box-outline":986160,"alpha-x-circle":986161,"alpha-x-circle-outline":986162,"alpha-y":985862,"alpha-y-box":985888,"alpha-y-box-outline":986163,"alpha-y-circle":986164,"alpha-y-circle-outline":986165,"alpha-z":985863,"alpha-z-box":985889,"alpha-z-box-outline":986166,"alpha-z-circle":986167,"alpha-z-circle-outline":986168,"alphabet-aurebesh":987948,"alphabet-cyrillic":987949,"alphabet-greek":987950,"alphabet-latin":987951,"alphabet-piqad":987952,"alphabet-tengwar":987959,alphabetical:983084,"alphabetical-off":987148,"alphabetical-variant":987149,"alphabetical-variant-off":987150,altimeter:984535,amazon:983085,"amazon-alexa":985286,ambulance:983087,ammunition:986344,ampersand:985741,amplifier:983088,"amplifier-off":987573,anchor:983089,android:983090,"android-auto":985742,"android-debug-bridge":983091,"android-messages":986437,"android-studio":983092,"angle-acute":985399,"angle-obtuse":985400,"angle-right":985401,angular:984754,angularjs:984767,animation:984536,"animation-outline":985743,"animation-play":985402,"animation-play-outline":985744,ansible:987290,antenna:987417,anvil:985243,"apache-kafka":987151,api:987291,"api-off":987735,apple:983093,"apple-airplay":983071,"apple-finder":983094,"apple-icloud":983096,"apple-ios":983095,"apple-keyboard-caps":984626,"apple-keyboard-command":984627,"apple-keyboard-control":984628,"apple-keyboard-option":984629,"apple-keyboard-shift":984630,"apple-safari":983097,application:984596,"application-export":986541,"application-import":986542,"approximately-equal":987038,"approximately-equal-box":987039,apps:983099,"apps-box":986438,arch:985287,archive:983100,"archive-arrow-down":987737,"archive-arrow-down-outline":987738,"archive-arrow-up":987739,"archive-arrow-up-outline":987740,"archive-outline":987662,"arm-flex":987095,"arm-flex-outline":987094,"arrange-bring-forward":983101,"arrange-bring-to-front":983102,"arrange-send-backward":983103,"arrange-send-to-back":983104,"arrow-all":983105,"arrow-bottom-left":983106,"arrow-bottom-left-bold-outline":985527,"arrow-bottom-left-thick":985528,"arrow-bottom-right":983107,"arrow-bottom-right-bold-outline":985529,"arrow-bottom-right-thick":985530,"arrow-collapse":984597,"arrow-collapse-all":983108,"arrow-collapse-down":984978,"arrow-collapse-horizontal":985164,"arrow-collapse-left":984979,"arrow-collapse-right":984980,"arrow-collapse-up":984981,"arrow-collapse-vertical":985165,"arrow-decision":985531,"arrow-decision-auto":985532,"arrow-decision-auto-outline":985533,"arrow-decision-outline":985534,"arrow-down":983109,"arrow-down-bold":984878,"arrow-down-bold-box":984879,"arrow-down-bold-box-outline":984880,"arrow-down-bold-circle":983111,"arrow-down-bold-circle-outline":983112,"arrow-down-bold-hexagon-outline":983113,"arrow-down-bold-outline":985535,"arrow-down-box":984768,"arrow-down-circle":986331,"arrow-down-circle-outline":986332,"arrow-down-drop-circle":983114,"arrow-down-drop-circle-outline":983115,"arrow-down-thick":983110,"arrow-expand":984598,"arrow-expand-all":983116,"arrow-expand-down":984982,"arrow-expand-horizontal":985166,"arrow-expand-left":984983,"arrow-expand-right":984984,"arrow-expand-up":984985,"arrow-expand-vertical":985167,"arrow-horizontal-lock":987483,"arrow-left":983117,"arrow-left-bold":984881,"arrow-left-bold-box":984882,"arrow-left-bold-box-outline":984883,"arrow-left-bold-circle":983119,"arrow-left-bold-circle-outline":983120,"arrow-left-bold-hexagon-outline":983121,"arrow-left-bold-outline":985536,"arrow-left-box":984769,"arrow-left-circle":986333,"arrow-left-circle-outline":986334,"arrow-left-drop-circle":983122,"arrow-left-drop-circle-outline":983123,"arrow-left-right":986739,"arrow-left-right-bold":986740,"arrow-left-right-bold-outline":985537,"arrow-left-thick":983118,"arrow-right":983124,"arrow-right-bold":984884,"arrow-right-bold-box":984885,"arrow-right-bold-box-outline":984886,"arrow-right-bold-circle":983126,"arrow-right-bold-circle-outline":983127,"arrow-right-bold-hexagon-outline":983128,"arrow-right-bold-outline":985538,"arrow-right-box":984770,"arrow-right-circle":986335,"arrow-right-circle-outline":986336,"arrow-right-drop-circle":983129,"arrow-right-drop-circle-outline":983130,"arrow-right-thick":983125,"arrow-split-horizontal":985403,"arrow-split-vertical":985404,"arrow-top-left":983131,"arrow-top-left-bold-outline":985539,"arrow-top-left-bottom-right":986741,"arrow-top-left-bottom-right-bold":986742,"arrow-top-left-thick":985540,"arrow-top-right":983132,"arrow-top-right-bold-outline":985541,"arrow-top-right-bottom-left":986743,"arrow-top-right-bottom-left-bold":986744,"arrow-top-right-thick":985542,"arrow-up":983133,"arrow-up-bold":984887,"arrow-up-bold-box":984888,"arrow-up-bold-box-outline":984889,"arrow-up-bold-circle":983135,"arrow-up-bold-circle-outline":983136,"arrow-up-bold-hexagon-outline":983137,"arrow-up-bold-outline":985543,"arrow-up-box":984771,"arrow-up-circle":986337,"arrow-up-circle-outline":986338,"arrow-up-down":986745,"arrow-up-down-bold":986746,"arrow-up-down-bold-outline":985544,"arrow-up-drop-circle":983138,"arrow-up-drop-circle-outline":983139,"arrow-up-thick":983134,"arrow-vertical-lock":987484,artstation:985947,"aspect-ratio":985636,assistant:983140,asterisk:984772,at:983141,atlassian:985092,atm:986439,atom:984936,"atom-variant":986747,attachment:983142,"audio-video":985405,"audio-video-off":987574,"augmented-reality":985168,"auto-download":988030,"auto-fix":983144,"auto-upload":983145,autorenew:983146,"av-timer":983147,aws:986639,axe:985288,axis:986440,"axis-arrow":986441,"axis-arrow-info":988174,"axis-arrow-lock":986442,"axis-lock":986443,"axis-x-arrow":986444,"axis-x-arrow-lock":986445,"axis-x-rotate-clockwise":986446,"axis-x-rotate-counterclockwise":986447,"axis-x-y-arrow-lock":986448,"axis-y-arrow":986449,"axis-y-arrow-lock":986450,"axis-y-rotate-clockwise":986451,"axis-y-rotate-counterclockwise":986452,"axis-z-arrow":986453,"axis-z-arrow-lock":986454,"axis-z-rotate-clockwise":986455,"axis-z-rotate-counterclockwise":986456,babel:985637,baby:983148,"baby-bottle":986937,"baby-bottle-outline":986938,"baby-buggy":988128,"baby-carriage":984719,"baby-carriage-off":987040,"baby-face":986748,"baby-face-outline":986749,backburger:983149,backspace:983150,"backspace-outline":985948,"backspace-reverse":986750,"backspace-reverse-outline":986751,"backup-restore":983151,bacteria:986837,"bacteria-outline":986838,"badge-account":986535,"badge-account-alert":986536,"badge-account-alert-outline":986537,"badge-account-horizontal":986637,"badge-account-horizontal-outline":986638,"badge-account-outline":986538,badminton:985169,"bag-carry-on":986939,"bag-carry-on-check":986469,"bag-carry-on-off":986940,"bag-checked":986941,"bag-personal":986640,"bag-personal-off":986641,"bag-personal-off-outline":986642,"bag-personal-outline":986643,baguette:986942,balloon:985638,ballot:985545,"ballot-outline":985546,"ballot-recount":986169,"ballot-recount-outline":986170,bandage:986543,bandcamp:984693,bank:983152,"bank-minus":986544,"bank-outline":986752,"bank-plus":986545,"bank-remove":986546,"bank-transfer":985639,"bank-transfer-in":985640,"bank-transfer-out":985641,barcode:983153,"barcode-off":987702,"barcode-scan":983154,barley:983155,"barley-off":985949,barn:985950,barrel:983156,baseball:985170,"baseball-bat":985171,bash:987523,basket:983158,"basket-fill":983159,"basket-outline":987521,"basket-unfill":983160,basketball:985094,"basketball-hoop":986171,"basketball-hoop-outline":986172,bat:985951,battery:983161,"battery-10":983162,"battery-10-bluetooth":985406,"battery-20":983163,"battery-20-bluetooth":985407,"battery-30":983164,"battery-30-bluetooth":985408,"battery-40":983165,"battery-40-bluetooth":985409,"battery-50":983166,"battery-50-bluetooth":985410,"battery-60":983167,"battery-60-bluetooth":985411,"battery-70":983168,"battery-70-bluetooth":985412,"battery-80":983169,"battery-80-bluetooth":985413,"battery-90":983170,"battery-90-bluetooth":985414,"battery-alert":983171,"battery-alert-bluetooth":985415,"battery-alert-variant":987340,"battery-alert-variant-outline":987341,"battery-bluetooth":985416,"battery-bluetooth-variant":985417,"battery-charging":983172,"battery-charging-10":985244,"battery-charging-100":983173,"battery-charging-20":983174,"battery-charging-30":983175,"battery-charging-40":983176,"battery-charging-50":985245,"battery-charging-60":983177,"battery-charging-70":985246,"battery-charging-80":983178,"battery-charging-90":983179,"battery-charging-high":987814,"battery-charging-low":987812,"battery-charging-medium":987813,"battery-charging-outline":985247,"battery-charging-wireless":985095,"battery-charging-wireless-10":985096,"battery-charging-wireless-20":985097,"battery-charging-wireless-30":985098,"battery-charging-wireless-40":985099,"battery-charging-wireless-50":985100,"battery-charging-wireless-60":985101,"battery-charging-wireless-70":985102,"battery-charging-wireless-80":985103,"battery-charging-wireless-90":985104,"battery-charging-wireless-alert":985105,"battery-charging-wireless-outline":985106,"battery-heart":987663,"battery-heart-outline":987664,"battery-heart-variant":987665,"battery-high":987811,"battery-low":987809,"battery-medium":987810,"battery-minus":983180,"battery-negative":983181,"battery-off":987741,"battery-off-outline":987742,"battery-outline":983182,"battery-plus":983183,"battery-positive":983184,"battery-unknown":983185,"battery-unknown-bluetooth":985418,battlenet:985952,beach:983186,beaker:986346,"beaker-alert":987689,"beaker-alert-outline":987690,"beaker-check":987691,"beaker-check-outline":987692,"beaker-minus":987693,"beaker-minus-outline":987694,"beaker-outline":984720,"beaker-plus":987695,"beaker-plus-outline":987696,"beaker-question":987697,"beaker-question-outline":987698,"beaker-remove":987699,"beaker-remove-outline":987700,bed:983779,"bed-double":987092,"bed-double-outline":987091,"bed-empty":985248,"bed-king":987090,"bed-king-outline":987089,"bed-outline":983193,"bed-queen":987088,"bed-queen-outline":987099,"bed-single":987245,"bed-single-outline":987246,bee:987041,"bee-flower":987042,"beehive-off-outline":988141,"beehive-outline":987342,beer:983192,"beer-outline":987916,bell:983194,"bell-alert":986457,"bell-alert-outline":986753,"bell-cancel":988135,"bell-cancel-outline":988136,"bell-check":987621,"bell-check-outline":987622,"bell-circle":986458,"bell-circle-outline":986459,"bell-minus":988137,"bell-minus-outline":988138,"bell-off":983195,"bell-off-outline":985745,"bell-outline":983196,"bell-plus":983197,"bell-plus-outline":985746,"bell-remove":988139,"bell-remove-outline":988140,"bell-ring":983198,"bell-ring-outline":983199,"bell-sleep":983200,"bell-sleep-outline":985747,beta:983201,betamax:985547,biathlon:986644,bicycle:987292,"bicycle-basket":987701,bike:983203,"bike-fast":987423,billboard:987152,billiards:985953,"billiards-rack":985954,binoculars:983205,bio:983206,biohazard:983207,bitbucket:983208,bitcoin:985107,"black-mesa":983209,blender:986347,"blender-software":983211,blinds:983212,"blinds-open":987153,"block-helper":983213,blogger:983214,"blood-bag":986348,bluetooth:983215,"bluetooth-audio":983216,"bluetooth-connect":983217,"bluetooth-off":983218,"bluetooth-settings":983219,"bluetooth-transfer":983220,blur:983221,"blur-linear":983222,"blur-off":983223,"blur-radial":983224,"bolnisi-cross":986349,bolt:986547,bomb:984721,"bomb-off":984773,bone:983225,book:983226,"book-account":988077,"book-account-outline":988078,"book-alphabet":984605,"book-cross":983202,"book-information-variant":987247,"book-lock":984986,"book-lock-open":984987,"book-minus":984537,"book-minus-multiple":985748,"book-minus-multiple-outline":985355,"book-multiple":983227,"book-multiple-outline":984118,"book-music":983143,"book-open":983229,"book-open-outline":985955,"book-open-page-variant":984538,"book-open-variant":983230,"book-outline":985956,"book-play":986754,"book-play-outline":986755,"book-plus":984539,"book-plus-multiple":985749,"book-plus-multiple-outline":985822,"book-remove":985751,"book-remove-multiple":985750,"book-remove-multiple-outline":984266,"book-search":986756,"book-search-outline":986757,"book-variant":983231,"book-variant-multiple":983228,bookmark:983232,"bookmark-check":983233,"bookmark-check-outline":988027,"bookmark-minus":985548,"bookmark-minus-outline":985549,"bookmark-multiple":986645,"bookmark-multiple-outline":986646,"bookmark-music":983234,"bookmark-music-outline":988025,"bookmark-off":985550,"bookmark-off-outline":985551,"bookmark-outline":983235,"bookmark-plus":983237,"bookmark-plus-outline":983236,"bookmark-remove":983238,"bookmark-remove-outline":988026,bookshelf:987743,"boom-gate":986758,"boom-gate-alert":986759,"boom-gate-alert-outline":986760,"boom-gate-down":986761,"boom-gate-down-outline":986762,"boom-gate-outline":986763,"boom-gate-up":986764,"boom-gate-up-outline":986765,boombox:984540,boomerang:987343,bootstrap:984774,"border-all":983239,"border-all-variant":985249,"border-bottom":983240,"border-bottom-variant":985250,"border-color":983241,"border-horizontal":983242,"border-inside":983243,"border-left":983244,"border-left-variant":985251,"border-none":983245,"border-none-variant":985252,"border-outside":983246,"border-right":983247,"border-right-variant":985253,"border-style":983248,"border-top":983249,"border-top-variant":985254,"border-vertical":983250,"bottle-soda":987248,"bottle-soda-classic":987249,"bottle-soda-classic-outline":988003,"bottle-soda-outline":987250,"bottle-tonic":987438,"bottle-tonic-outline":987439,"bottle-tonic-plus":987440,"bottle-tonic-plus-outline":987441,"bottle-tonic-skull":987442,"bottle-tonic-skull-outline":987443,"bottle-wine":985172,"bottle-wine-outline":987920,"bow-tie":984696,bowl:983694,"bowl-mix":984599,"bowl-mix-outline":983780,"bowl-outline":983721,bowling:983251,box:983252,"box-cutter":983253,"box-cutter-off":985930,"box-shadow":984631,"boxing-glove":985957,braille:985552,brain:985553,"bread-slice":986350,"bread-slice-outline":986351,bridge:984600,briefcase:983254,"briefcase-account":986352,"briefcase-account-outline":986353,"briefcase-check":983255,"briefcase-check-outline":987934,"briefcase-clock":987344,"briefcase-clock-outline":987345,"briefcase-download":983256,"briefcase-download-outline":986173,"briefcase-edit":985752,"briefcase-edit-outline":986174,"briefcase-minus":985642,"briefcase-minus-outline":986175,"briefcase-outline":985108,"briefcase-plus":985643,"briefcase-plus-outline":986176,"briefcase-remove":985644,"briefcase-remove-outline":986177,"briefcase-search":985645,"briefcase-search-outline":986178,"briefcase-upload":983257,"briefcase-upload-outline":986179,"briefcase-variant":988308,"briefcase-variant-outline":988309,"brightness-1":983258,"brightness-2":983259,"brightness-3":983260,"brightness-4":983261,"brightness-5":983262,"brightness-6":983263,"brightness-7":983264,"brightness-auto":983265,"brightness-percent":986354,broom:983266,brush:983267,bucket:988181,"bucket-outline":988182,buddhism:985419,buffer:984601,buffet:984440,bug:983268,"bug-check":985646,"bug-check-outline":985647,"bug-outline":985648,bugle:986548,bulldozer:985890,bullet:986355,"bulletin-board":983269,bullhorn:983270,"bullhorn-outline":985891,bullseye:984541,"bullseye-arrow":985289,bulma:987879,"bunk-bed":987906,"bunk-bed-outline":983191,bus:983271,"bus-alert":985753,"bus-articulated-end":984988,"bus-articulated-front":984989,"bus-clock":985290,"bus-double-decker":984990,"bus-marker":987666,"bus-multiple":986943,"bus-school":984991,"bus-side":984992,"bus-stop":987154,"bus-stop-covered":987155,"bus-stop-uncovered":987156,"cable-data":988052,cached:983272,cactus:986549,cake:983273,"cake-layered":983274,"cake-variant":983275,calculator:983276,"calculator-variant":985754,calendar:983277,"calendar-account":986839,"calendar-account-outline":986840,"calendar-alert":985649,"calendar-arrow-left":987444,"calendar-arrow-right":987445,"calendar-blank":983278,"calendar-blank-multiple":987251,"calendar-blank-outline":985958,"calendar-check":983279,"calendar-check-outline":986180,"calendar-clock":983280,"calendar-edit":985255,"calendar-export":985892,"calendar-heart":985554,"calendar-import":985893,"calendar-minus":986460,"calendar-month":986647,"calendar-month-outline":986648,"calendar-multiple":983281,"calendar-multiple-check":983282,"calendar-multiselect":985650,"calendar-outline":985959,"calendar-plus":983283,"calendar-question":984722,"calendar-range":984697,"calendar-range-outline":985960,"calendar-refresh":983521,"calendar-refresh-outline":983555,"calendar-remove":983284,"calendar-remove-outline":986181,"calendar-search":985420,"calendar-star":985555,"calendar-sync":986766,"calendar-sync-outline":986767,"calendar-text":983285,"calendar-text-outline":986182,"calendar-today":983286,"calendar-week":985651,"calendar-week-begin":985652,"calendar-weekend":986841,"calendar-weekend-outline":986842,"call-made":983287,"call-merge":983288,"call-missed":983289,"call-received":983290,"call-split":983291,camcorder:983292,"camcorder-off":983295,camera:983296,"camera-account":985291,"camera-burst":984723,"camera-control":985961,"camera-enhance":983297,"camera-enhance-outline":985962,"camera-front":983298,"camera-front-variant":983299,"camera-gopro":984993,"camera-image":985292,"camera-iris":983300,"camera-metering-center":984994,"camera-metering-matrix":984995,"camera-metering-partial":984996,"camera-metering-spot":984997,"camera-off":984543,"camera-outline":986461,"camera-party-mode":983301,"camera-plus":986843,"camera-plus-outline":986844,"camera-rear":983302,"camera-rear-variant":983303,"camera-retake":986649,"camera-retake-outline":986650,"camera-switch":983304,"camera-switch-outline":985162,"camera-timer":983305,"camera-wireless":986550,"camera-wireless-outline":986551,campfire:986845,cancel:984890,candle:984546,candycane:983306,cannabis:984998,"caps-lock":985755,car:983307,"car-2-plus":987157,"car-3-plus":987158,"car-arrow-left":988082,"car-arrow-right":988083,"car-back":986651,"car-battery":983308,"car-brake-abs":986183,"car-brake-alert":986184,"car-brake-hold":986462,"car-brake-parking":986463,"car-brake-retarder":987159,"car-child-seat":987043,"car-clutch":987160,"car-cog":988108,"car-connected":983309,"car-convertible":984999,"car-coolant-level":987161,"car-cruise-control":986464,"car-defrost-front":986465,"car-defrost-rear":986466,"car-door":985963,"car-door-lock":987293,"car-electric":985964,"car-esp":986185,"car-estate":985e3,"car-hatchback":985001,"car-info":987582,"car-key":985965,"car-light-dimmed":986186,"car-light-fog":986187,"car-light-high":986188,"car-limousine":985293,"car-multiple":985966,"car-off":986652,"car-parking-lights":986467,"car-pickup":985002,"car-seat":987044,"car-seat-cooler":987045,"car-seat-heater":987046,"car-settings":988109,"car-shift-pattern":986944,"car-side":985003,"car-sports":985004,"car-tire-alert":986189,"car-traction-control":986468,"car-turbocharger":987162,"car-wash":983310,"car-windshield":987163,"car-windshield-outline":987164,carabiner:988352,caravan:985005,card:985967,"card-account-details":984530,"card-account-details-outline":986539,"card-account-details-star":983715,"card-account-details-star-outline":984795,"card-account-mail":983438,"card-account-mail-outline":986776,"card-account-phone":986777,"card-account-phone-outline":986778,"card-bulleted":985968,"card-bulleted-off":985969,"card-bulleted-off-outline":985970,"card-bulleted-outline":985971,"card-bulleted-settings":985972,"card-bulleted-settings-outline":985973,"card-outline":985974,"card-plus":987647,"card-plus-outline":987648,"card-search":987252,"card-search-outline":987253,"card-text":985975,"card-text-outline":985976,cards:984632,"cards-club":985294,"cards-diamond":985295,"cards-diamond-outline":987165,"cards-heart":985296,"cards-outline":984633,"cards-playing-outline":984634,"cards-spade":985297,"cards-variant":984775,carrot:983311,cart:983312,"cart-arrow-down":986470,"cart-arrow-right":986190,"cart-arrow-up":986471,"cart-minus":986472,"cart-off":984683,"cart-outline":983313,"cart-plus":983314,"cart-remove":986473,"case-sensitive-alt":983315,cash:983316,"cash-100":983317,"cash-marker":986552,"cash-minus":987744,"cash-multiple":983318,"cash-plus":987745,"cash-refund":985756,"cash-register":986356,"cash-remove":987746,"cash-usd":987510,"cash-usd-outline":983319,cassette:985556,cast:983320,"cast-audio":987166,"cast-connected":983321,"cast-education":986653,"cast-off":984970,castle:983322,cat:983323,cctv:985006,"ceiling-light":984937,cellphone:983324,"cellphone-android":983325,"cellphone-arrow-down":985557,"cellphone-basic":983326,"cellphone-charging":988055,"cellphone-cog":985425,"cellphone-dock":983327,"cellphone-erase":985421,"cellphone-information":986945,"cellphone-iphone":983328,"cellphone-key":985422,"cellphone-link":983329,"cellphone-link-off":983330,"cellphone-lock":985423,"cellphone-message":985299,"cellphone-message-off":987346,"cellphone-nfc":986768,"cellphone-nfc-off":987864,"cellphone-off":985424,"cellphone-play":987167,"cellphone-screenshot":985653,"cellphone-settings":983331,"cellphone-sound":985426,"cellphone-text":985298,"cellphone-wireless":985109,"celtic-cross":986357,centos:987418,certificate:983332,"certificate-outline":987528,"chair-rolling":986952,"chair-school":983333,charity:986191,"chart-arc":983334,"chart-areaspline":983335,"chart-areaspline-variant":986769,"chart-bar":983336,"chart-bar-stacked":984938,"chart-bell-curve":986192,"chart-bell-curve-cumulative":987047,"chart-bubble":984547,"chart-donut":985007,"chart-donut-variant":985008,"chart-gantt":984684,"chart-histogram":983337,"chart-line":983338,"chart-line-stacked":984939,"chart-line-variant":985009,"chart-multiline":985300,"chart-multiple":987667,"chart-pie":983339,"chart-ppf":988032,"chart-sankey":987615,"chart-sankey-variant":987616,"chart-scatter-plot":986770,"chart-scatter-plot-hexbin":984685,"chart-timeline":984686,"chart-timeline-variant":986771,"chart-tree":986772,chat:985977,"chat-alert":985978,"chat-alert-outline":987849,"chat-minus":988176,"chat-minus-outline":988179,"chat-outline":986846,"chat-plus":988175,"chat-plus-outline":988178,"chat-processing":985979,"chat-processing-outline":987850,"chat-remove":988177,"chat-remove-outline":988180,"chat-sleep":987857,"chat-sleep-outline":987858,check:983340,"check-all":983341,"check-bold":986654,"check-box-multiple-outline":986193,"check-box-outline":986194,"check-circle":984544,"check-circle-outline":984545,"check-decagram":984977,"check-network":986195,"check-network-outline":986196,"check-outline":985173,"check-underline":986655,"check-underline-circle":986656,"check-underline-circle-outline":986657,checkbook:985757,"checkbox-blank":983342,"checkbox-blank-circle":983343,"checkbox-blank-circle-outline":983344,"checkbox-blank-off":987884,"checkbox-blank-off-outline":987885,"checkbox-blank-outline":983345,"checkbox-intermediate":985174,"checkbox-marked":983346,"checkbox-marked-circle":983347,"checkbox-marked-circle-outline":983348,"checkbox-marked-outline":983349,"checkbox-multiple-blank":983350,"checkbox-multiple-blank-circle":984635,"checkbox-multiple-blank-circle-outline":984636,"checkbox-multiple-blank-outline":983351,"checkbox-multiple-marked":983352,"checkbox-multiple-marked-circle":984637,"checkbox-multiple-marked-circle-outline":984638,"checkbox-multiple-marked-outline":983353,checkerboard:983354,"checkerboard-minus":987650,"checkerboard-plus":987649,"checkerboard-remove":987651,cheese:987833,"cheese-off":988142,"chef-hat":985980,"chemical-weapon":983355,"chess-bishop":985180,"chess-king":985175,"chess-knight":985176,"chess-pawn":985177,"chess-queen":985178,"chess-rook":985179,"chevron-double-down":983356,"chevron-double-left":983357,"chevron-double-right":983358,"chevron-double-up":983359,"chevron-down":983360,"chevron-down-box":985558,"chevron-down-box-outline":985559,"chevron-down-circle":985894,"chevron-down-circle-outline":985895,"chevron-left":983361,"chevron-left-box":985560,"chevron-left-box-outline":985561,"chevron-left-circle":985896,"chevron-left-circle-outline":985897,"chevron-right":983362,"chevron-right-box":985562,"chevron-right-box-outline":985563,"chevron-right-circle":985898,"chevron-right-circle-outline":985899,"chevron-triple-down":986553,"chevron-triple-left":986554,"chevron-triple-right":986555,"chevron-triple-up":986556,"chevron-up":983363,"chevron-up-box":985564,"chevron-up-box-outline":985565,"chevron-up-circle":985900,"chevron-up-circle-outline":985901,"chili-hot":985010,"chili-medium":985011,"chili-mild":985012,"chili-off":988263,chip:984602,christianity:985427,"christianity-outline":986358,church:983364,cigar:987529,"cigar-off":988187,circle:984933,"circle-double":986773,"circle-edit-outline":985301,"circle-expand":986774,"circle-half":988053,"circle-half-full":988054,"circle-medium":985566,"circle-multiple":985912,"circle-multiple-outline":984725,"circle-off-outline":987347,"circle-outline":984934,"circle-slice-1":985758,"circle-slice-2":985759,"circle-slice-3":985760,"circle-slice-4":985761,"circle-slice-5":985762,"circle-slice-6":985763,"circle-slice-7":985764,"circle-slice-8":985765,"circle-small":985567,"circular-saw":986658,city:983366,"city-variant":985654,"city-variant-outline":985655,clipboard:983367,"clipboard-account":983368,"clipboard-account-outline":986197,"clipboard-alert":983369,"clipboard-alert-outline":986359,"clipboard-arrow-down":983370,"clipboard-arrow-down-outline":986198,"clipboard-arrow-left":983371,"clipboard-arrow-left-outline":986360,"clipboard-arrow-right":986361,"clipboard-arrow-right-outline":986362,"clipboard-arrow-up":986199,"clipboard-arrow-up-outline":986200,"clipboard-check":983374,"clipboard-check-multiple":987747,"clipboard-check-multiple-outline":987748,"clipboard-check-outline":985256,"clipboard-file":987749,"clipboard-file-outline":987750,"clipboard-flow":984776,"clipboard-flow-outline":987415,"clipboard-list":987348,"clipboard-list-outline":987349,"clipboard-multiple":987751,"clipboard-multiple-outline":987752,"clipboard-outline":983372,"clipboard-play":986201,"clipboard-play-multiple":987753,"clipboard-play-multiple-outline":987754,"clipboard-play-outline":986202,"clipboard-plus":984913,"clipboard-plus-outline":987935,"clipboard-pulse":985181,"clipboard-pulse-outline":985182,"clipboard-text":983373,"clipboard-text-multiple":987755,"clipboard-text-multiple-outline":987756,"clipboard-text-outline":985656,"clipboard-text-play":986203,"clipboard-text-play-outline":986204,clippy:983375,clock:985428,"clock-alert":985429,"clock-alert-outline":984526,"clock-check":987048,"clock-check-outline":987049,"clock-digital":986775,"clock-end":983377,"clock-fast":983378,"clock-in":983379,"clock-out":983380,"clock-outline":983376,"clock-start":983381,"clock-time-eight":988230,"clock-time-eight-outline":988242,"clock-time-eleven":988233,"clock-time-eleven-outline":988245,"clock-time-five":988227,"clock-time-five-outline":988239,"clock-time-four":988226,"clock-time-four-outline":988238,"clock-time-nine":988231,"clock-time-nine-outline":988243,"clock-time-one":988223,"clock-time-one-outline":988235,"clock-time-seven":988229,"clock-time-seven-outline":988241,"clock-time-six":988228,"clock-time-six-outline":988240,"clock-time-ten":988232,"clock-time-ten-outline":988244,"clock-time-three":988225,"clock-time-three-outline":988237,"clock-time-twelve":988234,"clock-time-twelve-outline":988246,"clock-time-two":988224,"clock-time-two-outline":988236,close:983382,"close-box":983383,"close-box-multiple":986205,"close-box-multiple-outline":986206,"close-box-outline":983384,"close-circle":983385,"close-circle-multiple":984618,"close-circle-multiple-outline":985219,"close-circle-outline":983386,"close-network":983387,"close-network-outline":986207,"close-octagon":983388,"close-octagon-outline":983389,"close-outline":984777,"close-thick":988056,"closed-caption":983390,"closed-caption-outline":986557,cloud:983391,"cloud-alert":985568,"cloud-braces":985013,"cloud-check":983392,"cloud-check-outline":987852,"cloud-circle":983393,"cloud-download":983394,"cloud-download-outline":985981,"cloud-lock":987633,"cloud-lock-outline":987634,"cloud-off-outline":983396,"cloud-outline":983395,"cloud-print":983397,"cloud-print-outline":983398,"cloud-question":985657,"cloud-refresh":984362,"cloud-search":985430,"cloud-search-outline":985431,"cloud-sync":984639,"cloud-sync-outline":987862,"cloud-tags":985014,"cloud-upload":983399,"cloud-upload-outline":985982,clover:985110,"coach-lamp":987168,"coat-rack":987294,"code-array":983400,"code-braces":983401,"code-braces-box":987350,"code-brackets":983402,"code-equal":983403,"code-greater-than":983404,"code-greater-than-or-equal":983405,"code-json":984614,"code-less-than":983406,"code-less-than-or-equal":983407,"code-not-equal":983408,"code-not-equal-variant":983409,"code-parentheses":983410,"code-parentheses-box":987351,"code-string":983411,"code-tags":983412,"code-tags-check":984724,codepen:983413,coffee:983414,"coffee-maker":987295,"coffee-off":987050,"coffee-off-outline":987051,"coffee-outline":984778,"coffee-to-go":983415,"coffee-to-go-outline":987918,coffin:985983,cog:984211,"cog-box":984212,"cog-clockwise":987613,"cog-counterclockwise":987614,"cog-off":988110,"cog-off-outline":988111,"cog-outline":985275,"cog-refresh":988254,"cog-refresh-outline":988255,"cog-sync":988256,"cog-sync-outline":988257,"cog-transfer":987227,"cog-transfer-outline":987228,cogs:985302,collage:984640,"collapse-all":985766,"collapse-all-outline":985767,"color-helper":983417,comma:986659,"comma-box":986667,"comma-box-outline":986660,"comma-circle":986661,"comma-circle-outline":986662,comment:983418,"comment-account":983419,"comment-account-outline":983420,"comment-alert":983421,"comment-alert-outline":983422,"comment-arrow-left":985569,"comment-arrow-left-outline":985570,"comment-arrow-right":985571,"comment-arrow-right-outline":985572,"comment-check":983423,"comment-check-outline":983424,"comment-edit":987583,"comment-edit-outline":987844,"comment-eye":985658,"comment-eye-outline":985659,"comment-multiple":985183,"comment-multiple-outline":983425,"comment-outline":983426,"comment-plus":985573,"comment-plus-outline":983427,"comment-processing":983428,"comment-processing-outline":983429,"comment-question":985111,"comment-question-outline":983430,"comment-quote":987169,"comment-quote-outline":987170,"comment-remove":984542,"comment-remove-outline":983431,"comment-search":985660,"comment-search-outline":985661,"comment-text":983432,"comment-text-multiple":985184,"comment-text-multiple-outline":985185,"comment-text-outline":983433,compare:983434,"compare-horizontal":988306,"compare-vertical":988307,compass:983435,"compass-off":985984,"compass-off-outline":985985,"compass-outline":983436,"compass-rose":988034,"concourse-ci":987296,console:983437,"console-line":985015,"console-network":985257,"console-network-outline":986208,consolidate:987352,"contactless-payment":986474,"contactless-payment-circle":983841,"contactless-payment-circle-outline":984072,contacts:984779,"contacts-outline":984504,contain:985662,"contain-end":985663,"contain-start":985664,"content-copy":983439,"content-cut":983440,"content-duplicate":983441,"content-paste":983442,"content-save":983443,"content-save-alert":986946,"content-save-alert-outline":986947,"content-save-all":983444,"content-save-all-outline":986948,"content-save-cog":988251,"content-save-cog-outline":988252,"content-save-edit":986363,"content-save-edit-outline":986364,"content-save-move":986663,"content-save-move-outline":986664,"content-save-outline":985112,"content-save-settings":984603,"content-save-settings-outline":985902,contrast:983445,"contrast-box":983446,"contrast-circle":983447,"controller-classic":985986,"controller-classic-outline":985987,cookie:983448,"coolant-temperature":984008,copyright:984550,cordova:985432,corn:985016,"corn-off":988143,"cosine-wave":988281,counter:983449,cow:983450,"cpu-32-bit":986847,"cpu-64-bit":986848,crane:985186,creation:984692,"creative-commons":986475,"credit-card":987119,"credit-card-check":988112,"credit-card-check-outline":988113,"credit-card-clock":986849,"credit-card-clock-outline":986850,"credit-card-marker":984744,"credit-card-marker-outline":986558,"credit-card-minus":987052,"credit-card-minus-outline":987053,"credit-card-multiple":987120,"credit-card-multiple-outline":983452,"credit-card-off":987121,"credit-card-off-outline":984548,"credit-card-outline":983451,"credit-card-plus":987122,"credit-card-plus-outline":984694,"credit-card-refund":987123,"credit-card-refund-outline":985768,"credit-card-remove":987054,"credit-card-remove-outline":987055,"credit-card-scan":987124,"credit-card-scan-outline":983453,"credit-card-settings":987125,"credit-card-settings-outline":985303,"credit-card-wireless":985090,"credit-card-wireless-off":984442,"credit-card-wireless-off-outline":984443,"credit-card-wireless-outline":986476,cricket:986477,crop:983454,"crop-free":983455,"crop-landscape":983456,"crop-portrait":983457,"crop-rotate":984726,"crop-square":983458,crosshairs:983459,"crosshairs-gps":983460,"crosshairs-off":986949,"crosshairs-question":987446,crown:983461,"crown-outline":987600,cryengine:985433,"crystal-ball":985903,cube:983462,"cube-off":988188,"cube-off-outline":988189,"cube-outline":983463,"cube-scan":985988,"cube-send":983464,"cube-unfolded":983465,cup:983466,"cup-off":984549,"cup-off-outline":988029,"cup-outline":987919,"cup-water":983467,cupboard:986950,"cupboard-outline":986951,cupcake:985434,curling:985187,"currency-bdt":985188,"currency-brl":985989,"currency-btc":983468,"currency-cny":985018,"currency-eth":985019,"currency-eur":983469,"currency-eur-off":987925,"currency-gbp":983470,"currency-ils":986209,"currency-inr":983471,"currency-jpy":985020,"currency-krw":985021,"currency-kzt":985189,"currency-ngn":983472,"currency-php":985574,"currency-rial":986780,"currency-rub":983473,"currency-sign":985022,"currency-try":983474,"currency-twd":985023,"currency-usd":983489,"currency-usd-circle":987499,"currency-usd-circle-outline":983416,"currency-usd-off":984698,"current-ac":988288,"current-dc":985436,"cursor-default":983488,"cursor-default-click":986365,"cursor-default-click-outline":986366,"cursor-default-gesture":987431,"cursor-default-gesture-outline":987432,"cursor-default-outline":983487,"cursor-move":983486,"cursor-pointer":983485,"cursor-text":984551,database:983484,"database-check":985769,"database-edit":985990,"database-export":985438,"database-import":985437,"database-lock":985770,"database-marker":987894,"database-minus":983483,"database-plus":983482,"database-refresh":984514,"database-remove":986368,"database-search":985190,"database-settings":986369,"database-sync":986367,"death-star":985304,"death-star-variant":985305,"deathly-hallows":985991,debian:985306,"debug-step-into":983481,"debug-step-out":983480,"debug-step-over":983479,decagram:984940,"decagram-outline":984941,decimal:987297,"decimal-comma":987298,"decimal-comma-decrease":987299,"decimal-comma-increase":987300,"decimal-decrease":983478,"decimal-increase":983477,delete:983476,"delete-alert":987301,"delete-alert-outline":987302,"delete-circle":984707,"delete-circle-outline":985992,"delete-empty":984780,"delete-empty-outline":986781,"delete-forever":984552,"delete-forever-outline":985993,"delete-off":987303,"delete-off-outline":987304,"delete-outline":985575,"delete-restore":985113,"delete-sweep":984553,"delete-sweep-outline":986210,"delete-variant":983475,delta:983490,desk:987705,"desk-lamp":985439,deskphone:983491,"desktop-classic":985024,"desktop-mac":983492,"desktop-mac-dashboard":985576,"desktop-tower":983493,"desktop-tower-monitor":985771,details:983494,"dev-to":986478,"developer-board":984727,deviantart:983495,devices:987056,diabetes:987430,dialpad:984604,diameter:986211,"diameter-outline":986212,"diameter-variant":986213,diamond:985994,"diamond-outline":985995,"diamond-stone":983496,"dice-1":983498,"dice-1-outline":987466,"dice-2":983499,"dice-2-outline":987467,"dice-3":983500,"dice-3-outline":987468,"dice-4":983501,"dice-4-outline":987469,"dice-5":983502,"dice-5-outline":987470,"dice-6":983503,"dice-6-outline":987471,"dice-d10":987475,"dice-d10-outline":984943,"dice-d12":987476,"dice-d12-outline":985191,"dice-d20":987477,"dice-d20-outline":984554,"dice-d4":987472,"dice-d4-outline":984555,"dice-d6":987473,"dice-d6-outline":984557,"dice-d8":987474,"dice-d8-outline":984556,"dice-multiple":984942,"dice-multiple-outline":987478,"digital-ocean":987703,"dip-switch":985025,directions:983504,"directions-fork":984641,disc:984558,"disc-alert":983505,"disc-player":985440,discord:984687,dishwasher:985772,"dishwasher-alert":987576,"dishwasher-off":987577,disqus:983506,"distribute-horizontal-center":987593,"distribute-horizontal-left":987592,"distribute-horizontal-right":987594,"distribute-vertical-bottom":987595,"distribute-vertical-center":987596,"distribute-vertical-top":987597,"diving-flippers":986559,"diving-helmet":986560,"diving-scuba":986561,"diving-scuba-flag":986562,"diving-scuba-tank":986563,"diving-scuba-tank-multiple":986564,"diving-snorkel":986565,division:983508,"division-box":983509,dlna:985665,dna:984708,dns:983510,"dns-outline":985996,"do-not-disturb":984728,"do-not-disturb-off":984729,"dock-bottom":987305,"dock-left":987306,"dock-right":987307,"dock-window":987308,docker:985192,doctor:985666,dog:985667,"dog-service":985773,"dog-side":985668,dolby:984755,dolly:986782,domain:983511,"domain-off":986479,"domain-plus":987309,"domain-remove":987310,"dome-light":988190,"domino-mask":987171,donkey:985026,door:985114,"door-closed":985115,"door-closed-lock":987311,"door-open":985116,doorbell:987878,"doorbell-video":985193,"dot-net":985774,"dots-horizontal":983512,"dots-horizontal-circle":985027,"dots-horizontal-circle-outline":985997,"dots-vertical":983513,"dots-vertical-circle":985028,"dots-vertical-circle-outline":985998,douban:984730,download:983514,"download-box":988258,"download-box-outline":988259,"download-circle":988260,"download-circle-outline":988261,"download-lock":987936,"download-lock-outline":987937,"download-multiple":985577,"download-network":984820,"download-network-outline":986214,"download-off":987312,"download-off-outline":987313,"download-outline":985999,drag:983515,"drag-horizontal":983516,"drag-horizontal-variant":987888,"drag-variant":986e3,"drag-vertical":983517,"drag-vertical-variant":987889,"drama-masks":986370,draw:986953,drawing:983518,"drawing-box":983519,dresser:986954,"dresser-outline":986955,drone:983522,dropbox:983523,drupal:983524,duck:983525,dumbbell:983526,"dump-truck":986215,"ear-hearing":985029,"ear-hearing-off":985669,earth:983527,"earth-arrow-right":987921,"earth-box":984781,"earth-box-minus":988167,"earth-box-off":984782,"earth-box-plus":988166,"earth-box-remove":988168,"earth-minus":988164,"earth-off":983528,"earth-plus":988163,"earth-remove":988165,egg:985775,"egg-easter":985776,"egg-off":988144,"egg-off-outline":988145,"egg-outline":988146,"eight-track":985578,eject:983530,"eject-outline":986001,"electric-switch":986783,"electric-switch-closed":987353,"electron-framework":987172,elephant:985030,"elevation-decline":983531,"elevation-rise":983532,elevator:983533,"elevator-down":987842,"elevator-passenger":988033,"elevator-up":987841,ellipse:986784,"ellipse-outline":986785,email:983534,"email-alert":984783,"email-alert-outline":986434,"email-box":986371,"email-check":985777,"email-check-outline":985778,"email-edit":986851,"email-edit-outline":986852,"email-lock":983537,"email-mark-as-unread":986002,"email-minus":986853,"email-minus-outline":986854,"email-multiple":986855,"email-multiple-outline":986856,"email-newsletter":987057,"email-off":988131,"email-off-outline":988132,"email-open":983535,"email-open-multiple":986857,"email-open-multiple-outline":986858,"email-open-outline":984559,"email-outline":983536,"email-plus":985579,"email-plus-outline":985580,"email-receive":987354,"email-receive-outline":987355,"email-search":985441,"email-search-outline":985442,"email-send":987356,"email-send-outline":987357,"email-sync":987847,"email-sync-outline":987848,"email-variant":984560,ember:985904,emby:984756,emoticon:986216,"emoticon-angry":986217,"emoticon-angry-outline":986218,"emoticon-confused":987358,"emoticon-confused-outline":987359,"emoticon-cool":986219,"emoticon-cool-outline":983539,"emoticon-cry":986220,"emoticon-cry-outline":986221,"emoticon-dead":986222,"emoticon-dead-outline":984731,"emoticon-devil":986223,"emoticon-devil-outline":983540,"emoticon-excited":986224,"emoticon-excited-outline":984732,"emoticon-frown":986956,"emoticon-frown-outline":986957,"emoticon-happy":986225,"emoticon-happy-outline":983541,"emoticon-kiss":986226,"emoticon-kiss-outline":986227,"emoticon-lol":987668,"emoticon-lol-outline":987669,"emoticon-neutral":986228,"emoticon-neutral-outline":983542,"emoticon-outline":983538,"emoticon-poop":983543,"emoticon-poop-outline":986229,"emoticon-sad":986230,"emoticon-sad-outline":983544,"emoticon-tongue":983545,"emoticon-tongue-outline":986231,"emoticon-wink":986232,"emoticon-wink-outline":986233,engine:983546,"engine-off":985670,"engine-off-outline":985671,"engine-outline":983547,epsilon:987360,equal:983548,"equal-box":983549,equalizer:986786,"equalizer-outline":986787,eraser:983550,"eraser-variant":984642,escalator:983551,"escalator-box":988057,"escalator-down":987840,"escalator-up":987839,eslint:986234,et:985779,ethereum:985194,ethernet:983552,"ethernet-cable":983553,"ethernet-cable-off":983554,"ev-station":984561,evernote:983556,excavator:987173,exclamation:983557,"exclamation-thick":987704,"exit-run":985672,"exit-to-app":983558,"expand-all":985780,"expand-all-outline":985781,"expansion-card":985262,"expansion-card-variant":987058,exponent:985443,"exponent-box":985444,export:983559,"export-variant":986003,eye:983560,"eye-check":986372,"eye-check-outline":986373,"eye-circle":986004,"eye-circle-outline":986005,"eye-minus":987174,"eye-minus-outline":987175,"eye-off":983561,"eye-off-outline":984785,"eye-outline":984784,"eye-plus":985195,"eye-plus-outline":985196,"eye-settings":985197,"eye-settings-outline":985198,eyedropper:983562,"eyedropper-minus":988125,"eyedropper-off":988127,"eyedropper-plus":988124,"eyedropper-remove":988126,"eyedropper-variant":983563,face:984643,"face-agent":986480,"face-outline":986006,"face-profile":984644,"face-profile-woman":987254,"face-recognition":986235,"face-woman":987255,"face-woman-outline":987256,facebook:983564,"facebook-messenger":983566,"facebook-workplace":985905,factory:983567,fan:983568,"fan-alert":988268,"fan-chevron-down":988269,"fan-chevron-up":988270,"fan-minus":988272,"fan-off":985117,"fan-plus":988271,"fan-remove":988273,"fan-speed-1":988274,"fan-speed-2":988275,"fan-speed-3":988276,"fast-forward":983569,"fast-forward-10":986481,"fast-forward-30":986374,"fast-forward-5":987640,"fast-forward-outline":984786,fax:983570,feather:984787,"feature-search":985673,"feature-search-outline":985674,fedora:985307,fencing:988353,"ferris-wheel":986788,ferry:983571,file:983572,"file-account":984891,"file-account-outline":987176,"file-alert":985675,"file-alert-outline":985676,"file-cabinet":985782,"file-cad":986859,"file-cad-box":986860,"file-cancel":986566,"file-cancel-outline":986567,"file-certificate":987526,"file-certificate-outline":987527,"file-chart":983573,"file-chart-outline":987177,"file-check":983574,"file-check-outline":986665,"file-clock":987873,"file-clock-outline":987874,"file-cloud":983575,"file-cloud-outline":987178,"file-code":983598,"file-code-outline":987179,"file-cog":987259,"file-cog-outline":987260,"file-compare":985258,"file-delimited":983576,"file-delimited-outline":986789,"file-document":983577,"file-document-edit":986568,"file-document-edit-outline":986569,"file-document-outline":985582,"file-download":985445,"file-download-outline":985446,"file-edit":987623,"file-edit-outline":987624,"file-excel":983579,"file-excel-box":983580,"file-excel-box-outline":987180,"file-excel-outline":987181,"file-export":983581,"file-export-outline":987182,"file-eye":986570,"file-eye-outline":986571,"file-find":983582,"file-find-outline":986007,"file-hidden":984595,"file-image":983583,"file-image-outline":986800,"file-import":983584,"file-import-outline":987183,"file-key":987524,"file-key-outline":987525,"file-link":987511,"file-link-outline":987512,"file-lock":983585,"file-lock-outline":987184,"file-move":985785,"file-move-outline":987185,"file-multiple":983586,"file-multiple-outline":987186,"file-music":983587,"file-music-outline":986666,"file-outline":983588,"file-pdf":983589,"file-pdf-box":983590,"file-pdf-box-outline":987059,"file-pdf-outline":986669,"file-percent":985118,"file-percent-outline":987187,"file-phone":987513,"file-phone-outline":987514,"file-plus":984914,"file-plus-outline":986861,"file-powerpoint":983591,"file-powerpoint-box":983592,"file-powerpoint-box-outline":987188,"file-powerpoint-outline":987189,"file-presentation-box":983593,"file-question":985199,"file-question-outline":987190,"file-refresh":985368,"file-refresh-outline":984385,"file-remove":986008,"file-remove-outline":987191,"file-replace":985906,"file-replace-outline":985907,"file-restore":984688,"file-restore-outline":987192,"file-search":986236,"file-search-outline":986237,"file-send":983594,"file-send-outline":987193,"file-settings":987257,"file-settings-outline":987258,"file-star":987194,"file-star-outline":987195,"file-swap":987060,"file-swap-outline":987061,"file-sync":987670,"file-sync-outline":987671,"file-table":986238,"file-table-box":987361,"file-table-box-multiple":987362,"file-table-box-multiple-outline":987363,"file-table-box-outline":987364,"file-table-outline":986239,"file-tree":984645,"file-tree-outline":988114,"file-undo":985308,"file-undo-outline":987196,"file-upload":985677,"file-upload-outline":985678,"file-video":983595,"file-video-outline":986668,"file-word":983596,"file-word-box":983597,"file-word-box-outline":987197,"file-word-outline":987198,film:983599,filmstrip:983600,"filmstrip-box":983858,"filmstrip-box-multiple":986392,"filmstrip-off":983601,filter:983602,"filter-menu":987365,"filter-menu-outline":987366,"filter-minus":986862,"filter-minus-outline":986863,"filter-outline":983603,"filter-plus":986864,"filter-plus-outline":986865,"filter-remove":983604,"filter-remove-outline":983605,"filter-variant":983606,"filter-variant-minus":987410,"filter-variant-plus":987411,"filter-variant-remove":987199,finance:985119,"find-replace":984788,fingerprint:983607,"fingerprint-off":986801,fire:983608,"fire-extinguisher":986866,"fire-hydrant":987447,"fire-hydrant-alert":987448,"fire-hydrant-off":987449,"fire-truck":985259,firebase:985447,firefox:983609,fireplace:986670,"fireplace-off":986671,firework:986672,fish:983610,"fish-off":988147,fishbowl:986867,"fishbowl-outline":986868,"fit-to-page":986869,"fit-to-page-outline":986870,flag:983611,"flag-checkered":983612,"flag-minus":986009,"flag-minus-outline":987314,"flag-outline":983613,"flag-plus":986010,"flag-plus-outline":987315,"flag-remove":986011,"flag-remove-outline":987316,"flag-triangle":983615,"flag-variant":983616,"flag-variant-outline":983614,flare:986482,flash:983617,"flash-alert":986871,"flash-alert-outline":986872,"flash-auto":983618,"flash-circle":985120,"flash-off":983619,"flash-outline":984789,"flash-red-eye":984699,flashlight:983620,"flashlight-off":983621,flask:983187,"flask-empty":983188,"flask-empty-minus":987706,"flask-empty-minus-outline":987707,"flask-empty-off":988148,"flask-empty-off-outline":988149,"flask-empty-outline":983189,"flask-empty-plus":987708,"flask-empty-plus-outline":987709,"flask-empty-remove":987710,"flask-empty-remove-outline":987711,"flask-minus":987712,"flask-minus-outline":987713,"flask-off":988150,"flask-off-outline":988151,"flask-outline":983190,"flask-plus":987714,"flask-plus-outline":987715,"flask-remove":987716,"flask-remove-outline":987717,"flask-round-bottom":987723,"flask-round-bottom-empty":987724,"flask-round-bottom-empty-outline":987725,"flask-round-bottom-outline":987726,"fleur-de-lis":987907,"flip-horizontal":987367,"flip-to-back":983623,"flip-to-front":983624,"flip-vertical":987368,"floor-lamp":985309,"floor-lamp-dual":987200,"floor-lamp-variant":987201,"floor-plan":985121,floppy:983625,"floppy-variant":985583,flower:983626,"flower-outline":985584,"flower-poppy":986376,"flower-tulip":985585,"flower-tulip-outline":985586,"focus-auto":986958,"focus-field":986959,"focus-field-horizontal":986960,"focus-field-vertical":986961,folder:983627,"folder-account":983628,"folder-account-outline":986012,"folder-alert":986572,"folder-alert-outline":986573,"folder-clock":985786,"folder-clock-outline":985787,"folder-cog":987263,"folder-cog-outline":987264,"folder-download":983629,"folder-download-outline":987369,"folder-edit":985310,"folder-edit-outline":986574,"folder-google-drive":983630,"folder-heart":987370,"folder-heart-outline":987371,"folder-home":987317,"folder-home-outline":987318,"folder-image":983631,"folder-information":987319,"folder-information-outline":987320,"folder-key":985260,"folder-key-network":985261,"folder-key-network-outline":986240,"folder-key-outline":987372,"folder-lock":983632,"folder-lock-open":983633,"folder-marker":987757,"folder-marker-outline":987758,"folder-move":983634,"folder-move-outline":987718,"folder-multiple":983635,"folder-multiple-image":983636,"folder-multiple-outline":983637,"folder-multiple-plus":988286,"folder-multiple-plus-outline":988287,"folder-music":987993,"folder-music-outline":987994,"folder-network":985200,"folder-network-outline":986241,"folder-open":984944,"folder-open-outline":986575,"folder-outline":983638,"folder-plus":983639,"folder-plus-outline":986013,"folder-pound":986377,"folder-pound-outline":986378,"folder-refresh":984905,"folder-refresh-outline":984386,"folder-remove":983640,"folder-remove-outline":986014,"folder-search":985448,"folder-search-outline":985449,"folder-settings":987261,"folder-settings-outline":987262,"folder-star":984733,"folder-star-multiple":988115,"folder-star-multiple-outline":988116,"folder-star-outline":986015,"folder-swap":987062,"folder-swap-outline":987063,"folder-sync":986379,"folder-sync-outline":986380,"folder-table":987875,"folder-table-outline":987876,"folder-text":986242,"folder-text-outline":986243,"folder-upload":983641,"folder-upload-outline":987373,"folder-zip":984811,"folder-zip-outline":985017,"font-awesome":983098,food:983642,"food-apple":983643,"food-apple-outline":986244,"food-croissant":985032,"food-drumstick":988191,"food-drumstick-off":988264,"food-drumstick-off-outline":988265,"food-drumstick-outline":988192,"food-fork-drink":984562,"food-off":984563,"food-steak":988266,"food-steak-off":988267,"food-variant":983644,"food-variant-off":988133,"foot-print":986962,football:983645,"football-australian":983646,"football-helmet":983647,forklift:985033,"form-dropdown":988160,"form-select":988161,"form-textarea":987285,"form-textbox":984590,"form-textbox-lock":987997,"form-textbox-password":985077,"format-align-bottom":984915,"format-align-center":983648,"format-align-justify":983649,"format-align-left":983650,"format-align-middle":984916,"format-align-right":983651,"format-align-top":984917,"format-annotation-minus":985788,"format-annotation-plus":984646,"format-bold":983652,"format-clear":983653,"format-color-fill":983654,"format-color-highlight":986673,"format-color-marker-cancel":987923,"format-color-text":984734,"format-columns":985311,"format-float-center":983655,"format-float-left":983656,"format-float-none":983657,"format-float-right":983658,"format-font":984790,"format-font-size-decrease":985587,"format-font-size-increase":985588,"format-header-1":983659,"format-header-2":983660,"format-header-3":983661,"format-header-4":983662,"format-header-5":983663,"format-header-6":983664,"format-header-decrease":983665,"format-header-equal":983666,"format-header-increase":983667,"format-header-pound":983668,"format-horizontal-align-center":984606,"format-horizontal-align-left":984607,"format-horizontal-align-right":984608,"format-indent-decrease":983669,"format-indent-increase":983670,"format-italic":983671,"format-letter-case":985908,"format-letter-case-lower":985909,"format-letter-case-upper":985910,"format-letter-ends-with":987064,"format-letter-matches":987065,"format-letter-starts-with":987066,"format-line-spacing":983672,"format-line-style":984520,"format-line-weight":984521,"format-list-bulleted":983673,"format-list-bulleted-square":986576,"format-list-bulleted-triangle":986802,"format-list-bulleted-type":983674,"format-list-checkbox":985450,"format-list-checks":984918,"format-list-numbered":983675,"format-list-numbered-rtl":986381,"format-list-text":987759,"format-overline":986803,"format-page-break":984791,"format-paint":983676,"format-paragraph":983677,"format-pilcrow":984792,"format-quote-close":983678,"format-quote-close-outline":987560,"format-quote-open":984919,"format-quote-open-outline":987559,"format-rotate-90":984746,"format-section":984735,"format-size":983679,"format-strikethrough":983680,"format-strikethrough-variant":983681,"format-subscript":983682,"format-superscript":983683,"format-text":983684,"format-text-rotation-angle-down":987067,"format-text-rotation-angle-up":987068,"format-text-rotation-down":986483,"format-text-rotation-down-vertical":987069,"format-text-rotation-none":986484,"format-text-rotation-up":987070,"format-text-rotation-vertical":987071,"format-text-variant":986674,"format-text-wrapping-clip":986382,"format-text-wrapping-overflow":986383,"format-text-wrapping-wrap":986384,"format-textbox":986385,"format-textdirection-l-to-r":983685,"format-textdirection-r-to-l":983686,"format-title":984564,"format-underline":983687,"format-vertical-align-bottom":984609,"format-vertical-align-center":984610,"format-vertical-align-top":984611,"format-wrap-inline":983688,"format-wrap-square":983689,"format-wrap-tight":983690,"format-wrap-top-bottom":983691,forum:983692,"forum-outline":985122,forward:983693,forwardburger:986485,fountain:985451,"fountain-pen":986386,"fountain-pen-tip":986387,freebsd:985312,"frequently-asked-questions":986804,fridge:983696,"fridge-alert":987569,"fridge-alert-outline":987570,"fridge-bottom":983698,"fridge-off":987567,"fridge-off-outline":987568,"fridge-outline":983695,"fridge-top":983697,"fruit-cherries":987202,"fruit-cherries-off":988152,"fruit-citrus":987203,"fruit-citrus-off":988153,"fruit-grapes":987204,"fruit-grapes-outline":987205,"fruit-pineapple":987206,"fruit-watermelon":987207,fuel:985034,fullscreen:983699,"fullscreen-exit":983700,function:983701,"function-variant":985201,"furigana-horizontal":987265,"furigana-vertical":987266,fuse:986245,"fuse-alert":988205,"fuse-blade":986246,"fuse-off":988204,gamepad:983702,"gamepad-circle":986675,"gamepad-circle-down":986676,"gamepad-circle-left":986677,"gamepad-circle-outline":986678,"gamepad-circle-right":986679,"gamepad-circle-up":986680,"gamepad-down":986681,"gamepad-left":986682,"gamepad-right":986683,"gamepad-round":986684,"gamepad-round-down":986685,"gamepad-round-left":986686,"gamepad-round-outline":986687,"gamepad-round-right":986688,"gamepad-round-up":986689,"gamepad-square":986805,"gamepad-square-outline":986806,"gamepad-up":986690,"gamepad-variant":983703,"gamepad-variant-outline":986807,gamma:987374,"gantry-crane":986577,garage:984793,"garage-alert":985202,"garage-alert-variant":987861,"garage-open":984794,"garage-open-variant":987860,"garage-variant":987859,"gas-cylinder":984647,"gas-station":983704,"gas-station-off":988169,"gas-station-off-outline":988170,"gas-station-outline":986808,gate:983705,"gate-and":985313,"gate-arrow-right":987497,"gate-nand":985314,"gate-nor":985315,"gate-not":985316,"gate-open":987498,"gate-or":985317,"gate-xnor":985318,"gate-xor":985319,gatsby:986691,gauge:983706,"gauge-empty":985203,"gauge-full":985204,"gauge-low":985205,gavel:983707,"gender-female":983708,"gender-male":983709,"gender-male-female":983710,"gender-male-female-variant":987455,"gender-non-binary":987456,"gender-transgender":983711,gentoo:985320,gesture:985035,"gesture-double-tap":984892,"gesture-pinch":985789,"gesture-spread":985790,"gesture-swipe":986486,"gesture-swipe-down":984893,"gesture-swipe-horizontal":985791,"gesture-swipe-left":984894,"gesture-swipe-right":984895,"gesture-swipe-up":984896,"gesture-swipe-vertical":985792,"gesture-tap":984897,"gesture-tap-box":987817,"gesture-tap-button":987816,"gesture-tap-hold":986487,"gesture-two-double-tap":984898,"gesture-two-tap":984899,ghost:983712,"ghost-off":985589,gif:986488,gift:986692,"gift-outline":983713,git:983714,github:983716,gitlab:986016,"glass-cocktail":983894,"glass-flute":983717,"glass-mug":983718,"glass-mug-variant":987414,"glass-pint-outline":987917,"glass-stange":983719,"glass-tulip":983720,"glass-wine":985206,glasses:983722,"globe-light":987863,"globe-model":985321,gmail:983723,gnome:983724,"go-kart":986489,"go-kart-track":986490,gog:986017,gold:987727,golf:985123,"golf-cart":987556,"golf-tee":987267,gondola:984710,goodreads:986491,google:983725,"google-ads":986247,"google-analytics":985036,"google-assistant":985037,"google-cardboard":983726,"google-chrome":983727,"google-circles":983728,"google-circles-communities":983729,"google-circles-extended":983730,"google-circles-group":983731,"google-classroom":983744,"google-cloud":987638,"google-controller":983732,"google-controller-off":983733,"google-downasaur":988002,"google-drive":983734,"google-earth":983735,"google-fit":985452,"google-glass":983736,"google-hangouts":983753,"google-home":985124,"google-keep":984796,"google-lens":985590,"google-maps":984565,"google-my-business":987208,"google-nearby":983737,"google-photos":984797,"google-play":983740,"google-plus":983741,"google-podcast":986809,"google-spreadsheet":985591,"google-street-view":986248,"google-translate":983743,gradient:984736,grain:986492,graph:987209,"graph-outline":987210,graphql:985207,"grave-stone":986018,"grease-pencil":984648,"greater-than":985453,"greater-than-or-equal":985454,grid:983745,"grid-large":984920,"grid-off":983746,grill:986693,"grill-outline":987530,group:983747,"guitar-acoustic":984945,"guitar-electric":983748,"guitar-pick":983749,"guitar-pick-outline":983750,"guy-fawkes-mask":985125,hail:985793,"hair-dryer":987375,"hair-dryer-outline":987376,halloween:986019,hamburger:984709,hammer:985322,"hammer-screwdriver":987938,"hammer-wrench":987939,hand:985679,"hand-heart":987377,"hand-left":986694,"hand-okay":985680,"hand-peace":985681,"hand-peace-variant":985682,"hand-pointing-down":985683,"hand-pointing-left":985684,"hand-pointing-right":983751,"hand-pointing-up":985685,"hand-right":986695,"hand-saw":986696,"hand-water":988063,handball:986963,handcuffs:987454,handshake:987672,hanger:983752,"hard-hat":985455,harddisk:983754,"harddisk-plus":987211,"harddisk-remove":987212,"hat-fedora":986020,"hazard-lights":986249,hdr:986493,"hdr-off":986494,head:987998,"head-alert":987960,"head-alert-outline":987961,"head-check":987962,"head-check-outline":987963,"head-cog":987964,"head-cog-outline":987965,"head-dots-horizontal":987966,"head-dots-horizontal-outline":987967,"head-flash":987968,"head-flash-outline":987969,"head-heart":987970,"head-heart-outline":987971,"head-lightbulb":987972,"head-lightbulb-outline":987973,"head-minus":987974,"head-minus-outline":987975,"head-outline":987999,"head-plus":987976,"head-plus-outline":987977,"head-question":987978,"head-question-outline":987979,"head-remove":987980,"head-remove-outline":987981,"head-snowflake":987982,"head-snowflake-outline":987983,"head-sync":987984,"head-sync-outline":987985,headphones:983755,"headphones-bluetooth":985456,"headphones-box":983756,"headphones-off":985038,"headphones-settings":983757,headset:983758,"headset-dock":983759,"headset-off":983760,heart:983761,"heart-box":983762,"heart-box-outline":983763,"heart-broken":983764,"heart-broken-outline":986388,"heart-circle":985457,"heart-circle-outline":985458,"heart-flash":986873,"heart-half":984799,"heart-half-full":984798,"heart-half-outline":984800,"heart-minus":988207,"heart-minus-outline":988210,"heart-multiple":985686,"heart-multiple-outline":985687,"heart-off":984921,"heart-off-outline":988212,"heart-outline":983765,"heart-plus":988206,"heart-plus-outline":988209,"heart-pulse":984566,"heart-remove":988208,"heart-remove-outline":988211,helicopter:985794,help:983766,"help-box":984971,"help-circle":983767,"help-circle-outline":984613,"help-network":984821,"help-network-outline":986250,"help-rhombus":986021,"help-rhombus-outline":986022,hexadecimal:987815,hexagon:983768,"hexagon-multiple":984801,"hexagon-multiple-outline":987378,"hexagon-outline":983769,"hexagon-slice-1":985795,"hexagon-slice-2":985796,"hexagon-slice-3":985797,"hexagon-slice-4":985798,"hexagon-slice-5":985799,"hexagon-slice-6":985800,hexagram:985801,"hexagram-outline":985802,"high-definition":985039,"high-definition-box":985208,highway:984567,hiking:986495,hinduism:985459,history:983770,"hockey-puck":985209,"hockey-sticks":985210,hololens:983771,home:983772,"home-account":985126,"home-alert":985211,"home-analytics":986810,"home-assistant":985040,"home-automation":985041,"home-circle":985042,"home-circle-outline":987213,"home-city":986389,"home-city-outline":986390,"home-currency-usd":985263,"home-edit":987481,"home-edit-outline":987482,"home-export-outline":987035,"home-flood":986874,"home-floor-0":986578,"home-floor-1":986496,"home-floor-2":986497,"home-floor-3":986498,"home-floor-a":986499,"home-floor-b":986500,"home-floor-g":986501,"home-floor-l":986502,"home-floor-negative-1":986579,"home-group":986580,"home-heart":985127,"home-import-outline":987036,"home-lightbulb":987729,"home-lightbulb-outline":987730,"home-lock":985323,"home-lock-open":985324,"home-map-marker":984568,"home-minus":985460,"home-minus-outline":988117,"home-modern":983773,"home-outline":984737,"home-plus":985461,"home-plus-outline":988118,"home-remove":987719,"home-remove-outline":988119,"home-roof":987435,"home-search":988080,"home-search-outline":988081,"home-thermometer":986964,"home-thermometer-outline":986965,"home-variant":983774,"home-variant-outline":986023,hook:984802,"hook-off":984803,hops:983775,"horizontal-rotate-clockwise":987379,"horizontal-rotate-counterclockwise":987380,horseshoe:985688,hospital:987126,"hospital-box":983776,"hospital-box-outline":987127,"hospital-building":983777,"hospital-marker":983778,"hot-tub":985128,"hours-24":988280,hubspot:986391,hulu:985129,human:983782,"human-baby-changing-table":988043,"human-child":983783,"human-female":984649,"human-female-boy":985689,"human-female-female":985690,"human-female-girl":985691,"human-greeting":984650,"human-handsdown":984651,"human-handsup":984652,"human-male":984653,"human-male-boy":985692,"human-male-child":988044,"human-male-female":983784,"human-male-girl":985693,"human-male-height":986875,"human-male-height-variant":986876,"human-male-male":985694,"human-pregnant":984527,"human-wheelchair":988045,"humble-bundle":984900,hvac:987986,"hydraulic-oil-level":987940,"hydraulic-oil-temperature":987941,"hydro-power":987877,"ice-cream":985130,"ice-cream-off":986706,"ice-pop":986877,"id-card":987072,identifier:986878,"ideogram-cjk":987953,"ideogram-cjk-variant":987954,iframe:986251,"iframe-array":987381,"iframe-array-outline":987382,"iframe-braces":987383,"iframe-braces-outline":987384,"iframe-outline":986252,"iframe-parentheses":987385,"iframe-parentheses-outline":987386,"iframe-variable":987387,"iframe-variable-outline":987388,image:983785,"image-album":983786,"image-area":983787,"image-area-close":983788,"image-auto-adjust":987073,"image-broken":983789,"image-broken-variant":983790,"image-edit":987619,"image-edit-outline":987620,"image-filter-black-white":983792,"image-filter-center-focus":983793,"image-filter-center-focus-strong":986879,"image-filter-center-focus-strong-outline":986880,"image-filter-center-focus-weak":983794,"image-filter-drama":983795,"image-filter-frames":983796,"image-filter-hdr":983797,"image-filter-none":983798,"image-filter-tilt-shift":983799,"image-filter-vintage":983800,"image-frame":986697,"image-minus":988185,"image-move":985592,"image-multiple":983801,"image-multiple-outline":983791,"image-off":985131,"image-off-outline":987601,"image-outline":985462,"image-plus":985212,"image-remove":988184,"image-search":985463,"image-search-outline":985464,"image-size-select-actual":986253,"image-size-select-large":986254,"image-size-select-small":986255,import:983802,inbox:984711,"inbox-arrow-down":983803,"inbox-arrow-down-outline":987760,"inbox-arrow-up":984017,"inbox-arrow-up-outline":987761,"inbox-full":987762,"inbox-full-outline":987763,"inbox-multiple":985264,"inbox-multiple-outline":986024,"inbox-outline":987764,incognito:984569,"incognito-circle":988193,"incognito-circle-off":988194,"incognito-off":983157,infinity:984804,information:983804,"information-outline":983805,"information-variant":984654,instagram:983806,"instrument-triangle":987214,"invert-colors":983809,"invert-colors-off":986698,iobroker:987880,ip:985695,"ip-network":985696,"ip-network-outline":986256,ipod:986257,islam:985465,island:987215,"iv-bag":987321,jabber:986581,jeepney:983810,jellyfish:986881,"jellyfish-outline":986882,jira:983811,jquery:985213,jsfiddle:983812,judaism:985466,"jump-rope":987903,kabaddi:986503,karate:985132,keg:983813,kettle:984570,"kettle-alert":987927,"kettle-alert-outline":987928,"kettle-off":987931,"kettle-off-outline":987932,"kettle-outline":986966,"kettle-steam":987929,"kettle-steam-outline":987930,kettlebell:987904,key:983814,"key-arrow-right":987922,"key-change":983815,"key-link":987551,"key-minus":983816,"key-outline":986582,"key-plus":983817,"key-remove":983818,"key-star":987550,"key-variant":983819,"key-wireless":987074,keyboard:983820,"keyboard-backspace":983821,"keyboard-caps":983822,"keyboard-close":983823,"keyboard-esc":987831,"keyboard-f1":987819,"keyboard-f10":987828,"keyboard-f11":987829,"keyboard-f12":987830,"keyboard-f2":987820,"keyboard-f3":987821,"keyboard-f4":987822,"keyboard-f5":987823,"keyboard-f6":987824,"keyboard-f7":987825,"keyboard-f8":987826,"keyboard-f9":987827,"keyboard-off":983824,"keyboard-off-outline":986699,"keyboard-outline":985467,"keyboard-return":983825,"keyboard-settings":985593,"keyboard-settings-outline":985594,"keyboard-space":987216,"keyboard-tab":983826,"keyboard-variant":983827,khanda:987389,kickstarter:984901,klingon:987995,knife:985595,"knife-military":985596,kodi:983828,kubernetes:987390,label:983829,"label-multiple":988021,"label-multiple-outline":988022,"label-off":985803,"label-off-outline":985804,"label-outline":983830,"label-percent":987882,"label-percent-outline":987883,"label-variant":985805,"label-variant-outline":985806,ladybug:985133,lambda:984615,lamp:984757,lan:983831,"lan-check":987818,"lan-connect":983832,"lan-disconnect":983833,"lan-pending":983834,"language-c":984689,"language-cpp":984690,"language-csharp":983835,"language-css3":983836,"language-fortran":987674,"language-go":985043,"language-haskell":986258,"language-html5":983837,"language-java":985911,"language-javascript":983838,"language-kotlin":987673,"language-lua":985265,"language-markdown":983892,"language-markdown-outline":986971,"language-php":983839,"language-python":983840,"language-r":985044,"language-ruby":986413,"language-ruby-on-rails":985807,"language-swift":984805,"language-typescript":984806,"language-xaml":984691,laptop:983842,"laptop-chromebook":983843,"laptop-mac":983844,"laptop-off":984807,"laptop-windows":983845,laravel:985808,"laser-pointer":988292,lasso:986883,lastpass:984134,latitude:986967,launch:983847,"lava-lamp":985045,layers:983848,"layers-minus":986700,"layers-off":983849,"layers-off-outline":985597,"layers-outline":985598,"layers-plus":986701,"layers-remove":986702,"layers-search":987654,"layers-search-outline":987655,"layers-triple":986968,"layers-triple-outline":986969,"lead-pencil":984655,leaf:983850,"leaf-maple":986259,"leaf-maple-off":987866,"leaf-off":987865,leak:986583,"leak-off":986584,"led-off":983851,"led-on":983852,"led-outline":983853,"led-strip":985046,"led-strip-variant":987217,"led-variant-off":983854,"led-variant-on":983855,"led-variant-outline":983856,leek:987517,"less-than":985468,"less-than-or-equal":985469,library:983857,"library-shelves":986025,license:987075,lifebuoy:985214,"light-switch":985470,lightbulb:983861,"lightbulb-cfl":987656,"lightbulb-cfl-off":987657,"lightbulb-cfl-spiral":987765,"lightbulb-cfl-spiral-off":987843,"lightbulb-group":987731,"lightbulb-group-off":987853,"lightbulb-group-off-outline":987854,"lightbulb-group-outline":987732,"lightbulb-multiple":987733,"lightbulb-multiple-off":987855,"lightbulb-multiple-off-outline":987856,"lightbulb-multiple-outline":987734,"lightbulb-off":986703,"lightbulb-off-outline":986704,"lightbulb-on":984808,"lightbulb-on-outline":984809,"lightbulb-outline":983862,lighthouse:985599,"lighthouse-on":985600,"lightning-bolt":988171,"lightning-bolt-outline":988172,lingerie:988278,link:983863,"link-box":986394,"link-box-outline":986395,"link-box-variant":986396,"link-box-variant-outline":986397,"link-lock":987322,"link-off":983864,"link-plus":986260,"link-variant":983865,"link-variant-minus":987391,"link-variant-off":983866,"link-variant-plus":987392,"link-variant-remove":987393,linkedin:983867,linux:983869,"linux-mint":985325,lipstick:988085,litecoin:985697,loading:984946,"location-enter":987076,"location-exit":987077,lock:983870,"lock-alert":985326,"lock-check":988058,"lock-clock":985471,"lock-open":983871,"lock-open-alert":988059,"lock-open-check":988060,"lock-open-outline":983872,"lock-open-variant":987078,"lock-open-variant-outline":987079,"lock-outline":983873,"lock-pattern":984810,"lock-plus":984571,"lock-question":985327,"lock-reset":984947,"lock-smart":985266,locker:985047,"locker-multiple":985048,login:983874,"login-variant":984572,logout:983875,"logout-variant":984573,longitude:986970,looks:983876,loupe:983877,lumx:983878,lungs:987268,magnet:983879,"magnet-on":983880,magnify:983881,"magnify-close":985472,"magnify-minus":983882,"magnify-minus-cursor":985698,"magnify-minus-outline":984812,"magnify-plus":983883,"magnify-plus-cursor":985699,"magnify-plus-outline":984813,"magnify-remove-cursor":987660,"magnify-remove-outline":987661,"magnify-scan":987766,mail:986811,mailbox:984814,"mailbox-open":986504,"mailbox-open-outline":986505,"mailbox-open-up":986506,"mailbox-open-up-outline":986507,"mailbox-outline":986508,"mailbox-up":986509,"mailbox-up-outline":986510,map:983885,"map-check":986812,"map-check-outline":986813,"map-clock":986398,"map-clock-outline":986399,"map-legend":985601,"map-marker":983886,"map-marker-alert":986885,"map-marker-alert-outline":986886,"map-marker-check":986261,"map-marker-check-outline":987899,"map-marker-circle":983887,"map-marker-distance":985328,"map-marker-down":987394,"map-marker-left":987867,"map-marker-left-outline":987869,"map-marker-minus":984656,"map-marker-minus-outline":987897,"map-marker-multiple":983888,"map-marker-multiple-outline":987767,"map-marker-off":983889,"map-marker-off-outline":987901,"map-marker-outline":985049,"map-marker-path":986400,"map-marker-plus":984657,"map-marker-plus-outline":987896,"map-marker-question":986887,"map-marker-question-outline":986888,"map-marker-radius":983890,"map-marker-radius-outline":987900,"map-marker-remove":986889,"map-marker-remove-outline":987898,"map-marker-remove-variant":986890,"map-marker-right":987868,"map-marker-right-outline":987870,"map-marker-up":987395,"map-minus":985473,"map-outline":985474,"map-plus":985475,"map-search":985476,"map-search-outline":985477,mapbox:986026,margin:983891,marker:984658,"marker-cancel":986585,"marker-check":983893,mastodon:985809,"material-design":985478,"material-ui":983895,"math-compass":983896,"math-cos":986262,"math-integral":987080,"math-integral-box":987081,"math-log":987269,"math-norm":987082,"math-norm-box":987083,"math-sin":986263,"math-tan":986264,matrix:984616,medal:985479,"medal-outline":987942,"medical-bag":984815,meditation:987515,memory:983899,menu:983900,"menu-down":983901,"menu-down-outline":984758,"menu-left":983902,"menu-left-outline":985602,"menu-open":986027,"menu-right":983903,"menu-right-outline":985603,"menu-swap":985700,"menu-swap-outline":985701,"menu-up":983904,"menu-up-outline":984759,merge:986972,message:983905,"message-alert":983906,"message-alert-outline":985604,"message-arrow-left":987890,"message-arrow-left-outline":987891,"message-arrow-right":987892,"message-arrow-right-outline":987893,"message-bulleted":984738,"message-bulleted-off":984739,"message-cog":984817,"message-cog-outline":987506,"message-draw":983907,"message-image":983908,"message-image-outline":987500,"message-lock":987084,"message-lock-outline":987501,"message-minus":987502,"message-minus-outline":987503,"message-outline":983909,"message-plus":984659,"message-plus-outline":987323,"message-processing":983910,"message-processing-outline":987504,"message-reply":983911,"message-reply-text":983912,"message-settings":984816,"message-settings-outline":987505,"message-text":983913,"message-text-clock":987507,"message-text-clock-outline":987508,"message-text-lock":987085,"message-text-lock-outline":987509,"message-text-outline":983914,"message-video":983915,meteor:984617,metronome:985050,"metronome-tick":985051,"micro-sd":985052,microphone:983916,"microphone-minus":985267,"microphone-off":983917,"microphone-outline":983918,"microphone-plus":985268,"microphone-settings":983919,"microphone-variant":983920,"microphone-variant-off":983921,microscope:984660,microsoft:983922,"microsoft-access":988046,"microsoft-azure":985093,"microsoft-azure-devops":987093,"microsoft-bing":983204,"microsoft-dynamics-365":985480,"microsoft-edge":983529,"microsoft-edge-legacy":987728,"microsoft-excel":988047,"microsoft-internet-explorer":983808,"microsoft-office":984006,"microsoft-onedrive":984010,"microsoft-onenote":984903,"microsoft-outlook":986402,"microsoft-powerpoint":988048,"microsoft-sharepoint":988049,"microsoft-teams":983739,"microsoft-visual-studio":984592,"microsoft-visual-studio-code":985630,"microsoft-windows":984499,"microsoft-windows-classic":985633,"microsoft-word":988050,"microsoft-xbox":984505,"microsoft-xbox-controller":984506,"microsoft-xbox-controller-battery-alert":984907,"microsoft-xbox-controller-battery-charging":985634,"microsoft-xbox-controller-battery-empty":984908,"microsoft-xbox-controller-battery-full":984909,"microsoft-xbox-controller-battery-low":984910,"microsoft-xbox-controller-battery-medium":984911,"microsoft-xbox-controller-battery-unknown":984912,"microsoft-xbox-controller-menu":986735,"microsoft-xbox-controller-off":984507,"microsoft-xbox-controller-view":986736,"microsoft-yammer":984969,microwave:986265,"microwave-off":988195,middleware:986973,"middleware-outline":986974,midi:985329,"midi-port":985330,mine:986586,minecraft:983923,"mini-sd":985605,minidisc:985606,minus:983924,"minus-box":983925,"minus-box-multiple":987457,"minus-box-multiple-outline":987458,"minus-box-outline":984818,"minus-circle":983926,"minus-circle-multiple":983898,"minus-circle-multiple-outline":985811,"minus-circle-off":988249,"minus-circle-off-outline":988250,"minus-circle-outline":983927,"minus-network":983928,"minus-network-outline":986266,mirror:987645,"mixed-martial-arts":986511,"mixed-reality":985215,mixer:985053,molecule:986028,"molecule-co":987902,"molecule-co2":985060,monitor:983929,"monitor-cellphone":985481,"monitor-cellphone-star":985482,"monitor-clean":987396,"monitor-dashboard":985607,"monitor-edit":987846,"monitor-eye":988084,"monitor-lock":986587,"monitor-multiple":983930,"monitor-off":986512,"monitor-screenshot":986705,"monitor-share":988291,"monitor-speaker":986975,"monitor-speaker-off":986976,"monitor-star":986588,"moon-first-quarter":986977,"moon-full":986978,"moon-last-quarter":986979,"moon-new":986980,"moon-waning-crescent":986981,"moon-waning-gibbous":986982,"moon-waxing-crescent":986983,"moon-waxing-gibbous":986984,moped:987270,more:983931,"mother-heart":987924,"mother-nurse":986401,"motion-sensor":986513,"motion-sensor-off":988213,motorbike:983932,mouse:983933,"mouse-bluetooth":985483,"mouse-off":983934,"mouse-variant":983935,"mouse-variant-off":983936,"move-resize":984661,"move-resize-variant":984662,movie:983937,"movie-edit":987426,"movie-edit-outline":987427,"movie-filter":987428,"movie-filter-outline":987429,"movie-open":987086,"movie-open-outline":987087,"movie-outline":986589,"movie-roll":985054,"movie-search":987602,"movie-search-outline":987603,muffin:985484,multiplication:983938,"multiplication-box":983939,mushroom:985055,"mushroom-off":988154,"mushroom-off-outline":988155,"mushroom-outline":985056,music:984922,"music-accidental-double-flat":986985,"music-accidental-double-sharp":986986,"music-accidental-flat":986987,"music-accidental-natural":986988,"music-accidental-sharp":986989,"music-box":983940,"music-box-multiple":983859,"music-box-multiple-outline":986884,"music-box-outline":983941,"music-circle":983942,"music-circle-outline":985812,"music-clef-alto":986990,"music-clef-bass":986991,"music-clef-treble":986992,"music-note":983943,"music-note-bluetooth":984574,"music-note-bluetooth-off":984575,"music-note-eighth":983944,"music-note-eighth-dotted":986993,"music-note-half":983945,"music-note-half-dotted":986994,"music-note-off":983946,"music-note-off-outline":986995,"music-note-outline":986996,"music-note-plus":986590,"music-note-quarter":983947,"music-note-quarter-dotted":986997,"music-note-sixteenth":983948,"music-note-sixteenth-dotted":986998,"music-note-whole":983949,"music-note-whole-dotted":986999,"music-off":984923,"music-rest-eighth":987e3,"music-rest-half":987001,"music-rest-quarter":987002,"music-rest-sixteenth":987003,"music-rest-whole":987004,nail:986591,nas:985331,nativescript:985216,nature:983950,"nature-people":983951,navigation:983952,"near-me":984525,necklace:986891,needle:983953,netflix:984902,network:984819,"network-off":986267,"network-off-outline":986268,"network-outline":986269,"network-strength-1":985332,"network-strength-1-alert":985333,"network-strength-2":985334,"network-strength-2-alert":985335,"network-strength-3":985336,"network-strength-3-alert":985337,"network-strength-4":985338,"network-strength-4-alert":985339,"network-strength-off":985340,"network-strength-off-outline":985341,"network-strength-outline":985342,"new-box":983956,newspaper:983957,"newspaper-minus":986892,"newspaper-plus":986893,"newspaper-variant":987137,"newspaper-variant-multiple":987138,"newspaper-variant-multiple-outline":987139,"newspaper-variant-outline":987140,nfc:983958,"nfc-search-variant":986707,"nfc-tap":983959,"nfc-variant":983960,"nfc-variant-off":986708,ninja:984948,"nintendo-game-boy":988051,"nintendo-switch":985057,"nintendo-wii":984491,"nintendo-wiiu":984877,nix:987397,nodejs:983961,noodles:987518,"not-equal":985485,"not-equal-variant":985486,note:983962,"note-multiple":984760,"note-multiple-outline":984761,"note-outline":983963,"note-plus":983964,"note-plus-outline":983965,"note-text":983966,"note-text-outline":987607,notebook:985134,"notebook-multiple":986709,"notebook-outline":986815,"notification-clear-all":983967,npm:984823,nuke:984740,null:985058,numeric:983968,"numeric-0":985913,"numeric-0-box":983969,"numeric-0-box-multiple":986894,"numeric-0-box-multiple-outline":983970,"numeric-0-box-outline":983971,"numeric-0-circle":986270,"numeric-0-circle-outline":986271,"numeric-1":985914,"numeric-1-box":983972,"numeric-1-box-multiple":986895,"numeric-1-box-multiple-outline":983973,"numeric-1-box-outline":983974,"numeric-1-circle":986272,"numeric-1-circle-outline":986273,"numeric-10":987113,"numeric-10-box":987005,"numeric-10-box-multiple":987114,"numeric-10-box-multiple-outline":987115,"numeric-10-box-outline":987006,"numeric-10-circle":987116,"numeric-10-circle-outline":987117,"numeric-2":985915,"numeric-2-box":983975,"numeric-2-box-multiple":986896,"numeric-2-box-multiple-outline":983976,"numeric-2-box-outline":983977,"numeric-2-circle":986274,"numeric-2-circle-outline":986275,"numeric-3":985916,"numeric-3-box":983978,"numeric-3-box-multiple":986897,"numeric-3-box-multiple-outline":983979,"numeric-3-box-outline":983980,"numeric-3-circle":986276,"numeric-3-circle-outline":986277,"numeric-4":985917,"numeric-4-box":983981,"numeric-4-box-multiple":986898,"numeric-4-box-multiple-outline":983986,"numeric-4-box-outline":983982,"numeric-4-circle":986278,"numeric-4-circle-outline":986279,"numeric-5":985918,"numeric-5-box":983985,"numeric-5-box-multiple":986899,"numeric-5-box-multiple-outline":983983,"numeric-5-box-outline":983984,"numeric-5-circle":986280,"numeric-5-circle-outline":986281,"numeric-6":985919,"numeric-6-box":983987,"numeric-6-box-multiple":986900,"numeric-6-box-multiple-outline":983988,"numeric-6-box-outline":983989,"numeric-6-circle":986282,"numeric-6-circle-outline":986283,"numeric-7":985920,"numeric-7-box":983990,"numeric-7-box-multiple":986901,"numeric-7-box-multiple-outline":983991,"numeric-7-box-outline":983992,"numeric-7-circle":986284,"numeric-7-circle-outline":986285,"numeric-8":985921,"numeric-8-box":983993,"numeric-8-box-multiple":986902,"numeric-8-box-multiple-outline":983994,"numeric-8-box-outline":983995,"numeric-8-circle":986286,"numeric-8-circle-outline":986287,"numeric-9":985922,"numeric-9-box":983996,"numeric-9-box-multiple":986903,"numeric-9-box-multiple-outline":983997,"numeric-9-box-outline":983998,"numeric-9-circle":986288,"numeric-9-circle-outline":986289,"numeric-9-plus":987118,"numeric-9-plus-box":983999,"numeric-9-plus-box-multiple":986904,"numeric-9-plus-box-multiple-outline":984e3,"numeric-9-plus-box-outline":984001,"numeric-9-plus-circle":986290,"numeric-9-plus-circle-outline":986291,"numeric-negative-1":987218,nut:984824,nutrition:984002,nuxt:987398,oar:984700,ocarina:986592,oci:987881,ocr:987450,octagon:984003,"octagon-outline":984004,octagram:984825,"octagram-outline":984949,odnoklassniki:984005,offer:987675,"office-building":985489,oil:984007,"oil-lamp":986905,"oil-level":987219,"oil-temperature":987128,omega:984009,"one-up":986029,onepassword:985217,opacity:984524,"open-in-app":984011,"open-in-new":984012,"open-source-initiative":986030,openid:984013,opera:984014,orbit:983064,"order-alphabetical-ascending":983565,"order-alphabetical-descending":986375,"order-bool-ascending":983742,"order-bool-ascending-variant":985487,"order-bool-descending":988036,"order-bool-descending-variant":985488,"order-numeric-ascending":984389,"order-numeric-descending":984390,origin:985923,ornament:984015,"ornament-variant":984016,"outdoor-lamp":987220,overscan:987141,owl:984018,"pac-man":986031,package:984019,"package-down":984020,"package-up":984021,"package-variant":984022,"package-variant-closed":984023,"page-first":984576,"page-last":984577,"page-layout-body":984826,"page-layout-footer":984827,"page-layout-header":984828,"page-layout-header-footer":987007,"page-layout-sidebar-left":984829,"page-layout-sidebar-right":984830,"page-next":986032,"page-next-outline":986033,"page-previous":986034,"page-previous-outline":986035,pail:988183,"pail-minus":988215,"pail-minus-outline":988220,"pail-off":988217,"pail-off-outline":988222,"pail-outline":988218,"pail-plus":988214,"pail-plus-outline":988219,"pail-remove":988216,"pail-remove-outline":988221,palette:984024,"palette-advanced":984025,"palette-outline":986636,"palette-swatch":985269,"palette-swatch-outline":987996,"palm-tree":987221,pan:986036,"pan-bottom-left":986037,"pan-bottom-right":986038,"pan-down":986039,"pan-horizontal":986040,"pan-left":986041,"pan-right":986042,"pan-top-left":986043,"pan-top-right":986044,"pan-up":986045,"pan-vertical":986046,panda:984026,pandora:984027,panorama:984028,"panorama-fisheye":984029,"panorama-horizontal":984030,"panorama-vertical":984031,"panorama-wide-angle":984032,"paper-cut-vertical":984033,"paper-roll":987479,"paper-roll-outline":987480,paperclip:984034,parachute:986292,"parachute-outline":986293,parking:984035,"party-popper":987222,passport:985059,"passport-biometric":986593,pasta:987488,"patio-heater":987008,patreon:985218,pause:984036,"pause-circle":984037,"pause-circle-outline":984038,"pause-octagon":984039,"pause-octagon-outline":984040,paw:984041,"paw-off":984663,"pdf-box":986710,peace:985220,peanut:987132,"peanut-off":987133,"peanut-off-outline":987135,"peanut-outline":987134,pen:984042,"pen-lock":986594,"pen-minus":986595,"pen-off":986596,"pen-plus":986597,"pen-remove":986598,pencil:984043,"pencil-box":984044,"pencil-box-multiple":987460,"pencil-box-multiple-outline":987461,"pencil-box-outline":984045,"pencil-circle":984831,"pencil-circle-outline":984950,"pencil-lock":984046,"pencil-lock-outline":986599,"pencil-minus":986600,"pencil-minus-outline":986601,"pencil-off":984047,"pencil-off-outline":986602,"pencil-outline":986294,"pencil-plus":986603,"pencil-plus-outline":986604,"pencil-remove":986605,"pencil-remove-outline":986606,"pencil-ruler":987987,penguin:986816,pentagon:984833,"pentagon-outline":984832,percent:984048,"percent-outline":987768,"periodic-table":985270,"perspective-less":986403,"perspective-more":986404,pharmacy:984049,phone:984050,"phone-alert":986906,"phone-alert-outline":987534,"phone-bluetooth":984051,"phone-bluetooth-outline":987535,"phone-cancel":987324,"phone-cancel-outline":987536,"phone-check":987561,"phone-check-outline":987562,"phone-classic":984578,"phone-classic-off":987769,"phone-forward":984052,"phone-forward-outline":987537,"phone-hangup":984053,"phone-hangup-outline":987538,"phone-in-talk":984054,"phone-in-talk-outline":987522,"phone-incoming":984055,"phone-incoming-outline":987539,"phone-lock":984056,"phone-lock-outline":987540,"phone-log":984057,"phone-log-outline":987541,"phone-message":987542,"phone-message-outline":987543,"phone-minus":984664,"phone-minus-outline":987544,"phone-missed":984058,"phone-missed-outline":987557,"phone-off":986607,"phone-off-outline":987558,"phone-outgoing":984059,"phone-outgoing-outline":987545,"phone-outline":986608,"phone-paused":984060,"phone-paused-outline":987546,"phone-plus":984665,"phone-plus-outline":987547,"phone-return":985135,"phone-return-outline":987548,"phone-ring":987563,"phone-ring-outline":987564,"phone-rotate-landscape":985221,"phone-rotate-portrait":985222,"phone-settings":984061,"phone-settings-outline":987549,"phone-voip":984062,pi:984063,"pi-box":984064,"pi-hole":986609,piano:984701,pickaxe:985271,"picture-in-picture-bottom-right":986711,"picture-in-picture-bottom-right-outline":986712,"picture-in-picture-top-right":986713,"picture-in-picture-top-right-outline":986714,pier:985223,"pier-crane":985224,pig:984065,"pig-variant":987142,"piggy-bank":987143,pill:984066,pillar:984834,pin:984067,"pin-off":984068,"pin-off-outline":985392,"pin-outline":985393,"pine-tree":984069,"pine-tree-box":984070,"pine-tree-fire":988186,pinterest:984071,pinwheel:985813,"pinwheel-outline":985814,pipe:985061,"pipe-disconnected":985062,"pipe-leak":985225,"pipe-wrench":987988,pirate:985608,pistol:984835,piston:985226,pizza:984073,play:984074,"play-box":987770,"play-box-multiple":986393,"play-box-multiple-outline":988134,"play-box-outline":984075,"play-circle":984076,"play-circle-outline":984077,"play-network":985227,"play-network-outline":986295,"play-outline":986907,"play-pause":984078,"play-protected-content":984079,"play-speed":985343,"playlist-check":984519,"playlist-edit":985344,"playlist-minus":984080,"playlist-music":986296,"playlist-music-outline":986297,"playlist-play":984081,"playlist-plus":984082,"playlist-remove":984083,"playlist-star":986610,plex:984762,plus:984085,"plus-box":984086,"plus-box-multiple":983860,"plus-box-multiple-outline":987459,"plus-box-outline":984836,"plus-circle":984087,"plus-circle-multiple":983884,"plus-circle-multiple-outline":984088,"plus-circle-outline":984089,"plus-minus":985490,"plus-minus-box":985491,"plus-minus-variant":988361,"plus-network":984090,"plus-network-outline":986298,"plus-one":984091,"plus-outline":984837,"plus-thick":987628,podcast:985492,podium:986405,"podium-bronze":986406,"podium-gold":986407,"podium-silver":986408,"point-of-sale":986514,pokeball:984093,"pokemon-go":985609,"poker-chip":985136,polaroid:984094,"police-badge":987495,"police-badge-outline":987496,poll:984095,"poll-box":984096,"poll-box-outline":987771,polo:988355,polymer:984097,pool:984582,popcorn:984098,post:987144,"post-outline":987145,"postage-stamp":986299,pot:983781,"pot-mix":984667,"pot-mix-outline":984695,"pot-outline":983807,"pot-steam":984666,"pot-steam-outline":983846,pound:984099,"pound-box":984100,"pound-box-outline":987519,power:984101,"power-cycle":985345,"power-off":985346,"power-on":985347,"power-plug":984741,"power-plug-off":984742,"power-plug-off-outline":988196,"power-plug-outline":988197,"power-settings":984102,"power-sleep":985348,"power-socket":984103,"power-socket-au":985349,"power-socket-de":987399,"power-socket-eu":985063,"power-socket-fr":987400,"power-socket-jp":987401,"power-socket-uk":985064,"power-socket-us":985065,"power-standby":985350,powershell:985610,prescription:984838,presentation:984104,"presentation-play":984105,printer:984106,"printer-3d":984107,"printer-3d-nozzle":986715,"printer-3d-nozzle-alert":987584,"printer-3d-nozzle-alert-outline":987585,"printer-3d-nozzle-outline":986716,"printer-alert":984108,"printer-check":987462,"printer-eye":988248,"printer-off":986717,"printer-pos":987223,"printer-search":988247,"printer-settings":984839,"printer-wireless":985611,"priority-high":984579,"priority-low":984580,"professional-hexagon":984109,"progress-alert":986300,"progress-check":985493,"progress-clock":985494,"progress-close":987402,"progress-download":985495,"progress-upload":985496,"progress-wrench":986301,projector:984110,"projector-screen":984111,"propane-tank":987991,"propane-tank-outline":987992,protocol:987096,publish:984743,pulse:984112,pump:988162,pumpkin:986047,purse:986908,"purse-outline":986909,puzzle:984113,"puzzle-check":988198,"puzzle-check-outline":988199,"puzzle-edit":988371,"puzzle-edit-outline":988377,"puzzle-heart":988372,"puzzle-heart-outline":988378,"puzzle-minus":988369,"puzzle-minus-outline":988375,"puzzle-outline":985702,"puzzle-plus":988368,"puzzle-plus-outline":988374,"puzzle-remove":988370,"puzzle-remove-outline":988376,"puzzle-star":988373,"puzzle-star-outline":988379,qi:985497,qqchat:984581,qrcode:984114,"qrcode-edit":985272,"qrcode-minus":987532,"qrcode-plus":987531,"qrcode-remove":987533,"qrcode-scan":984115,quadcopter:984116,"quality-high":984117,"quality-low":985612,"quality-medium":985613,quora:986409,rabbit:985351,"racing-helmet":986515,racquetball:986516,radar:984119,radiator:984120,"radiator-disabled":985815,"radiator-off":985816,radio:984121,"radio-am":986302,"radio-fm":986303,"radio-handheld":984122,"radio-off":987676,"radio-tower":984123,radioactive:984124,"radioactive-off":986817,"radiobox-blank":984125,"radiobox-marked":984126,"radiology-box":988357,"radiology-box-outline":988358,radius:986304,"radius-outline":986305,"railroad-light":986910,"raspberry-pi":984127,"ray-end":984128,"ray-end-arrow":984129,"ray-start":984130,"ray-start-arrow":984131,"ray-start-end":984132,"ray-vertex":984133,react:984840,read:984135,receipt:984137,record:984138,"record-circle":986818,"record-circle-outline":986819,"record-player":985498,"record-rec":984139,rectangle:986718,"rectangle-outline":986719,recycle:984140,"recycle-variant":988061,reddit:984141,redhat:987419,redo:984142,"redo-variant":984143,"reflect-horizontal":985614,"reflect-vertical":985615,refresh:984144,"refresh-circle":988023,regex:984145,"registered-trademark":985703,"relation-many-to-many":988310,"relation-many-to-one":988311,"relation-many-to-one-or-many":988312,"relation-many-to-only-one":988313,"relation-many-to-zero-or-many":988314,"relation-many-to-zero-or-one":988315,"relation-one-or-many-to-many":988316,"relation-one-or-many-to-one":988317,"relation-one-or-many-to-one-or-many":988318,"relation-one-or-many-to-only-one":988319,"relation-one-or-many-to-zero-or-many":988320,"relation-one-or-many-to-zero-or-one":988321,"relation-one-to-many":988322,"relation-one-to-one":988323,"relation-one-to-one-or-many":988324,"relation-one-to-only-one":988325,"relation-one-to-zero-or-many":988326,"relation-one-to-zero-or-one":988327,"relation-only-one-to-many":988328,"relation-only-one-to-one":988329,"relation-only-one-to-one-or-many":988330,"relation-only-one-to-only-one":988331,"relation-only-one-to-zero-or-many":988332,"relation-only-one-to-zero-or-one":988333,"relation-zero-or-many-to-many":988334,"relation-zero-or-many-to-one":988335,"relation-zero-or-many-to-one-or-many":988336,"relation-zero-or-many-to-only-one":988337,"relation-zero-or-many-to-zero-or-many":988338,"relation-zero-or-many-to-zero-or-one":988339,"relation-zero-or-one-to-many":988340,"relation-zero-or-one-to-one":988341,"relation-zero-or-one-to-one-or-many":988342,"relation-zero-or-one-to-only-one":988343,"relation-zero-or-one-to-zero-or-many":988344,"relation-zero-or-one-to-zero-or-one":988345,"relative-scale":984146,reload:984147,"reload-alert":987403,reminder:985228,remote:984148,"remote-desktop":985273,"remote-off":986820,"remote-tv":986821,"remote-tv-off":986822,"rename-box":984149,"reorder-horizontal":984712,"reorder-vertical":984713,repeat:984150,"repeat-off":984151,"repeat-once":984152,replay:984153,reply:984154,"reply-all":984155,"reply-all-outline":986911,"reply-circle":987566,"reply-outline":986912,reproduction:984156,resistor:985924,"resistor-nodes":985925,resize:985704,"resize-bottom-right":984157,responsive:984158,restart:984841,"restart-alert":987404,"restart-off":986517,restore:985499,"restore-alert":987405,rewind:984159,"rewind-10":986410,"rewind-30":986518,"rewind-5":987641,"rewind-outline":984842,rhombus:984843,"rhombus-medium":985616,"rhombus-medium-outline":988380,"rhombus-outline":984844,"rhombus-split":985617,"rhombus-split-outline":988381,ribbon:984160,rice:985066,ring:985067,rivet:986720,road:984161,"road-variant":984162,robber:987224,robot:984745,"robot-industrial":985926,"robot-mower":987639,"robot-mower-outline":987635,"robot-vacuum":984845,"robot-vacuum-variant":985352,rocket:984163,"rocket-launch":988382,"rocket-launch-outline":988383,"rocket-outline":988079,rodent:987943,"roller-skate":986411,"roller-skate-off":983365,rollerblade:986412,"rollerblade-off":983086,rollupjs:986048,"roman-numeral-1":987272,"roman-numeral-10":987281,"roman-numeral-2":987273,"roman-numeral-3":987274,"roman-numeral-4":987275,"roman-numeral-5":987276,"roman-numeral-6":987277,"roman-numeral-7":987278,"roman-numeral-8":987279,"roman-numeral-9":987280,"room-service":985229,"room-service-outline":986519,"rotate-3d":986823,"rotate-3d-variant":984164,"rotate-left":984165,"rotate-left-variant":984166,"rotate-orbit":986520,"rotate-right":984167,"rotate-right-variant":984168,"rounded-corner":984583,router:987618,"router-network":987271,"router-wireless":984169,"router-wireless-settings":985705,routes:984170,"routes-clock":987225,rowing:984584,rss:984171,"rss-box":984172,"rss-off":986913,rug:988277,rugby:986521,ruler:984173,"ruler-square":986306,"ruler-square-compass":986814,run:984846,"run-fast":984174,"rv-truck":987604,sack:986414,"sack-percent":986415,safe:985706,"safe-square":987772,"safe-square-outline":987773,"safety-goggles":986416,"sail-boat":986824,sale:984175,salesforce:985230,sass:985068,satellite:984176,"satellite-uplink":985353,"satellite-variant":984177,sausage:985274,"saw-blade":986721,"sawtooth-wave":988282,saxophone:984585,scale:984178,"scale-balance":984529,"scale-bathroom":984179,"scale-off":987226,"scan-helper":988120,scanner:984747,"scanner-off":985354,"scatter-plot":986825,"scatter-plot-outline":986826,school:984180,"school-outline":987520,"scissors-cutting":985707,scooter:987625,scoreboard:987774,"scoreboard-outline":987775,"screen-rotation":984181,"screen-rotation-lock":984184,"screw-flat-top":986611,"screw-lag":986612,"screw-machine-flat-top":986613,"screw-machine-round-top":986614,"screw-round-top":986615,screwdriver:984182,script:986049,"script-outline":984183,"script-text":986050,"script-text-outline":986051,sd:984185,seal:984186,"seal-variant":987097,"search-web":984847,seat:986307,"seat-flat":984187,"seat-flat-angled":984188,"seat-individual-suite":984189,"seat-legroom-extra":984190,"seat-legroom-normal":984191,"seat-legroom-reduced":984192,"seat-outline":986308,"seat-passenger":987721,"seat-recline-extra":984193,"seat-recline-normal":984194,seatbelt:986309,security:984195,"security-network":984196,seed:986722,"seed-off":988157,"seed-off-outline":988158,"seed-outline":986723,segment:986827,select:984197,"select-all":984198,"select-color":986417,"select-compare":985817,"select-drag":985708,"select-group":987010,"select-inverse":984199,"select-marker":987776,"select-multiple":987777,"select-multiple-marker":987778,"select-off":984200,"select-place":987098,"select-search":987652,selection:984201,"selection-drag":985709,"selection-ellipse":986418,"selection-ellipse-arrow-inside":986914,"selection-marker":987779,"selection-multiple":987781,"selection-multiple-marker":987780,"selection-off":984951,"selection-search":987653,"semantic-web":987926,send:984202,"send-check":987489,"send-check-outline":987490,"send-circle":986616,"send-circle-outline":986617,"send-clock":987491,"send-clock-outline":987492,"send-lock":985069,"send-lock-outline":987494,"send-outline":987493,"serial-port":984668,server:984203,"server-minus":984204,"server-network":984205,"server-network-off":984206,"server-off":984207,"server-plus":984208,"server-remove":984209,"server-security":984210,"set-all":984952,"set-center":984953,"set-center-right":984954,"set-left":984955,"set-left-center":984956,"set-left-right":984957,"set-merge":988384,"set-none":984958,"set-right":984959,"set-split":988385,"set-square":988253,"set-top-box":985503,"settings-helper":985710,shaker:987406,"shaker-outline":987407,shape:985137,"shape-circle-plus":984669,"shape-outline":985138,"shape-oval-plus":987642,"shape-plus":984213,"shape-polygon-plus":984670,"shape-rectangle-plus":984671,"shape-square-plus":984672,share:984214,"share-all":987636,"share-all-outline":987637,"share-circle":987565,"share-off":986915,"share-off-outline":986916,"share-outline":985394,"share-variant":984215,sheep:986310,shield:984216,"shield-account":985231,"shield-account-outline":985618,"shield-airplane":984763,"shield-airplane-outline":986311,"shield-alert":986828,"shield-alert-outline":986829,"shield-bug":988122,"shield-bug-outline":988123,"shield-car":987011,"shield-check":984421,"shield-check-outline":986312,"shield-cross":986313,"shield-cross-outline":986314,"shield-edit":987552,"shield-edit-outline":987553,"shield-half":988e3,"shield-half-full":984960,"shield-home":984714,"shield-home-outline":986315,"shield-key":986052,"shield-key-outline":986053,"shield-link-variant":986419,"shield-link-variant-outline":986420,"shield-lock":985501,"shield-lock-outline":986316,"shield-off":985502,"shield-off-outline":985500,"shield-outline":984217,"shield-plus":985818,"shield-plus-outline":985819,"shield-refresh":983210,"shield-refresh-outline":983520,"shield-remove":985820,"shield-remove-outline":985821,"shield-search":986522,"shield-star":987451,"shield-star-outline":987452,"shield-sun":987229,"shield-sun-outline":987230,"shield-sync":987554,"shield-sync-outline":987555,"ship-wheel":985139,"shoe-formal":985927,"shoe-heel":985928,"shoe-print":986618,shopping:984218,"shopping-music":984219,"shopping-outline":987605,"shopping-search":987012,shovel:984848,"shovel-off":984849,shower:985504,"shower-head":985505,shredder:984220,shuffle:984221,"shuffle-disabled":984222,"shuffle-variant":984223,shuriken:988031,sigma:984224,"sigma-lower":984619,"sign-caution":984225,"sign-direction":984961,"sign-direction-minus":987136,"sign-direction-plus":987100,"sign-direction-remove":987101,"sign-real-estate":987416,"sign-text":984962,signal:984226,"signal-2g":984850,"signal-3g":984851,"signal-4g":984852,"signal-5g":985711,"signal-cellular-1":985276,"signal-cellular-2":985277,"signal-cellular-3":985278,"signal-cellular-outline":985279,"signal-distance-variant":986724,"signal-hspa":984853,"signal-hspa-plus":984854,"signal-off":984963,"signal-variant":984586,signature:986619,"signature-freehand":986620,"signature-image":986621,"signature-text":986622,silo:985929,silverware:984227,"silverware-clean":987102,"silverware-fork":984228,"silverware-fork-knife":985712,"silverware-spoon":984229,"silverware-variant":984230,sim:984231,"sim-alert":984232,"sim-off":984233,"simple-icons":987933,"sina-weibo":985823,"sine-wave":985435,sitemap:984234,"size-l":988070,"size-m":988069,"size-s":988068,"size-xl":988071,"size-xs":988067,"size-xxl":988072,"size-xxs":988066,"size-xxxl":988073,skate:986421,skateboard:988354,"skew-less":986422,"skew-more":986423,ski:987908,"ski-cross-country":987909,"ski-water":987910,"skip-backward":984235,"skip-backward-outline":986917,"skip-forward":984236,"skip-forward-outline":986918,"skip-next":984237,"skip-next-circle":984673,"skip-next-circle-outline":984674,"skip-next-outline":986919,"skip-previous":984238,"skip-previous-circle":984675,"skip-previous-circle-outline":984676,"skip-previous-outline":986920,skull:984716,"skull-crossbones":986054,"skull-crossbones-outline":986055,"skull-outline":986056,"skull-scan":988359,"skull-scan-outline":988360,skype:984239,"skype-business":984240,slack:984241,"slash-forward":987103,"slash-forward-box":987104,sleep:984242,"sleep-off":984243,"slope-downhill":986623,"slope-uphill":986624,"slot-machine":987412,"slot-machine-outline":987413,"smart-card":987325,"smart-card-outline":987326,"smart-card-reader":987327,"smart-card-reader-outline":987328,smog:985713,"smoke-detector":983954,smoking:984244,"smoking-off":984245,"smoking-pipe":988173,"smoking-pipe-off":988200,snapchat:984246,snowboard:987911,snowflake:984855,"snowflake-alert":986921,"snowflake-melt":987851,"snowflake-variant":986922,snowman:984247,soccer:984248,"soccer-field":985140,sofa:984249,"solar-panel":986523,"solar-panel-large":986524,"solar-power":985714,"soldering-iron":987282,solid:984717,"sony-playstation":984084,sort:984250,"sort-alphabetical-ascending":984509,"sort-alphabetical-ascending-variant":987464,"sort-alphabetical-descending":984511,"sort-alphabetical-descending-variant":987465,"sort-alphabetical-variant":984251,"sort-ascending":984252,"sort-bool-ascending":988037,"sort-bool-ascending-variant":988038,"sort-bool-descending":988039,"sort-bool-descending-variant":988040,"sort-descending":984253,"sort-numeric-ascending":988041,"sort-numeric-ascending-variant":985357,"sort-numeric-descending":988042,"sort-numeric-descending-variant":985810,"sort-numeric-variant":984254,"sort-reverse-variant":983868,"sort-variant":984255,"sort-variant-lock":986317,"sort-variant-lock-open":986318,"sort-variant-remove":987463,soundcloud:984256,"source-branch":984620,"source-branch-check":988367,"source-branch-minus":988363,"source-branch-plus":988362,"source-branch-refresh":988365,"source-branch-remove":988364,"source-branch-sync":988366,"source-commit":984856,"source-commit-end":984857,"source-commit-end-local":984858,"source-commit-local":984859,"source-commit-next-local":984860,"source-commit-start":984861,"source-commit-start-next-local":984862,"source-fork":984257,"source-merge":984621,"source-pull":984258,"source-repository":986319,"source-repository-multiple":986320,"soy-sauce":985070,"soy-sauce-off":988156,spa:986321,"spa-outline":986322,"space-invaders":986057,"space-station":988035,spade:986725,speaker:984259,"speaker-bluetooth":985506,"speaker-multiple":986424,"speaker-off":984260,"speaker-wireless":984863,speedometer:984261,"speedometer-medium":987013,"speedometer-slow":987014,spellcheck:984262,spider:987626,"spider-thread":987627,"spider-web":986058,"spoon-sugar":988201,spotify:984263,spotlight:984264,"spotlight-beam":984265,spray:984677,"spray-bottle":985824,sprinkler:987231,"sprinkler-variant":987232,sprout:986726,"sprout-outline":986727,square:984932,"square-edit-outline":985356,"square-medium":985619,"square-medium-outline":985620,"square-off":987886,"square-off-outline":987887,"square-outline":984931,"square-root":984964,"square-root-box":985507,"square-small":985621,"square-wave":988283,squeegee:985825,ssh:985280,"stack-exchange":984587,"stack-overflow":984268,stackpath:983897,stadium:987129,"stadium-variant":984864,stairs:984269,"stairs-box":988062,"stairs-down":987838,"stairs-up":987837,stamper:986425,"standard-definition":985071,star:984270,"star-box":985715,"star-box-multiple":987782,"star-box-multiple-outline":987783,"star-box-outline":985716,"star-circle":984271,"star-circle-outline":985508,"star-face":985509,"star-four-points":985826,"star-four-points-outline":985827,"star-half":983622,"star-half-full":984272,"star-off":984273,"star-outline":984274,"star-three-points":985828,"star-three-points-outline":985829,"state-machine":987631,steam:984275,steering:984276,"steering-off":985358,"step-backward":984277,"step-backward-2":984278,"step-forward":984279,"step-forward-2":984280,stethoscope:984281,sticker:988004,"sticker-alert":988005,"sticker-alert-outline":988006,"sticker-check":988007,"sticker-check-outline":988008,"sticker-circle-outline":984528,"sticker-emoji":984965,"sticker-minus":988009,"sticker-minus-outline":988010,"sticker-outline":988011,"sticker-plus":988012,"sticker-plus-outline":988013,"sticker-remove":988014,"sticker-remove-outline":988015,stocking:984282,stomach:987283,stop:984283,"stop-circle":984678,"stop-circle-outline":984679,store:984284,"store-24-hour":984285,"store-outline":988001,storefront:985031,"storefront-outline":987329,stove:984286,strategy:987606,"stretch-to-page":986923,"stretch-to-page-outline":986924,"string-lights":987834,"string-lights-off":987835,"subdirectory-arrow-left":984588,"subdirectory-arrow-right":984589,subtitles:985622,"subtitles-outline":985623,subway:984748,"subway-alert-variant":986525,"subway-variant":984287,summit:984966,sunglasses:984288,"surround-sound":984517,"surround-sound-2-0":985072,"surround-sound-3-1":985073,"surround-sound-5-1":985074,"surround-sound-7-1":985075,svg:984865,"swap-horizontal":984289,"swap-horizontal-bold":986061,"swap-horizontal-circle":987105,"swap-horizontal-circle-outline":987106,"swap-horizontal-variant":985281,"swap-vertical":984290,"swap-vertical-bold":986062,"swap-vertical-circle":987107,"swap-vertical-circle-outline":987108,"swap-vertical-variant":985282,swim:984291,switch:984292,sword:984293,"sword-cross":984967,"syllabary-hangul":987955,"syllabary-hiragana":987956,"syllabary-katakana":987957,"syllabary-katakana-halfwidth":987958,symfony:985830,sync:984294,"sync-alert":984295,"sync-circle":988024,"sync-off":984296,tab:984297,"tab-minus":985931,"tab-plus":984924,"tab-remove":985932,"tab-unselected":984298,table:984299,"table-account":988089,"table-alert":988090,"table-arrow-down":988091,"table-arrow-left":988092,"table-arrow-right":988093,"table-arrow-up":988094,"table-border":985624,"table-cancel":988095,"table-chair":987233,"table-check":988096,"table-clock":988097,"table-cog":988098,"table-column":985141,"table-column-plus-after":984300,"table-column-plus-before":984301,"table-column-remove":984302,"table-column-width":984303,"table-edit":984304,"table-eye":987284,"table-eye-off":988099,"table-furniture":984508,"table-headers-eye":987677,"table-headers-eye-off":987678,"table-heart":988100,"table-key":988101,"table-large":984305,"table-large-plus":987015,"table-large-remove":987016,"table-lock":988102,"table-merge-cells":985510,"table-minus":988103,"table-multiple":988104,"table-network":988105,"table-of-contents":985142,"table-off":988106,"table-plus":985717,"table-refresh":988064,"table-remove":985718,"table-row":985143,"table-row-height":984306,"table-row-plus-after":984307,"table-row-plus-before":984308,"table-row-remove":984309,"table-search":985359,"table-settings":985144,"table-split-cell":988202,"table-star":988107,"table-sync":988065,"table-tennis":986728,tablet:984310,"tablet-android":984311,"tablet-cellphone":985511,"tablet-dashboard":986830,"tablet-ipad":984312,taco:984930,tag:984313,"tag-faces":984314,"tag-heart":984715,"tag-heart-outline":986063,"tag-minus":985360,"tag-minus-outline":987679,"tag-multiple":984315,"tag-multiple-outline":987895,"tag-off":987680,"tag-off-outline":987681,"tag-outline":984316,"tag-plus":984866,"tag-plus-outline":987682,"tag-remove":984867,"tag-remove-outline":987683,"tag-text":987684,"tag-text-outline":984317,tailwind:988159,tank:986426,"tanker-truck":987109,"tape-measure":985933,target:984318,"target-account":986064,"target-variant":985719,taxi:984319,tea:986526,"tea-outline":986527,teach:985232,teamviewer:984320,telegram:984321,telescope:985934,television:984322,"television-ambient-light":987990,"television-box":985145,"television-classic":985076,"television-classic-off":985146,"television-clean":987408,"television-guide":984323,"television-off":985147,"television-pause":987017,"television-play":986831,"television-stop":987018,"temperature-celsius":984324,"temperature-fahrenheit":984325,"temperature-kelvin":984326,tennis:986528,"tennis-ball":984327,tent:984328,terraform:987234,terrain:984329,"test-tube":984680,"test-tube-empty":985361,"test-tube-off":985362,text:985512,"text-box":983578,"text-box-check":986790,"text-box-check-outline":986791,"text-box-minus":986792,"text-box-minus-outline":986793,"text-box-multiple":985783,"text-box-multiple-outline":985784,"text-box-outline":985581,"text-box-plus":986794,"text-box-plus-outline":986795,"text-box-remove":986796,"text-box-remove-outline":986797,"text-box-search":986798,"text-box-search-outline":986799,"text-recognition":987453,"text-search":988088,"text-shadow":984681,"text-short":985513,"text-subject":985514,"text-to-speech":984330,"text-to-speech-off":984331,texture:984332,"texture-box":987110,theater:984333,"theme-light-dark":984334,thermometer:984335,"thermometer-alert":986625,"thermometer-chevron-down":986626,"thermometer-chevron-up":986627,"thermometer-high":987330,"thermometer-lines":984336,"thermometer-low":987331,"thermometer-minus":986628,"thermometer-plus":986629,thermostat:983955,"thermostat-box":985233,"thought-bubble":985078,"thought-bubble-outline":985079,"thumb-down":984337,"thumb-down-outline":984338,"thumb-up":984339,"thumb-up-outline":984340,"thumbs-up-down":984341,ticket:984342,"ticket-account":984343,"ticket-confirmation":984344,"ticket-confirmation-outline":988074,"ticket-outline":985363,"ticket-percent":984868,"ticket-percent-outline":988203,tie:984345,tilde:984869,timelapse:984346,timeline:986065,"timeline-alert":987029,"timeline-alert-outline":987032,"timeline-clock":987643,"timeline-clock-outline":987644,"timeline-help":987033,"timeline-help-outline":987034,"timeline-outline":986066,"timeline-plus":987030,"timeline-plus-outline":987031,"timeline-text":986067,"timeline-text-outline":986068,timer:988075,"timer-10":984348,"timer-3":984349,"timer-off":988076,"timer-off-outline":984350,"timer-outline":984347,"timer-sand":984351,"timer-sand-empty":984749,"timer-sand-full":984972,timetable:984352,toaster:987235,"toaster-off":987575,"toaster-oven":986323,"toggle-switch":984353,"toggle-switch-off":984354,"toggle-switch-off-outline":985625,"toggle-switch-outline":985626,toilet:985515,toolbox:985516,"toolbox-outline":985517,tools:987236,tooltip:984355,"tooltip-account":983052,"tooltip-edit":984356,"tooltip-edit-outline":987845,"tooltip-image":984357,"tooltip-image-outline":986069,"tooltip-outline":984358,"tooltip-plus":986070,"tooltip-plus-outline":984359,"tooltip-text":984360,"tooltip-text-outline":986071,tooth:985283,"tooth-outline":984361,toothbrush:987433,"toothbrush-electric":987436,"toothbrush-paste":987434,tortoise:986427,toslink:987832,tournament:985518,"tow-truck":985148,"tower-beach":984705,"tower-fire":984706,"toy-brick":987784,"toy-brick-marker":987785,"toy-brick-marker-outline":987786,"toy-brick-minus":987787,"toy-brick-minus-outline":987788,"toy-brick-outline":987789,"toy-brick-plus":987790,"toy-brick-plus-outline":987791,"toy-brick-remove":987792,"toy-brick-remove-outline":987793,"toy-brick-search":987794,"toy-brick-search-outline":987795,"track-light":985364,trackpad:985080,"trackpad-lock":985395,tractor:985234,"tractor-variant":988356,trademark:985720,"traffic-cone":988028,"traffic-light":984363,train:984364,"train-car":986072,"train-variant":985284,tram:984365,"tram-side":987111,transcribe:984366,"transcribe-close":984367,transfer:987237,"transfer-down":986529,"transfer-left":986530,"transfer-right":984368,"transfer-up":986531,"transit-connection":986428,"transit-connection-variant":986429,"transit-detour":987019,"transit-transfer":984750,transition:985365,"transition-masked":985366,translate:984522,"translate-off":986630,"transmission-tower":986430,"trash-can":985721,"trash-can-outline":985722,tray:987796,"tray-alert":987797,"tray-full":987798,"tray-minus":987799,"tray-plus":987800,"tray-remove":987801,"treasure-chest":984870,tree:984369,"tree-outline":986729,trello:984370,"trending-down":984371,"trending-neutral":984372,"trending-up":984373,triangle:984374,"triangle-outline":984375,"triangle-wave":988284,triforce:986073,trophy:984376,"trophy-award":984377,"trophy-broken":986532,"trophy-outline":984378,"trophy-variant":984379,"trophy-variant-outline":984380,truck:984381,"truck-check":986324,"truck-check-outline":987802,"truck-delivery":984382,"truck-delivery-outline":987803,"truck-fast":984968,"truck-fast-outline":987804,"truck-outline":987805,"truck-trailer":984871,trumpet:987286,"tshirt-crew":985723,"tshirt-crew-outline":984383,"tshirt-v":985724,"tshirt-v-outline":984384,"tumble-dryer":985367,"tumble-dryer-alert":987578,"tumble-dryer-off":987579,tune:984622,"tune-vertical":984682,turnstile:986325,"turnstile-outline":986326,turtle:986327,twitch:984387,twitter:984388,"twitter-retweet":984391,"two-factor-authentication":985519,typewriter:986925,ubisoft:986074,ubuntu:984392,ufo:987332,"ufo-outline":987333,"ultra-high-definition":985081,umbraco:984393,umbrella:984394,"umbrella-closed":985520,"umbrella-closed-outline":988130,"umbrella-closed-variant":988129,"umbrella-outline":984395,undo:984396,"undo-variant":984397,"unfold-less-horizontal":984398,"unfold-less-vertical":984928,"unfold-more-horizontal":984399,"unfold-more-vertical":984929,ungroup:984400,unicode:986832,unity:984751,unreal:985521,untappd:984401,update:984752,upload:984402,"upload-lock":988019,"upload-lock-outline":988020,"upload-multiple":985149,"upload-network":984822,"upload-network-outline":986328,"upload-off":987334,"upload-off-outline":987335,"upload-outline":986631,usb:984403,"usb-flash-drive":987806,"usb-flash-drive-outline":987807,"usb-port":987632,valve:987238,"valve-closed":987239,"valve-open":987240,"van-passenger":985082,"van-utility":985083,vanish:985084,"vanity-light":987617,variable:985831,"variable-box":987409,"vector-arrange-above":984404,"vector-arrange-below":984405,"vector-bezier":985832,"vector-circle":984406,"vector-circle-variant":984407,"vector-combine":984408,"vector-curve":984409,"vector-difference":984410,"vector-difference-ab":984411,"vector-difference-ba":984412,"vector-ellipse":985235,"vector-intersection":984413,"vector-line":984414,"vector-link":987112,"vector-point":984415,"vector-polygon":984416,"vector-polyline":984417,"vector-polyline-edit":987685,"vector-polyline-minus":987686,"vector-polyline-plus":987687,"vector-polyline-remove":987688,"vector-radius":984906,"vector-rectangle":984518,"vector-selection":984418,"vector-square":983041,"vector-triangle":984419,"vector-union":984420,vhs:985627,vibrate:984422,"vibrate-off":986329,video:984423,"video-3d":985085,"video-3d-off":988121,"video-3d-variant":986833,"video-4k-box":985150,"video-account":985369,"video-box":983293,"video-box-off":983294,"video-check":987241,"video-check-outline":987242,"video-image":985370,"video-input-antenna":985151,"video-input-component":985152,"video-input-hdmi":985153,"video-input-scart":987020,"video-input-svideo":985154,"video-minus":985522,"video-minus-outline":983738,"video-off":984424,"video-off-outline":986075,"video-outline":986076,"video-plus":985523,"video-plus-outline":983507,"video-stabilization":985371,"video-switch":984425,"video-switch-outline":984976,"video-vintage":985628,"video-wireless":986834,"video-wireless-outline":986835,"view-agenda":984426,"view-agenda-outline":987608,"view-array":984427,"view-array-outline":988293,"view-carousel":984428,"view-carousel-outline":988294,"view-column":984429,"view-column-outline":988295,"view-comfy":986730,"view-comfy-outline":988296,"view-compact":986731,"view-compact-outline":986732,"view-dashboard":984430,"view-dashboard-outline":985629,"view-dashboard-variant":985155,"view-dashboard-variant-outline":988297,"view-day":984431,"view-day-outline":988298,"view-grid":984432,"view-grid-outline":987609,"view-grid-plus":987021,"view-grid-plus-outline":987610,"view-headline":984433,"view-list":984434,"view-list-outline":988299,"view-module":984435,"view-module-outline":988300,"view-parallel":984872,"view-parallel-outline":988301,"view-quilt":984436,"view-quilt-outline":988302,"view-sequential":984873,"view-sequential-outline":988303,"view-split-horizontal":986059,"view-split-vertical":986060,"view-stream":984437,"view-stream-outline":988304,"view-week":984438,"view-week-outline":988305,vimeo:984439,violin:984591,"virtual-reality":985236,virus:988086,"virus-outline":988087,vk:984441,vlc:984444,"voice-off":986836,voicemail:984445,volleyball:985524,"volume-high":984446,"volume-low":984447,"volume-medium":984448,"volume-minus":984926,"volume-mute":984927,"volume-off":984449,"volume-plus":984925,"volume-source":987424,"volume-variant-off":986632,"volume-vibrate":987425,vote:985631,"vote-outline":985632,vpn:984450,vuejs:985156,vuetify:986733,walk:984451,wall:985086,"wall-sconce":985372,"wall-sconce-flat":985373,"wall-sconce-flat-variant":984092,"wall-sconce-round":984904,"wall-sconce-round-variant":985374,wallet:984452,"wallet-giftcard":984453,"wallet-membership":984454,"wallet-outline":986077,"wallet-plus":987022,"wallet-plus-outline":987023,"wallet-travel":984455,wallpaper:986633,wan:984456,wardrobe:987024,"wardrobe-outline":987025,warehouse:987009,"washing-machine":984874,"washing-machine-alert":987580,"washing-machine-off":987581,watch:984457,"watch-export":984458,"watch-export-variant":985237,"watch-import":984459,"watch-import-variant":985238,"watch-variant":985239,"watch-vibrate":984753,"watch-vibrate-off":986330,water:984460,"water-boiler":987026,"water-boiler-alert":987571,"water-boiler-off":987572,"water-off":984461,"water-outline":986634,"water-percent":984462,"water-polo":987808,"water-pump":984463,"water-pump-off":987027,"water-well":987243,"water-well-outline":987244,"watering-can":988289,"watering-can-outline":988290,watermark:984594,wave:986926,waveform:988285,waves:984973,waze:986078,"weather-cloudy":984464,"weather-cloudy-alert":986927,"weather-cloudy-arrow-right":986734,"weather-fog":984465,"weather-hail":984466,"weather-hazy":986928,"weather-hurricane":985240,"weather-lightning":984467,"weather-lightning-rainy":984702,"weather-night":984468,"weather-night-partly-cloudy":986929,"weather-partly-cloudy":984469,"weather-partly-lightning":986930,"weather-partly-rainy":986931,"weather-partly-snowy":986932,"weather-partly-snowy-rainy":986933,"weather-pouring":984470,"weather-rainy":984471,"weather-snowy":984472,"weather-snowy-heavy":986934,"weather-snowy-rainy":984703,"weather-sunny":984473,"weather-sunny-alert":986935,"weather-sunset":984474,"weather-sunset-down":984475,"weather-sunset-up":984476,"weather-tornado":986936,"weather-windy":984477,"weather-windy-variant":984478,web:984479,"web-box":987028,"web-clock":987722,webcam:984480,webhook:984623,webpack:984875,webrtc:987720,wechat:984593,weight:984481,"weight-gram":986431,"weight-kilogram":984482,"weight-lifter":987485,"weight-pound":985525,whatsapp:984483,"wheelchair-accessibility":984484,whistle:985526,"whistle-outline":987836,"white-balance-auto":984485,"white-balance-incandescent":984486,"white-balance-iridescent":984487,"white-balance-sunny":984488,widgets:984876,"widgets-outline":987989,wifi:984489,"wifi-off":984490,"wifi-star":986635,"wifi-strength-1":985375,"wifi-strength-1-alert":985376,"wifi-strength-1-lock":985377,"wifi-strength-2":985378,"wifi-strength-2-alert":985379,"wifi-strength-2-lock":985380,"wifi-strength-3":985381,"wifi-strength-3-alert":985382,"wifi-strength-3-lock":985383,"wifi-strength-4":985384,"wifi-strength-4-alert":985385,"wifi-strength-4-lock":985386,"wifi-strength-alert-outline":985387,"wifi-strength-lock-outline":985388,"wifi-strength-off":985389,"wifi-strength-off-outline":985390,"wifi-strength-outline":985391,wikipedia:984492,"wind-turbine":986533,"window-close":984493,"window-closed":984494,"window-closed-variant":987611,"window-maximize":984495,"window-minimize":984496,"window-open":984497,"window-open-variant":987612,"window-restore":984498,"window-shutter":987420,"window-shutter-alert":987421,"window-shutter-open":987422,wiper:985833,"wiper-wash":986534,"wizard-hat":988279,wordpress:984500,wrap:984502,"wrap-disabled":986079,wrench:984503,"wrench-outline":986080,xamarin:985157,"xamarin-outline":985158,xing:984510,xml:984512,xmpp:985087,"y-combinator":984612,yahoo:985935,yeast:984513,"yin-yang":984704,yoga:987516,youtube:984515,"youtube-gaming":985160,"youtube-studio":985159,"youtube-subscription":986432,"youtube-tv":984136,"z-wave":985834,zend:985835,zigbee:986433,"zip-box":984516,"zip-box-outline":987130,"zip-disk":985635,"zodiac-aquarius":985725,"zodiac-aries":985726,"zodiac-cancer":985727,"zodiac-capricorn":985728,"zodiac-gemini":985729,"zodiac-leo":985730,"zodiac-libra":985731,"zodiac-pisces":985732,"zodiac-sagittarius":985733,"zodiac-scorpio":985734,"zodiac-taurus":985735,"zodiac-virgo":985736,blank:63116}},664,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.getImageSourceSync=e.getImageSource=e.TabBarItemIOS=e.TabBarItem=e.Button=e.default=void 0;var I=t(r(d[1])),u=t(r(d[2])),o=(0,I.default)(u.default,'Material Icons','MaterialIcons.ttf'),c=o;e.default=c;var S=o.Button,n=o.TabBarItem,B=o.TabBarItemIOS,l=o.getImageSource,b=o.getImageSourceSync;e.getImageSourceSync=b,e.getImageSource=l,e.TabBarItemIOS=B,e.TabBarItem=n,e.Button=S},665,[1,633,666]); -__d(function(e,o,t,a,r,i,n){r.exports={360:58743,"10k":59729,"10mp":59730,"11mp":59731,"12mp":59732,"13mp":59733,"14mp":59734,"15mp":59735,"16mp":59736,"17mp":59737,"18mp":59738,"19mp":59739,"1k":59740,"1k-plus":59741,"20mp":59742,"21mp":59743,"22mp":59744,"23mp":59745,"24mp":59746,"2k":59747,"2k-plus":59748,"2mp":59749,"3d-rotation":59469,"3k":59750,"3k-plus":59751,"3mp":59752,"4k":57458,"4k-plus":59753,"4mp":59754,"5g":61240,"5k":59755,"5k-plus":59756,"5mp":59757,"6-ft-apart":61982,"6k":59758,"6k-plus":59759,"6mp":59760,"7k":59761,"7k-plus":59762,"7mp":59763,"8k":59764,"8k-plus":59765,"8mp":59766,"9k":59767,"9k-plus":59768,"9mp":59769,"ac-unit":60219,"access-alarm":57744,"access-alarms":57745,"access-time":57746,accessibility:59470,"accessibility-new":59692,accessible:59668,"accessible-forward":59700,"account-balance":59471,"account-balance-wallet":59472,"account-box":59473,"account-circle":59475,"account-tree":59770,"ad-units":61241,adb:58894,add:57669,"add-a-photo":58425,"add-alarm":57747,"add-alert":57347,"add-box":57670,"add-business":59177,"add-call":57576,"add-chart":59771,"add-circle":57671,"add-circle-outline":57672,"add-comment":57958,"add-ic-call":59772,"add-link":57720,"add-location":58727,"add-location-alt":61242,"add-moderator":59773,"add-photo-alternate":58430,"add-road":61243,"add-shopping-cart":59476,"add-task":62010,"add-to-drive":58972,"add-to-home-screen":57854,"add-to-photos":58269,"add-to-queue":57436,addchart:61244,adjust:58270,"admin-panel-settings":61245,agriculture:60025,"airline-seat-flat":58928,"airline-seat-flat-angled":58929,"airline-seat-individual-suite":58930,"airline-seat-legroom-extra":58931,"airline-seat-legroom-normal":58932,"airline-seat-legroom-reduced":58933,"airline-seat-recline-extra":58934,"airline-seat-recline-normal":58935,"airplanemode-active":57749,"airplanemode-inactive":57748,"airplanemode-off":57748,"airplanemode-on":57749,airplay:57429,"airport-shuttle":60220,alarm:59477,"alarm-add":59478,"alarm-off":59479,"alarm-on":59480,album:57369,"align-horizontal-center":57359,"align-horizontal-left":57357,"align-horizontal-right":57360,"align-vertical-bottom":57365,"align-vertical-center":57361,"align-vertical-top":57356,"all-inbox":59775,"all-inclusive":60221,"all-out":59659,"alt-route":61828,"alternate-email":57574,"amp-stories":59923,analytics:61246,anchor:61901,android:59481,animation:59164,announcement:59482,apartment:59968,api:61879,"app-blocking":61247,"app-registration":61248,"app-settings-alt":61249,approval:59778,apps:58819,architecture:59963,archive:57673,"arrow-back":58820,"arrow-back-ios":58848,"arrow-circle-down":61825,"arrow-circle-up":61826,"arrow-downward":58843,"arrow-drop-down":58821,"arrow-drop-down-circle":58822,"arrow-drop-up":58823,"arrow-forward":58824,"arrow-forward-ios":58849,"arrow-left":58846,"arrow-right":58847,"arrow-right-alt":59713,"arrow-upward":58840,"art-track":57440,article:61250,"aspect-ratio":59483,assessment:59484,assignment:59485,"assignment-ind":59486,"assignment-late":59487,"assignment-return":59488,"assignment-returned":59489,"assignment-turned-in":59490,assistant:58271,"assistant-direction":59784,"assistant-navigation":59785,"assistant-photo":58272,atm:58739,"attach-email":59998,"attach-file":57894,"attach-money":57895,attachment:58044,attractions:59986,audiotrack:58273,"auto-awesome":58975,"auto-awesome-mosaic":58976,"auto-awesome-motion":58977,"auto-delete":59980,"auto-fix-high":58979,"auto-fix-normal":58980,"auto-fix-off":58981,"auto-stories":58982,autorenew:59491,"av-timer":57371,"baby-changing-station":61851,backpack:61852,backspace:57674,backup:59492,"backup-table":61251,badge:60007,"bakery-dining":59987,ballot:57714,"bar-chart":57963,"batch-prediction":61685,bathtub:59969,"battery-alert":57756,"battery-charging-full":57763,"battery-full":57764,"battery-std":57765,"battery-unknown":57766,"beach-access":60222,bedtime:61252,beenhere:58669,bento:61940,"bike-scooter":61253,biotech:59962,block:57675,"block-flipped":61254,bluetooth:57767,"bluetooth-audio":58895,"bluetooth-connected":57768,"bluetooth-disabled":57769,"bluetooth-searching":57770,"blur-circular":58274,"blur-linear":58275,"blur-off":58276,"blur-on":58277,bolt:59915,book:59493,"book-online":61975,bookmark:59494,"bookmark-border":59495,"bookmark-outline":59495,bookmarks:59787,"border-all":57896,"border-bottom":57897,"border-clear":57898,"border-color":57899,"border-horizontal":57900,"border-inner":57901,"border-left":57902,"border-outer":57903,"border-right":57904,"border-style":57905,"border-top":57906,"border-vertical":57907,"branding-watermark":57451,"breakfast-dining":59988,"brightness-1":58278,"brightness-2":58279,"brightness-3":58280,"brightness-4":58281,"brightness-5":58282,"brightness-6":58283,"brightness-7":58284,"brightness-auto":57771,"brightness-high":57772,"brightness-low":57773,"brightness-medium":57774,"broken-image":58285,"browser-not-supported":61255,"brunch-dining":60019,brush:58286,"bubble-chart":59101,"bug-report":59496,build:59497,"build-circle":61256,"burst-mode":58428,"bus-alert":59791,business:57519,"business-center":60223,cached:59498,cake:59369,calculate:59999,"calendar-today":59701,"calendar-view-day":59702,call:57520,"call-end":57521,"call-made":57522,"call-merge":57523,"call-missed":57524,"call-missed-outgoing":57572,"call-received":57525,"call-split":57526,"call-to-action":57452,camera:58287,"camera-alt":58288,"camera-enhance":59644,"camera-front":58289,"camera-rear":58290,"camera-roll":58291,campaign:61257,cancel:58825,"cancel-presentation":57577,"cancel-schedule-send":59961,"car-rental":59989,"car-repair":59990,"card-giftcard":59638,"card-membership":59639,"card-travel":59640,carpenter:61944,cases:59794,casino:60224,cast:58119,"cast-connected":58120,"cast-for-education":61420,category:58740,celebration:60005,"cell-wifi":57580,"center-focus-strong":58292,"center-focus-weak":58293,"change-history":59499,"charging-station":61853,chat:57527,"chat-bubble":57546,"chat-bubble-outline":57547,check:58826,"check-box":59444,"check-box-outline-blank":59445,"check-circle":59500,"check-circle-outline":59693,checkroom:61854,"chevron-left":58827,"chevron-right":58828,"child-care":60225,"child-friendly":60226,"chrome-reader-mode":59501,circle:61258,"circle-notifications":59796,class:59502,"clean-hands":61983,"cleaning-services":61695,clear:57676,"clear-all":57528,close:58829,"close-fullscreen":61903,"closed-caption":57372,"closed-caption-disabled":61916,"closed-caption-off":59798,cloud:58045,"cloud-circle":58046,"cloud-done":58047,"cloud-download":58048,"cloud-off":58049,"cloud-queue":58050,"cloud-upload":58051,code:59503,collections:58294,"collections-bookmark":58417,"color-lens":58295,colorize:58296,comment:57529,"comment-bank":59982,commute:59712,compare:58297,"compare-arrows":59669,"compass-calibration":58748,compress:59725,computer:58122,"confirmation-num":58936,"confirmation-number":58936,"connect-without-contact":61987,"connected-tv":59800,construction:59964,"contact-mail":57552,"contact-page":61998,"contact-phone":57551,"contact-support":59724,contactless:60017,contacts:57530,"content-copy":57677,"content-cut":57678,"content-paste":57679,"control-camera":57460,"control-point":58298,"control-point-duplicate":58299,copyright:59660,coronavirus:61985,"corporate-fare":61904,countertops:61943,create:57680,"create-new-folder":58060,"credit-card":59504,crop:58302,"crop-16-9":58300,"crop-3-2":58301,"crop-5-4":58303,"crop-7-5":58304,"crop-din":58305,"crop-free":58306,"crop-landscape":58307,"crop-original":58308,"crop-portrait":58309,"crop-rotate":58423,"crop-square":58310,dangerous:59802,dashboard:59505,"dashboard-customize":59803,"data-usage":57775,"date-range":59670,deck:59970,dehaze:58311,delete:59506,"delete-forever":59691,"delete-outline":59694,"delete-sweep":57708,"delivery-dining":60018,"departure-board":58742,description:59507,"design-services":61706,"desktop-access-disabled":59805,"desktop-mac":58123,"desktop-windows":58124,details:58312,"developer-board":58125,"developer-mode":57776,"device-hub":58165,"device-thermostat":57855,"device-unknown":58169,devices:57777,"devices-other":58167,"dialer-sip":57531,dialpad:57532,"dinner-dining":59991,directions:58670,"directions-bike":58671,"directions-boat":58674,"directions-bus":58672,"directions-car":58673,"directions-ferry":58674,"directions-off":61711,"directions-railway":58676,"directions-run":58726,"directions-subway":58675,"directions-train":58676,"directions-transit":58677,"directions-walk":58678,"dirty-lens":61259,"disabled-by-default":62e3,"disc-full":58896,"dnd-forwardslash":58897,dns:59509,"do-not-disturb":58898,"do-not-disturb-alt":58897,"do-not-disturb-off":58947,"do-not-disturb-on":58948,"do-not-step":61855,"do-not-touch":61872,dock:58126,domain:59374,"domain-disabled":57583,"domain-verification":61260,done:59510,"done-all":59511,"done-outline":59695,"donut-large":59671,"donut-small":59672,"double-arrow":59984,drafts:57681,"drag-handle":57949,"drag-indicator":59717,"drive-eta":58899,"drive-file-move":58997,"drive-file-move-outline":59809,"drive-file-rename-outline":59810,"drive-folder-upload":59811,dry:61875,"dry-cleaning":59992,duo:59813,dvr:57778,"dynamic-feed":59924,"dynamic-form":61887,east:61919,eco:59957,edit:58313,"edit-attributes":58744,"edit-location":58728,"edit-off":59728,"edit-road":61261,eject:59643,elderly:61978,"electric-bike":60187,"electric-car":60188,"electric-moped":60189,"electric-rickshaw":60190,"electric-scooter":60191,"electrical-services":61698,elevator:61856,email:57534,"emoji-emotions":59938,"emoji-events":59939,"emoji-flags":59930,"emoji-food-beverage":59931,"emoji-nature":59932,"emoji-objects":59940,"emoji-people":59933,"emoji-symbols":59934,"emoji-transportation":59935,engineering:59965,"enhance-photo-translate":59644,"enhanced-encryption":58943,equalizer:57373,error:57344,"error-outline":57345,escalator:61857,"escalator-warning":61868,euro:59925,"euro-symbol":59686,"ev-station":58733,event:59512,"event-available":58900,"event-busy":58901,"event-note":58902,"event-seat":59651,"exit-to-app":59513,expand:59727,"expand-less":58830,"expand-more":58831,explicit:57374,explore:59514,"explore-off":59816,exposure:58314,"exposure-minus-1":58315,"exposure-minus-2":58316,"exposure-neg-1":58315,"exposure-neg-2":58316,"exposure-plus-1":58317,"exposure-plus-2":58318,"exposure-zero":58319,extension:59515,face:59516,"face-retouching-natural":61262,facebook:62004,"fact-check":61637,"family-restroom":61858,"fast-forward":57375,"fast-rewind":57376,fastfood:58746,favorite:59517,"favorite-border":59518,"favorite-outline":59518,"featured-play-list":57453,"featured-video":57454,feedback:59519,fence:61942,festival:60008,"fiber-dvr":57437,"fiber-manual-record":57441,"fiber-new":57438,"fiber-pin":57450,"fiber-smart-record":57442,"file-copy":57715,"file-download":58052,"file-download-done":59818,"file-present":59918,"file-upload":58054,filter:58323,"filter-1":58320,"filter-2":58321,"filter-3":58322,"filter-4":58324,"filter-5":58325,"filter-6":58326,"filter-7":58327,"filter-8":58328,"filter-9":58329,"filter-9-plus":58330,"filter-alt":61263,"filter-b-and-w":58331,"filter-center-focus":58332,"filter-drama":58333,"filter-frames":58334,"filter-hdr":58335,"filter-list":57682,"filter-list-alt":59726,"filter-none":58336,"filter-tilt-shift":58338,"filter-vintage":58339,"find-in-page":59520,"find-replace":59521,fingerprint:59661,"fire-extinguisher":61912,"fire-hydrant":61859,fireplace:59971,"first-page":58844,"fit-screen":59920,"fitness-center":60227,flag:57683,flaky:61264,flare:58340,"flash-auto":58341,"flash-off":58342,"flash-on":58343,flight:58681,"flight-land":59652,"flight-takeoff":59653,flip:58344,"flip-camera-android":59959,"flip-camera-ios":59960,"flip-to-back":59522,"flip-to-front":59523,folder:58055,"folder-open":58056,"folder-shared":58057,"folder-special":58903,"follow-the-signs":61986,"font-download":57703,"food-bank":61938,"format-align-center":57908,"format-align-justify":57909,"format-align-left":57910,"format-align-right":57911,"format-bold":57912,"format-clear":57913,"format-color-fill":57914,"format-color-reset":57915,"format-color-text":57916,"format-indent-decrease":57917,"format-indent-increase":57918,"format-italic":57919,"format-line-spacing":57920,"format-list-bulleted":57921,"format-list-numbered":57922,"format-list-numbered-rtl":57959,"format-paint":57923,"format-quote":57924,"format-shapes":57950,"format-size":57925,"format-strikethrough":57926,"format-textdirection-l-to-r":57927,"format-textdirection-r-to-l":57928,"format-underline":57929,"format-underlined":57929,forum:57535,forward:57684,"forward-10":57430,"forward-30":57431,"forward-5":57432,"forward-to-inbox":61831,foundation:61952,"free-breakfast":60228,fullscreen:58832,"fullscreen-exit":58833,functions:57930,"g-translate":59687,gamepad:58127,games:57377,gavel:59662,gesture:57685,"get-app":59524,gif:59656,goat:1114109,"golf-course":60229,"gps-fixed":57779,"gps-not-fixed":57780,"gps-off":57781,grade:59525,gradient:58345,grading:59983,grain:58346,"graphic-eq":57784,grass:61957,"grid-off":58347,"grid-on":58348,"grid-view":59824,group:59375,"group-add":59376,"group-work":59526,groups:62003,hail:59825,handyman:61707,hardware:59993,hd:57426,"hdr-enhanced-select":61265,"hdr-off":58349,"hdr-on":58350,"hdr-strong":58353,"hdr-weak":58354,headset:58128,"headset-mic":58129,"headset-off":58170,healing:58355,hearing:57379,"hearing-disabled":61700,height:59926,help:59527,"help-center":61888,"help-outline":59645,"high-quality":57380,highlight:57951,"highlight-alt":61266,"highlight-off":59528,"highlight-remove":59528,history:59529,"history-edu":59966,"history-toggle-off":61821,home:59530,"home-filled":59826,"home-repair-service":61696,"home-work":59913,"horizontal-distribute":57364,"horizontal-rule":61704,"horizontal-split":59719,"hot-tub":60230,hotel:58682,"hourglass-bottom":59996,"hourglass-disabled":61267,"hourglass-empty":59531,"hourglass-full":59532,"hourglass-top":59995,house:59972,"house-siding":61954,"how-to-reg":57716,"how-to-vote":57717,http:59650,https:59533,hvac:61710,icecream:60009,image:58356,"image-aspect-ratio":58357,"image-not-supported":61718,"image-search":58431,"imagesearch-roller":59828,"import-contacts":57568,"import-export":57539,"important-devices":59666,inbox:57686,"indeterminate-check-box":59657,info:59534,"info-outline":59535,input:59536,"insert-chart":57931,"insert-chart-outlined":57962,"insert-comment":57932,"insert-drive-file":57933,"insert-emoticon":57934,"insert-invitation":57935,"insert-link":57936,"insert-photo":57937,insights:61586,"integration-instructions":61268,inventory:57721,"invert-colors":59537,"invert-colors-off":57540,"invert-colors-on":59537,"ios-share":59064,iso:58358,keyboard:58130,"keyboard-arrow-down":58131,"keyboard-arrow-left":58132,"keyboard-arrow-right":58133,"keyboard-arrow-up":58134,"keyboard-backspace":58135,"keyboard-capslock":58136,"keyboard-control":58835,"keyboard-hide":58138,"keyboard-return":58139,"keyboard-tab":58140,"keyboard-voice":58141,"king-bed":59973,kitchen:60231,label:59538,"label-important":59703,"label-important-outline":59720,"label-off":59830,"label-outline":59539,landscape:58359,language:59540,laptop:58142,"laptop-chromebook":58143,"laptop-mac":58144,"laptop-windows":58145,"last-page":58845,launch:59541,layers:58683,"layers-clear":58684,leaderboard:61964,"leak-add":58360,"leak-remove":58361,"leave-bags-at-home":61979,"legend-toggle":61723,lens:58362,"library-add":57390,"library-add-check":59831,"library-books":57391,"library-music":57392,lightbulb:57584,"lightbulb-outline":59663,"line-style":59673,"line-weight":59674,"linear-scale":57952,link:57687,"link-off":57711,"linked-camera":58424,liquor:6e4,list:59542,"list-alt":57582,"live-help":57542,"live-tv":58937,"local-activity":58687,"local-airport":58685,"local-atm":58686,"local-attraction":58687,"local-bar":58688,"local-cafe":58689,"local-car-wash":58690,"local-convenience-store":58691,"local-dining":58710,"local-drink":58692,"local-fire-department":61269,"local-florist":58693,"local-gas-station":58694,"local-grocery-store":58695,"local-hospital":58696,"local-hotel":58697,"local-laundry-service":58698,"local-library":58699,"local-mall":58700,"local-movies":58701,"local-offer":58702,"local-parking":58703,"local-pharmacy":58704,"local-phone":58705,"local-pizza":58706,"local-play":58707,"local-police":61270,"local-post-office":58708,"local-print-shop":58709,"local-printshop":58709,"local-restaurant":58710,"local-see":58711,"local-shipping":58712,"local-taxi":58713,"location-city":59377,"location-disabled":57782,"location-history":58714,"location-off":57543,"location-on":57544,"location-pin":61915,"location-searching":57783,lock:59543,"lock-clock":61271,"lock-open":59544,"lock-outline":59545,login:60023,logout:59834,looks:58364,"looks-3":58363,"looks-4":58365,"looks-5":58366,"looks-6":58367,"looks-one":58368,"looks-two":58369,loop:57384,loupe:58370,"low-priority":57709,loyalty:59546,luggage:62005,"lunch-dining":60001,mail:57688,"mail-outline":57569,map:58715,"maps-ugc":61272,margin:59835,"mark-as-unread":59836,"mark-chat-read":61835,"mark-chat-unread":61833,"mark-email-read":61836,"mark-email-unread":61834,markunread:57689,"markunread-mailbox":59547,masks:61976,maximize:59696,mediation:61351,"medical-services":61705,"meeting-room":60239,memory:58146,menu:58834,"menu-book":59929,"menu-open":59837,"merge-type":57938,message:57545,messenger:57546,"messenger-outline":57547,mic:57385,"mic-external-off":61273,"mic-external-on":61274,"mic-none":57386,"mic-off":57387,microwave:61956,"military-tech":59967,minimize:59697,"miscellaneous-services":61708,"missed-video-call":57459,mms:58904,"mobile-friendly":57856,"mobile-off":57857,"mobile-screen-share":57575,"mode-comment":57939,"mode-edit":57940,"model-training":61647,"monetization-on":57955,money:58749,"money-off":57948,monitor:61275,"monochrome-photos":58371,mood:59378,"mood-bad":59379,moped:60200,more:58905,"more-horiz":58835,"more-time":59997,"more-vert":58836,"motion-photos-off":59840,"motion-photos-on":59841,"motion-photos-pause":61991,"motion-photos-paused":59842,motorcycle:59675,mouse:58147,"move-to-inbox":57704,movie:57388,"movie-creation":58372,"movie-filter":58426,mp:59843,"multiline-chart":59103,"multiple-stop":61881,"multitrack-audio":57784,museum:59958,"music-note":58373,"music-off":58432,"music-video":57443,"my-library-add":57390,"my-library-books":57391,"my-library-music":57392,"my-location":58716,nat:61276,nature:58374,"nature-people":58375,"navigate-before":58376,"navigate-next":58377,navigation:58717,"near-me":58729,"near-me-disabled":61935,"network-cell":57785,"network-check":58944,"network-locked":58906,"network-wifi":57786,"new-releases":57393,"next-plan":61277,"next-week":57706,nfc:57787,"night-shelter":61937,nightlife:60002,"nightlight-round":61278,"nights-stay":59974,"no-backpack":62007,"no-cell":61860,"no-drinks":61861,"no-encryption":58945,"no-flash":61862,"no-food":61863,"no-luggage":62011,"no-meals":61910,"no-meals-ouline":61993,"no-meeting-room":60238,"no-photography":61864,"no-sim":57548,"no-stroller":61871,"no-transfer":61909,north:61920,"north-east":61921,"north-west":61922,"not-accessible":61694,"not-interested":57395,"not-listed-location":58741,"not-started":61649,note:57455,"note-add":59548,notes:57964,"notification-important":57348,notifications:59380,"notifications-active":59383,"notifications-none":59381,"notifications-off":59382,"notifications-on":59383,"notifications-paused":59384,"now-wallpaper":57788,"now-widgets":57789,"offline-bolt":59698,"offline-pin":59658,"offline-share":59845,"ondemand-video":58938,"online-prediction":61675,opacity:59676,"open-in-browser":59549,"open-in-full":61902,"open-in-new":59550,"open-with":59551,outbond:61992,outbox:61279,"outdoor-grill":59975,"outgoing-mail":61650,outlet:61908,"outlined-flag":57710,padding:59848,pages:59385,pageview:59552,palette:58378,"pan-tool":59685,panorama:58379,"panorama-fish-eye":58380,"panorama-fisheye":58380,"panorama-horizontal":58381,"panorama-horizontal-select":61280,"panorama-photosphere":59849,"panorama-photosphere-select":59850,"panorama-vertical":58382,"panorama-vertical-select":61281,"panorama-wide-angle":58383,"panorama-wide-angle-select":61282,park:60003,"party-mode":59386,pause:57396,"pause-circle-filled":57397,"pause-circle-outline":57398,"pause-presentation":57578,payment:59553,payments:61283,"pedal-bike":60201,pending:61284,"pending-actions":61883,people:59387,"people-alt":59937,"people-outline":59388,"perm-camera-mic":59554,"perm-contact-cal":59555,"perm-contact-calendar":59555,"perm-data-setting":59556,"perm-device-info":59557,"perm-device-information":59557,"perm-identity":59558,"perm-media":59559,"perm-phone-msg":59560,"perm-scan-wifi":59561,person:59389,"person-add":59390,"person-add-alt":59981,"person-add-alt-1":61285,"person-add-disabled":59851,"person-outline":59391,"person-pin":58714,"person-pin-circle":58730,"person-remove":61286,"person-remove-alt-1":61287,"person-search":61702,"personal-video":58939,"pest-control":61690,"pest-control-rodent":61693,pets:59677,phone:57549,"phone-android":58148,"phone-bluetooth-speaker":58907,"phone-callback":58953,"phone-disabled":59852,"phone-enabled":59853,"phone-forwarded":58908,"phone-in-talk":58909,"phone-iphone":58149,"phone-locked":58910,"phone-missed":58911,"phone-paused":58912,phonelink:58150,"phonelink-erase":57563,"phonelink-lock":57564,"phonelink-off":58151,"phonelink-ring":57565,"phonelink-setup":57566,photo:58384,"photo-album":58385,"photo-camera":58386,"photo-camera-back":61288,"photo-camera-front":61289,"photo-filter":58427,"photo-library":58387,"photo-size-select-actual":58418,"photo-size-select-large":58419,"photo-size-select-small":58420,"picture-as-pdf":58389,"picture-in-picture":59562,"picture-in-picture-alt":59665,"pie-chart":59076,"pie-chart-outlined":59077,"pin-drop":58718,"pivot-table-chart":59854,place:58719,plagiarism:59994,"play-arrow":57399,"play-circle-fill":57400,"play-circle-filled":57400,"play-circle-outline":57401,"play-disabled":61290,"play-for-work":59654,"playlist-add":57403,"playlist-add-check":57445,"playlist-play":57439,plumbing:61703,"plus-one":59392,"point-of-sale":61822,policy:59927,poll:59393,polymer:59563,pool:60232,"portable-wifi-off":57550,portrait:58390,"post-add":59936,power:58940,"power-input":58166,"power-off":58950,"power-settings-new":59564,"pregnant-woman":59678,"present-to-all":57567,preview:61893,print:59565,"print-disabled":59855,"priority-high":58949,"privacy-tip":61660,psychology:59978,public:59403,"public-off":61898,publish:57941,"published-with-changes":62002,"push-pin":61709,"qr-code":61291,"qr-code-2":57354,"qr-code-scanner":61958,"query-builder":59566,"question-answer":59567,queue:57404,"queue-music":57405,"queue-play-next":57446,"quick-contacts-dialer":57551,"quick-contacts-mail":57552,quickreply:61292,radio:57406,"radio-button-checked":59447,"radio-button-off":59446,"radio-button-on":59447,"radio-button-unchecked":59446,"railway-alert":59857,"ramen-dining":60004,"rate-review":58720,"read-more":61293,receipt:59568,"receipt-long":61294,"recent-actors":57407,recommend:59858,"record-voice-over":59679,redeem:59569,redo:57690,"reduce-capacity":61980,refresh:58837,remove:57691,"remove-circle":57692,"remove-circle-outline":57693,"remove-done":59859,"remove-from-queue":57447,"remove-moderator":59860,"remove-red-eye":58391,"remove-shopping-cart":59688,reorder:59646,repeat:57408,"repeat-on":59862,"repeat-one":57409,"repeat-one-on":59863,replay:57410,"replay-10":57433,"replay-30":57434,"replay-5":57435,"replay-circle-filled":59864,reply:57694,"reply-all":57695,report:57696,"report-off":57712,"report-problem":59570,"request-page":61996,"request-quote":61878,"reset-tv":59865,restaurant:58732,"restaurant-menu":58721,restore:59571,"restore-from-trash":59704,"restore-page":59689,"rice-bowl":61941,"ring-volume":57553,roofing:61953,room:59572,"room-preferences":61880,"room-service":60233,"rotate-90-degrees-ccw":58392,"rotate-left":58393,"rotate-right":58394,"rounded-corner":59680,router:58152,rowing:59681,"rss-feed":57573,rtt:59821,rule:61890,"rule-folder":61897,"run-circle":61295,"rv-hookup":58946,sanitizer:61981,satellite:58722,save:57697,"save-alt":57713,"saved-search":59921,scanner:58153,"scatter-plot":57960,schedule:59573,"schedule-send":59914,school:59404,science:59979,score:57961,"screen-lock-landscape":57790,"screen-lock-portrait":57791,"screen-lock-rotation":57792,"screen-rotation":57793,"screen-search-desktop":61296,"screen-share":57570,sd:59869,"sd-card":58915,"sd-storage":57794,search:59574,"search-off":60022,security:58154,segment:59723,"select-all":57698,"self-improvement":60024,send:57699,"send-and-archive":59916,"send-to-mobile":61532,"sensor-door":61877,"sensor-window":61876,"sentiment-dissatisfied":59409,"sentiment-neutral":59410,"sentiment-satisfied":59411,"sentiment-satisfied-alt":57581,"sentiment-very-dissatisfied":59412,"sentiment-very-satisfied":59413,"set-meal":61930,settings:59576,"settings-applications":59577,"settings-backup-restore":59578,"settings-bluetooth":59579,"settings-brightness":59581,"settings-cell":59580,"settings-display":59581,"settings-ethernet":59582,"settings-input-antenna":59583,"settings-input-component":59584,"settings-input-composite":59585,"settings-input-hdmi":59586,"settings-input-svideo":59587,"settings-overscan":59588,"settings-phone":59589,"settings-power":59590,"settings-remote":59591,"settings-system-daydream":57795,"settings-voice":59592,share:59405,shield:59872,shop:59593,"shop-two":59594,"shopping-bag":61900,"shopping-basket":59595,"shopping-cart":59596,"short-text":57953,"show-chart":59105,shuffle:57411,"shuffle-on":59873,"shutter-speed":58429,sick:61984,"signal-cellular-0-bar":61608,"signal-cellular-4-bar":57800,"signal-cellular-alt":57858,"signal-cellular-connected-no-internet-4-bar":57805,"signal-cellular-no-sim":57806,"signal-cellular-null":57807,"signal-cellular-off":57808,"signal-wifi-0-bar":61616,"signal-wifi-4-bar":57816,"signal-wifi-4-bar-lock":57817,"signal-wifi-off":57818,"sim-card":58155,"sim-card-alert":58916,"single-bed":59976,"skip-next":57412,"skip-previous":57413,slideshow:58395,"slow-motion-video":57448,"smart-button":61889,smartphone:58156,"smoke-free":60234,"smoking-rooms":60235,sms:58917,"sms-failed":58918,"snippet-folder":61895,snooze:57414,soap:61874,sort:57700,"sort-by-alpha":57427,source:61892,south:61923,"south-east":61924,"south-west":61925,spa:60236,"space-bar":57942,speaker:58157,"speaker-group":58158,"speaker-notes":59597,"speaker-notes-off":59690,"speaker-phone":57554,speed:59876,spellcheck:59598,sports:59952,"sports-bar":61939,"sports-baseball":59985,"sports-basketball":59942,"sports-cricket":59943,"sports-esports":59944,"sports-football":59945,"sports-golf":59946,"sports-handball":59955,"sports-hockey":59947,"sports-kabaddi":59956,"sports-mma":59948,"sports-motorsports":59949,"sports-rugby":59950,"sports-soccer":59951,"sports-tennis":59954,"sports-volleyball":59953,"square-foot":59977,"stacked-bar-chart":59878,"stacked-line-chart":61995,stairs:61865,star:59448,"star-border":59450,"star-half":59449,"star-outline":61551,"star-rate":61676,stars:59600,"stay-current-landscape":57555,"stay-current-portrait":57556,"stay-primary-landscape":57557,"stay-primary-portrait":57558,"sticky-note-2":61948,stop:57415,"stop-circle":61297,"stop-screen-share":57571,storage:57819,store:59601,"store-mall-directory":58723,storefront:59922,straighten:58396,stream:59881,streetview:58734,"strikethrough-s":57943,stroller:61870,style:58397,"subdirectory-arrow-left":58841,"subdirectory-arrow-right":58842,subject:59602,subscript:61713,subscriptions:57444,subtitles:57416,"subtitles-off":61298,subway:58735,superscript:61714,"supervised-user-circle":59705,"supervisor-account":59603,support:61299,"support-agent":61666,"surround-sound":57417,"swap-calls":57559,"swap-horiz":59604,"swap-horizontal-circle":59699,"swap-vert":59605,"swap-vert-circle":59606,"swap-vertical-circle":59606,swipe:59884,"switch-account":59885,"switch-camera":58398,"switch-left":61905,"switch-right":61906,"switch-video":58399,sync:58919,"sync-alt":59928,"sync-disabled":58920,"sync-problem":58921,"system-update":58922,"system-update-alt":59607,"system-update-tv":59607,tab:59608,"tab-unselected":59609,"table-chart":57957,"table-rows":61697,"table-view":61886,tablet:58159,"tablet-android":58160,"tablet-mac":58161,tag:59887,"tag-faces":58400,"takeout-dining":60020,"tap-and-play":58923,tapas:61929,"taxi-alert":61300,terrain:58724,"text-fields":57954,"text-format":57701,"text-rotate-up":59706,"text-rotate-vertical":59707,"text-rotation-angledown":59708,"text-rotation-angleup":59709,"text-rotation-down":59710,"text-rotation-none":59711,"text-snippet":61894,textsms:57560,texture:58401,"theater-comedy":60006,theaters:59610,"thumb-down":59611,"thumb-down-alt":59414,"thumb-down-off-alt":59890,"thumb-up":59612,"thumb-up-alt":59415,"thumb-up-off-alt":59891,"thumbs-up-down":59613,"time-to-leave":58924,timelapse:58402,timeline:59682,timer:58405,"timer-10":58403,"timer-3":58404,"timer-off":58406,title:57956,toc:59614,today:59615,"toggle-off":59893,"toggle-on":59894,toll:59616,tonality:58407,topic:61896,"touch-app":59667,tour:61301,toys:58162,"track-changes":59617,traffic:58725,train:58736,tram:58737,"transfer-within-a-station":58738,transform:58408,"transit-enterexit":58745,translate:59618,"trending-down":59619,"trending-flat":59620,"trending-neutral":59620,"trending-up":59621,"trip-origin":58747,tty:61866,tune:58409,"turned-in":59622,"turned-in-not":59623,tv:58163,"tv-off":58951,"two-wheeler":59897,umbrella:61869,unarchive:57705,undo:57702,"unfold-less":58838,"unfold-more":58839,unpublished:62006,unsubscribe:57579,update:59683,"update-disabled":57461,upgrade:61691,"upload-file":59900,usb:57824,verified:61302,"verified-user":59624,"vertical-align-bottom":57944,"vertical-align-center":57945,"vertical-align-top":57946,"vertical-distribute":57462,"vertical-split":59721,vibration:58925,"video-call":57456,"video-collection":57418,"video-label":57457,"video-library":57418,"video-settings":60021,videocam:57419,"videocam-off":57420,"videogame-asset":58168,"view-agenda":59625,"view-array":59626,"view-carousel":59627,"view-column":59628,"view-comfortable":58410,"view-comfy":58410,"view-compact":58411,"view-day":59629,"view-headline":59630,"view-in-ar":59902,"view-list":59631,"view-module":59632,"view-quilt":59633,"view-sidebar":61716,"view-stream":59634,"view-week":59635,vignette:58421,visibility:59636,"visibility-off":59637,"voice-chat":58926,"voice-over-off":59722,voicemail:57561,"volume-down":57421,"volume-mute":57422,"volume-off":57423,"volume-up":57424,"volunteer-activism":60016,"vpn-key":57562,"vpn-lock":58927,"wallet-giftcard":59638,"wallet-membership":59639,"wallet-travel":59640,wallpaper:57788,warning:57346,wash:61873,watch:58164,"watch-later":59684,"water-damage":61955,"waterfall-chart":59904,waves:57718,"wb-auto":58412,"wb-cloudy":58413,"wb-incandescent":58414,"wb-iridescent":58422,"wb-shade":59905,"wb-sunny":58416,"wb-twighlight":59906,wc:58941,web:57425,"web-asset":57449,weekend:57707,west:61926,whatshot:59406,"wheelchair-pickup":61867,"where-to-vote":57719,widgets:57789,wifi:58942,"wifi-calling":61303,"wifi-lock":57825,"wifi-off":58952,"wifi-protected-setup":61692,"wifi-tethering":57826,"wine-bar":61928,work:59641,"work-off":59714,"work-outline":59715,"workspaces-filled":59917,"workspaces-outline":59919,"wrap-text":57947,"wrong-location":61304,wysiwyg:61891,"youtube-searched-for":59642,"zoom-in":59647,"zoom-out":59648,"zoom-out-map":58731}},666,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.getImageSourceSync=e.getImageSource=e.TabBarItemIOS=e.TabBarItem=e.Button=e.default=void 0;var u=t(r(d[1])),c=t(r(d[2])),o=(0,u.default)(c.default,'Octicons','Octicons.ttf'),I=o;e.default=I;var S=o.Button,n=o.TabBarItem,B=o.TabBarItemIOS,b=o.getImageSource,f=o.getImageSourceSync;e.getImageSourceSync=f,e.getImageSource=b,e.TabBarItemIOS=B,e.TabBarItem=n,e.Button=S},667,[1,633,668]); -__d(function(e,r,o,i,l,a,t){l.exports={alert:61696,archive:61697,"arrow-both":61698,"arrow-down":61699,"arrow-left":61700,"arrow-right":61701,"arrow-small-down":61702,"arrow-small-left":61703,"arrow-small-right":61704,"arrow-small-up":61705,"arrow-up":61706,beaker:61707,bell:61708,bold:61709,book:61710,bookmark:61711,briefcase:61712,broadcast:61713,browser:61714,bug:61715,calendar:61716,check:61717,checklist:61718,"chevron-down":61719,"chevron-left":61720,"chevron-right":61721,"chevron-up":61722,"circle-slash":61723,"circuit-board":61724,clippy:61725,clock:61726,"cloud-download":61727,"cloud-upload":61728,code:61729,comment:61730,"comment-discussion":61731,"credit-card":61732,dash:61733,dashboard:61734,database:61735,"desktop-download":61736,"device-camera":61737,"device-camera-video":61738,"device-desktop":61739,"device-mobile":61740,diff:61741,"diff-added":61742,"diff-ignored":61743,"diff-modified":61744,"diff-removed":61745,"diff-renamed":61746,ellipsis:61747,eye:61748,"eye-closed":61749,file:61750,"file-binary":61751,"file-code":61752,"file-directory":61753,"file-media":61754,"file-pdf":61755,"file-submodule":61756,"file-symlink-directory":61757,"file-symlink-file":61758,"file-zip":61759,flame:61760,fold:61761,"fold-down":61762,"fold-up":61763,gear:61764,gift:61765,gist:61766,"gist-secret":61767,"git-branch":61768,"git-commit":61769,"git-compare":61770,"git-merge":61771,"git-pull-request":61772,"github-action":61773,globe:61774,grabber:61775,graph:61776,heart:61777,history:61778,home:61779,"horizontal-rule":61780,hubot:61781,inbox:61782,info:61783,"issue-closed":61784,"issue-opened":61785,"issue-reopened":61786,italic:61787,jersey:61788,"kebab-horizontal":61789,"kebab-vertical":61790,key:61791,keyboard:61792,law:61793,"light-bulb":61794,link:61795,"link-external":61796,"list-ordered":61797,"list-unordered":61798,location:61799,lock:61800,"logo-gist":61801,"logo-github":61802,mail:61803,"mail-read":61804,"mark-github":61805,markdown:61806,megaphone:61807,mention:61808,milestone:61809,mirror:61810,"mortar-board":61811,mute:61812,"no-newline":61813,note:61814,octoface:61815,organization:61816,package:61817,paintcan:61818,pencil:61819,person:61820,pin:61821,play:61822,plug:61823,plus:61824,"plus-small":61825,"primitive-dot":61826,"primitive-square":61827,project:61828,pulse:61829,question:61830,quote:61831,"radio-tower":61832,reply:61833,repo:61834,"repo-clone":61835,"repo-force-push":61836,"repo-forked":61837,"repo-pull":61838,"repo-push":61839,report:61840,"request-changes":61841,rocket:61842,rss:61843,ruby:61844,"screen-full":61845,"screen-normal":61846,search:61847,server:61848,settings:61849,shield:61850,"sign-in":61851,"sign-out":61852,smiley:61853,squirrel:61854,star:61855,stop:61856,sync:61857,tag:61858,tasklist:61859,telescope:61860,terminal:61861,"text-size":61862,"three-bars":61863,thumbsdown:61864,thumbsup:61865,tools:61866,trashcan:61867,"triangle-down":61868,"triangle-left":61869,"triangle-right":61870,"triangle-up":61871,unfold:61872,unmute:61873,unverified:61874,verified:61875,versions:61876,watch:61877,x:61878,zap:61879}},668,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.getImageSourceSync=e.getImageSource=e.TabBarItemIOS=e.TabBarItem=e.Button=e.default=void 0;var u=t(r(d[1])),I=t(r(d[2])),o=(0,u.default)(I.default,'simple-line-icons','SimpleLineIcons.ttf'),c=o;e.default=c;var n=o.Button,S=o.TabBarItem,l=o.TabBarItemIOS,B=o.getImageSource,b=o.getImageSourceSync;e.getImageSourceSync=b,e.getImageSource=B,e.TabBarItemIOS=l,e.TabBarItem=S,e.Button=n},669,[1,633,670]); -__d(function(e,o,l,a,r,c,i){r.exports={user:57349,people:57345,"user-female":57344,"user-follow":57346,"user-following":57347,"user-unfollow":57348,login:57446,logout:57445,emotsmile:57377,phone:58880,"call-end":57416,"call-in":57415,"call-out":57414,map:57395,"location-pin":57494,direction:57410,directions:57409,compass:57413,layers:57396,menu:58881,list:57447,"options-vertical":58882,options:58883,"arrow-down":58884,"arrow-left":58885,"arrow-right":58886,"arrow-up":58887,"arrow-up-circle":57464,"arrow-left-circle":57466,"arrow-right-circle":57465,"arrow-down-circle":57467,check:57472,clock:57473,plus:57493,minus:58901,close:57474,event:58905,exclamation:58903,organization:58902,trophy:57350,"screen-smartphone":57360,"screen-desktop":57361,plane:57362,notebook:57363,mustache:57364,mouse:57365,magnet:57366,energy:57376,disc:57378,cursor:57454,"cursor-move":57379,crop:57380,chemistry:57382,speedometer:57351,shield:57358,"screen-tablet":57359,"magic-wand":57367,hourglass:57368,graduation:57369,ghost:57370,"game-controller":57371,fire:57372,eyeglass:57373,"envelope-open":57374,"envelope-letter":57375,bell:57383,badge:57384,anchor:57385,wallet:57386,vector:57387,speech:57388,puzzle:57389,printer:57390,present:57391,playlist:57392,pin:57393,picture:57394,handbag:57397,"globe-alt":57398,globe:57399,"folder-alt":57401,folder:57481,film:57402,feed:57403,drop:57406,drawer:57407,docs:57408,doc:57477,diamond:57411,cup:57412,calculator:57417,bubbles:57418,briefcase:57419,"book-open":57420,"basket-loaded":57421,basket:57422,bag:57423,"action-undo":57424,"action-redo":57425,wrench:57426,umbrella:57427,trash:57428,tag:57429,support:57430,frame:57400,"size-fullscreen":57431,"size-actual":57432,shuffle:57433,"share-alt":57434,share:57435,rocket:57436,question:57437,"pie-chart":57438,pencil:57439,note:57440,loop:57444,home:57449,grid:57450,graph:57451,microphone:57443,"music-tone-alt":57441,"music-tone":57442,"earphones-alt":57404,earphones:57405,equalizer:57452,like:57448,dislike:57453,"control-start":57455,"control-rewind":57456,"control-play":57457,"control-pause":57458,"control-forward":57459,"control-end":57460,"volume-1":57503,"volume-2":57504,"volume-off":57505,calendar:57461,bulb:57462,chart:57463,ban:57468,bubble:57469,camrecorder:57470,camera:57471,"cloud-download":57475,"cloud-upload":57476,envelope:57478,eye:57479,flag:57480,heart:57482,info:57483,key:57484,link:57485,lock:57486,"lock-open":57487,magnifier:57488,"magnifier-add":57489,"magnifier-remove":57490,"paper-clip":57491,"paper-plane":57492,power:57495,refresh:57496,reload:57497,settings:57498,star:57499,"symbol-female":57500,"symbol-male":57501,target:57502,"credit-card":57381,paypal:58888,"social-tumblr":57354,"social-twitter":57353,"social-facebook":57355,"social-instagram":58889,"social-linkedin":58890,"social-pinterest":58891,"social-github":58892,"social-google":58893,"social-reddit":58894,"social-skype":58895,"social-dribbble":57357,"social-behance":58896,"social-foursqare":58897,"social-soundcloud":58898,"social-spotify":58899,"social-stumbleupon":58900,"social-youtube":57352,"social-dropbox":57356,"social-vkontakte":58904,"social-steam":58912}},670,[]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.getImageSourceSync=e.getImageSource=e.TabBarItemIOS=e.TabBarItem=e.Button=e.default=void 0;var u=t(r(d[1])),o=t(r(d[2])),I=(0,u.default)(o.default,'zocial','Zocial.ttf'),c=I;e.default=c;var S=I.Button,n=I.TabBarItem,B=I.TabBarItemIOS,l=I.getImageSource,b=I.getImageSourceSync;e.getImageSourceSync=b,e.getImageSource=l,e.TabBarItemIOS=B,e.TabBarItem=n,e.Button=S},671,[1,633,672]); -__d(function(e,o,t,a,i,s,r){i.exports={acrobat:61696,amazon:61697,android:61698,angellist:61699,aol:61700,appnet:61701,appstore:61702,bitbucket:61703,bitcoin:61704,blogger:61705,buffer:61706,cal:61707,call:61708,cart:61709,chrome:61710,cloudapp:61711,creativecommons:61712,delicious:61713,digg:61714,disqus:61715,dribbble:61716,dropbox:61717,drupal:61718,dwolla:61720,email:61721,eventasaurus:61722,eventbrite:61723,eventful:61724,evernote:61725,facebook:61726,fivehundredpx:61727,flattr:61728,flickr:61729,forrst:61730,foursquare:61731,github:61732,gmail:61733,google:61734,googleplay:61735,googleplus:61736,gowalla:61737,grooveshark:61738,guest:61739,html5:61740,ie:61741,instagram:61742,instapaper:61743,intensedebate:61744,itunes:61745,klout:61746,lanyrd:61747,lastfm:61748,lego:61749,linkedin:61750,lkdto:61751,logmein:61752,macstore:61753,meetup:61754,myspace:61755,ninetyninedesigns:61756,openid:61757,opentable:61758,paypal:61759,persona:61796,pinboard:61760,pinterest:61761,plancast:61762,plurk:61763,pocket:61764,podcast:61765,posterous:61766,print:61767,quora:61768,reddit:61769,rss:61770,scribd:61771,skype:61772,smashing:61773,songkick:61774,soundcloud:61775,spotify:61776,stackoverflow:61777,statusnet:61778,steam:61779,stripe:61780,stumbleupon:61781,tumblr:61782,twitter:61783,viadeo:61784,vimeo:61785,vk:61786,weibo:61787,wikipedia:61788,windows:61789,wordpress:61790,xing:61791,yahoo:61792,ycombinator:61793,yelp:61794,youtube:61795}},672,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.Icon=void 0;var t=Object.assign||function(t){for(var o=1;o=0||Object.prototype.hasOwnProperty.call(t,s)&&(n[s]=t[s]);return n}function S(t,o){if(!(t instanceof o))throw new TypeError("Cannot call a class as a function")}function _(t,o){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!o||"object"!=typeof o&&"function"!=typeof o?t:o}function k(t,o){if("function"!=typeof o&&null!==o)throw new TypeError("Super expression must either be null or a function, not "+typeof o);t.prototype=Object.create(o&&o.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),o&&(Object.setPrototypeOf?Object.setPrototypeOf(t,o):t.__proto__=o)}var w='absolute',x='bottom',O='top',V=(function(c){function y(t){S(this,y);var o=_(this,(y.__proto__||Object.getPrototypeOf(y)).call(this,t));return o.closeModal=function(t){o.setState({modalVisible:!1});var n=o.state.onClose;n&&'function'==typeof n&&n(t)},o.state={fadeAnim:new l.Animated.Value(0),pan:new l.Animated.ValueXY({x:0,y:0}),keyboardHeight:0,isKeyboardVisible:!1,modalVisible:!1},o.keyboardDidHide=o.keyboardDidHide.bind(o),o.keyboardDidShow=o.keyboardDidShow.bind(o),o._panResponder=l.PanResponder.create({onMoveShouldSetPanResponderCapture:function(){return!0},onPanResponderRelease:function(t,n){var s=n.dx;0!==s&&l.Animated.timing(o.state.pan,{toValue:{x:s,y:0},duration:100}).start(function(){return o.closeToast('swipe')})}}),o}return k(y,s.Component),n(y,null,[{key:'show',value:function(t){var o=T(t,[]);this.toastInstance._root.showToast({config:o})}},{key:'hide',value:function(){this.toastInstance._root.getModalState()&&this.toastInstance._root.closeToast('functionCall')}}]),n(y,[{key:'componentDidMount',value:function(){l.Keyboard.addListener('keyboardDidShow',this.keyboardDidShow),l.Keyboard.addListener('keyboardDidHide',this.keyboardDidHide)}},{key:'getToastStyle',value:function(){return{position:w,opacity:this.state.fadeAnim,width:'100%',elevation:9,paddingHorizontal:l.Platform.OS===f.PLATFORM.IOS?20:0,top:this.state.position===O?30:void 0,bottom:this.state.position===x?this.getTop():void 0}}},{key:'getTop',value:function(){return l.Platform.OS===f.PLATFORM.IOS?this.state.isKeyboardVisible?this.state.keyboardHeight:30:0}},{key:'getButtonText',value:function(t){if(t){if(0===t.trim().length)return;return t}}},{key:'getModalState',value:function(){return this.state.modalVisible}},{key:'keyboardDidHide',value:function(){this.setState({keyboardHeight:0,isKeyboardVisible:!1})}},{key:'keyboardDidShow',value:function(t){this.setState({keyboardHeight:t.endCoordinates.height,isKeyboardVisible:!0})}},{key:'showToast',value:function(t){var o=t.config;if(this.setState({modalVisible:!0,text:o.text,buttonText:this.getButtonText(o.buttonText),type:o.type,position:o.position?o.position:x,supportedOrientations:o.supportedOrientations,style:o.style,buttonTextStyle:o.buttonTextStyle,buttonStyle:o.buttonStyle,textStyle:o.textStyle,onClose:o.onClose}),this.closeTimeout&&clearTimeout(this.closeTimeout),0!==o.duration){var n=o.duration>0?o.duration:1500;this.closeTimeout=setTimeout(this.closeToast.bind(this,'timeout'),n)}l.Animated.timing(this.state.fadeAnim,{toValue:1,duration:200,useNativeDriver:!1}).start()}},{key:'closeToast',value:function(t){var o=this;clearTimeout(this.closeTimeout),l.Animated.timing(this.state.fadeAnim,{toValue:0,duration:200,useNativeDriver:!1}).start(function(){o.closeModal(t),o.state.pan.setValue({x:0,y:0})})}},{key:'render',value:function(){var n=this;if(this.state.modalVisible){var s=this.state.pan,c=s.x,y=s.y;return u.default.createElement(l.Animated.View,t({},this._panResponder.panHandlers,{style:[this.getToastStyle(),{transform:[{translateX:c},{translateY:y}]}],__source:{fileName:o,lineNumber:175}}),u.default.createElement(p.Toast,{style:[this.state.style],danger:'danger'===this.state.type,success:'success'===this.state.type,warning:'warning'===this.state.type,__source:{fileName:o,lineNumber:182}},u.default.createElement(h.Text,{style:this.state.textStyle,__source:{fileName:o,lineNumber:188}},this.state.text),this.state.buttonText&&u.default.createElement(b.Button,{style:this.state.buttonStyle,onPress:function(){return n.closeToast('user')},__source:{fileName:o,lineNumber:190}},u.default.createElement(h.Text,{style:this.state.buttonTextStyle,__source:{fileName:o,lineNumber:194}},this.state.buttonText))))}return null}}]),y})();V.propTypes=t({},l.ViewPropTypes);var P=(0,c.connectStyle)('NativeBase.ToastContainer',{},y.default)(V);e.ToastContainer=P},697,[47,2,538,619,575,624,626,698]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.Toast=void 0;var t=Object.assign||function(t){for(var n=1;n1&&void 0!==arguments[1]?arguments[1]:{},R=(0,b.default)({},I,H);return _=w=(function(b){function I(o){var t;(0,s.default)(this,I),(t=(0,u.default)(this,(0,p.default)(I).call(this,o))).getScrollResponder=function(){return t._rnkasv_keyboardView&&t._rnkasv_keyboardView.getScrollResponder&&t._rnkasv_keyboardView.getScrollResponder()},t.scrollToPosition=function(o,n){var l=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],s=t.getScrollResponder();s&&s.scrollResponderScrollTo({x:o,y:n,animated:l})},t.scrollToEnd=function(){var o=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],n=t.getScrollResponder();n&&n.scrollResponderScrollToEnd({animated:o})},t.scrollForExtraHeightOnAndroid=function(o){t.scrollToPosition(0,t.position.y+o,!0)},t.scrollToFocusedInput=function(o,n,l){void 0===n&&(n=t.props.extraHeight||0),void 0===l&&(l=t.props.keyboardOpeningTime||0),setTimeout(function(){if(t.mountedComponent){var l=t.getScrollResponder();l&&l.scrollResponderScrollNativeHandleToKeyboard(o,n,!0)}},l)},t.scrollIntoView=function(o){var s,c,u,p,h,f,b,S,y,v,k=arguments;return n.default.async(function(T){for(;;)switch(T.prev=T.next){case 0:if(s=k.length>1&&void 0!==k[1]?k[1]:{},t._rnkasv_keyboardView&&o){T.next=3;break}return T.abrupt("return");case 3:return T.next=5,n.default.awrap(Promise.all([t._measureElement(t._rnkasv_keyboardView),t._measureElement(o)]));case 5:c=T.sent,u=(0,l.default)(c,2),p=u[0],h=u[1],f=s.getScrollPosition||t._defaultGetScrollPosition,b=f(p,h,t.position),S=b.x,y=b.y,v=b.animated,t.scrollToPosition(S,y,v);case 12:case"end":return T.stop()}},null,this)},t._defaultGetScrollPosition=function(o,t,n){return{x:0,y:Math.max(0,t.y-o.y+n.y),animated:!0}},t._measureElement=function(o){var t=(0,y.findNodeHandle)(o);return new Promise(function(o){y.UIManager.measureInWindow(t,function(t,n,l,s){o({x:t,y:n,width:l,height:s})})})},t._updateKeyboardSpace=function(o){if(t.props.enableAutomaticScroll){var n=o.endCoordinates.height+t.props.extraScrollHeight;t.props.viewIsInsideTabBar&&(n-=v),t.setState({keyboardSpace:n});var l=y.TextInput.State.currentlyFocusedField(),s=t.getScrollResponder();if(!l||!s)return;y.UIManager.viewIsDescendantOf(l,s.getInnerViewNode(),function(s){s&&y.UIManager.measureInWindow(l,function(s,c,u,p){var h=c+p,f=o.endCoordinates.screenY,b=t.props.extraScrollHeight+t.props.extraHeight;'ios'===y.Platform.OS?h>f-b&&t._scrollToFocusedInputWithNodeHandle(l):h>f?(n-=h-f,t.setState({keyboardSpace:n}),t.scrollForExtraHeightOnAndroid(b)):h>f-b&&t.scrollForExtraHeightOnAndroid(b-(f-h))})})}t.props.resetScrollToCoords||t.defaultResetScrollToCoords||(t.defaultResetScrollToCoords=t.position)},t._resetKeyboardSpace=function(){var o=t.props.viewIsInsideTabBar?v:0;t.setState({keyboardSpace:o}),!1!==t.props.enableResetScrollToCoords?t.props.resetScrollToCoords?t.scrollToPosition(t.props.resetScrollToCoords.x,t.props.resetScrollToCoords.y,!0):t.defaultResetScrollToCoords?(t.scrollToPosition(t.defaultResetScrollToCoords.x,t.defaultResetScrollToCoords.y,!0),t.defaultResetScrollToCoords=null):t.scrollToPosition(0,0,!0):t.defaultResetScrollToCoords=null},t._scrollToFocusedInputWithNodeHandle=function(o,n,l){void 0===n&&(n=t.props.extraHeight);var s=(0,y.findNodeHandle)(o);t.scrollToFocusedInput(s,n+t.props.extraScrollHeight,void 0!==l?l:t.props.keyboardOpeningTime||0)},t._handleOnScroll=function(o){t.position=o.nativeEvent.contentOffset},t._handleRef=function(o){t._rnkasv_keyboardView=o?R.extractNativeRef(o):o,t.props.innerRef&&t.props.innerRef(t._rnkasv_keyboardView)},t.update=function(){var o=y.TextInput.State.currentlyFocusedField(),n=t.getScrollResponder();o&&n&&t._scrollToFocusedInputWithNodeHandle(o)},t.keyboardWillShowEvent=void 0,t.keyboardWillHideEvent=void 0,t.callbacks={},t.position={x:0,y:0},t.defaultResetScrollToCoords=null;var c=o.viewIsInsideTabBar?v:0;return t.state={keyboardSpace:c},t}return(0,h.default)(I,b),(0,c.default)(I,[{key:"componentDidMount",value:function(){var o=this;this.mountedComponent=!0,'ios'===y.Platform.OS?(this.keyboardWillShowEvent=y.Keyboard.addListener('keyboardWillShow',this._updateKeyboardSpace),this.keyboardWillHideEvent=y.Keyboard.addListener('keyboardWillHide',this._resetKeyboardSpace)):'android'===y.Platform.OS&&this.props.enableOnAndroid&&(this.keyboardWillShowEvent=y.Keyboard.addListener('keyboardDidShow',this._updateKeyboardSpace),this.keyboardWillHideEvent=y.Keyboard.addListener('keyboardDidHide',this._resetKeyboardSpace)),k.forEach(function(t){var n=T(t);o.props[n]&&(o.callbacks[t]=y.Keyboard.addListener(t,o.props[n]))})}},{key:"componentDidUpdate",value:function(o){if(this.props.viewIsInsideTabBar!==o.viewIsInsideTabBar){var t=this.props.viewIsInsideTabBar?v:0;this.state.keyboardSpace!==t&&this.setState({keyboardSpace:t})}}},{key:"componentWillUnmount",value:function(){this.mountedComponent=!1,this.keyboardWillShowEvent&&this.keyboardWillShowEvent.remove(),this.keyboardWillHideEvent&&this.keyboardWillHideEvent.remove(),Object.values(this.callbacks).forEach(function(o){return o.remove()})}},{key:"render",value:function(){var n,l=this.props,s=l.enableOnAndroid,c=l.contentContainerStyle,u=l.onScroll;'android'===y.Platform.OS&&s&&(n=[].concat(c).concat({paddingBottom:((c||{}).paddingBottom||0)+this.state.keyboardSpace}));var p=(0,f.default)({},R.refPropName,this._handleRef);return S.default.createElement(o,(0,t.default)({},p,{keyboardDismissMode:"interactive",contentInset:{bottom:this.state.keyboardSpace},automaticallyAdjustContentInsets:!1,showsVerticalScrollIndicator:!0,scrollEventThrottle:1},this.props,{contentContainerStyle:n||c,keyboardSpace:this.state.keyboardSpace,getScrollResponder:this.getScrollResponder,scrollToPosition:this.scrollToPosition,scrollToEnd:this.scrollToEnd,scrollForExtraHeightOnAndroid:this.scrollForExtraHeightOnAndroid,scrollToFocusedInput:this.scrollToFocusedInput,scrollIntoView:this.scrollIntoView,resetKeyboardSpace:this._resetKeyboardSpace,handleOnScroll:this._handleOnScroll,update:this.update,onScroll:y.Animated.forkEvent(u,this._handleOnScroll)}))}}]),I})(S.default.Component),w.displayName="KeyboardAware"+((x=o)&&(x.displayName||x.name)||'Component'),w.defaultProps={enableAutomaticScroll:R.enableAutomaticScroll,extraHeight:R.extraHeight,extraScrollHeight:R.extraScrollHeight,enableResetScrollToCoords:R.enableResetScrollToCoords,keyboardOpeningTime:R.keyboardOpeningTime,viewIsInsideTabBar:R.viewIsInsideTabBar,enableOnAndroid:R.enableOnAndroid},_}var _=function(o){return'object'!=typeof o||o.displayName?w(o):function(t){return w(t,o)}};e.default=_},702,[1,8,139,9,19,20,27,30,33,45,44,47,2,703]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.isIphoneX=n,e.ifIphoneX=o,e.getStatusBarHeight=function(n){return t.Platform.select({ios:o(n?44:30,20),android:t.StatusBar.currentHeight,default:0})},e.getBottomSpace=function(){return n()?34:0};var t=r(d[0]);function n(){var n=t.Dimensions.get('window');return!('ios'!==t.Platform.OS||t.Platform.isPad||t.Platform.isTVOS||812!==n.height&&812!==n.width&&896!==n.height&&896!==n.width)}function o(t,o){return n()?t:o}},703,[2]); -__d(function(g,r,i,a,m,e,d){var l=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=r(d[1]),u=(0,l(r(d[2])).default)(t.ScrollView);e.default=u},704,[1,2,702]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=r(d[1]),u=(0,t(r(d[2])).default)(l.FlatList);e.default=u},705,[1,2,702]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var u=r(d[1]),f=(0,t(r(d[2])).default)(u.SectionList);e.default=f},706,[1,2,702]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.Footer=void 0;var t=Object.assign||function(t){for(var o=1;o5},onPanResponderGrant:function(){t.state.pan.setOffset({x:t.state.pan.x._value,y:t.state.pan.y._value}),t.state.pan.setValue({x:0,y:0})},onPanResponderMove:function(n,s){s.dx>20?t.props.onSwiping&&t.props.onSwiping('right',s.dx):s.dx<-20&&t.props.onSwiping&&t.props.onSwiping('left',s.dx);var o=Math.abs(.0013*s.dx);o>.2&&(o=.2),u.Animated.timing(t.state.fadeAnim,{toValue:.8+o,useNativeDriver:!1}).start(),u.Animated.spring(t.state.enter,{toValue:.8+o,friction:7,useNativeDriver:!1}).start(),u.Animated.event([null,{dx:t.state.pan.x}],{useNativeDriver:!1})(n,s)},onPanResponderRelease:function(n,s){var o=s.vx,l=s.vy;t.props.onSwiping&&t.props.onSwiping(null);var p=void 0;o>=0?p=(0,c.default)(o,4.5,10):o<0&&(p=-1*(0,c.default)(-1*o,4.5,10)),Math.abs(t.state.pan.x._value)>120?(p>0?(t.props.onSwipeRight&&t.props.onSwipeRight(t.state.selectedItem),t.selectNext()):(t.props.onSwipeLeft&&t.props.onSwipeLeft(t.state.selectedItem),t.selectNext()),u.Animated.decay(t.state.pan,{velocity:{x:p,y:l},deceleration:.98}).start(t._resetState.bind(t))):u.Animated.spring(t.state.pan,{toValue:{x:0,y:0},friction:4,useNativeDriver:!1}).start()}})}},{key:'_resetState',value:function(){this.state.pan.setValue({x:0,y:0}),this.state.enter.setValue(.8),this.state.fadeAnim.setValue(.8),this.setState({card1Top:!this.state.card1Top,card2Top:!this.state.card2Top}),this.props.onSwiping&&this.props.onSwiping(null)}},{key:'swipeRight',value:function(){var t=this;this.props.onSwiping&&this.props.onSwiping('right'),setTimeout(function(){u.Animated.timing(t.state.fadeAnim,{toValue:1,useNativeDriver:!1}).start(),u.Animated.spring(t.state.enter,{toValue:1,friction:7,useNativeDriver:!1}).start(),t.selectNext(),u.Animated.decay(t.state.pan,{velocity:{x:8,y:1},deceleration:.98}).start(t._resetState.bind(t))},300)}},{key:'swipeLeft',value:function(){var t=this;this.props.onSwiping&&this.props.onSwiping('left'),setTimeout(function(){u.Animated.timing(t.state.fadeAnim,{toValue:1,useNativeDriver:!1}).start(),u.Animated.spring(t.state.enter,{toValue:1,friction:7,useNativeDriver:!1}).start(),t.selectNext(),u.Animated.decay(t.state.pan,{velocity:{x:-8,y:1},deceleration:.98}).start(t._resetState.bind(t))},300)}},{key:'selectNext',value:function(){var t=this,n=this.props.dataSource,s=n.indexOf(this.state.selectedItem);if(!this.state.looping){if(s===n.length-1)return this.setState({disabled:!0});if(s===n.length-2)return setTimeout(function(){t.setState({selectedItem:n[s+1]}),setTimeout(function(){t.setState({lastCard:!0})},350)},50)}var o=this.findNextIndexes(s);return setTimeout(function(){t.setState({selectedItem:t.props.dataSource[o[0]]}),setTimeout(function(){t.setState({selectedItem2:t.props.dataSource[o[1]]})},350)},50),null}},{key:'findNextIndexes',value:function(t){var n=t+1,s=t+2;return s>this.props.dataSource.length-1&&n===this.props.dataSource.length-1?[n,0]:n>this.props.dataSource.length-1?[0,1]:[n,s]}},{key:'render',value:function(){return this.state.disabled?l.default.createElement(u.View,{style:{position:'relative',flexDirection:'column'},__source:{fileName:t,lineNumber:263}},l.default.createElement(u.View,{__source:{fileName:t,lineNumber:264}},this.props.renderEmpty&&this.props.renderEmpty())):this.state.lastCard?l.default.createElement(u.View,{style:{position:'relative',flexDirection:'column'},__source:{fileName:t,lineNumber:270}},void 0===this.state.selectedItem?l.default.createElement(u.View,{__source:{fileName:t,lineNumber:272}}):l.default.createElement(u.View,{__source:{fileName:t,lineNumber:274}},l.default.createElement(u.Animated.View,n({style:[this.getCardStyles()[1],this.getInitialStyle().topCard,{opacity:this.state.fadeAnim}]},this._panResponder.panHandlers,{__source:{fileName:t,lineNumber:275}}),this.props.renderEmpty&&this.props.renderEmpty()),l.default.createElement(u.Animated.View,n({style:[this.getCardStyles()[0],this.getInitialStyle().topCard]},this._panResponder.panHandlers,{__source:{fileName:t,lineNumber:285}}),this.props.renderItem(this.state.selectedItem)))):l.default.createElement(u.View,{style:{position:'relative',flexDirection:'column'},__source:{fileName:t,lineNumber:300}},void 0===this.state.selectedItem?l.default.createElement(u.View,{__source:{fileName:t,lineNumber:302}}):l.default.createElement(u.View,{__source:{fileName:t,lineNumber:304}},l.default.createElement(u.Animated.View,n({style:[this.getCardStyles()[1],this.getInitialStyle().topCard,{opacity:this.state.fadeAnim}]},this._panResponder.panHandlers,{__source:{fileName:t,lineNumber:305}}),this.props.renderBottom?this.props.renderBottom(this.state.selectedItem2):this.props.renderItem(this.state.selectedItem2)),l.default.createElement(u.Animated.View,n({style:[this.getCardStyles()[0],this.getInitialStyle().topCard]},this._panResponder.panHandlers,{__source:{fileName:t,lineNumber:317}}),this.props.renderTop?this.props.renderTop(this.state.selectedItem):this.props.renderItem(this.state.selectedItem))))}}]),f})();w.propTypes=n({},u.ViewPropTypes,{style:p.default.oneOfType([p.default.object,p.default.number,p.default.array]),dataSource:p.default.array});var b=(0,f.connectStyle)('NativeBase.DeckSwiper',{},h.default)(w);e.DeckSwiper=b},713,[47,59,2,714,538,619]); -__d(function(g,r,i,a,m,e,d){m.exports=function(n,t,o){return to?o:n:nt?t:n}},714,[]); -__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.Item=void 0;var t=Object.assign||function(t){for(var n=1;n=0&&t.page!==this.state.currentPage&&this.goToPage(t.page)},goToPage:function(t){var n=t*this.state.containerWidth;this.scrollView&&this.scrollView.scrollTo({x:n,y:0,animated:!this.props.scrollWithoutAnimation});var o=this.state.currentPage;this.updateSceneKeys({page:t,callback:this._onChangeTab.bind(this,o,t)})},renderTabBar:function(o){return!1===this.props.renderTabBar?null:this.props.renderTabBar?h.cloneElement(this.props.renderTabBar(o),o):h.createElement(P,t({},o,{__source:{fileName:n,lineNumber:129}}))},updateSceneKeys:function(t){var n=t.page,o=t.children,s=void 0===o?this.props.children:o,l=t.callback,c=void 0===l?function(){}:l,u=this.newSceneKeys({previousKeys:this.state.sceneKeys,currentPage:n,children:s});this.setState({currentPage:n,sceneKeys:u},c)},newSceneKeys:function(t){var n=this,o=t.previousKeys,s=void 0===o?[]:o,l=t.currentPage,c=void 0===l?0:l,u=t.children,p=void 0===u?this.props.children:u,h=[];return this._children(p).forEach(function(t,o){var l=n._makeSceneKey(t,o);(n._keyExists(s,l)||n._shouldRenderSceneKey(o,c))&&h.push(l)}),h},_shouldRenderSceneKey:function(t,n){var o=this.props.prerenderingSiblingsNumber;return tn-o-1},_keyExists:function(t,n){return t.find(function(t){return n===t})},_makeSceneKey:function(t,n){return t.props.heading+'_'+n},renderScrollableContent:function(){var o=this,s=this._composeScenes();return h.createElement(v,t({horizontal:!0,pagingEnabled:!0,automaticallyAdjustContentInsets:!1,keyboardShouldPersistTaps:'handled',contentOffset:{x:this.props.initialPage*this.state.containerWidth},ref:function(t){o.scrollView=t},onScroll:function(t){var n=t.nativeEvent.contentOffset.x;o._updateScrollValue(n/o.state.containerWidth)},onMomentumScrollBegin:this._onMomentumScrollBeginAndEnd,onMomentumScrollEnd:this._onMomentumScrollBeginAndEnd,scrollEventThrottle:16,scrollsToTop:!1,showsHorizontalScrollIndicator:!1,scrollEnabled:!this.props.locked,directionalLockEnabled:!0,alwaysBounceVertical:!1,keyboardDismissMode:'on-drag'},this.props.contentProps,{__source:{fileName:n,lineNumber:182}}),s)},_composeScenes:function(){var t=this;return this._children().map(function(o,s){var l=t._makeSceneKey(o,s);return h.createElement(_,{key:o.key,shouldUpdated:t._shouldRenderSceneKey(s,t.state.currentPage),style:{width:t.state.containerWidth},__source:{fileName:n,lineNumber:217}},t._keyExists(t.state.sceneKeys,l)?o:h.createElement(y,{heading:o.props.heading,__source:{fileName:n,lineNumber:228}}))})},_onMomentumScrollBeginAndEnd:function(t){var n=t.nativeEvent.contentOffset.x,o=Math.round(n/this.state.containerWidth);this.state.currentPage!==o&&this._updateSelectedPage(o)},_updateSelectedPage:function(t){var n=t;'object'==typeof n&&(n=t.nativeEvent.position);var o=this.state.currentPage;this.updateSceneKeys({page:n,callback:this._onChangeTab.bind(this,o,n)})},_onChangeTab:function(t,n){this.props.onChangeTab({i:n,ref:this._children()[n],from:t})},_updateScrollValue:function(t){this.state.scrollValue.setValue(t),this.props.onScroll(t)},_handleLayout:function(t){var n=this,o=t.nativeEvent.layout.width;!o||o<=0||Math.round(o)===Math.round(this.state.containerWidth)||(this.setState({containerWidth:o}),this.requestAnimationFrame(function(){n.goToPage(n.state.currentPage)}))},_children:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.props.children;return h.Children.map(t,function(t){return t})},render:function(){var t,o='overlayTop'===this.props.tabBarPosition||'overlayBottom'===this.props.tabBarPosition,s={goToPage:this.goToPage,tabs:this._children().map(function(t){return t.props.heading}),tabStyle:this._children().map(function(t){return t.props.tabStyle}),activeTabStyle:this._children().map(function(t){return t.props.activeTabStyle}),textStyle:this._children().map(function(t){return t.props.textStyle}),activeTextStyle:this._children().map(function(t){return t.props.activeTextStyle}),tabHeaderStyle:this._children().map(function(t){return l.default.get(t.props.heading.props,'style',void 0)}),disabled:this._children().map(function(t){return t.props.disabled}),accessible:this._children().map(function(t){return 0!=t.props.accessible}),accessibilityLabel:this._children().map(function(t){return t.props.accessibilityLabel}),activeTab:this.state.currentPage,scrollValue:this.state.scrollValue,containerWidth:this.state.containerWidth};(this.props.tabBarBackgroundColor&&(s.backgroundColor=this.props.tabBarBackgroundColor),this.props.tabBarActiveTextColor&&(s.activeTextColor=this.props.tabBarActiveTextColor),this.props.tabBarInactiveTextColor&&(s.inactiveTextColor=this.props.tabBarInactiveTextColor),this.props.tabBarTextStyle&&(s.textStyle=this.props.tabBarTextStyle),this.props.tabBarUnderlineStyle&&(s.underlineStyle=this.props.tabBarUnderlineStyle),this.props.tabContainerStyle&&(s.tabContainerStyle=this.props.tabContainerStyle),o)&&(s.style=(p(t={position:'absolute',left:0,right:0},'overlayTop'===this.props.tabBarPosition?'top':'bottom',0),p(t,'backgroundColor','rgba(255, 255, 255, 0.7)'),t));return h.createElement(y,{style:[x.container,this.props.style],onLayout:this._handleLayout,__source:{fileName:n,lineNumber:342}},('top'===this.props.tabBarPosition||'overlayTop'===this.props.tabBarPosition)&&this.renderTabBar(s),this.renderScrollableContent(),('bottom'===this.props.tabBarPosition||'overlayBottom'===this.props.tabBarPosition)&&this.renderTabBar(s))}});e.default=C;var x=T.create({container:{flex:1},scrollableContentAndroid:{flex:1}})},720,[59,196,552,694,47,2,721,723,725]); -__d(function(g,r,i,a,m,e,d){var n=Object.assign||function(n){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(n,c)&&(o[c]=n[c]);return o}var o=r(d[0]),c=r(d[1]),s=(o.Component,c.View),l=(c.StyleSheet,r(d[2]));m.exports=function(c){var u=c.shouldUpdated,p=t(c,['shouldUpdated']);return o.createElement(s,n({},p,{__source:{fileName:"src/basic/Tabs/SceneComponent.js",lineNumber:11}}),o.createElement(l,{shouldUpdate:u,__source:{fileName:"src/basic/Tabs/SceneComponent.js",lineNumber:12}},p.children))}},721,[47,2,722]); -__d(function(g,r,i,a,m,e,d){var t=(function(){function t(t,n){for(var o=0;oo||this.necessarilyMeasurementsCompleted(n,n===o)&&(this.updateTabPanel(n,s),this.updateTabUnderline(n,s,l))},necessarilyMeasurementsCompleted:function(t,n){return this._tabsMeasurements[t]&&(n||this._tabsMeasurements[t+1])&&this._tabContainerMeasurements&&this._containerMeasurements},updateTabPanel:function(t,n){var s=this._containerMeasurements.width,l=this._tabsMeasurements[t].width,o=this._tabsMeasurements[t+1],u=o&&o.width||0,c=this._tabsMeasurements[t].left+n*l;c=(c-=(s-(1-n)*l-n*u)/2)>=0?c:0,this._scrollView.scrollTo({x:c,y:0,animated:!1})},updateTabUnderline:function(t,n,s){var l=this._tabsMeasurements[t].left,o=this._tabsMeasurements[t].right;if(t getPackages() { - return Arrays.asList( - new MainReactPackage() - , new PolyvRNVodPluginManager() - , new RNGestureHandlerPackage() - ); - } - - @Override - protected String getJSMainModuleName() { - return "index"; - } - }; - - @Override - public ReactNativeHost getReactNativeHost() { - return mReactNativeHost; - } - - - @Override - public void onCreate() { - super.onCreate(); - SoLoader.init(this, /* native exopackage */ false); - } - -} diff --git a/android/app/src/main/java/com/easefun/polyvsdk/rn/MainActivity.java b/android/app/src/main/java/com/easefun/polyvsdk/rn/MainActivity.java deleted file mode 100644 index 85ada20..0000000 --- a/android/app/src/main/java/com/easefun/polyvsdk/rn/MainActivity.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.easefun.polyvsdk.rn; - -import android.view.KeyEvent; - -import com.easefun.polyvsdk.util.PolyvScreenUtils; -import com.facebook.react.ReactActivity; -import com.facebook.react.ReactActivityDelegate; -import com.facebook.react.ReactRootView; -import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView; - -public class MainActivity extends ReactActivity { - - /** - * Returns the name of the main component registered from JavaScript. - * This is used to schedule rendering of the component. - */ - @Override - protected String getMainComponentName() { - return "PolyvVodRnDemo"; - } - @Override - protected ReactActivityDelegate createReactActivityDelegate() { - return new ReactActivityDelegate(this, getMainComponentName()) { - @Override - protected ReactRootView createRootView() { - return new RNGestureHandlerEnabledRootView(MainActivity.this); - } - }; - } - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if(KeyEvent.KEYCODE_BACK == keyCode){ - if(PolyvScreenUtils.isLandscape(this)){ - PolyvScreenUtils.setPortrait(this); - }else { - finish(); - } - } - return false; - } -} diff --git a/android/app/src/main/java/com/polyvrnvoddemo/MainActivity.java b/android/app/src/main/java/com/polyvrnvoddemo/MainActivity.java new file mode 100644 index 0000000..568ed83 --- /dev/null +++ b/android/app/src/main/java/com/polyvrnvoddemo/MainActivity.java @@ -0,0 +1,50 @@ +package com.polyvrnvoddemo; + +import android.view.KeyEvent; + +import com.easefun.polyvsdk.util.PolyvScreenUtils; +import com.facebook.react.ReactActivity; +import com.facebook.react.ReactActivityDelegate; +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; +import com.facebook.react.defaults.DefaultReactActivityDelegate; + +public class MainActivity extends ReactActivity { + + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + @Override + protected String getMainComponentName() { + return "PolyvRNVodDemo"; + } + + /** + * Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link + * DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React + * (aka React 18) with two boolean flags. + */ + @Override + protected ReactActivityDelegate createReactActivityDelegate() { + return new DefaultReactActivityDelegate( + this, + getMainComponentName(), + // If you opted-in for the New Architecture, we enable the Fabric Renderer. + DefaultNewArchitectureEntryPoint.getFabricEnabled(), // fabricEnabled + // If you opted-in for the New Architecture, we enable Concurrent React (i.e. React 18). + DefaultNewArchitectureEntryPoint.getConcurrentReactEnabled() // concurrentRootEnabled + ); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if(KeyEvent.KEYCODE_BACK == keyCode){ + if(PolyvScreenUtils.isLandscape(this)){ + PolyvScreenUtils.setPortrait(this); + }else { + finish(); + } + } + return false; + } +} diff --git a/android/app/src/main/java/com/polyvrnvoddemo/MainApplication.java b/android/app/src/main/java/com/polyvrnvoddemo/MainApplication.java new file mode 100644 index 0000000..8179fc5 --- /dev/null +++ b/android/app/src/main/java/com/polyvrnvoddemo/MainApplication.java @@ -0,0 +1,67 @@ +package com.polyvrnvoddemo; + +import android.app.Application; +import com.facebook.react.PackageList; +//import com.easefun.polyvsdk.rn.BuildConfig; +import com.polyvrnvoddemo.PolyvRNVodPluginPackage; +import com.polyvrnvoddemo.BuildConfig; +import com.facebook.react.ReactApplication; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; +import com.facebook.react.defaults.DefaultReactNativeHost; +import com.facebook.soloader.SoLoader; +import com.polyvrnvoddemo.ReactNativeFlipper; + +import java.util.List; + +public class MainApplication extends Application implements ReactApplication { + + private final ReactNativeHost mReactNativeHost = + new DefaultReactNativeHost(this) { + @Override + public boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + @SuppressWarnings("UnnecessaryLocalVariable") + List packages = new PackageList(this).getPackages(); + // Packages that cannot be autolinked yet can be added manually here, for example: + packages.add(new PolyvRNVodPluginPackage()); + return packages; + } + + @Override + protected String getJSMainModuleName() { + return "index"; + } + + @Override + protected boolean isNewArchEnabled() { + return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; + } + + @Override + protected Boolean isHermesEnabled() { + return BuildConfig.IS_HERMES_ENABLED; + } + }; + + @Override + public ReactNativeHost getReactNativeHost() { + return mReactNativeHost; + } + + @Override + public void onCreate() { + super.onCreate(); + SoLoader.init(this, /* native exopackage */ false); + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + // If you opted-in for the New Architecture, we load the native entry point for this app. + DefaultNewArchitectureEntryPoint.load(); + } + ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); + } +} diff --git a/android/app/src/main/java/com/polyv/PolyvRNConstants.java b/android/app/src/main/java/com/polyvrnvoddemo/PolyvRNConstants.java similarity index 93% rename from android/app/src/main/java/com/polyv/PolyvRNConstants.java rename to android/app/src/main/java/com/polyvrnvoddemo/PolyvRNConstants.java index 4212ce3..5d492cf 100644 --- a/android/app/src/main/java/com/polyv/PolyvRNConstants.java +++ b/android/app/src/main/java/com/polyvrnvoddemo/PolyvRNConstants.java @@ -1,4 +1,4 @@ -package com.polyv; +package com.polyvrnvoddemo; /** * @author df diff --git a/android/app/src/main/java/com/polyv/PolyvRNVodCode.java b/android/app/src/main/java/com/polyvrnvoddemo/PolyvRNVodCode.java similarity index 98% rename from android/app/src/main/java/com/polyv/PolyvRNVodCode.java rename to android/app/src/main/java/com/polyvrnvoddemo/PolyvRNVodCode.java index 187f678..be36f42 100644 --- a/android/app/src/main/java/com/polyv/PolyvRNVodCode.java +++ b/android/app/src/main/java/com/polyvrnvoddemo/PolyvRNVodCode.java @@ -1,4 +1,4 @@ -package com.polyv; +package com.polyvrnvoddemo; /** * @author df diff --git a/android/app/src/main/java/com/polyv/PolyvRNVodConfigModule.java b/android/app/src/main/java/com/polyvrnvoddemo/PolyvRNVodConfigModule.java similarity index 98% rename from android/app/src/main/java/com/polyv/PolyvRNVodConfigModule.java rename to android/app/src/main/java/com/polyvrnvoddemo/PolyvRNVodConfigModule.java index 2d84ca3..8624668 100644 --- a/android/app/src/main/java/com/polyv/PolyvRNVodConfigModule.java +++ b/android/app/src/main/java/com/polyvrnvoddemo/PolyvRNVodConfigModule.java @@ -1,4 +1,4 @@ -package com.polyv; +package com.polyvrnvoddemo; import android.text.TextUtils; import android.util.Log; @@ -6,7 +6,6 @@ import com.easefun.polyvsdk.PolyvDevMountInfo; import com.easefun.polyvsdk.PolyvDownloaderManager; import com.easefun.polyvsdk.PolyvSDKClient; -import com.easefun.polyvsdk.screencast.PolyvScreencastHelper; import com.easefun.polyvsdk.util.PolyvStorageUtils; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Promise; @@ -18,7 +17,7 @@ import java.io.File; import java.util.ArrayList; -import static com.polyv.PolyvRNVodCode.parseDataError; +import static com.polyvrnvoddemo.PolyvRNVodCode.parseDataError; /** * @author df @@ -147,7 +146,7 @@ public void initScreencast() { //TODO appId和appSecret需与包名绑定,获取方式请咨询Polyv技术支持 // PolyvScreencastHelper.init("10747", "34fa2201e4e7441635ca4fa97fd4b21e");//该appId,appSecret仅能在demo中使用 //初始化单例 - PolyvScreencastHelper.getInstance(getCurrentActivity()); +// PolyvScreencastHelper.getInstance(getCurrentActivity()); } public void initPolyvCilent(String vodKey, String decodeKey, String decodeIv, String viewerId) { diff --git a/android/app/src/main/java/com/polyv/PolyvRNVodDownloadModule.java b/android/app/src/main/java/com/polyvrnvoddemo/PolyvRNVodDownloadModule.java similarity index 96% rename from android/app/src/main/java/com/polyv/PolyvRNVodDownloadModule.java rename to android/app/src/main/java/com/polyvrnvoddemo/PolyvRNVodDownloadModule.java index b71bf73..18bf805 100644 --- a/android/app/src/main/java/com/polyv/PolyvRNVodDownloadModule.java +++ b/android/app/src/main/java/com/polyvrnvoddemo/PolyvRNVodDownloadModule.java @@ -1,7 +1,9 @@ -package com.polyv; +package com.polyvrnvoddemo; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +//import android.support.annotation.NonNull; +//import android.support.annotation.Nullable; +import androidx.annotation.Nullable; +import androidx.annotation.NonNull; import android.util.Log; import android.widget.Toast; @@ -12,10 +14,8 @@ import com.easefun.polyvsdk.Video; import com.easefun.polyvsdk.bean.PolyvDownloadInfo; import com.easefun.polyvsdk.database.PolyvDownloadSQLiteHelper; -import com.easefun.polyvsdk.download.listener.IPolyvDownloaderProgressListener; import com.easefun.polyvsdk.download.listener.IPolyvDownloaderProgressListener2; import com.easefun.polyvsdk.download.listener.IPolyvDownloaderSpeedListener; -import com.easefun.polyvsdk.download.listener.IPolyvDownloaderStartListener; import com.easefun.polyvsdk.download.listener.IPolyvDownloaderStartListener2; import com.easefun.polyvsdk.log.PolyvCommonLog; import com.easefun.polyvsdk.util.PolyvErrorMessageUtils; @@ -29,7 +29,8 @@ import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.WritableMap; import com.facebook.react.modules.core.DeviceEventManagerModule; -import com.hpplay.common.utils.GsonUtil; +import com.plv.foundationsdk.utils.PLVGsonUtil; +//import com.hpplay.common.utils.GsonUtil; import java.util.ArrayList; import java.util.HashMap; @@ -156,7 +157,7 @@ public void getDownloadVideoList(boolean hasDownloaded, Promise promise) { lists = downloadSQLiteHelper.getAll(); downloadInfos.addAll(getTask(lists, hasDownloaded, null)); WritableMap map = Arguments.createMap(); - map.putString("downloadList", GsonUtil.toJson(downloadInfos)); + map.putString("downloadList", PLVGsonUtil.toJson(downloadInfos)); promise.resolve(map); } @@ -264,7 +265,7 @@ private PolyvDownloader addDownloadListener(String vid, int bitrate, final Polyv polyvDownloader.setPolyvDownloadProressListener2(new IPolyvDownloaderProgressListener2() { private long total; - String data = GsonUtil.toJson(downloadInfo); + String data = PLVGsonUtil.toJson(downloadInfo); @Override public void onDownload(long current, long total) { @@ -309,7 +310,7 @@ public void onDownloadFail(@NonNull PolyvDownloaderErrorReason errorReason) { polyvDownloader.setPolyvDownloadStartListener2(new IPolyvDownloaderStartListener2() { @Override public void onStart() { - String data = GsonUtil.toJson(downloadInfo); + String data = PLVGsonUtil.toJson(downloadInfo); WritableMap map = Arguments.createMap(); map.putString("downloadInfo", data); sendEvent(getReactApplicationContext(), "startDownloadEvent", map); diff --git a/android/app/src/main/java/com/polyv/PolyvRNVodPluginManager.java b/android/app/src/main/java/com/polyvrnvoddemo/PolyvRNVodPluginPackage.java similarity index 89% rename from android/app/src/main/java/com/polyv/PolyvRNVodPluginManager.java rename to android/app/src/main/java/com/polyvrnvoddemo/PolyvRNVodPluginPackage.java index ba9cea0..4e5cf53 100644 --- a/android/app/src/main/java/com/polyv/PolyvRNVodPluginManager.java +++ b/android/app/src/main/java/com/polyvrnvoddemo/PolyvRNVodPluginPackage.java @@ -1,4 +1,4 @@ -package com.polyv; +package com.polyvrnvoddemo; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; @@ -13,7 +13,7 @@ * @create 2019/2/20 * @Describe */ -public class PolyvRNVodPluginManager implements ReactPackage { +public class PolyvRNVodPluginPackage implements ReactPackage { @Override public List createNativeModules(ReactApplicationContext reactContext) { return Arrays.asList(new PolyvRNVodConfigModule(reactContext), new PolyvRNVodDownloadModule(reactContext)); diff --git a/android/app/src/main/java/com/polyv/PolyvUserConfig.java b/android/app/src/main/java/com/polyvrnvoddemo/PolyvUserConfig.java similarity index 97% rename from android/app/src/main/java/com/polyv/PolyvUserConfig.java rename to android/app/src/main/java/com/polyvrnvoddemo/PolyvUserConfig.java index 1783948..3f6ebc6 100644 --- a/android/app/src/main/java/com/polyv/PolyvUserConfig.java +++ b/android/app/src/main/java/com/polyvrnvoddemo/PolyvUserConfig.java @@ -1,4 +1,4 @@ -package com.polyv; +package com.polyvrnvoddemo; /** * @author df diff --git a/android/app/src/main/java/com/polyv/PolyvVodPlayer.java b/android/app/src/main/java/com/polyvrnvoddemo/PolyvVodPlayer.java similarity index 91% rename from android/app/src/main/java/com/polyv/PolyvVodPlayer.java rename to android/app/src/main/java/com/polyvrnvoddemo/PolyvVodPlayer.java index d75d1fb..7209103 100644 --- a/android/app/src/main/java/com/polyv/PolyvVodPlayer.java +++ b/android/app/src/main/java/com/polyvrnvoddemo/PolyvVodPlayer.java @@ -1,12 +1,11 @@ -package com.polyv; - -import android.support.annotation.Nullable; -import android.widget.Toast; +package com.polyvrnvoddemo; +//import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.easefun.polyvsdk.log.PolyvCommonLog; -import com.easefun.polyvsdk.screencast.utils.PolyvToastUtil; -import com.polyv.protocol.IPolyvRNVideoPlayer; -import com.polyv.view.PolyvRNVodPlayer; +//import com.easefun.polyvsdk.screencast.utils.PolyvToastUtil; +import com.polyvrnvoddemo.protocol.IPolyvRNVideoPlayer; +import com.polyvrnvoddemo.view.PolyvRNVodPlayer; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.common.MapBuilder; @@ -16,7 +15,7 @@ import java.util.Map; -import static com.polyv.PolyvRNConstants.RN_MARQUEE; +import static com.polyvrnvoddemo.PolyvRNConstants.RN_MARQUEE; /** * @author df @@ -115,7 +114,7 @@ public void setVid(PolyvRNVodPlayer player, ReadableMap readableMap) { boolean isAutoStart = false; boolean isFullScreen = false; if(!readableMap.hasKey(PolyvRNConstants.RN_VID)){ - PolyvToastUtil.show(player.getContext(),"vid is error "); +// PolyvToastUtil.show(player.getContext(),"vid is error "); return; } diff --git a/android/app/src/main/java/com/polyv/protocol/IPolyvRNVideoPlayer.java b/android/app/src/main/java/com/polyvrnvoddemo/protocol/IPolyvRNVideoPlayer.java similarity index 75% rename from android/app/src/main/java/com/polyv/protocol/IPolyvRNVideoPlayer.java rename to android/app/src/main/java/com/polyvrnvoddemo/protocol/IPolyvRNVideoPlayer.java index 0c05d31..b307b99 100644 --- a/android/app/src/main/java/com/polyv/protocol/IPolyvRNVideoPlayer.java +++ b/android/app/src/main/java/com/polyvrnvoddemo/protocol/IPolyvRNVideoPlayer.java @@ -1,6 +1,6 @@ -package com.polyv.protocol; +package com.polyvrnvoddemo.protocol; -import com.polyv.view.PolyvRNVodPlayer; +import com.polyvrnvoddemo.view.PolyvRNVodPlayer; import com.facebook.react.bridge.ReadableMap; /** diff --git a/android/app/src/main/java/com/polyv/view/PolyvRNVodPlayer.java b/android/app/src/main/java/com/polyvrnvoddemo/view/PolyvRNVodPlayer.java similarity index 97% rename from android/app/src/main/java/com/polyv/view/PolyvRNVodPlayer.java rename to android/app/src/main/java/com/polyvrnvoddemo/view/PolyvRNVodPlayer.java index 88dc631..dfc1db3 100644 --- a/android/app/src/main/java/com/polyv/view/PolyvRNVodPlayer.java +++ b/android/app/src/main/java/com/polyvrnvoddemo/view/PolyvRNVodPlayer.java @@ -1,4 +1,4 @@ -package com.polyv.view; +package com.polyvrnvoddemo.view; import android.app.Activity; import android.content.Context; @@ -6,8 +6,10 @@ import android.content.res.Configuration; import android.graphics.Color; import android.net.Uri; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +//import android.support.annotation.NonNull; +//import android.support.annotation.Nullable; +import androidx.annotation.Nullable; +import androidx.annotation.NonNull; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; @@ -35,10 +37,9 @@ import com.easefun.polyvsdk.player.PolyvPlayerPreviewView; import com.easefun.polyvsdk.player.PolyvPlayerProgressView; import com.easefun.polyvsdk.player.PolyvPlayerVolumeView; -import com.easefun.polyvsdk.screencast.utils.PolyvToastUtil; +//import com.easefun.polyvsdk.screencast.utils.PolyvToastUtil; import com.easefun.polyvsdk.srt.PolyvSRTItemVO; import com.easefun.polyvsdk.util.PolyvErrorMessageUtils; -import com.easefun.polyvsdk.util.PolyvNetworkDetection; import com.easefun.polyvsdk.util.PolyvScreenUtils; import com.easefun.polyvsdk.video.IPolyvMediaPlayerControl; import com.easefun.polyvsdk.video.PolyvMediaInfoType; @@ -270,7 +271,7 @@ private void findIdAndNew() { mediaController.findViewById(R.id.iv_pip_portrait).setVisibility(View.GONE); //避免空指针而初始化,但是并不使用 - mediaController.networkDetection = new PolyvNetworkDetection(getContext()); +// mediaController.networkDetection = new PolyvNetworkDetection(getContext()); } @@ -879,10 +880,12 @@ public void setPlayerFullScreen(boolean fullScreen){ // 设置跑马灯 public void playMarquee(ReadableMap marquee) { if(!marquee.hasKey("content")){ - PolyvToastUtil.show(getContext(),"未设置跑马灯内容"); +// PolyvToastUtil.show(getContext(),"未设置跑马灯内容"); + Toast.makeText(getContext(),"未设置跑马灯内容",Toast.LENGTH_SHORT).show(); + return; } - int displayDuration = 8*1000,font = 20,alpha = 255,maxRollInterval=1*1000,color=0xffffff; + int displayDuration = 8*1000,font = 20,alpha = 255,maxRollInterval=1*1000,color=0xffffff,reappearTime=3*1000; if(marquee.hasKey("displayDuration")){ displayDuration = marquee.getInt("displayDuration")*1000; } @@ -900,6 +903,9 @@ public void playMarquee(ReadableMap marquee) { if(marquee.hasKey("color")){ color = Color.parseColor(marquee.getString("color")); } + if(marquee.hasKey("reappearTime")){ + reappearTime = marquee.getInt("reappearTime")*1000; + } videoView.setMarqueeView(marqueeView, marqueeItem = new PolyvMarqueeItem() .setStyle(PolyvMarqueeItem.STYLE_ROLL) //样式 @@ -908,8 +914,10 @@ public void playMarquee(ReadableMap marquee) { .setSize(font) //字体大小 .setColor(color) //字体颜色 .setTextAlpha(alpha) //字体透明度 - .setLifeTime(maxRollInterval))//显示时间 + .setLifeTime(maxRollInterval)//显示时间 + .setReappearTime(reappearTime)) // 设置跑马灯再次出现的间隔 ; } // + } diff --git a/android/app/src/main/res/drawable/rn_edit_text_material.xml b/android/app/src/main/res/drawable/rn_edit_text_material.xml new file mode 100644 index 0000000..f35d996 --- /dev/null +++ b/android/app/src/main/res/drawable/rn_edit_text_material.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..a2f5908 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..1b52399 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..ff10afd Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..115a4c7 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..dcd3cd8 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..459ca60 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..8ca12fe Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..8e19b41 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..b824ebd Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..4c19a13 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index d902e2f..fd7bd23 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,12 +1,3 @@ - - - RN点播助手 - Hello world! - Settings - 跳过 - 回答正确 - 回答错误 - 您还未选择任何答案 - - \ No newline at end of file + PolyvRNVodDemo + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..7ba83a2 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/android/app/src/release/java/com/polyvrnvoddemo/ReactNativeFlipper.java b/android/app/src/release/java/com/polyvrnvoddemo/ReactNativeFlipper.java new file mode 100644 index 0000000..51d7518 --- /dev/null +++ b/android/app/src/release/java/com/polyvrnvoddemo/ReactNativeFlipper.java @@ -0,0 +1,20 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + *

This source code is licensed under the MIT license found in the LICENSE file in the root + * directory of this source tree. + */ +package com.polyvrnvoddemo; + +import android.content.Context; +import com.facebook.react.ReactInstanceManager; + +/** + * Class responsible of loading Flipper inside your React Native application. This is the release + * flavor of it so it's empty as we don't want to load Flipper. + */ +public class ReactNativeFlipper { + public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { + // Do nothing as we don't want to initialize Flipper on Release. + } +} diff --git a/android/build.gradle b/android/build.gradle index 96cf508..ff7658d 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,35 +2,39 @@ buildscript { ext { - buildToolsVersion = "28.0.3" - minSdkVersion = 16 - compileSdkVersion = 29 - targetSdkVersion = 29 - supportLibVersion = "28.0.0" + buildToolsVersion = "33.0.0" + minSdkVersion = 21 + compileSdkVersion = 33 + targetSdkVersion = 33 + + // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. + ndkVersion = "23.1.7779620" } repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files + classpath 'com.android.tools.build:gradle:3.6.4' + classpath("com.facebook.react:react-native-gradle-plugin") } } + allprojects { repositories { - mavenLocal() - google() - jcenter() + //阿里云的镜像库 + maven { + allowInsecureProtocol = true + url "http://maven.aliyun.com/nexus/content/groups/public/"} maven { - // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm - url "$rootDir/../node_modules/react-native/android" + allowInsecureProtocol = true + url 'http://maven.aliyun.com/nexus/content/repositories/releases/'} + mavenCentral() + //阿里云效关于central的镜像 + maven{ + url 'https://maven.aliyun.com/repository/public' } - - maven {url 'http://maven.aliyun.com/nexus/content/repositories/releases/'} //阿里云效仓库,必须添加 maven { credentials { @@ -40,10 +44,4 @@ allprojects { url 'https://packages.aliyun.com/maven/repository/2102846-release-8EVsoM/' } } -} - - -task wrapper(type: Wrapper) { - gradleVersion = '4.7' - distributionUrl = distributionUrl.replace("bin", "all") -} +} \ No newline at end of file diff --git a/android/gradle.properties b/android/gradle.properties index 7f69cc3..2fc7924 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -9,14 +9,36 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx10248m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 - +# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m +org.gradle.java.home=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home # 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 -MYAPP_RELEASE_STORE_FILE=polyv_rn.jks -MYAPP_RELEASE_KEY_ALIAS=polyv -MYAPP_RELEASE_STORE_PASSWORD=123456 -MYAPP_RELEASE_KEY_PASSWORD=123456 \ No newline at end of file + +# 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 +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true + +# Version of flipper SDK to use with React Native +FLIPPER_VERSION=0.125.0 + +# 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=false + +# Use this property to enable or disable the Hermes JS engine. +# If set to false, you will be using JSC instead. +hermesEnabled=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar index 01b8bf6..41d9927 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 b10568f..8fad3f5 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip diff --git a/android/gradlew b/android/gradlew index cccdd3d..1b6c787 100755 --- a/android/gradlew +++ b/android/gradlew @@ -1,78 +1,129 @@ -#!/usr/bin/env sh +#!/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. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# 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/master/subprojects/plugins/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 -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +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 -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +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 - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +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" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || 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 @@ -89,84 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -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" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + 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 - i=$((i+1)) + # 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 - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# 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/android/gradlew.bat b/android/gradlew.bat index e95643d..ac1b06f 100644 --- a/android/gradlew.bat +++ b/android/gradlew.bat @@ -1,3 +1,19 @@ +@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 + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -13,15 +29,18 @@ if "%DIRNAME%" == "" set DIRNAME=. 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= +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%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :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 %CMD_LINE_ARGS% +"%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 diff --git a/android/keystores/BUCK b/android/keystores/BUCK deleted file mode 100644 index 88e4c31..0000000 --- a/android/keystores/BUCK +++ /dev/null @@ -1,8 +0,0 @@ -keystore( - name = "debug", - properties = "debug.keystore.properties", - store = "debug.keystore", - visibility = [ - "PUBLIC", - ], -) diff --git a/android/keystores/debug.keystore.properties b/android/keystores/debug.keystore.properties deleted file mode 100644 index 121bfb4..0000000 --- a/android/keystores/debug.keystore.properties +++ /dev/null @@ -1,4 +0,0 @@ -key.store=debug.keystore -key.alias=androiddebugkey -key.store.password=android -key.alias.password=android diff --git a/android/polyvsdk/.classpath b/android/polyvsdk/.classpath deleted file mode 100644 index eb19361..0000000 --- a/android/polyvsdk/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/android/polyvsdk/.gitignore b/android/polyvsdk/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/android/polyvsdk/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/android/polyvsdk/.project b/android/polyvsdk/.project deleted file mode 100644 index 643c022..0000000 --- a/android/polyvsdk/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - polyvsdk - Project polyvsdk created by Buildship. - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.buildship.core.gradleprojectbuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.buildship.core.gradleprojectnature - - diff --git a/android/polyvsdk/.settings/org.eclipse.buildship.core.prefs b/android/polyvsdk/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index b1886ad..0000000 --- a/android/polyvsdk/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -connection.project.dir=.. -eclipse.preferences.version=1 diff --git a/android/polyvsdk/build.gradle b/android/polyvsdk/build.gradle index 759d2c4..1dc7f75 100644 --- a/android/polyvsdk/build.gradle +++ b/android/polyvsdk/build.gradle @@ -3,8 +3,6 @@ apply plugin: 'com.android.library' android { compileSdkVersion 28 - - defaultConfig { minSdkVersion 16 targetSdkVersion 28 @@ -12,7 +10,6 @@ android { versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } buildTypes { @@ -36,15 +33,26 @@ dependencies { api 'com.android.support:support-v4:28.0.0' api 'com.android.support:design:28.0.0' - api 'net.polyv.android:polyvPlayer:2.13.2'//SDK核心包 - api 'net.polyv.android:polyvPlayerABI:1.9.7'//SDK核心包 - api ('net.polyv.android:polyvDownload:2.13.0'){ - exclude group:'com.easefun.polyv',module:'polyvPlayer' - } - api 'net.polyv.android:polyvScreencast:0.2.1'//SDK投屏功能 + +// Polyv Vod SDK + api 'net.polyv.android:polyvPlayer:2.21.2'//SDK核心包 + api 'net.polyv.android:polyvDownload:2.21.2'//SDK下载功能 + api 'net.polyv.android:polyvUpload:2.21.2'//SDK上传功能 + api 'net.polyv.android:polyvSub:2.21.2'//弹幕、截图功能中使用 + api 'de.hdodenhof:circleimageview:2.2.0'//圆形imageview,音频封面图使用 api 'com.github.bumptech.glide:glide:4.7.1'//demo中的ppt图片加载使用 - api 'net.polyv.android:polyvUpload:2.3.1'//SDK上传功能 - api 'net.polyv.android:polyvSub:2.13.0'//弹幕、截图功能中使用 api "com.daimajia.swipelayout:library:1.2.0@aar"//demo中下载列表使用 + +// api 'net.polyv.android:polyvPlayer:2.13.2'//SDK核心包 +// api 'net.polyv.android:polyvPlayerABI:1.9.7'//SDK核心包 +// api ('net.polyv.android:polyvDownload:2.13.0'){ +// exclude group:'com.easefun.polyv',module:'polyvPlayer' +// } +// api 'net.polyv.android:polyvScreencast:0.2.1'//SDK投屏功能 +// api 'de.hdodenhof:circleimageview:2.2.0'//圆形imageview,音频封面图使用 +// api 'com.github.bumptech.glide:glide:4.7.1'//demo中的ppt图片加载使用 +// api 'net.polyv.android:polyvUpload:2.3.1'//SDK上传功能 +// api 'net.polyv.android:polyvSub:2.13.0'//弹幕、截图功能中使用 +// api "com.daimajia.swipelayout:library:1.2.0@aar"//demo中下载列表使用 } diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/PolyvUserClient.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/PolyvUserClient.java index dcb07cc..2c6cfb7 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/PolyvUserClient.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/PolyvUserClient.java @@ -1,7 +1,7 @@ package com.easefun.polyvsdk; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.text.TextUtils; import android.util.Log; @@ -9,6 +9,7 @@ import com.easefun.polyvsdk.bean.PolyvDownloadInfo; import com.easefun.polyvsdk.database.PolyvDownloadSQLiteHelper; import com.easefun.polyvsdk.log.PolyvCommonLog; +import com.easefun.polyvsdk.util.PLVFileUtils; import com.easefun.polyvsdk.util.PolyvStorageUtils; import com.easefun.polyvsdk.util.PolyvTaskExecutorUtils; @@ -203,7 +204,7 @@ private void moveDownloadToNewPath(File downloadDir) { PolyvCommonLog.d(TAG,"moveDownloadToNewPath:"+newDir); if (downloadDir.exists() && downloadDir.isDirectory()) { copyFile(downloadDir, newDir); - com.hpplay.common.utils.FileUtil.deleteFile(downloadDir); + PLVFileUtils.deleteDir(downloadDir); } }catch (Exception e){ PolyvCommonLog.exception(e); diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvDownloadActivity.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvDownloadActivity.java index 9b668ef..50e6d86 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvDownloadActivity.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvDownloadActivity.java @@ -1,136 +1,136 @@ -package com.easefun.polyvsdk.activity; - -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.support.v4.view.ViewPager; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.adapter.PolyvPlayerFragmentAdapter; -import com.easefun.polyvsdk.fragment.PolyvDownloadFragment; - -import java.util.ArrayList; -import java.util.List; - -public class PolyvDownloadActivity extends FragmentActivity { - private ViewPager vp_download; - private List downloadFragments; - private PolyvPlayerFragmentAdapter downloadAdapter; - // 返回按钮 - private ImageView iv_finish; - private TextView tv_downloaded, tv_downloading; - private View v_tabline; - - private PolyvDownloadFragment downloadedFragment; - - private void findIdAndNew() { - vp_download = (ViewPager) findViewById(R.id.vp_download); - iv_finish = (ImageView) findViewById(R.id.iv_finish); - tv_downloaded = (TextView) findViewById(R.id.tv_downloaded); - tv_downloading = (TextView) findViewById(R.id.tv_downloading); - v_tabline = findViewById(R.id.v_tabline); - downloadFragments = new ArrayList<>(); - } - - public PolyvDownloadFragment getDownloadedFragment() { - return downloadedFragment; - } - - private void initView() { - Bundle bundle = new Bundle(); - downloadedFragment = new PolyvDownloadFragment(); - bundle.putBoolean("isFinished", true); - downloadedFragment.setArguments(bundle); - PolyvDownloadFragment downloadingFragment = new PolyvDownloadFragment(); - bundle = new Bundle(); - bundle.putBoolean("isFinished", false); - downloadingFragment.setArguments(bundle); - downloadFragments.add(downloadedFragment); - downloadFragments.add(downloadingFragment); - downloadAdapter = new PolyvPlayerFragmentAdapter(getSupportFragmentManager(), downloadFragments); - vp_download.setAdapter(downloadAdapter); - vp_download.setOffscreenPageLimit(1); - vp_download.setPageMargin(30); - vp_download.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - } - - @Override - public void onPageSelected(int position) { - tv_downloading.setSelected(false); - tv_downloaded.setSelected(false); - if (position == 0) { - tv_downloaded.setSelected(true); - } else if (position == 1) { - tv_downloading.setSelected(true); - } - setLineLocation(position); - } - - @Override - public void onPageScrollStateChanged(int state) { - } - }); - - iv_finish.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - finish(); - } - }); - tv_downloaded.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - vp_download.setCurrentItem(0); - } - }); - tv_downloading.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - vp_download.setCurrentItem(1); - } - }); - - final boolean isStarting = getIntent().getBooleanExtra("isStarting", false); - if (isStarting) { - tv_downloading.setSelected(true); - } else { - tv_downloaded.setSelected(true); - } - vp_download.setCurrentItem(isStarting ? 1 : 0); - v_tabline.post(new Runnable() { - @Override - public void run() { - setLineLocation(isStarting ? 1 : 0); - } - }); - } - - private void setLineLocation(int position) { - ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) v_tabline.getLayoutParams(); - lp.width = tv_downloaded.getWidth(); - int[] wh = new int[2]; - if (position == 0) { - tv_downloaded.getLocationInWindow(wh); - } else if (position == 1) { - tv_downloading.getLocationInWindow(wh); - } - lp.leftMargin = wh[0]; - v_tabline.setLayoutParams(lp); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.polyv_activity_downlaod); - findIdAndNew(); - initView(); - } -} +package com.easefun.polyvsdk.activity; + +import android.os.Bundle; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.viewpager.widget.ViewPager; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.adapter.PolyvPlayerFragmentAdapter; +import com.easefun.polyvsdk.fragment.PolyvDownloadFragment; + +import java.util.ArrayList; +import java.util.List; + +public class PolyvDownloadActivity extends FragmentActivity { + private ViewPager vp_download; + private List downloadFragments; + private PolyvPlayerFragmentAdapter downloadAdapter; + // 返回按钮 + private ImageView iv_finish; + private TextView tv_downloaded, tv_downloading; + private View v_tabline; + + private PolyvDownloadFragment downloadedFragment; + + private void findIdAndNew() { + vp_download = (ViewPager) findViewById(R.id.vp_download); + iv_finish = (ImageView) findViewById(R.id.iv_finish); + tv_downloaded = (TextView) findViewById(R.id.tv_downloaded); + tv_downloading = (TextView) findViewById(R.id.tv_downloading); + v_tabline = findViewById(R.id.v_tabline); + downloadFragments = new ArrayList<>(); + } + + public PolyvDownloadFragment getDownloadedFragment() { + return downloadedFragment; + } + + private void initView() { + Bundle bundle = new Bundle(); + downloadedFragment = new PolyvDownloadFragment(); + bundle.putBoolean("isFinished", true); + downloadedFragment.setArguments(bundle); + PolyvDownloadFragment downloadingFragment = new PolyvDownloadFragment(); + bundle = new Bundle(); + bundle.putBoolean("isFinished", false); + downloadingFragment.setArguments(bundle); + downloadFragments.add(downloadedFragment); + downloadFragments.add(downloadingFragment); + downloadAdapter = new PolyvPlayerFragmentAdapter(getSupportFragmentManager(), downloadFragments); + vp_download.setAdapter(downloadAdapter); + vp_download.setOffscreenPageLimit(1); + vp_download.setPageMargin(30); + vp_download.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + } + + @Override + public void onPageSelected(int position) { + tv_downloading.setSelected(false); + tv_downloaded.setSelected(false); + if (position == 0) { + tv_downloaded.setSelected(true); + } else if (position == 1) { + tv_downloading.setSelected(true); + } + setLineLocation(position); + } + + @Override + public void onPageScrollStateChanged(int state) { + } + }); + + iv_finish.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + finish(); + } + }); + tv_downloaded.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + vp_download.setCurrentItem(0); + } + }); + tv_downloading.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + vp_download.setCurrentItem(1); + } + }); + + final boolean isStarting = getIntent().getBooleanExtra("isStarting", false); + if (isStarting) { + tv_downloading.setSelected(true); + } else { + tv_downloaded.setSelected(true); + } + vp_download.setCurrentItem(isStarting ? 1 : 0); + v_tabline.post(new Runnable() { + @Override + public void run() { + setLineLocation(isStarting ? 1 : 0); + } + }); + } + + private void setLineLocation(int position) { + ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) v_tabline.getLayoutParams(); + lp.width = tv_downloaded.getWidth(); + int[] wh = new int[2]; + if (position == 0) { + tv_downloaded.getLocationInWindow(wh); + } else if (position == 1) { + tv_downloading.getLocationInWindow(wh); + } + lp.leftMargin = wh[0]; + v_tabline.setLayoutParams(lp); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.polyv_activity_downlaod); + findIdAndNew(); + initView(); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvLoginActivity.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvLoginActivity.java index 4137a04..a8705df 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvLoginActivity.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvLoginActivity.java @@ -3,14 +3,14 @@ import android.app.Activity; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.view.View; import android.widget.TextView; +import android.widget.Toast; import com.easefun.polyvsdk.PolyvSDKClient; import com.easefun.polyvsdk.PolyvUserClient; import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.screencast.utils.PolyvToastUtil; /** * @author df @@ -64,7 +64,7 @@ public void switchAccount(int index) { } hasLogout = true; PolyvUserClient.getInstance().login(viewers[index++], this); - PolyvToastUtil.show(this, "切换账户到:" + PolyvSDKClient.getInstance().getViewerId()); + Toast.makeText(this, "切换账户到:" + PolyvSDKClient.getInstance().getViewerId(), Toast.LENGTH_SHORT).show(); } @Override @@ -76,7 +76,7 @@ public void onClick(View v) { switchAccount(1); } else if (id == R.id.logout) { PolyvUserClient.getInstance().logout(this); - PolyvToastUtil.show(this, "登出账户"); + Toast.makeText(this, "登出账户", Toast.LENGTH_SHORT).show(); } else if (id == R.id.gohome) { Intent intent = new Intent(this, PolyvMainActivity.class); startActivity(intent); diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvMainActivity.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvMainActivity.java index 2d33f4d..aff6e99 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvMainActivity.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvMainActivity.java @@ -1,290 +1,306 @@ -package com.easefun.polyvsdk.activity; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.net.Uri; -import android.os.Bundle; -import android.provider.Settings; -import android.support.annotation.NonNull; -import android.support.v4.app.ActivityCompat; -import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.GridView; -import android.widget.ImageView; -import android.widget.ProgressBar; -import android.widget.TextView; -import android.widget.Toast; - -import com.easefun.polyvsdk.PolyvSDKClient; -import com.easefun.polyvsdk.PolyvUserClient; -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.adapter.PolyvHotCoursesGridViewAdapter; -import com.easefun.polyvsdk.permission.PolyvPermission; -import com.easefun.polyvsdk.screencast.utils.PolyvToastUtil; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvAddOrderInfo; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvCoursesInfo; -import com.easefun.polyvsdk.sub.vlms.listener.PolyvVlmsApiListener; -import com.easefun.polyvsdk.sub.vlms.main.PolyvVlmsTestData; -import com.easefun.polyvsdk.util.PolyvUtils; -import com.easefun.polyvsdk.util.PolyvVlmsHelper; -import com.easefun.polyvsdk.view.PolyvSimpleSwipeRefreshLayout; - -import java.util.ArrayList; -import java.util.List; - -public class PolyvMainActivity extends Activity implements OnClickListener { - public static final String IS_VLMS_ONLINE = "isVlmsOnline"; - // 热门课程的gridView - private GridView gv_hc; - private PolyvHotCoursesGridViewAdapter adapter; - private List lists; - // 在线视频按钮,上传按钮,缓存按钮 - private ImageView iv_online, iv_uplaod, iv_download; - // 加载中控件 - private ProgressBar pb_loading; - // 空数据控件,重新加载控件 - private TextView tv_empty, tv_reload; - // 下拉刷新控件 - private PolyvSimpleSwipeRefreshLayout srl_bot; - private TextView tv_guide; - private PolyvVlmsHelper vlmsHelper; - private PolyvPermission polyvPermission = null; - private PolyvCoursesInfo.Course course = null; - - private void findIdAndNew() { - gv_hc = (GridView) findViewById(R.id.gv_hc); - iv_online = (ImageView) findViewById(R.id.iv_online); - iv_uplaod = (ImageView) findViewById(R.id.iv_upload); - iv_download = (ImageView) findViewById(R.id.iv_download); - pb_loading = (ProgressBar) findViewById(R.id.pb_loading); - tv_empty = (TextView) findViewById(R.id.tv_empty); - tv_reload = (TextView) findViewById(R.id.tv_reload); - srl_bot = (PolyvSimpleSwipeRefreshLayout) findViewById(R.id.srl_bot); - tv_guide = (TextView) findViewById(R.id.tv_guide); - lists = new ArrayList<>(); - vlmsHelper = new PolyvVlmsHelper(); - } - - private void getCoursesDetail() { - // 获取课程信息和老师的名称 - vlmsHelper.getCoursesDetail(20, PolyvCoursesInfo.IS_FREE_YES, new PolyvVlmsHelper.GetCoursesDetailListener() { - - @Override - public void fail(Throwable t) { - pb_loading.setVisibility(View.INVISIBLE); - tv_empty.setVisibility(View.INVISIBLE); - tv_reload.setVisibility(View.INVISIBLE); - srl_bot.setRefreshing(false); - - srl_bot.setEnabled(false); - tv_reload.setVisibility(View.VISIBLE); - if (PolyvMainActivity.this.lists.size() > 0) { - PolyvMainActivity.this.lists.clear(); - adapter.notifyDataSetChanged(); - } - } - - @Override - public void success(List coursesDetails) { - pb_loading.setVisibility(View.INVISIBLE); - tv_empty.setVisibility(View.INVISIBLE); - tv_reload.setVisibility(View.INVISIBLE); - srl_bot.setRefreshing(false); - - srl_bot.setEnabled(true); - if (coursesDetails.size() == 0) - tv_empty.setVisibility(View.VISIBLE); - PolyvMainActivity.this.lists.clear(); - PolyvMainActivity.this.lists.addAll(coursesDetails); - adapter.notifyDataSetChanged(); - } - }); - } - - private void addOrder(String course_id) { - // 已购买的课程课程才能评论 - vlmsHelper.addOrder(course_id, new PolyvVlmsApiListener.AddOrderListener() { - @Override - public void fail(Throwable t) { - if ("已购买课程".equals(t.getMessage())) - Toast.makeText(PolyvMainActivity.this, "购买课程成功", Toast.LENGTH_SHORT).show(); - else - Toast.makeText(PolyvMainActivity.this, "购买课程失败\n" + t.getMessage(), Toast.LENGTH_SHORT).show(); - } - - @Override - public void success(PolyvAddOrderInfo polyvAddOrderInfo) { - Toast.makeText(PolyvMainActivity.this, "购买课程成功", Toast.LENGTH_SHORT).show(); - } - }); - } - - private void initView() { - if (!PolyvVlmsTestData.USERID.equals(PolyvSDKClient.getInstance().getUserId())) { - srl_bot.setVisibility(View.INVISIBLE); - tv_guide.setVisibility(View.VISIBLE); - tv_guide.setText("您的userId是:" + PolyvSDKClient.getInstance().getUserId() + "\n请点击左上角的按钮进入视频列表页查看您的视频"); - } else { - getCoursesDetail(); - } - adapter = new PolyvHotCoursesGridViewAdapter(this, lists); - gv_hc.setAdapter(adapter); - gv_hc.setOnItemClickListener(new OnItemClickListener() { - - @Override - public void onItemClick(AdapterView parent, View view, final int position, long id) { - course = lists.get(position).course; - polyvPermission.applyPermission(PolyvMainActivity.this, PolyvPermission.OperationType.playAndDownload); - } - }); - srl_bot.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, - android.R.color.holo_orange_light, android.R.color.holo_green_light); - srl_bot.setEnabled(false); - srl_bot.setChildView(gv_hc); - srl_bot.setOnRefreshListener(new OnRefreshListener() { - - @Override - public void onRefresh() { - getCoursesDetail(); - } - }); - iv_online.setOnClickListener(this); - iv_uplaod.setOnClickListener(this); - iv_download.setOnClickListener(this); - tv_reload.setOnClickListener(this); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.polyv_activity_main); - findIdAndNew(); - initView(); - - polyvPermission = new PolyvPermission(); - polyvPermission.setResponseCallback(new PolyvPermission.ResponseCallback() { - @Override - public void callback(@NonNull PolyvPermission.OperationType type) { - gotoActivity(type.getNum()); - } - }); - polyvPermission.applyPermission(this, PolyvPermission.OperationType.readImei); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - vlmsHelper.destroy(); - } - - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.tv_reload) { - tv_reload.setVisibility(View.INVISIBLE); - pb_loading.setVisibility(View.VISIBLE); - getCoursesDetail(); - } else if (id == R.id.iv_online) { - polyvPermission.applyPermission(this, PolyvPermission.OperationType.play); - } else if (id == R.id.iv_download) { - polyvPermission.applyPermission(this, PolyvPermission.OperationType.download); - } else if (id == R.id.iv_upload) { - polyvPermission.applyPermission(this, PolyvPermission.OperationType.upload); - } - } - - private void gotoActivity(int type) { - PolyvPermission.OperationType OperationType = PolyvPermission.OperationType.getOperationType(type); - switch (OperationType) { - case readImei: - PolyvSDKClient.getInstance().setImei(PolyvUtils.getAndroidId(this)); - break; - case play: - startActivity(new Intent(PolyvMainActivity.this, PolyvOnlineVideoActivity.class)); - break; - case download: - startActivity(new Intent(PolyvMainActivity.this, PolyvDownloadActivity.class)); - break; - case upload: - startActivity(new Intent(PolyvMainActivity.this, PolyvUploadActivity.class)); - break; - case playAndDownload: - // 为免费的课程添加订单 - addOrder(course.course_id); - Intent intent = new Intent(PolyvMainActivity.this, PolyvPlayerActivity.class); - Bundle bundle = new Bundle(); - bundle.putBoolean(PolyvMainActivity.IS_VLMS_ONLINE, true); - bundle.putParcelable("course", course); - intent.putExtras(bundle); - startActivity(intent); - break; - } - } - - /** - * This is the method that is hit after the user accepts/declines the - * permission you requested. For the purpose of this example I am showing a "success" header - * when the user accepts the permission and a snackbar when the user declines it. In your application - * you will want to handle the accept/decline in a way that makes sense. - * - * @param requestCode - * @param permissions - * @param grantResults - */ - @Override - public void onRequestPermissionsResult(final int requestCode, String[] permissions, int[] grantResults) { - if (polyvPermission.operationHasPermission(requestCode)) { - gotoActivity(requestCode); - } else { - PolyvSDKClient.getInstance().setImei(PolyvUtils.getAndroidId(this)); - for (int i = 0; i < grantResults.length; i++) { - if (grantResults[i] == PackageManager.PERMISSION_DENIED) { - if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("提示"); - builder.setMessage("需要权限被拒绝,是否跳转到权限设置?"); - builder.setPositiveButton("是", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - Toast.makeText(PolyvMainActivity.this, "点击权限,并打开全部权限", Toast.LENGTH_LONG).show(); - Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - intent.setData(Uri.fromParts("package", getPackageName(), null)); - startActivityForResult(intent, requestCode); - dialog.dismiss(); - } - }); - - builder.setNegativeButton("取消", null); - builder.setCancelable(true); - builder.show(); - return; - } - } - } - } - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (polyvPermission.operationHasPermission(requestCode)) { - gotoActivity(requestCode); - } else { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("提示"); - builder.setMessage("请开启功能需要的权限,再使用该功能。"); - builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - dialog.dismiss(); - } - }); - - builder.setCancelable(true); - builder.show(); - } - } -} +package com.easefun.polyvsdk.activity; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Settings; +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.EditText; +import android.widget.GridView; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import com.easefun.polyvsdk.PolyvSDKClient; +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.adapter.PolyvHotCoursesGridViewAdapter; +import com.easefun.polyvsdk.permission.PolyvPermission; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvVlmsCoursesInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvVlmsDataBody; +import com.easefun.polyvsdk.sub.vlms.listener.PolyvVlmsApiListener2; +import com.easefun.polyvsdk.sub.vlms.main.PolyvVlmsManager2; +import com.easefun.polyvsdk.sub.vlms.main.PolyvVlmsTestData; +import com.easefun.polyvsdk.util.PolyvSPUtils; +import com.easefun.polyvsdk.view.PolyvSimpleSwipeRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +public class PolyvMainActivity extends Activity implements OnClickListener { + public static final String IS_VLMS_ONLINE = "isVlmsOnline"; + // 热门课程的gridView + private GridView gv_hc; + private PolyvHotCoursesGridViewAdapter adapter; + private List lists; + // 在线视频按钮,上传按钮,缓存按钮 + private ImageView iv_online, iv_uplaod, iv_download; + //标题 + private TextView tv_title; + // 加载中控件 + private ProgressBar pb_loading; + // 空数据控件,重新加载控件 + private TextView tv_empty, tv_reload; + // 下拉刷新控件 + private PolyvSimpleSwipeRefreshLayout srl_bot; + private TextView tv_guide; + private PolyvVlmsManager2 vlmsManager2; + private PolyvPermission polyvPermission = null; + private PolyvVlmsCoursesInfo course = null; + + private void findIdAndNew() { + gv_hc = (GridView) findViewById(R.id.gv_hc); + tv_title = (TextView) findViewById(R.id.tv_title); + iv_online = (ImageView) findViewById(R.id.iv_online); + iv_uplaod = (ImageView) findViewById(R.id.iv_upload); + iv_download = (ImageView) findViewById(R.id.iv_download); + pb_loading = (ProgressBar) findViewById(R.id.pb_loading); + tv_empty = (TextView) findViewById(R.id.tv_empty); + tv_reload = (TextView) findViewById(R.id.tv_reload); + srl_bot = (PolyvSimpleSwipeRefreshLayout) findViewById(R.id.srl_bot); + tv_guide = (TextView) findViewById(R.id.tv_guide); + lists = new ArrayList<>(); + + vlmsManager2 = new PolyvVlmsManager2(this); + } + + private void getCoursesDetail() { + vlmsManager2.getCourses2(1, 100, new PolyvVlmsApiListener2>() { + @Override + public void onFailed(Throwable throwable) { + throwable.printStackTrace(); + pb_loading.setVisibility(View.GONE); + tv_empty.setVisibility(View.GONE); + tv_reload.setVisibility(View.GONE); + srl_bot.setRefreshing(false); + + srl_bot.setEnabled(false); + tv_reload.setVisibility(View.VISIBLE); + if (PolyvMainActivity.this.lists.size() > 0) { + PolyvMainActivity.this.lists.clear(); + adapter.notifyDataSetChanged(); + } + } + + @Override + public void onSuccess(PolyvVlmsDataBody data) { + pb_loading.setVisibility(View.GONE); + tv_empty.setVisibility(View.GONE); + tv_reload.setVisibility(View.GONE); + srl_bot.setRefreshing(false); + + srl_bot.setEnabled(true); + if (data == null || data.getContents().size()==0) { + tv_empty.setVisibility(View.VISIBLE); + PolyvMainActivity.this.lists.clear(); + return; + } + PolyvMainActivity.this.lists.addAll(data.getContents()); + adapter.notifyDataSetChanged(); + } + }); + } + + private void initView() { + if(PolyvVlmsTestData.USERID_2.equals(PolyvSDKClient.getInstance().getUserId()) || + PolyvVlmsTestData.USERID.equals(PolyvSDKClient.getInstance().getUserId())){ + getCoursesDetail(); + } else { + srl_bot.setVisibility(View.GONE); + tv_guide.setVisibility(View.VISIBLE); + tv_guide.setText("您的userId是:" + PolyvSDKClient.getInstance().getUserId() + "\n请点击左上角的按钮进入视频列表页查看您的视频"); + } + + adapter = new PolyvHotCoursesGridViewAdapter(this, lists); + gv_hc.setAdapter(adapter); + gv_hc.setOnItemClickListener(new OnItemClickListener() { + + @Override + public void onItemClick(AdapterView parent, View view, final int position, long id) { + course = lists.get(position); + polyvPermission.applyPermission(PolyvMainActivity.this, PolyvPermission.OperationType.playAndDownload); + } + }); + srl_bot.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, + android.R.color.holo_orange_light, android.R.color.holo_green_light); + srl_bot.setEnabled(false); + srl_bot.setChildView(gv_hc); + srl_bot.setOnRefreshListener(new OnRefreshListener() { + + @Override + public void onRefresh() { + getCoursesDetail(); + } + }); + iv_online.setOnClickListener(this); + iv_uplaod.setOnClickListener(this); + iv_download.setOnClickListener(this); + tv_reload.setOnClickListener(this); + tv_title.setOnClickListener(this); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.polyv_activity_main); + + //--------------------- + //开启httpdns,请确保先获取用户隐私授权 + PolyvSDKClient.getInstance().enableHttpDns(true); + + findIdAndNew(); + initView(); + + polyvPermission = new PolyvPermission(); + polyvPermission.setResponseCallback(new PolyvPermission.ResponseCallback() { + @Override + public void callback(@NonNull PolyvPermission.OperationType type) { + gotoActivity(type.getNum()); + } + }); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + } + + @Override + public void onClick(View v) { + int id = v.getId(); + if (id == R.id.tv_reload) { + tv_reload.setVisibility(View.GONE); + pb_loading.setVisibility(View.VISIBLE); + getCoursesDetail(); + } else if (id == R.id.iv_online) { + polyvPermission.applyPermission(this, PolyvPermission.OperationType.play); + } else if (id == R.id.iv_download) { + polyvPermission.applyPermission(this, PolyvPermission.OperationType.download); + } else if (id == R.id.iv_upload) { + polyvPermission.applyPermission(this, PolyvPermission.OperationType.upload); + } else if (id == R.id.tv_title) { + gotoSetSDKConfig(); + } + } + + private void gotoSetSDKConfig() { + final EditText etConfig = new EditText(this); + new AlertDialog.Builder(this).setTitle("设置加密串") + .setView(etConfig) + .setPositiveButton("保存并重启", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + PolyvSPUtils.getInstance(PolyvMainActivity.this).put("SDKConfig", etConfig.getText().toString().trim(), true); + final Intent intent = PolyvMainActivity.this.getPackageManager().getLaunchIntentForPackage(PolyvMainActivity.this.getPackageName()); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + android.os.Process.killProcess(android.os.Process.myPid()); + } + }).setNegativeButton("取消",null) + .setNeutralButton("课程配置并重启", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + PolyvSPUtils.getInstance(PolyvMainActivity.this).put("SDKConfig", PolyvVlmsTestData.CONFIG_2, true); + final Intent intent = PolyvMainActivity.this.getPackageManager().getLaunchIntentForPackage(PolyvMainActivity.this.getPackageName()); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + android.os.Process.killProcess(android.os.Process.myPid()); + } + }) + .show(); + + } + + private void gotoActivity(int type) { + PolyvPermission.OperationType OperationType = PolyvPermission.OperationType.getOperationType(type); + switch (OperationType) { + case play: + startActivity(new Intent(PolyvMainActivity.this, PolyvOnlineVideoActivity.class)); + break; + case download: + startActivity(new Intent(PolyvMainActivity.this, PolyvDownloadActivity.class)); + break; + case upload: + startActivity(new Intent(PolyvMainActivity.this, PolyvUploadActivity.class)); + break; + case playAndDownload: + Intent intent = new Intent(PolyvMainActivity.this, PolyvPlayerActivity.class); + Bundle bundle = new Bundle(); + bundle.putBoolean(PolyvMainActivity.IS_VLMS_ONLINE, true); + bundle.putString("course", course.toString()); + intent.putExtras(bundle); + startActivity(intent); + break; + } + } + + /** + * This is the method that is hit after the user accepts/declines the + * permission you requested. For the purpose of this example I am showing a "success" header + * when the user accepts the permission and a snackbar when the user declines it. In your application + * you will want to handle the accept/decline in a way that makes sense. + * + * @param requestCode + * @param permissions + * @param grantResults + */ + @Override + public void onRequestPermissionsResult(final int requestCode, String[] permissions, int[] grantResults) { + if (polyvPermission.operationHasPermission(requestCode)) { + gotoActivity(requestCode); + } else { + for (int i = 0; i < grantResults.length; i++) { + if (grantResults[i] == PackageManager.PERMISSION_DENIED) { + if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("提示"); + builder.setMessage("需要权限被拒绝,是否跳转到权限设置?"); + builder.setPositiveButton("是", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + Toast.makeText(PolyvMainActivity.this, "点击权限,并打开全部权限", Toast.LENGTH_LONG).show(); + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.setData(Uri.fromParts("package", getPackageName(), null)); + startActivityForResult(intent, requestCode); + dialog.dismiss(); + } + }); + + builder.setNegativeButton("取消", null); + builder.setCancelable(true); + builder.show(); + return; + } + } + } + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (polyvPermission.operationHasPermission(requestCode)) { + gotoActivity(requestCode); + } else { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("提示"); + builder.setMessage("请开启功能需要的权限,再使用该功能。"); + builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + dialog.dismiss(); + } + }); + + builder.setCancelable(true); + builder.show(); + } + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvOnlineVideoActivity.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvOnlineVideoActivity.java index a040de7..0ea1933 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvOnlineVideoActivity.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvOnlineVideoActivity.java @@ -1,14 +1,20 @@ package com.easefun.polyvsdk.activity; import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; -import android.widget.Button; +import android.widget.EditText; import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; import com.easefun.polyvsdk.PolyvSDKClient; import com.easefun.polyvsdk.R; @@ -24,13 +30,13 @@ public class PolyvOnlineVideoActivity extends Activity implements View.OnClickListener { private ImageView iv_finish; + private TextView tv_search; private RecyclerView lv_online; private PolyvOnlineListViewAdapter lv_online_adapter; private HeaderViewRecyclerAdapter mAdapter; private List data; private View loadMoreView; private int pageNum = 1, pageSize = 20; - ; @Override protected void onCreate(Bundle savedInstanceState) { @@ -43,6 +49,7 @@ protected void onCreate(Bundle savedInstanceState) { private void findIdAndNew() { iv_finish = (ImageView) findViewById(R.id.iv_finish); lv_online = (RecyclerView) findViewById(R.id.lv_online); + tv_search = (TextView) findViewById(R.id.tv_search); data = new ArrayList<>(); } @@ -65,12 +72,13 @@ public void onLoadMore(int i) { }); new LoadVideoList().execute(); iv_finish.setOnClickListener(this); + tv_search.setOnClickListener(this); } private void createLoadMoreView() { loadMoreView = LayoutInflater.from(this).inflate(R.layout.polyv_bottom_loadmorelayout, lv_online, false); mAdapter.addFooterView(loadMoreView); - loadMoreView.setVisibility(View.INVISIBLE); + loadMoreView.setVisibility(View.GONE); } class LoadVideoList extends AsyncTask> { @@ -89,17 +97,16 @@ protected List doInBackground(String... arg0) { @Override protected void onPostExecute(List result) { super.onPostExecute(result); - loadMoreView.setVisibility(View.INVISIBLE); - if (result == null) { - mAdapter.removeFootView(); - return; - } - if (result.size() < pageSize) - mAdapter.removeFootView(); - data.addAll(result); - if (pageNum * pageSize - pageSize - 1 > 0) { - mAdapter.notifyItemRangeChanged(pageNum * pageSize - pageSize - 1, pageSize); - } else { + synchronized (PolyvOnlineVideoActivity.this) { + loadMoreView.setVisibility(View.GONE); + if (result == null) { + mAdapter.removeFootView(); + return; + } + if (result.size() < pageSize) + mAdapter.removeFootView(); + data.addAll(result); + mAdapter.notifyDataSetChanged(); } } @@ -107,8 +114,30 @@ protected void onPostExecute(List result) { @Override public void onClick(View v) { - if (v.getId() == R.id.iv_finish) { + int id = v.getId(); + if (id == R.id.iv_finish) { finish(); + } else if (id == R.id.tv_search) { + gotoSetVid(); } } + + private void gotoSetVid() { + final EditText etConfig = new EditText(PolyvOnlineVideoActivity.this); + new AlertDialog.Builder(PolyvOnlineVideoActivity.this).setTitle("设置Vid") + .setView(etConfig) + .setPositiveButton("保存并跳转", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + String vid = etConfig.getText().toString().trim(); + if (!TextUtils.isEmpty(vid)) { + Intent intent = PolyvPlayerActivity.newIntent(PolyvOnlineVideoActivity.this, PolyvPlayerActivity.PlayMode.portrait, vid); + intent.putExtra(PolyvMainActivity.IS_VLMS_ONLINE, false); + PolyvOnlineVideoActivity.this.startActivity(intent); + } else { + Toast.makeText(PolyvOnlineVideoActivity.this,"请输入Vid", Toast.LENGTH_LONG).show(); + } + } + }).setNegativeButton("取消",null).show(); + } } diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvPlayerActivity.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvPlayerActivity.java index 32d0492..9169d4a 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvPlayerActivity.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvPlayerActivity.java @@ -10,21 +10,23 @@ import android.content.ServiceConnection; import android.content.res.Configuration; import android.graphics.Color; +import android.media.AudioManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.IBinder; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentTransaction; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentTransaction; +import androidx.appcompat.app.AlertDialog; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewTreeObserver; +import android.view.WindowManager; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; @@ -40,8 +42,11 @@ import com.easefun.polyvsdk.fragment.PolyvPlayerTabFragment; import com.easefun.polyvsdk.fragment.PolyvPlayerTopFragment; import com.easefun.polyvsdk.fragment.PolyvPlayerViewPagerFragment; -import com.easefun.polyvsdk.marquee.PolyvMarqueeItem; -import com.easefun.polyvsdk.marquee.PolyvMarqueeView; +import com.easefun.polyvsdk.log.PolyvCommonLog; +import com.easefun.polyvsdk.marquee.IPLVMarqueeView; +import com.easefun.polyvsdk.marquee.PLVMarqueeView; +import com.easefun.polyvsdk.marquee.model.PLVMarqueeAnimationVO; +import com.easefun.polyvsdk.marquee.model.PLVMarqueeModel; import com.easefun.polyvsdk.player.PolyvPlayerAnswerView; import com.easefun.polyvsdk.player.PolyvPlayerAudioCoverView; import com.easefun.polyvsdk.player.PolyvPlayerAuditionView; @@ -59,14 +64,15 @@ import com.easefun.polyvsdk.ppt.PolyvPPTErrorLayout; import com.easefun.polyvsdk.ppt.PolyvPPTView; import com.easefun.polyvsdk.ppt.PolyvViceScreenLayout; -import com.easefun.polyvsdk.screencast.PolyvScreencastHelper; import com.easefun.polyvsdk.service.PolyvBackgroundPlayService; import com.easefun.polyvsdk.srt.PolyvSRTItemVO; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvCoursesInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvVlmsCoursesInfo; import com.easefun.polyvsdk.util.PolyvCustomQuestionBuilder; import com.easefun.polyvsdk.util.PolyvImageLoader; import com.easefun.polyvsdk.util.PolyvNetworkDetection; import com.easefun.polyvsdk.util.PolyvScreenUtils; +import com.easefun.polyvsdk.video.IPolyvVideoView; +import com.easefun.polyvsdk.video.PolyvAudioSeekType; import com.easefun.polyvsdk.video.PolyvMediaInfoType; import com.easefun.polyvsdk.video.PolyvPlayErrorReason; import com.easefun.polyvsdk.video.PolyvSeekType; @@ -92,20 +98,22 @@ import com.easefun.polyvsdk.video.listener.IPolyvOnPlayPauseListener; import com.easefun.polyvsdk.video.listener.IPolyvOnPreloadPlayListener; import com.easefun.polyvsdk.video.listener.IPolyvOnPreparedListener2; +import com.easefun.polyvsdk.video.listener.IPolyvOnSeekStartListener; import com.easefun.polyvsdk.video.listener.IPolyvOnTeaserCountDownListener; import com.easefun.polyvsdk.video.listener.IPolyvOnTeaserOutListener; import com.easefun.polyvsdk.video.listener.IPolyvOnVideoPlayErrorListener2; +import com.easefun.polyvsdk.video.listener.IPolyvOnVideoPlayeErrorListener; import com.easefun.polyvsdk.video.listener.IPolyvOnVideoSRTListener; import com.easefun.polyvsdk.video.listener.IPolyvOnVideoSRTPreparedListener; import com.easefun.polyvsdk.video.listener.IPolyvOnVideoStatusListener; import com.easefun.polyvsdk.video.listener.IPolyvOnVideoTimeoutListener; import com.easefun.polyvsdk.view.PolyvLoadingLayout; -import com.easefun.polyvsdk.view.PolyvScreencastSearchLayout; -import com.easefun.polyvsdk.view.PolyvScreencastStatusLayout; +import com.easefun.polyvsdk.view.PolyvNetworkPoorIndicateLayout; import com.easefun.polyvsdk.view.PolyvTouchSpeedLayout; import com.easefun.polyvsdk.vo.PolyvADMatterVO; import com.easefun.polyvsdk.vo.PolyvQuestionVO; import com.easefun.polyvsdk.vo.PolyvVideoVO; +import com.google.gson.Gson; import java.net.MalformedURLException; import java.net.URL; @@ -119,11 +127,6 @@ public class PolyvPlayerActivity extends FragmentActivity { private PolyvPlayerViewPagerFragment viewPagerFragment; private PolyvPlayerDanmuFragment danmuFragment; private ImageView iv_vlms_cover; - //投屏相关 - private PolyvScreencastHelper screencastHelper; - private PolyvScreencastStatusLayout fl_screencast_status; - private PolyvScreencastSearchLayout fl_screencast_search, fl_screencast_search_land; - private ImageView iv_screencast_search, iv_screencast_search_land; /** * 播放器的parentView */ @@ -135,12 +138,15 @@ public class PolyvPlayerActivity extends FragmentActivity { /** * 跑马灯控件 */ - private PolyvMarqueeView marqueeView = null; - private PolyvMarqueeItem marqueeItem = null; + private IPLVMarqueeView marqueeView = null; /** * 视频控制栏 */ private PolyvPlayerMediaController mediaController = null; + /** + * 网络较差时切换清晰度提示布局 + */ + private PolyvNetworkPoorIndicateLayout networkPoorIndicateLayout = null; /** * 底部字幕文本视图 */ @@ -240,6 +246,17 @@ public class PolyvPlayerActivity extends FragmentActivity { private BroadcastReceiver pipReceiver; private boolean isInPictureInPictureMode; + /** + * 画中画模式不同机型回调表现有差异 + *

+ * 部分机型会正常回调生命周期 {@link #onDestroy()},可以正常销毁页面 + *

+ * 部分机型会只会回调 {@link #onStop()} -> {@link #onPictureInPictureModeChanged(boolean, Configuration)}, + * 不会回调 {@link #onDestroy()},引起不能正常销毁页面 + *

+ * 为了兼容这种情况,在 {@link #onStop()} 中判断是否在画中画模式,触发退出画中画模式并且已经回调 {@link #onStop()} 时主动销毁页面 + */ + private boolean isCalledStopOnPipModeChanged = false; private boolean isOnBackKeyPressed; private ServiceConnection playConnection; @@ -253,12 +270,17 @@ protected void onCreate(Bundle savedInstanceState) { savedInstanceState.putParcelable("android:support:fragments", null); super.onCreate(savedInstanceState); setContentView(R.layout.polyv_activity_player); + //修复部分手机状态栏关闭之后异常 + WindowManager.LayoutParams params = this.getWindow().getAttributes(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; + } + this.getWindow().setAttributes(params); addFragment(); findIdAndNew(); initView(); initPlayErrorView(); initRouteView(); - initScreencast(); PolyvScreenUtils.generateHeight16_9(this); int playModeCode = getIntent().getIntExtra("playMode", PlayMode.portrait.getCode()); @@ -334,12 +356,12 @@ public void onChanged(int networkType) { if (videoView.isPlaying()) { videoView.pause(true); flowPlayLayout.setVisibility(View.VISIBLE); - cancelFlowPlayButton.setVisibility(View.INVISIBLE); + cancelFlowPlayButton.setVisibility(View.GONE); } } } else if (networkDetection.isWifiType()) { if (flowPlayLayout.getVisibility() == View.VISIBLE) { - flowPlayLayout.setVisibility(View.INVISIBLE); + flowPlayLayout.setVisibility(View.GONE); if (videoView.isInPlaybackState()) { videoView.start(); } else { @@ -360,9 +382,16 @@ private void addFragment() { ft.commit(); return; } + String courseString = getIntent().getStringExtra("course"); + PolyvVlmsCoursesInfo coursesInfo = new Gson().fromJson(courseString, PolyvVlmsCoursesInfo.class); + if(coursesInfo == null){ + return; + } + String coverImage = coursesInfo.getCoverImage(); PolyvImageLoader.getInstance() - .loadImageOrigin(PolyvPlayerActivity.this, ((PolyvCoursesInfo.Course) getIntent().getExtras().getParcelable("course")).cover_image, + .loadImageOrigin(PolyvPlayerActivity.this, coverImage, iv_vlms_cover = ((ImageView) findViewById(R.id.iv_vlms_cover)),R.drawable.polyv_pic_demo ); + topFragment = new PolyvPlayerTopFragment(); topFragment.setArguments(getIntent().getExtras()); tabFragment = new PolyvPlayerTabFragment(); @@ -376,8 +405,9 @@ private void addFragment() { private void findIdAndNew() { viewLayout = (RelativeLayout) findViewById(R.id.view_layout); videoView = (PolyvVideoView) findViewById(R.id.polyv_video_view); - marqueeView = (PolyvMarqueeView) findViewById(R.id.polyv_marquee_view); + marqueeView = (PLVMarqueeView) findViewById(R.id.polyv_marquee_view); mediaController = (PolyvPlayerMediaController) findViewById(R.id.polyv_player_media_controller); + networkPoorIndicateLayout = (PolyvNetworkPoorIndicateLayout) findViewById(R.id.polyv_network_poor_indicate_layout); srtTextView = (TextView) findViewById(R.id.srt); topSrtTextView = (TextView) findViewById(R.id.top_srt); questionView = (PolyvPlayerAnswerView) findViewById(R.id.polyv_player_question_view); @@ -395,9 +425,6 @@ private void findIdAndNew() { logoView = (PolyvPlayerLogoView) findViewById(R.id.logo_layout); coverView = (PolyvPlayerAudioCoverView) findViewById(R.id.polyv_cover_view); audioSourceCoverView = (PolyvPlayerAudioCoverView) findViewById(R.id.polyv_source_audio_cover); - fl_screencast_search = (PolyvScreencastSearchLayout) findViewById(R.id.fl_screencast_search); - fl_screencast_search_land = (PolyvScreencastSearchLayout) findViewById(R.id.fl_screencast_search_land); - fl_screencast_status = (PolyvScreencastStatusLayout) findViewById(R.id.fl_screencast_status); playErrorView = (PolyvPlayerPlayErrorView) findViewById(R.id.polyv_player_play_error_view); playRouteView = (PolyvPlayerPlayRouteView) findViewById(R.id.polyv_player_play_route_view); flowPlayLayout = (LinearLayout) findViewById(R.id.flow_play_layout); @@ -412,12 +439,6 @@ private void findIdAndNew() { //添加副屏布局 addViceScreenLayout(videoView); - iv_screencast_search = (ImageView) mediaController.findViewById(R.id.iv_screencast_search); - iv_screencast_search_land = (ImageView) mediaController.findViewById(R.id.iv_screencast_search_land); - //投屏功能默认隐藏,如果需要请注释下面两行代码 - iv_screencast_search.setVisibility(View.INVISIBLE); - iv_screencast_search_land.setVisibility(View.INVISIBLE); - mediaController.initConfig(viewLayout); mediaController.setAudioCoverView(coverView); mediaController.setDanmuFragment(danmuFragment); @@ -432,35 +453,43 @@ private void findIdAndNew() { videoView.setAuxiliaryVideoView(auxiliaryVideoView); videoView.setPlayerBufferingIndicator(loadingLayout); loadingLayout.bindVideoView(videoView); + // 设置跑马灯 - videoView.setMarqueeView(marqueeView, marqueeItem = new PolyvMarqueeItem() - .setStyle(PolyvMarqueeItem.STYLE_ROLL) //样式 - .setDuration(10000) //时长 - .setText("POLYV Android SDK") //文本 - .setSize(16) //字体大小 - .setColor(Color.YELLOW) //字体颜色 - .setTextAlpha(70) //字体透明度 - .setInterval(1000) //隐藏时间 - .setLifeTime(1000) //显示时间 - .setTweenTime(1000) //渐隐渐现时间 - .setHasStroke(true) //是否有描边 - .setBlurStroke(true) //是否模糊描边 - .setStrokeWidth(3) //描边宽度 - .setStrokeColor(Color.MAGENTA) //描边颜色 - .setReappearTime(3000) // 设置跑马灯再次出现的间隔 - .setStrokeAlpha(70)); //描边透明度 + PLVMarqueeModel plvMarqueeModel = new PLVMarqueeModel() + .setUserName("保利威SDK") + .setFontAlpha(255) + .setFontSize(40) + .setFontColor(Color.RED) + .setFilter(false) + .setFilterAlpha(255) + .setFilterColor(Color.BLACK) + .setFilterBlurX(2) + .setFilterBlurY(2) + .setFilterStrength(4) + .setSetting(PLVMarqueeAnimationVO.ROLL) + .setInterval(3) + .setTweenTime(1) + .setLifeTime(2) + .setSpeed(200) + .setAlwaysShowWhenRun(false) + .setHiddenWhenPause(true); + + marqueeView.setPLVMarqueeModel(plvMarqueeModel); } private void initView() { videoView.setOpenAd(true); videoView.setOpenTeaser(true); + videoView.setOpenTeaserWhenLocalPlay(true); videoView.setOpenQuestion(true); videoView.setOpenSRT(true); videoView.setOpenPreload(true, 2); videoView.setOpenMarquee(true); videoView.setAutoContinue(true); + videoView.setShouldPlayAdBeforeContinue(false); videoView.setNeedGestureDetector(true); videoView.setSeekType(PolyvSeekType.SEEKTYPE_NORMAL); + videoView.setAudioSeekType(PolyvAudioSeekType.SEEKTYPE_NORMAL); videoView.setLoadTimeoutSecond(false, 60);//加载超时时间,单位:秒。false:不开启。 videoView.setBufferTimeoutSecond(false, 30);//缓冲超时时间,单位:秒。false:不开启。 videoView.disableScreenCAP(this, false);//防录屏开关,true为开启,如果开启防录屏,投屏功能将不可用 @@ -473,14 +502,22 @@ public void onPrepared() { } else { audioSourceCoverView.hide(); } + if (networkPoorIndicateLayout != null) { + networkPoorIndicateLayout.reset(); + } mediaController.preparedView(); progressView.setViewMaxValue(videoView.getDuration()); // 没开预加载在这里开始弹幕 // danmuFragment.start(); //设置logo - logoView.addLogo(new PolyvPlayerLogoView.LogoParam().setWidth(0.1f).setHeight(0.1f) - .setAlpha(100).setOffsetX(0.05f).setOffsetY(0.05f).setPos(2).setResId(R.drawable.polyv_logo)); + logoView.addLogo(new PolyvPlayerLogoView.LogoParam() + .setWidth(0.1f).setHeight(0.1f) + .setAlpha(100).setOffsetX(0.05f) + .setOffsetY(0.05f).setPos(2).setResId(R.drawable.polyv_logo)); + if (marqueeView != null) { + marqueeView.start(); + } } }); @@ -499,12 +536,14 @@ public boolean onInfo(int what, int extra) { case PolyvMediaInfoType.MEDIA_INFO_BUFFERING_START: danmuFragment.pause(false); touchSpeedLayout.updateStatus(true); + networkPoorIndicateLayout.notifyBufferingStart(); break; case PolyvMediaInfoType.MEDIA_INFO_BUFFERING_END: - if (!videoView.isPausState()){ + if (!videoView.isPausState()) { danmuFragment.resume(false); } touchSpeedLayout.updateStatus(false); + networkPoorIndicateLayout.notifyBufferingEnd(); break; } @@ -518,6 +557,9 @@ public void onPause() { coverView.stopAnimation(); danmuFragment.pause(); mediaController.updatePictureInPictureActions(R.drawable.polyv_btn_play_port, "pause", 1, 1); + if (marqueeView != null) { + marqueeView.pause(); + } } @Override @@ -525,12 +567,41 @@ public void onPlay() { coverView.startAnimation(); danmuFragment.resume(); mediaController.updatePictureInPictureActions(R.drawable.polyv_btn_pause_port, "start", 2, 2); + if (marqueeView != null) { + marqueeView.start(); + } } @Override public void onCompletion() { coverView.stopAnimation(); mediaController.updatePictureInPictureActions(R.drawable.polyv_btn_play_port, "pause", 1, 1); + if (marqueeView != null) { + marqueeView.stop(); + } + } + }); + + videoView.setOnAudioFocusChangeListener(new PolyvVideoView.OnAudioFocusChangeListener() { + @Override + public void onAudioFocusChange(IPolyvVideoView videoView, int focusChange) { + switch (focusChange) { + // 重新获得焦点 + case AudioManager.AUDIOFOCUS_GAIN: + if (!videoView.isPlaying()) { + videoView.start(); + } + break; + // 永久丢失焦点,如被其他播放器抢占 + case AudioManager.AUDIOFOCUS_LOSS: + // 短暂丢失焦点,如来电 + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: + if (videoView.isPlaying()) { + videoView.pause(false, false); + } + break; + default: + } } }); @@ -559,10 +630,17 @@ public void onStatus(int status) { } }); + videoView.setOnVideoPlayerErrorListener(new IPolyvOnVideoPlayeErrorListener() { + @Override + public void onVideoPlayError(String tipsZhCn,String tipsEn, String code) { + playErrorView.show(tipsZhCn,code, videoView); + } + }); + videoView.setOnVideoPlayErrorListener(new IPolyvOnVideoPlayErrorListener2() { @Override public boolean onVideoPlayError(@PolyvPlayErrorReason.PlayErrorReason int playErrorReason) { - playErrorView.show(playErrorReason, videoView); + playErrorView.show(playErrorReason, videoView); return true; } }); @@ -594,7 +672,7 @@ public void onCountDown(int num) { @Override public void onEnd() { - advertCountDown.setVisibility(View.INVISIBLE); + advertCountDown.setVisibility(View.GONE); auxiliaryView.hide(); } }); @@ -692,7 +770,7 @@ public void onVideoSRT(@Nullable List subTitleItems) { @Override public void callback(boolean start, boolean end) { Log.d(TAG, String.format("LeftUp %b %b brightness %d", start, end, videoView.getBrightness(PolyvPlayerActivity.this))); - if(mediaController.isLocked()){ + if (mediaController.isLocked()) { return; } @@ -711,7 +789,7 @@ public void callback(boolean start, boolean end) { @Override public void callback(boolean start, boolean end) { Log.d(TAG, String.format("LeftDown %b %b brightness %d", start, end, videoView.getBrightness(PolyvPlayerActivity.this))); - if(mediaController.isLocked()){ + if (mediaController.isLocked()) { return; } int brightness = videoView.getBrightness(PolyvPlayerActivity.this) - 5; @@ -730,7 +808,7 @@ public void callback(boolean start, boolean end) { public void callback(boolean start, boolean end) { Log.d(TAG, String.format("RightUp %b %b volume %d", start, end, videoView.getVolume())); // 加减单位最小为10,否则无效果 - if(mediaController.isLocked()){ + if (mediaController.isLocked()) { return; } int volume = videoView.getVolume() + 10; @@ -768,7 +846,7 @@ public void callback(boolean start, boolean end) { public void callback(boolean start, int times, boolean end) { // 左滑事件 Log.d(TAG, String.format("SwipeLeft %b %b", start, end)); - if(mediaController.isLocked()){ + if (mediaController.isLocked()) { return; } mediaController.hideTickTips(); @@ -803,7 +881,7 @@ public void callback(boolean start, int times, boolean end) { public void callback(boolean start, int times, boolean end) { // 右滑事件 Log.d(TAG, String.format("SwipeRight %b %b", start, end)); - if(mediaController.isLocked()){ + if (mediaController.isLocked()) { return; } mediaController.hideTickTips(); @@ -871,22 +949,66 @@ public void callback(boolean isTouchLeft, boolean start, boolean end) { } }); + videoView.setOnSeekStartListener(new IPolyvOnSeekStartListener() { + @Override + public void onSeekStart(long positionBeforeSeek) { + if (networkPoorIndicateLayout != null) { + networkPoorIndicateLayout.notifySeek(); + } + } + }); + flowPlayButton.setOnClickListener(flowButtonOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { networkDetection.allowMobile(); - flowPlayLayout.setVisibility(View.INVISIBLE); + flowPlayLayout.setVisibility(View.GONE); play(vid, bitrate, true, isMustFromLocal); } }); cancelFlowPlayButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - flowPlayLayout.setVisibility(View.INVISIBLE); + flowPlayLayout.setVisibility(View.GONE); videoView.start(); } }); + mediaController.setOnDragSeekListener(new PolyvPlayerMediaController.OnDragSeekListener() { + @Override + public void onDragSeekSuccess(int positionBeforeSeek, int positionAfterSeek) { + PolyvCommonLog.d(TAG, "drag seek success, position before seek = " + positionBeforeSeek + ", position after seek = " + positionAfterSeek); + } + + @Override + public void onDragSeekBan(int dragSeekStrategy) { + // 拖拽参数在PolyvPlayerMediaController#dragSeekStrategy设置 + // 当设置dragSeekStrategy为DRAG_SEEK_PLAYED或者DRAG_SEEK_BAN,在触发禁止拖拽时会回调 + if (dragSeekStrategy == PolyvPlayerMediaController.DRAG_SEEK_PLAYED) { + PolyvCommonLog.d(TAG, "drag seek ban because dragSeekStrategy is set to DRAG_SEEK_PLAYED"); + Toast.makeText(PolyvPlayerActivity.this, "只能拖拽到已播放过的进度", Toast.LENGTH_SHORT).show(); + } else if (dragSeekStrategy == PolyvPlayerMediaController.DRAG_SEEK_BAN) { + PolyvCommonLog.d(TAG, "drag seek ban because dragSeekStrategy is set to DRAG_SEEK_BAN"); + Toast.makeText(PolyvPlayerActivity.this, "已设置禁止拖拽进度", Toast.LENGTH_SHORT).show(); + } + } + }); + + networkPoorIndicateLayout.setOnViewActionListener(new PolyvNetworkPoorIndicateLayout.OnViewActionListener() { + @Override + public int getLowerBitrate() { + if (videoView == null) { + return -1; + } + return videoView.getBitRate() - 1; + } + + @Override + public boolean changeBitrate(int bitrate) { + return videoView.changeBitRate(bitrate); + } + }); + //用于设置自定义片头url // String customTeaserUrl="https://w.wallhaven.cc/full/13/wallhaven-13x79v.jpg"; // int customTeaserDuration=3; @@ -945,7 +1067,7 @@ public void play(final String vid, final int bitrate, boolean startNow, final bo (bitrate == 0 && !PolyvVideoUtil.validateLocalVideo(vid).hasLocalVideo())) { flowPlayButton.setOnClickListener(flowButtonOnClickListener); flowPlayLayout.setVisibility(View.VISIBLE); - cancelFlowPlayButton.setVisibility(View.INVISIBLE); + cancelFlowPlayButton.setVisibility(View.GONE); return; } } else { @@ -953,45 +1075,35 @@ public void play(final String vid, final int bitrate, boolean startNow, final bo (bitrate == 0 && PolyvVideoUtil.validateMP3Audio(vid).size() == 0) && !PolyvVideoUtil.validateLocalVideo(vid).hasLocalVideo()) { flowPlayButton.setOnClickListener(flowButtonOnClickListener); flowPlayLayout.setVisibility(View.VISIBLE); - cancelFlowPlayButton.setVisibility(View.INVISIBLE); + cancelFlowPlayButton.setVisibility(View.GONE); return; } } } - if (fl_screencast_status != null && fl_screencast_status.getVisibility() == View.VISIBLE) { - showScreencastTipsDialog(vid, bitrate, startNow, isMustFromLocal); - return; - } - if (iv_vlms_cover != null && iv_vlms_cover.getVisibility() == View.VISIBLE) { - iv_vlms_cover.setVisibility(View.INVISIBLE); - } - - if (videoView.isDisableScreenCAP()) { - iv_screencast_search.setVisibility(View.INVISIBLE); - iv_screencast_search_land.setVisibility(View.INVISIBLE); + iv_vlms_cover.setVisibility(View.GONE); } if (viceScreenLayout != null) { viceScreenLayout.hide(); } - portPptDirLayout.setVisibility(View.INVISIBLE); - landPptErrorLayout.setVisibility(View.INVISIBLE); - landPptErrorLayout.setVisibility(View.INVISIBLE); + portPptDirLayout.setVisibility(View.GONE); + landPptErrorLayout.setVisibility(View.GONE); + landPptErrorLayout.setVisibility(View.GONE); videoView.release(); - srtTextView.setVisibility(View.INVISIBLE); - topSrtTextView.setVisibility(View.INVISIBLE); + srtTextView.setVisibility(View.GONE); + topSrtTextView.setVisibility(View.GONE); mediaController.hide(); mediaController.resetView(); - loadingLayout.setVisibility(View.INVISIBLE); + loadingLayout.setVisibility(View.GONE); questionView.hide(); auditionView.hide(); auxiliaryVideoView.hide(); - auxiliaryLoadingProgress.setVisibility(View.INVISIBLE); + auxiliaryLoadingProgress.setVisibility(View.GONE); auxiliaryView.hide(); - advertCountDown.setVisibility(View.INVISIBLE); + advertCountDown.setVisibility(View.GONE); firstStartView.hide(); progressView.resetMaxValue(); audioSourceCoverView.hide(); @@ -1013,7 +1125,7 @@ public void play(final String vid, final int bitrate, boolean startNow, final bo @Override public void onClickStart() { //在播放视频时设置viewerId方法使用示例 - videoView.setVidWithViewerId(vid, bitrate, isMustFromLocal,"123"); + videoView.setVidWithViewerId(vid, bitrate, isMustFromLocal, "123"); } }); @@ -1030,9 +1142,16 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { viewPagerFragment.getTalkFragment().onActivityResult(requestCode, resultCode, data); } + @Override + protected void onStart() { + super.onStart(); + isCalledStopOnPipModeChanged = false; + } + @Override protected void onResume() { super.onResume(); + if (!isInPipMode()) { if (!isBackgroundPlay) { //回来后继续播放 @@ -1053,7 +1172,9 @@ protected void onResume() { @Override protected void onStop() { super.onStop(); + isCalledStopOnPipModeChanged = isInPipMode(); mediaController.pause(); + marqueeView.stop(); if (!isInPipMode()) { if (!isBackgroundPlay || isInPictureInPictureMode) { //弹出去暂停 @@ -1070,15 +1191,13 @@ protected void onStop() { protected void onDestroy() { super.onDestroy(); videoView.destroy(); + networkPoorIndicateLayout.destroy(); questionView.hide(); auditionView.hide(); auxiliaryView.hide(); firstStartView.hide(); coverView.hide(); mediaController.disable(); - fl_screencast_search.destroy(); - fl_screencast_search_land.destroy(); - screencastHelper.release(); networkDetection.destroy(); if (viceScreenLayout != null) { viceScreenLayout.destroy(); @@ -1141,6 +1260,10 @@ public void onReceive(Context context, Intent intent) { } } + + if (isCalledStopOnPipModeChanged && !isInPictureInPictureMode) { + finish(); + } } /** @@ -1150,7 +1273,7 @@ public void onReceive(Context context, Intent intent) { private void resetVideoHeight() { //onCreate中初始化了高度,PolyvScreenUtils.generateHeight16_9(this); //如果高度相同,则画中画高度没有成功缩小 - if(viewLayout.getHeight() == PolyvScreenUtils.getHeight16_9() && isInPipMode()){ + if (viewLayout.getHeight() == PolyvScreenUtils.getHeight16_9() && isInPipMode()) { LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) viewLayout.getLayoutParams(); params.height = LinearLayout.LayoutParams.MATCH_PARENT; viewLayout.setLayoutParams(params); @@ -1224,7 +1347,6 @@ private void showScreencastTipsDialog(final String vid, final int bitrate, final .setPositiveButton("继续", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - fl_screencast_status.hide(true); play(vid, bitrate, startNow, isMustFromLocal); } }) @@ -1241,15 +1363,15 @@ public void onClick(DialogInterface dialog, int which) { * 自定义问答必须在视频加载完成{@link PolyvVideoView#setOnPreparedListener(IPolyvOnPreparedListener2)}后才能设置, * 只有视频加载完成后才能知道视频本身是否有问答。视频本身问答加载后再加入自定义问答保证程序一致性。 */ - private void showCustomQuestion(){ + private void showCustomQuestion() { //问题1 PolyvCustomQuestionBuilder.ChoiceList choiceList = new PolyvCustomQuestionBuilder.ChoiceList(); choiceList.addChoice("晴天", true) - .addChoice("雨天",true) + .addChoice("雨天", true) .addChoice("大雾"); try { PolyvCustomQuestionBuilder.create(questionView) - .mustParam("1231", "今天天气怎么样",choiceList) + .mustParam("1231", "今天天气怎么样", choiceList) .skip(true) .illustration(null) .rightAnswerTip("答对了") @@ -1257,7 +1379,7 @@ private void showCustomQuestion(){ .listen(new PolyvCustomQuestionBuilder.IPolyvOnCustomQuestionAnswerResultListener() { @Override public void onAnswerResult(PolyvQuestionVO polyvQuestionVO) { - Log.d(TAG,polyvQuestionVO.getExamId()); + Log.d(TAG, polyvQuestionVO.getExamId()); } }) .showTime(-1) @@ -1275,13 +1397,13 @@ public void onAnswerResult(PolyvQuestionVO polyvQuestionVO) { .addChoice("潮汐"); try { PolyvCustomQuestionBuilder.create(questionView) - .mustParam("1232", "今天天气怎么样",choiceList2) + .mustParam("1232", "今天天气怎么样", choiceList2) .skip(true) .illustration(null) .listen(new PolyvCustomQuestionBuilder.IPolyvOnCustomQuestionAnswerResultListener() { @Override public void onAnswerResult(PolyvQuestionVO polyvQuestionVO) { - Log.d(TAG,polyvQuestionVO.getExamId()); + Log.d(TAG, polyvQuestionVO.getExamId()); } }) .showTime(70) @@ -1300,14 +1422,14 @@ public void onAnswerResult(PolyvQuestionVO polyvQuestionVO) { PolyvQuestionVO questionVO3 = null; try { questionVO3 = PolyvCustomQuestionBuilder.create(questionView) - .mustParam("1233", "今天风力怎么样?",choiceList3) + .mustParam("1233", "今天风力怎么样?", choiceList3) .skip(false) .wrongTime(60) .illustration(null) .listen(new PolyvCustomQuestionBuilder.IPolyvOnCustomQuestionAnswerResultListener() { @Override public void onAnswerResult(PolyvQuestionVO polyvQuestionVO) { - Log.d(TAG,polyvQuestionVO.getExamId()); + Log.d(TAG, polyvQuestionVO.getExamId()); } }).toPolyvQuestionVO(); } catch (Exception e) { @@ -1329,7 +1451,7 @@ public void onAnswerResult(PolyvQuestionVO polyvQuestionVO) { .listen(new PolyvCustomQuestionBuilder.IPolyvOnCustomQuestionAnswerResultListener() { @Override public void onAnswerResult(PolyvQuestionVO polyvQuestionVO) { - Log.d(TAG,polyvQuestionVO.getExamId()); + Log.d(TAG, polyvQuestionVO.getExamId()); } }) .showTime(50) @@ -1344,49 +1466,9 @@ public void onAnswerResult(PolyvQuestionVO polyvQuestionVO) { questionView.changeQuestion(70, questionVOS); } - private void initScreencast() { - fl_screencast_status.setScreencastSearchLayout(fl_screencast_search); - fl_screencast_status.setLandScreencastSearchLayout(fl_screencast_search_land); - fl_screencast_status.setVideoView(videoView); - fl_screencast_status.setMediaController(mediaController); - - screencastHelper = PolyvScreencastHelper.getInstance(null);//如果之前已经初始化,那么这里可以传null - - fl_screencast_search.setScreencastStatusLayout(fl_screencast_status); - fl_screencast_search.setScreencastHelper(screencastHelper); - fl_screencast_search_land.setScreencastStatusLayout(fl_screencast_status); - fl_screencast_search_land.setScreencastHelper(screencastHelper); - - iv_screencast_search.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (iv_screencast_search.isSelected()) { - fl_screencast_search.hide(true); - } else { - fl_screencast_search.show(); - } - } - }); - iv_screencast_search_land.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - fl_screencast_search_land.show(); - } - }); - - fl_screencast_search.setOnVisibilityChangedListener(new PolyvScreencastSearchLayout.OnVisibilityChangedListener() { - @Override - public void onVisibilityChanged(@NonNull View changedView, int visibility) { - iv_screencast_search.setSelected(visibility == View.VISIBLE); - } - }); - } - @Override public boolean dispatchTouchEvent(MotionEvent ev) { - if (hideViewOnTouchOutside(ev, fl_screencast_search_land)) { - return true; - } else if (hideViewOnTouchOutside(ev, landPptDirLayout)) { + if (hideViewOnTouchOutside(ev, landPptDirLayout)) { return true; } return super.dispatchTouchEvent(ev); @@ -1397,11 +1479,7 @@ private boolean hideViewOnTouchOutside(MotionEvent ev, View view) { int[] location = new int[2]; view.getLocationInWindow(location); if (ev.getX() < location[0]) { - if (view instanceof PolyvScreencastSearchLayout) { - ((PolyvScreencastSearchLayout) view).hide(true); - } else { - view.setVisibility(View.INVISIBLE); - } + view.setVisibility(View.GONE); return true; } } @@ -1412,15 +1490,7 @@ private boolean hideViewOnTouchOutside(MotionEvent ev, View view) { public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (landPptDirLayout.getVisibility() == View.VISIBLE) { - landPptDirLayout.setVisibility(View.INVISIBLE); - return true; - } - if (fl_screencast_search.getVisibility() == View.VISIBLE) { - fl_screencast_search.hide(true); - return true; - } - if (fl_screencast_search_land.getVisibility() == View.VISIBLE) { - fl_screencast_search_land.hide(true); + landPptDirLayout.setVisibility(View.GONE); return true; } if (mediaController != null && mediaController.isLocked()) { diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvTalkEdittextActivity.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvTalkEdittextActivity.java index e27da3d..e53b75a 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvTalkEdittextActivity.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvTalkEdittextActivity.java @@ -1,123 +1,123 @@ -package com.easefun.polyvsdk.activity; - -import android.app.Activity; -import android.content.Intent; -import android.graphics.Color; -import android.os.Bundle; -import android.text.Editable; -import android.text.Spannable; -import android.text.SpannableString; -import android.text.TextWatcher; -import android.text.style.BackgroundColorSpan; -import android.text.style.ForegroundColorSpan; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.EditText; -import android.widget.TextView; -import android.widget.Toast; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.fragment.PolyvTalkFragment; - -public class PolyvTalkEdittextActivity extends Activity { - // 讨论的输入框 - private EditText et_talk; - // 发送按钮 - private TextView tv_send; - // question_id - private String question_id; - // 点击的父索引 - private int position; - // 非发送内容的字符串长度 - private int length; - private String nickname; - - private void findIdAndNew() { - et_talk = (EditText) findViewById(R.id.et_talk); - tv_send = (TextView) findViewById(R.id.tv_send); - } - - private void initView() { - final SpannableString spanStr = new SpannableString("回复 @" + nickname + " : "); - length = spanStr.length(); - spanStr.setSpan(new BackgroundColorSpan(Color.MAGENTA), 0, length - 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - spanStr.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.center_left_text_color_gray)), 0, - length - 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - et_talk.setText(spanStr); - et_talk.setSelection(length); - et_talk.addTextChangedListener(new TextWatcher() { - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - String all = et_talk.getText().toString(); - String msg = all.substring(all.indexOf(" : ") + 3); - if (all.length() < length || all.indexOf(" : ") == -1) - msg = ""; - if (start < length && !et_talk.getText().toString().equals(spanStr.toString() + msg)) { - final SpannableString spanStr1 = new SpannableString(spanStr + msg); - spanStr1.setSpan(new BackgroundColorSpan(Color.MAGENTA), 0, spanStr1.length() - msg.length() - 3, - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - spanStr1.setSpan( - new ForegroundColorSpan(getResources().getColor(R.color.center_left_text_color_gray)), 0, - spanStr1.length() - msg.length() - 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - et_talk.setText(spanStr1); - et_talk.setSelection(et_talk.getText().toString().length()); - } - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void afterTextChanged(Editable s) { - } - }); - tv_send.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - String sendMsg = et_talk.getText().toString().substring(length); - if (sendMsg.trim().length()==0) { - Toast.makeText(PolyvTalkEdittextActivity.this,"发送信息不能为空!",Toast.LENGTH_SHORT).show(); - return; - } - Intent intent = new Intent(PolyvTalkEdittextActivity.this, PolyvTalkFragment.class); - intent.putExtra("question_id", question_id); - intent.putExtra("position", position); - intent.putExtra("sendMsg", sendMsg); - setResult(19, intent); - finish(); - } - }); - } - - private void initData() { - question_id = getIntent().getStringExtra("question_id"); - position = getIntent().getIntExtra("position", -1); - nickname = getIntent().getStringExtra("nickname"); - } - - @Override - public void finish() { - super.finish(); - overridePendingTransition(0,0); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.polyv_activity_talk_edittext); - initData(); - findIdAndNew(); - initView(); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_UP) - finish(); - return true; - } -} +package com.easefun.polyvsdk.activity; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.text.Editable; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.TextWatcher; +import android.text.style.BackgroundColorSpan; +import android.text.style.ForegroundColorSpan; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.fragment.PolyvTalkFragment; + +public class PolyvTalkEdittextActivity extends Activity { + // 讨论的输入框 + private EditText et_talk; + // 发送按钮 + private TextView tv_send; + // question_id + private String question_id; + // 点击的父索引 + private int position; + // 非发送内容的字符串长度 + private int length; + private String nickname; + + private void findIdAndNew() { + et_talk = (EditText) findViewById(R.id.et_talk); + tv_send = (TextView) findViewById(R.id.tv_send); + } + + private void initView() { + final SpannableString spanStr = new SpannableString("回复 @" + nickname + " : "); + length = spanStr.length(); + spanStr.setSpan(new BackgroundColorSpan(Color.MAGENTA), 0, length - 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + spanStr.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.center_left_text_color_gray)), 0, + length - 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + et_talk.setText(spanStr); + et_talk.setSelection(length); + et_talk.addTextChangedListener(new TextWatcher() { + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + String all = et_talk.getText().toString(); + String msg = all.substring(all.indexOf(" : ") + 3); + if (all.length() < length || all.indexOf(" : ") == -1) + msg = ""; + if (start < length && !et_talk.getText().toString().equals(spanStr.toString() + msg)) { + final SpannableString spanStr1 = new SpannableString(spanStr + msg); + spanStr1.setSpan(new BackgroundColorSpan(Color.MAGENTA), 0, spanStr1.length() - msg.length() - 3, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + spanStr1.setSpan( + new ForegroundColorSpan(getResources().getColor(R.color.center_left_text_color_gray)), 0, + spanStr1.length() - msg.length() - 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + et_talk.setText(spanStr1); + et_talk.setSelection(et_talk.getText().toString().length()); + } + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + tv_send.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + String sendMsg = et_talk.getText().toString().substring(length); + if (sendMsg.trim().length()==0) { + Toast.makeText(PolyvTalkEdittextActivity.this,"发送信息不能为空!",Toast.LENGTH_SHORT).show(); + return; + } + Intent intent = new Intent(PolyvTalkEdittextActivity.this, PolyvTalkFragment.class); + intent.putExtra("question_id", question_id); + intent.putExtra("position", position); + intent.putExtra("sendMsg", sendMsg); + setResult(19, intent); + finish(); + } + }); + } + + private void initData() { + question_id = getIntent().getStringExtra("question_id"); + position = getIntent().getIntExtra("position", -1); + nickname = getIntent().getStringExtra("nickname"); + } + + @Override + public void finish() { + super.finish(); + overridePendingTransition(0,0); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.polyv_activity_talk_edittext); + initData(); + findIdAndNew(); + initView(); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_UP) + finish(); + return true; + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvTalkSendActivity.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvTalkSendActivity.java index e8c872f..b96ec10 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvTalkSendActivity.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvTalkSendActivity.java @@ -1,102 +1,102 @@ -package com.easefun.polyvsdk.activity; - -import com.easefun.polyvsdk.R; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; - -public class PolyvTalkSendActivity extends Activity { - // 返回按钮 - private ImageView iv_finish; - // 发送按钮 - private TextView tv_send; - // 话题,内容 - private EditText et_topic, et_msg; - - private void findIdAndNew() { - iv_finish = (ImageView) findViewById(R.id.iv_finish); - tv_send = (TextView) findViewById(R.id.tv_send); - et_topic = (EditText) findViewById(R.id.et_topic); - et_msg = (EditText) findViewById(R.id.et_msg); - } - - private void initView() { - iv_finish.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - finish(); - } - }); - et_topic.addTextChangedListener(new TextWatcher() { - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void afterTextChanged(Editable s) { - if (s.toString().trim().length() > 0 && et_msg.getText().toString().trim().length() > 0) { - tv_send.setEnabled(true); - tv_send.setTextColor(getResources().getColorStateList(R.color.polyv_send_text_color)); - } else { - tv_send.setEnabled(false); - tv_send.setTextColor(getResources().getColor(R.color.top_right_text_color_gray)); - } - } - }); - et_msg.addTextChangedListener(new TextWatcher() { - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void afterTextChanged(Editable s) { - if (s.toString().trim().length() > 0 && et_topic.getText().toString().trim().length() > 0) { - tv_send.setEnabled(true); - tv_send.setTextColor(getResources().getColorStateList(R.color.polyv_send_text_color)); - } else { - tv_send.setEnabled(false); - tv_send.setTextColor(getResources().getColor(R.color.top_right_text_color_gray)); - } - } - }); - tv_send.setEnabled(false); - tv_send.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - Intent intent = new Intent(); - intent.putExtra("topic", et_topic.getText().toString()); - intent.putExtra("sendMsg", et_msg.getText().toString()); - setResult(12, intent); - finish(); - } - }); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.polyv_activity_talk_send); - findIdAndNew(); - initView(); - } -} +package com.easefun.polyvsdk.activity; + +import com.easefun.polyvsdk.R; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +public class PolyvTalkSendActivity extends Activity { + // 返回按钮 + private ImageView iv_finish; + // 发送按钮 + private TextView tv_send; + // 话题,内容 + private EditText et_topic, et_msg; + + private void findIdAndNew() { + iv_finish = (ImageView) findViewById(R.id.iv_finish); + tv_send = (TextView) findViewById(R.id.tv_send); + et_topic = (EditText) findViewById(R.id.et_topic); + et_msg = (EditText) findViewById(R.id.et_msg); + } + + private void initView() { + iv_finish.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + finish(); + } + }); + et_topic.addTextChangedListener(new TextWatcher() { + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void afterTextChanged(Editable s) { + if (s.toString().trim().length() > 0 && et_msg.getText().toString().trim().length() > 0) { + tv_send.setEnabled(true); + tv_send.setTextColor(getResources().getColorStateList(R.color.polyv_send_text_color)); + } else { + tv_send.setEnabled(false); + tv_send.setTextColor(getResources().getColor(R.color.top_right_text_color_gray)); + } + } + }); + et_msg.addTextChangedListener(new TextWatcher() { + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void afterTextChanged(Editable s) { + if (s.toString().trim().length() > 0 && et_topic.getText().toString().trim().length() > 0) { + tv_send.setEnabled(true); + tv_send.setTextColor(getResources().getColorStateList(R.color.polyv_send_text_color)); + } else { + tv_send.setEnabled(false); + tv_send.setTextColor(getResources().getColor(R.color.top_right_text_color_gray)); + } + } + }); + tv_send.setEnabled(false); + tv_send.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + Intent intent = new Intent(); + intent.putExtra("topic", et_topic.getText().toString()); + intent.putExtra("sendMsg", et_msg.getText().toString()); + setResult(12, intent); + finish(); + } + }); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.polyv_activity_talk_send); + findIdAndNew(); + initView(); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvUploadActivity.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvUploadActivity.java index a74d472..9c942b4 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvUploadActivity.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/activity/PolyvUploadActivity.java @@ -1,182 +1,182 @@ -package com.easefun.polyvsdk.activity; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.AdapterView; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.RelativeLayout; -import android.widget.Toast; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.adapter.PolyvUploadListViewAdapter; -import com.easefun.polyvsdk.bean.PolyvUploadInfo; -import com.easefun.polyvsdk.database.PolyvUploadSQLiteHelper; -import com.easefun.polyvsdk.util.GetPathFromUri; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -public class PolyvUploadActivity extends Activity { - // 上传的listView - private ListView lv_upload; - private PolyvUploadListViewAdapter adapter; - private List lists; - // 返回按钮 - private ImageView iv_finish; - // 底部选择本地视频按钮 - private RelativeLayout rl_bot; - private PolyvUploadSQLiteHelper uploadSQLiteHelper; - - private void findIdAndNew() { - lv_upload = (ListView) findViewById(R.id.lv_upload); - iv_finish = (ImageView) findViewById(R.id.iv_finish); - rl_bot = (RelativeLayout) findViewById(R.id.rl_bot); - lists = new ArrayList<>(); - uploadSQLiteHelper = PolyvUploadSQLiteHelper.getInstance(this); - } - - private void initView() { - lists.addAll(PolyvUploadSQLiteHelper.getInstance(this).getAll()); - adapter = new PolyvUploadListViewAdapter(this, lists, lv_upload); - lv_upload.setAdapter(adapter); - lv_upload.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, final int position, long id) { - new AlertDialog.Builder(PolyvUploadActivity.this).setTitle("提示").setMessage("是否从列表中移除该任务") - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - adapter.removeTask(position); - } - }).setNegativeButton(android.R.string.cancel, null).show(); - return true; - } - }); - iv_finish.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - finish(); - } - }); - rl_bot.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.setType("video/*"); - startActivityForResult(Intent.createChooser(intent, "完成操作需使用"), 12); - } - }); - } - - // 获取视频的地址并添加到上传列表中 - private void handle(Uri... uris) { - // 路径 - String filepath; - for (int i = 0; i < uris.length; i++) { - // 在图册中上传 - if (uris[i].toString().startsWith("content")) { - filepath = GetPathFromUri.getPath(this, uris[i]); - } else { - // 在文件中选择 - filepath = uris[i].getPath().substring(uris[i].getPath().indexOf("/") + 1); - } - File file = new File(filepath); - String fileName = file.getName(); - // 标题 - String title = null; - if (fileName.contains(".")) { - title = fileName.substring(0, fileName.lastIndexOf(".")); - } else { - title = fileName; - } - // 描述 - String desc = title; - // 大小 - long filesize = file.length(); - // 分类id,默认为0 - // 注:如果一个视频使用uploader.start()上传了数据,之后再改变为其他的cataid上传,也会上传到之前有数据的那个cataid目录下。 - String cataid = "0"; - PolyvUploadInfo uploadInfo = new PolyvUploadInfo(title, desc, filesize, filepath, cataid); - if (!uploadSQLiteHelper.isAdd(uploadInfo)) { - uploadSQLiteHelper.insert(uploadInfo); - lists.add(uploadInfo); - adapter.initUploader(); - } else { - PolyvUploadActivity.this.runOnUiThread(new Runnable() { - - @Override - public void run() { - Toast.makeText(PolyvUploadActivity.this, "上传任务已经增加到队列", Toast.LENGTH_SHORT).show(); - } - }); - } - } - adapter.notifyDataSetChanged(); - } - - private void initData() { - initData(null); - } - - // 初始化分享上传的视频数据 - private void initData(Intent intent) { - if (intent == null) - intent = getIntent(); - String action = intent.getAction(); - String type = intent.getType(); - if (Intent.ACTION_SEND.equals(action) && type != null) { - if (type.startsWith("video/")) { - Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM); - if (uri != null) - handle(uri); - } - } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { - if (type.startsWith("video/") || type.startsWith("*/")) { - ArrayList uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); - if (uris != null) - handle(uris.toArray(new Uri[uris.size()])); - } - } - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.polyv_activity_upload); - findIdAndNew(); - initView(); - initData(); - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - initData(intent); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - switch (requestCode) { - case 12: - if (resultCode == RESULT_OK && data != null) { - // 获取文件路径 - Uri uri = data.getData(); - handle(uri); - } else { - Toast.makeText(PolyvUploadActivity.this, "视频获取失败", Toast.LENGTH_SHORT).show(); - } - break; - } - } -} +package com.easefun.polyvsdk.activity; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.Toast; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.adapter.PolyvUploadListViewAdapter; +import com.easefun.polyvsdk.bean.PolyvUploadInfo; +import com.easefun.polyvsdk.database.PolyvUploadSQLiteHelper; +import com.easefun.polyvsdk.util.GetPathFromUri; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class PolyvUploadActivity extends Activity { + // 上传的listView + private ListView lv_upload; + private PolyvUploadListViewAdapter adapter; + private List lists; + // 返回按钮 + private ImageView iv_finish; + // 底部选择本地视频按钮 + private RelativeLayout rl_bot; + private PolyvUploadSQLiteHelper uploadSQLiteHelper; + + private void findIdAndNew() { + lv_upload = (ListView) findViewById(R.id.lv_upload); + iv_finish = (ImageView) findViewById(R.id.iv_finish); + rl_bot = (RelativeLayout) findViewById(R.id.rl_bot); + lists = new ArrayList<>(); + uploadSQLiteHelper = PolyvUploadSQLiteHelper.getInstance(this); + } + + private void initView() { + lists.addAll(PolyvUploadSQLiteHelper.getInstance(this).getAll()); + adapter = new PolyvUploadListViewAdapter(this, lists, lv_upload); + lv_upload.setAdapter(adapter); + lv_upload.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, final int position, long id) { + new AlertDialog.Builder(PolyvUploadActivity.this).setTitle("提示").setMessage("是否从列表中移除该任务") + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + adapter.removeTask(position); + } + }).setNegativeButton(android.R.string.cancel, null).show(); + return true; + } + }); + iv_finish.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + finish(); + } + }); + rl_bot.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.setType("video/*"); + startActivityForResult(Intent.createChooser(intent, "完成操作需使用"), 12); + } + }); + } + + // 获取视频的地址并添加到上传列表中 + private void handle(Uri... uris) { + // 路径 + String filepath; + for (int i = 0; i < uris.length; i++) { + // 在图册中上传 + if (uris[i].toString().startsWith("content")) { + filepath = GetPathFromUri.getPath(this, uris[i]); + } else { + // 在文件中选择 + filepath = uris[i].getPath().substring(uris[i].getPath().indexOf("/") + 1); + } + File file = new File(filepath); + String fileName = file.getName(); + // 标题 + String title = null; + if (fileName.contains(".")) { + title = fileName.substring(0, fileName.lastIndexOf(".")); + } else { + title = fileName; + } + // 描述 + String desc = title; + // 大小 + long filesize = file.length(); + // 分类id,默认为0 + // 注:如果一个视频使用uploader.start()上传了数据,之后再改变为其他的cataid上传,也会上传到之前有数据的那个cataid目录下。 + String cataid = "0"; + PolyvUploadInfo uploadInfo = new PolyvUploadInfo(title, desc, filesize, filepath, cataid); + if (!uploadSQLiteHelper.isAdd(uploadInfo)) { + uploadSQLiteHelper.insert(uploadInfo); + lists.add(uploadInfo); + adapter.initUploader(); + } else { + PolyvUploadActivity.this.runOnUiThread(new Runnable() { + + @Override + public void run() { + Toast.makeText(PolyvUploadActivity.this, "上传任务已经增加到队列", Toast.LENGTH_SHORT).show(); + } + }); + } + } + adapter.notifyDataSetChanged(); + } + + private void initData() { + initData(null); + } + + // 初始化分享上传的视频数据 + private void initData(Intent intent) { + if (intent == null) + intent = getIntent(); + String action = intent.getAction(); + String type = intent.getType(); + if (Intent.ACTION_SEND.equals(action) && type != null) { + if (type.startsWith("video/")) { + Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM); + if (uri != null) + handle(uri); + } + } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { + if (type.startsWith("video/") || type.startsWith("*/")) { + ArrayList uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); + if (uris != null) + handle(uris.toArray(new Uri[uris.size()])); + } + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.polyv_activity_upload); + findIdAndNew(); + initView(); + initData(); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + initData(intent); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + switch (requestCode) { + case 12: + if (resultCode == RESULT_OK && data != null) { + // 获取文件路径 + Uri uri = data.getData(); + handle(uri); + } else { + Toast.makeText(PolyvUploadActivity.this, "视频获取失败", Toast.LENGTH_SHORT).show(); + } + break; + } + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/AbsRecyclerViewAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/AbsRecyclerViewAdapter.java index f56d97d..6db8d41 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/AbsRecyclerViewAdapter.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/AbsRecyclerViewAdapter.java @@ -1,8 +1,8 @@ package com.easefun.polyvsdk.adapter; import android.content.Context; -import android.support.annotation.IdRes; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.IdRes; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import java.util.ArrayList; diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/EndlessRecyclerOnScrollListener.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/EndlessRecyclerOnScrollListener.java index 6b7ab52..c58da22 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/EndlessRecyclerOnScrollListener.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/EndlessRecyclerOnScrollListener.java @@ -1,7 +1,7 @@ package com.easefun.polyvsdk.adapter; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener { diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/HeaderViewRecyclerAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/HeaderViewRecyclerAdapter.java index ef1e570..022af97 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/HeaderViewRecyclerAdapter.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/HeaderViewRecyclerAdapter.java @@ -1,6 +1,6 @@ package com.easefun.polyvsdk.adapter; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvAnswerAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvAnswerAdapter.java index 631bcf6..479b025 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvAnswerAdapter.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvAnswerAdapter.java @@ -1,7 +1,7 @@ package com.easefun.polyvsdk.adapter; import android.content.Context; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvCurriculumListViewAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvCurriculumListViewAdapter.java index a351057..e1590c8 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvCurriculumListViewAdapter.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvCurriculumListViewAdapter.java @@ -1,261 +1,266 @@ -package com.easefun.polyvsdk.adapter; - -import android.content.Context; -import android.support.annotation.NonNull; -import android.util.SparseBooleanArray; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import com.easefun.polyvsdk.PolyvDownloader; -import com.easefun.polyvsdk.PolyvDownloaderErrorReason; -import com.easefun.polyvsdk.PolyvDownloaderManager; -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.bean.PolyvDownloadInfo; -import com.easefun.polyvsdk.database.PolyvDownloadSQLiteHelper; -import com.easefun.polyvsdk.download.listener.IPolyvDownloaderProgressListener; -import com.easefun.polyvsdk.util.PolyvImageLoader; -import com.easefun.polyvsdk.util.PolyvVlmsHelper; -import com.easefun.polyvsdk.vo.PolyvVideoVO; - -import java.util.List; - -public class PolyvCurriculumListViewAdapter extends BaseAdapter { - private List lists; - private static Context appContext; - private LayoutInflater inflater; - private ViewHolder viewHolder; - private boolean isVisible; - private SparseBooleanArray selBit1Positions; - private SparseBooleanArray selBit2Positions; - private SparseBooleanArray selBit3Positions; - private PolyvDownloadSQLiteHelper downloadSQLiteHelper; - private int currentSelcetBitrate; - - public PolyvCurriculumListViewAdapter(List lists, Context context) { - // lists所指向的对象更新时,这里也会更新 - this.lists = lists; - this.appContext = context.getApplicationContext(); - this.inflater = LayoutInflater.from(context); - this.selBit1Positions = new SparseBooleanArray(); - this.selBit2Positions = new SparseBooleanArray(); - this.selBit3Positions = new SparseBooleanArray(); - this.downloadSQLiteHelper = PolyvDownloadSQLiteHelper.getInstance(context); - } - - public void cancelSideIconSelected() { - for (int i = 0; i < lists.size(); i++) { - for (int j = 1; j <= 3; j++) { - PolyvDownloadInfo downloadInfo = generateDownloadInfo(i, j); - if (!downloadSQLiteHelper.isAdd(downloadInfo)) - putSideIconStatus(j, i, false); - } - } - } - - public void putCurBitSideIconSelected(int bitrate) { - for (int i = 0; i < lists.size(); i++) - putSideIconStatus(bitrate, i, true); - } - - public void putSideIconStatus(int bitrate, int position, boolean isSelected) { - PolyvDownloadInfo downloadInfo = generateDownloadInfo(position, 3); - // 如果可以下载的码率<=选择下载的码率 - if (downloadInfo.getBitrate() <= bitrate) - mulPutSideIconStatus(3, position, isSelected); - else - mulPutSideIconStatus(bitrate, position, isSelected); - } - - //设置侧边图标的选择状态 - private void mulPutSideIconStatus(int bitrate, int position, boolean isSelected) { - SparseBooleanArray temp = null; - switch (bitrate) { - case 1: - temp = selBit1Positions; - selBit1Positions.put(position, isSelected); - break; - case 2: - temp = selBit2Positions; - selBit2Positions.put(position, isSelected); - break; - case 3: - temp = selBit3Positions; - selBit3Positions.put(position, isSelected); - break; - } - PolyvDownloadInfo downloadInfo = generateDownloadInfo(position, bitrate); - if (bitrate != downloadInfo.getBitrate()) { - // 如果可以下载的码率与当前选择的码率不同,那么把当前item的状态同步到那个item - mulPutSideIconStatus(downloadInfo.getBitrate(), position, isSelected); - } - // 遍历集合,把当前bit及vid相同的项设置为相同的状态 - for (int i = 0; i < lists.size(); i++) { - if (lists.get(i).lecture.vid.equals(downloadInfo.getVid())) - temp.put(i, isSelected); - } - notifyDataSetChanged(); - } - - public boolean isHasSelected(boolean exceptIsAdded) { - for (int i = 0; i < lists.size(); i++) { - for (int j = 1; j <= 3; j++) - if (getSideIconStatus(j, i, exceptIsAdded)) - return true; - } - return false; - } - - //获取侧边图标是否是选择状态 - public boolean getSideIconStatus(int bitrate, int position, boolean exceptIsAdded) { - boolean isSelected = false; - switch (bitrate) { - case 1: - isSelected = selBit1Positions.get(position, false); - break; - case 2: - isSelected = selBit2Positions.get(position, false); - break; - case 3: - isSelected = selBit3Positions.get(position, false); - break; - } - PolyvDownloadInfo downloadInfo = generateDownloadInfo(position, bitrate); - boolean isAdded = downloadSQLiteHelper.isAdd(downloadInfo); - return exceptIsAdded ? (isAdded ? false : isSelected) : isSelected; - } - - //初始化选择状态 - public void initSelect(int bitrate) { - currentSelcetBitrate = bitrate; - for (int i = 0; i < lists.size(); i++) { - if (downloadSQLiteHelper.isAdd(generateDownloadInfo(i, bitrate)) || getSideIconStatus(bitrate, i, false)) { - putSideIconStatus(bitrate, i, true); - } else { - putSideIconStatus(bitrate, i, false); - } - } - notifyDataSetChanged(); - } - - // 设置侧边图标是否可见 - public void setSideIconVisible(boolean isVisible) { - this.isVisible = isVisible; - notifyDataSetChanged(); - } - - // 获取侧边图标是否可见 - public boolean getSideIconVisible() { - return isVisible; - } - - //生成下载信息对象 - private PolyvDownloadInfo generateDownloadInfo(int position, int bitrate) { - PolyvVlmsHelper.CurriculumsDetail curriculum = lists.get(position); - PolyvVideoVO videoVO = curriculum.videoVO; - long filesize = -1; - // 获取可以下载码率的文件大小 - while (filesize <= 0 && bitrate > 0) - filesize = videoVO.getFileSizeMatchVideoType(bitrate--, PolyvDownloader.FILE_VIDEO); - return new PolyvDownloadInfo(videoVO.getVid(), videoVO.getDuration(), filesize, bitrate + 1, curriculum.lecture.title); - } - - private static class MyDownloadListener implements IPolyvDownloaderProgressListener { - private PolyvDownloadInfo downloadInfo; - private long total; - - public MyDownloadListener(PolyvDownloadInfo downloadInfo) { - this.downloadInfo = downloadInfo; - } - - @Override - public void onDownload(long current, long total) { - this.total = total; - } - - @Override - public void onDownloadSuccess() { - if (total == 0) - total = 1; - PolyvDownloadSQLiteHelper.getInstance(appContext).update(downloadInfo, total, total); - } - - @Override - public void onDownloadFail(@NonNull PolyvDownloaderErrorReason errorReason) { - } - } - - public void downloadSelected() { - for (int i = 0; i < lists.size(); i++) { - for (int j = 1; j <= 3; j++) { - boolean isSelected = getSideIconStatus(j, i, false); - final PolyvDownloadInfo downloadInfo = generateDownloadInfo(i, j); - downloadInfo.setFileType(PolyvDownloader.FILE_VIDEO); - if (isSelected && !downloadSQLiteHelper.isAdd(downloadInfo)) { - downloadSQLiteHelper.insert(downloadInfo); - PolyvDownloader downloader = PolyvDownloaderManager.getPolyvDownloader(downloadInfo.getVid(), downloadInfo.getBitrate(), downloadInfo.getFileType()); - downloader.setPolyvDownloadProressListener(new MyDownloadListener(downloadInfo)); - downloader.start(); - } - } - } - } - - @Override - public int getCount() { - return lists.size(); - } - - @Override - public Object getItem(int position) { - return lists.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = inflater.inflate(R.layout.polyv_listview_cur_item, null); - viewHolder = new ViewHolder(); - viewHolder.iv_sel = (ImageView) convertView.findViewById(R.id.iv_sel); - viewHolder.iv_demo = (ImageView) convertView.findViewById(R.id.iv_demo); - viewHolder.tv_seri = (TextView) convertView.findViewById(R.id.tv_seri); - viewHolder.tv_title = (TextView) convertView.findViewById(R.id.tv_title); - viewHolder.tv_time = (TextView) convertView.findViewById(R.id.tv_time); - viewHolder.tv_added = (TextView) convertView.findViewById(R.id.tv_added); - convertView.setTag(viewHolder); - } else { - viewHolder = (ViewHolder) convertView.getTag(); - } - if (isVisible) - viewHolder.iv_sel.setVisibility(View.VISIBLE); - else - viewHolder.iv_sel.setVisibility(View.INVISIBLE); - if (!getSideIconStatus(currentSelcetBitrate, position, false)) - viewHolder.iv_sel.setSelected(false); - else - viewHolder.iv_sel.setSelected(true); - if (isVisible && downloadSQLiteHelper.isAdd(generateDownloadInfo(position, currentSelcetBitrate))) - viewHolder.tv_added.setVisibility(View.VISIBLE); - else - viewHolder.tv_added.setVisibility(View.INVISIBLE); - PolyvVlmsHelper.CurriculumsDetail polyvCurriculum = lists.get(position); - viewHolder.tv_seri.setText(polyvCurriculum.section_name + " " + polyvCurriculum.name); - viewHolder.tv_title.setText(polyvCurriculum.lecture.title); - viewHolder.tv_time.setText(polyvCurriculum.lecture.duration); - PolyvImageLoader.getInstance().loadImageWithCache(appContext,polyvCurriculum.cover_image, viewHolder.iv_demo, R.drawable.polyv_demo ); - return convertView; - } - - private class ViewHolder { - ImageView iv_sel, iv_demo; - TextView tv_seri, tv_title, tv_time, tv_added; - } -} +package com.easefun.polyvsdk.adapter; + +import android.content.Context; +import androidx.annotation.NonNull; +import android.text.TextUtils; +import android.util.SparseBooleanArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.easefun.polyvsdk.PolyvDownloader; +import com.easefun.polyvsdk.PolyvDownloaderErrorReason; +import com.easefun.polyvsdk.PolyvDownloaderManager; +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.bean.PolyvDownloadInfo; +import com.easefun.polyvsdk.database.PolyvDownloadSQLiteHelper; +import com.easefun.polyvsdk.download.listener.IPolyvDownloaderProgressListener; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvVlmsCurriculumInfo; +import com.easefun.polyvsdk.util.PolyvImageLoader; +import com.easefun.polyvsdk.util.PolyvTimeUtils; +import com.easefun.polyvsdk.vo.PolyvVideoVO; + +import java.util.List; + +public class PolyvCurriculumListViewAdapter extends BaseAdapter { + private List lists; + private static Context appContext; + private LayoutInflater inflater; + private ViewHolder viewHolder; + private boolean isVisible; + private SparseBooleanArray selBit1Positions; + private SparseBooleanArray selBit2Positions; + private SparseBooleanArray selBit3Positions; + private PolyvDownloadSQLiteHelper downloadSQLiteHelper; + private int currentSelcetBitrate; + + public PolyvCurriculumListViewAdapter(List lists, Context context) { + // lists所指向的对象更新时,这里也会更新 + this.lists = lists; + this.appContext = context.getApplicationContext(); + this.inflater = LayoutInflater.from(context); + this.selBit1Positions = new SparseBooleanArray(); + this.selBit2Positions = new SparseBooleanArray(); + this.selBit3Positions = new SparseBooleanArray(); + this.downloadSQLiteHelper = PolyvDownloadSQLiteHelper.getInstance(context); + } + + public void cancelSideIconSelected() { + for (int i = 0; i < lists.size(); i++) { + for (int j = 1; j <= 3; j++) { + PolyvDownloadInfo downloadInfo = generateDownloadInfo(i, j); + if (!downloadSQLiteHelper.isAdd(downloadInfo)) + putSideIconStatus(j, i, false); + } + } + } + + public void putCurBitSideIconSelected(int bitrate) { + for (int i = 0; i < lists.size(); i++) + putSideIconStatus(bitrate, i, true); + } + + public void putSideIconStatus(int bitrate, int position, boolean isSelected) { + PolyvDownloadInfo downloadInfo = generateDownloadInfo(position, 3); + // 如果可以下载的码率<=选择下载的码率 + if (downloadInfo.getBitrate() <= bitrate) + mulPutSideIconStatus(3, position, isSelected); + else + mulPutSideIconStatus(bitrate, position, isSelected); + } + + //设置侧边图标的选择状态 + private void mulPutSideIconStatus(int bitrate, int position, boolean isSelected) { + SparseBooleanArray temp = null; + switch (bitrate) { + case 1: + temp = selBit1Positions; + selBit1Positions.put(position, isSelected); + break; + case 2: + temp = selBit2Positions; + selBit2Positions.put(position, isSelected); + break; + case 3: + temp = selBit3Positions; + selBit3Positions.put(position, isSelected); + break; + } + PolyvDownloadInfo downloadInfo = generateDownloadInfo(position, bitrate); + if (bitrate != downloadInfo.getBitrate()) { + // 如果可以下载的码率与当前选择的码率不同,那么把当前item的状态同步到那个item + mulPutSideIconStatus(downloadInfo.getBitrate(), position, isSelected); + } + //遍历集合,把当前bit及vid相同的项设置为相同的状态 + for (int i = 0; i < lists.size(); i++) { + if (lists.get(i).getVideoId().equals(downloadInfo.getVid())) + temp.put(i, isSelected); + } + notifyDataSetChanged(); + } + + public boolean isHasSelected(boolean exceptIsAdded) { + for (int i = 0; i < lists.size(); i++) { + for (int j = 1; j <= 3; j++) + if (getSideIconStatus(j, i, exceptIsAdded)) + return true; + } + return false; + } + + //获取侧边图标是否是选择状态 + public boolean getSideIconStatus(int bitrate, int position, boolean exceptIsAdded) { + boolean isSelected = false; + switch (bitrate) { + case 1: + isSelected = selBit1Positions.get(position, false); + break; + case 2: + isSelected = selBit2Positions.get(position, false); + break; + case 3: + isSelected = selBit3Positions.get(position, false); + break; + } + PolyvDownloadInfo downloadInfo = generateDownloadInfo(position, bitrate); + boolean isAdded = downloadSQLiteHelper.isAdd(downloadInfo); + return exceptIsAdded ? (isAdded ? false : isSelected) : isSelected; + } + + //初始化选择状态 + public void initSelect(int bitrate) { + currentSelcetBitrate = bitrate; + for (int i = 0; i < lists.size(); i++) { + if (downloadSQLiteHelper.isAdd(generateDownloadInfo(i, bitrate)) || getSideIconStatus(bitrate, i, false)) { + putSideIconStatus(bitrate, i, true); + } else { + putSideIconStatus(bitrate, i, false); + } + } + notifyDataSetChanged(); + } + + // 设置侧边图标是否可见 + public void setSideIconVisible(boolean isVisible) { + this.isVisible = isVisible; + notifyDataSetChanged(); + } + + // 获取侧边图标是否可见 + public boolean getSideIconVisible() { + return isVisible; + } + + //生成下载信息对象 + private PolyvDownloadInfo generateDownloadInfo(int position, int bitrate) { + PolyvVlmsCurriculumInfo curriculum = lists.get(position); + PolyvVideoVO videoVO = curriculum.getVideo(); + long filesize = -1; + // 获取可以下载码率的文件大小 + while (filesize <= 0 && bitrate > 0) + filesize = videoVO.getFileSizeMatchVideoType(bitrate--, PolyvDownloader.FILE_VIDEO); + return new PolyvDownloadInfo(videoVO.getVid(), videoVO.getDuration(), filesize, bitrate + 1, curriculum.getTitle()); + } + + private static class MyDownloadListener implements IPolyvDownloaderProgressListener { + private PolyvDownloadInfo downloadInfo; + private long total; + + public MyDownloadListener(PolyvDownloadInfo downloadInfo) { + this.downloadInfo = downloadInfo; + } + + @Override + public void onDownload(long current, long total) { + this.total = total; + } + + @Override + public void onDownloadSuccess() { + if (total == 0) + total = 1; + PolyvDownloadSQLiteHelper.getInstance(appContext).update(downloadInfo, total, total); + } + + @Override + public void onDownloadFail(@NonNull PolyvDownloaderErrorReason errorReason) { + } + } + + public void downloadSelected() { + for (int i = 0; i < lists.size(); i++) { + for (int j = 1; j <= 3; j++) { + boolean isSelected = getSideIconStatus(j, i, false); + final PolyvDownloadInfo downloadInfo = generateDownloadInfo(i, j); + downloadInfo.setFileType(PolyvDownloader.FILE_VIDEO); + if (isSelected && !downloadSQLiteHelper.isAdd(downloadInfo)) { + downloadSQLiteHelper.insert(downloadInfo); + PolyvDownloader downloader = PolyvDownloaderManager.getPolyvDownloader(downloadInfo.getVid(), downloadInfo.getBitrate(), downloadInfo.getFileType()); + downloader.setPolyvDownloadProressListener(new MyDownloadListener(downloadInfo)); + downloader.start(); + } + } + } + } + + @Override + public int getCount() { + return lists.size(); + } + + @Override + public Object getItem(int position) { + return lists.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = inflater.inflate(R.layout.polyv_listview_cur_item, null); + viewHolder = new ViewHolder(); + viewHolder.iv_sel = (ImageView) convertView.findViewById(R.id.iv_sel); + viewHolder.iv_demo = (ImageView) convertView.findViewById(R.id.iv_demo); + viewHolder.tv_seri = (TextView) convertView.findViewById(R.id.tv_seri); + viewHolder.tv_title = (TextView) convertView.findViewById(R.id.tv_title); + viewHolder.tv_time = (TextView) convertView.findViewById(R.id.tv_time); + viewHolder.tv_added = (TextView) convertView.findViewById(R.id.tv_added); + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + if (isVisible) + viewHolder.iv_sel.setVisibility(View.VISIBLE); + else + viewHolder.iv_sel.setVisibility(View.GONE); + if (!getSideIconStatus(currentSelcetBitrate, position, false)) + viewHolder.iv_sel.setSelected(false); + else + viewHolder.iv_sel.setSelected(true); + if (isVisible && downloadSQLiteHelper.isAdd(generateDownloadInfo(position, currentSelcetBitrate))) + viewHolder.tv_added.setVisibility(View.VISIBLE); + else + viewHolder.tv_added.setVisibility(View.GONE); + PolyvVlmsCurriculumInfo polyvCurriculum = lists.get(position); + viewHolder.tv_title.setText(polyvCurriculum.getTitle()); + viewHolder.tv_time.setText(PolyvTimeUtils.generateTime(polyvCurriculum.getVideoDuration() * 1000)); + if (!TextUtils.isEmpty(polyvCurriculum.getVideoCoverImage())) { + PolyvImageLoader.getInstance().loadImageWithCache(appContext, polyvCurriculum.getVideoCoverImage(), viewHolder.iv_demo, R.drawable.polyv_demo); + } else if (polyvCurriculum.getVideo() != null) { + PolyvImageLoader.getInstance().loadImageWithCache(appContext, polyvCurriculum.getVideo().getFirstImage(), viewHolder.iv_demo, R.drawable.polyv_demo); + } + return convertView; + } + + private class ViewHolder { + ImageView iv_sel, iv_demo; + TextView tv_seri, tv_title, tv_time, tv_added; + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvDownloadListViewAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvDownloadListViewAdapter.java index db23e5d..06d4c3f 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvDownloadListViewAdapter.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvDownloadListViewAdapter.java @@ -1,508 +1,511 @@ -package com.easefun.polyvsdk.adapter; - -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.support.annotation.NonNull; -import android.text.format.Formatter; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.ProgressBar; -import android.widget.TextView; - -import com.daimajia.swipe.SwipeLayout; -import com.daimajia.swipe.adapters.BaseSwipeAdapter; -import com.easefun.polyvsdk.PolyvDownloader; -import com.easefun.polyvsdk.PolyvDownloaderErrorReason; -import com.easefun.polyvsdk.PolyvDownloaderManager; -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.activity.PolyvMainActivity; -import com.easefun.polyvsdk.activity.PolyvPlayerActivity; -import com.easefun.polyvsdk.bean.PolyvDownloadInfo; -import com.easefun.polyvsdk.database.PolyvDownloadSQLiteHelper; -import com.easefun.polyvsdk.download.listener.IPolyvDownloaderProgressListener2; -import com.easefun.polyvsdk.download.listener.IPolyvDownloaderSpeedListener; -import com.easefun.polyvsdk.download.listener.IPolyvDownloaderStartListener2; -import com.easefun.polyvsdk.download.listener.IPolyvDownloaderWaitingListener; -import com.easefun.polyvsdk.util.PolyvErrorMessageUtils; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.List; - -public class PolyvDownloadListViewAdapter extends BaseSwipeAdapter { - private static final String TAG = PolyvDownloadListViewAdapter.class.getSimpleName(); - private static final String DOWNLOADED = "已下载"; - private static final String DOWNLOADING = "正在下载"; - private static final String PAUSEED = "暂停下载"; - private static final String WAITED = "等待下载"; - private static PolyvDownloadSQLiteHelper downloadSQLiteHelper; - private static Context appContext; - private Context context; - private ListView lv_download; - private List lists; - private LayoutInflater inflater; - private ViewHolder viewHolder; - - public PolyvDownloadListViewAdapter(List lists, Context context, ListView lv_download) { - this.lists = lists; - this.context = context; - appContext = context.getApplicationContext(); - this.inflater = LayoutInflater.from(this.context); - this.lv_download = lv_download; - downloadSQLiteHelper = PolyvDownloadSQLiteHelper.getInstance(this.context); - init(); - } - - private void init() { - for (int i = 0; i < lists.size(); i++) { - PolyvDownloadInfo downloadInfo = lists.get(i); - String vid = downloadInfo.getVid(); - int bitrate = downloadInfo.getBitrate(); - PolyvDownloaderManager.getPolyvDownloader(vid, bitrate, downloadInfo.getFileType()); - } - } - - /** - * 下载全部任务 - */ - public void downloadAll() { - // 已完成的任务key集合 - List finishKey = new ArrayList<>(); - List downloadInfos = downloadSQLiteHelper.getAll(); - for (int i = 0; i < downloadInfos.size(); i++) { - PolyvDownloadInfo downloadInfo = downloadInfos.get(i); - long percent = downloadInfo.getPercent(); - long total = downloadInfo.getTotal(); - int progress = 0; - if (total != 0) - progress = (int) (percent * 100 / total); - if (progress == 100) - finishKey.add(PolyvDownloaderManager.getKey(downloadInfo.getVid(), downloadInfo.getBitrate(), downloadInfo.getFileType())); - } - updateButtonStatus(false); - PolyvDownloaderManager.startUnfinished(finishKey, context); - } - - /** - * 暂停全部任务 - */ - public void pauseAll() { - PolyvDownloaderManager.stopAll(); - updateButtonStatus(true); - for (int i = 0; i < lists.size(); i++) { - View child = null; - if ((child = lv_download.getChildAt(i - lv_download.getFirstVisiblePosition())) != null) { - TextView tv_speed = (TextView) child.findViewById(R.id.tv_speed); - showPauseSpeeView(lists.get(i), tv_speed); - } - } - } - - /** - * 删除当前列表的所有任务 - */ - public void deleteAllTask() { - for (int i = 0; i < lists.size(); i++) { - PolyvDownloadInfo downloadInfo = lists.get(i); - //移除任务 - PolyvDownloader downloader = PolyvDownloaderManager.clearPolyvDownload(downloadInfo.getVid(), downloadInfo.getBitrate(), downloadInfo.getFileType()); - //删除文件 - downloader.deleteVideo(); - //移除数据库的下载信息 - downloadSQLiteHelper.delete(downloadInfo); - } - lists.clear(); - notifyDataSetChanged(); - } - - /** - * 删除任务 - */ - public void deleteTask(int position) { - PolyvDownloadInfo downloadInfo = lists.remove(position); - //移除任务 - PolyvDownloader downloader = PolyvDownloaderManager.clearPolyvDownload(downloadInfo.getVid(), downloadInfo.getBitrate(), downloadInfo.getFileType()); - //删除文件 - downloader.deleteVideo(); - //移除数据库的下载信息 - downloadSQLiteHelper.delete(downloadInfo); - notifyDataSetChanged(); - } - - /** - * 更新按钮状态 - * - * @param isPause 之后的状态是否是暂停状态 - */ - private void updateButtonStatus(boolean isPause) { - for (int i = 0; i < lv_download.getChildCount(); i++) { - TextView tv_status = (TextView) lv_download.getChildAt(i).findViewById(R.id.tv_status); - ImageView iv_start = (ImageView) lv_download.getChildAt(i).findViewById(R.id.iv_start); - if (!tv_status.getText().equals(DOWNLOADED)) { - if (isPause) { - tv_status.setText(PAUSEED); - tv_status.setSelected(true); - iv_start.setImageResource(R.drawable.polyv_btn_download); - } else { - if (!tv_status.getText().equals(DOWNLOADING)) { - tv_status.setText(WAITED); - tv_status.setSelected(true); - iv_start.setImageResource(R.drawable.polyv_btn_download); - } - } - } - } - } - - @Override - public int getCount() { - return lists.size(); - } - - @Override - public Object getItem(int position) { - return lists.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public int getSwipeLayoutResourceId(int position) { - return R.id.sl_download; - } - - @Override - public View generateView(int position, ViewGroup parent) { - View view = LayoutInflater.from(context).inflate(R.layout.polyv_listview_download_item, null); - SwipeLayout swipeLayout = (SwipeLayout) view.findViewById(getSwipeLayoutResourceId(position)); - swipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown); - swipeLayout.addDrag(SwipeLayout.DragEdge.Right, swipeLayout.findViewWithTag("ll_delete")); - - viewHolder = new ViewHolder(); - viewHolder.fl_start = (FrameLayout) view.findViewById(R.id.fl_start); - viewHolder.iv_start = (ImageView) view.findViewById(R.id.iv_start); - viewHolder.tv_seri = (TextView) view.findViewById(R.id.tv_seri); - viewHolder.tv_size = (TextView) view.findViewById(R.id.tv_size); - viewHolder.tv_speed = (TextView) view.findViewById(R.id.tv_speed); - viewHolder.tv_status = (TextView) view.findViewById(R.id.tv_status); - viewHolder.tv_title = (TextView) view.findViewById(R.id.tv_title); - viewHolder.pb_progress = (ProgressBar) view.findViewById(R.id.pb_progress); - viewHolder.tv_delete = (TextView) view.findViewById(R.id.tv_delete); - view.setTag(viewHolder); - return view; - } - - @Override - public void fillValues(final int position, View convertView) { - viewHolder = (ViewHolder) convertView.getTag(); - - PolyvDownloadInfo downloadInfo = lists.get(position); - String vid = downloadInfo.getVid(); - int bitrate = downloadInfo.getBitrate(); - long percent = downloadInfo.getPercent(); - long total = downloadInfo.getTotal(); - String title = downloadInfo.getTitle(); - long filesize = downloadInfo.getFilesize(); - int fileType = downloadInfo.getFileType(); - // 已下载的百分比 - int progress = 0; - if (total != 0) { - progress = (int) (percent * 100 / total); - } - PolyvDownloader downloader = PolyvDownloaderManager.getPolyvDownloader(vid, bitrate, fileType); - viewHolder.pb_progress.setVisibility(View.VISIBLE); - viewHolder.tv_speed.setVisibility(View.VISIBLE); - viewHolder.tv_status.setSelected(false); - if (progress == 100) { - viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_play); - viewHolder.tv_status.setText(DOWNLOADED); - viewHolder.pb_progress.setVisibility(View.INVISIBLE); - viewHolder.tv_speed.setVisibility(View.INVISIBLE); - } else if (downloader.isDownloading()) { - viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_dlpause); - viewHolder.tv_status.setText(DOWNLOADING); - viewHolder.tv_speed.setText("0.00B/S"); - } else if (PolyvDownloaderManager.isWaitingDownload(vid, bitrate, fileType)) { - viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_download); - viewHolder.tv_status.setText(WAITED); - viewHolder.tv_status.setSelected(true); - viewHolder.tv_speed.setText(Formatter.formatFileSize(context, filesize * progress / 100)); - } else { - viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_download); - viewHolder.tv_status.setText(PAUSEED); - viewHolder.tv_status.setSelected(true); - viewHolder.tv_speed.setText(Formatter.formatFileSize(context, filesize * progress / 100)); - } - if (position + 1 < 10) { - viewHolder.tv_seri.setText("0" + (position + 1)); - } else { - viewHolder.tv_seri.setText("" + (position + 1)); - } - viewHolder.tv_title.setText(title); - viewHolder.tv_size.setText(Formatter.formatFileSize(context, filesize)); - viewHolder.pb_progress.setProgress(progress); - viewHolder.fl_start.setOnClickListener(new DownloadOnClickListener(downloadInfo, viewHolder.iv_start, viewHolder.tv_status, viewHolder.tv_speed)); - viewHolder.setDownloadListener(downloader, downloadInfo, position, lists); - viewHolder.tv_delete.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - ((SwipeLayout) lv_download.getChildAt(position - lv_download.getFirstVisiblePosition())).close(false); - deleteTask(position); - } - }); - } - - public interface DownloadSuccessListener { - void onDownloadSuccess(PolyvDownloadInfo downloadInfo); - } - - private static DownloadSuccessListener downloadSuccessListener; - - public void setDownloadSuccessListener(DownloadSuccessListener downloadSuccessListener) { - this.downloadSuccessListener = downloadSuccessListener; - } - - private static class MyDownloadListener implements IPolyvDownloaderProgressListener2 { - private WeakReference contextWeakReference; - private WeakReference wr_lv_download; - private WeakReference viewHolder; - private PolyvDownloadInfo downloadInfo; - private List lists; - private int position; - private long total; - - MyDownloadListener(Context context, ListView lv_download, ViewHolder viewHolder, PolyvDownloadInfo downloadInfo, int position, List lists) { - this.contextWeakReference = new WeakReference<>(context); - this.wr_lv_download = new WeakReference<>(lv_download); - this.viewHolder = new WeakReference<>(viewHolder); - this.downloadInfo = downloadInfo; - this.position = position; - this.lists = lists; - } - - private boolean canUpdateView() { - ListView lv_download = wr_lv_download.get(); - return lv_download != null && viewHolder.get() != null && lv_download.getChildAt(position - lv_download.getFirstVisiblePosition()) != null; - } - - private void removeToDownloadedQueue(int position) { - if(position >= lists.size()){ - return; - } - PolyvDownloadInfo downloadInfo = lists.remove(position); - ((BaseSwipeAdapter) wr_lv_download.get().getAdapter()).notifyDataSetChanged(); - if (downloadSuccessListener != null) { - downloadSuccessListener.onDownloadSuccess(downloadInfo); - } - } - - @Override - public void onDownload(long current, long total) { - this.total = total; - downloadInfo.setPercent(current); - downloadInfo.setTotal(total); - downloadSQLiteHelper.update(downloadInfo, current, total); - if (canUpdateView()) { - // 已下载的百分比 - int progress = (int) (current * 100 / total); - viewHolder.get().pb_progress.setProgress(progress); - } - } - - @Override - public void onDownloadSuccess(int bitrate) { - if (total == 0) - total = 1; - downloadInfo.setPercent(total); - downloadInfo.setTotal(total); - downloadSQLiteHelper.update(downloadInfo, total, total); - if (canUpdateView()) { - viewHolder.get().tv_status.setText(DOWNLOADED); - viewHolder.get().tv_status.setSelected(false); - viewHolder.get().iv_start.setImageResource(R.drawable.polyv_btn_play); - viewHolder.get().pb_progress.setVisibility(View.INVISIBLE); - viewHolder.get().tv_speed.setVisibility(View.INVISIBLE); - -// Toast.makeText(appContext, "第" + (position + 1) + "个任务下载成功", Toast.LENGTH_SHORT).show(); - removeToDownloadedQueue(position); - } - } - - @Override - public void onDownloadFail(@NonNull PolyvDownloaderErrorReason errorReason) { - if (canUpdateView()) { - viewHolder.get().tv_status.setText(PAUSEED); - viewHolder.get().tv_status.setSelected(true); - viewHolder.get().iv_start.setImageResource(R.drawable.polyv_btn_download); - showPauseSpeeView(downloadInfo, viewHolder.get().tv_speed); - String message = "第" + (position + 1) + "个任务"; - message += PolyvErrorMessageUtils.getDownloaderErrorMessage(errorReason.getType(), downloadInfo.getFileType()); - message += "(error code " + errorReason.getType().getCode() + ")"; - -// Toast.makeText(appContext, message, Toast.LENGTH_LONG).show(); - AlertDialog.Builder builder = new AlertDialog.Builder(contextWeakReference.get()); - builder.setTitle("错误"); - builder.setMessage(message); - builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - dialog.dismiss(); - } - }); - - builder.show(); - } - } - } - - private static class MyDownloadSpeedListener implements IPolyvDownloaderSpeedListener { - private WeakReference wr_lv_download; - private WeakReference viewHolder; - private PolyvDownloader downloader; - private int position; - - MyDownloadSpeedListener(ListView lv_download, ViewHolder viewHolder, PolyvDownloader downloader, int position) { - this.wr_lv_download = new WeakReference(lv_download); - this.viewHolder = new WeakReference(viewHolder); - this.downloader = downloader; - this.position = position; - } - - private boolean canUpdateView() { - ListView lv_download = wr_lv_download.get(); - return lv_download != null && viewHolder.get() != null && lv_download.getChildAt(position - lv_download.getFirstVisiblePosition()) != null; - } - - @Override - public void onSpeed(int speed) { - if (canUpdateView() && downloader.isDownloading()) { - viewHolder.get().tv_speed.setText(Formatter.formatShortFileSize(appContext, speed) + "/S"); - } - } - } - - private static class MyDownloaderStartListener implements IPolyvDownloaderStartListener2 { - private WeakReference wr_lv_download; - private WeakReference viewHolder; - private int position; - - MyDownloaderStartListener(ListView lv_download, ViewHolder viewHolder, int position) { - this.wr_lv_download = new WeakReference(lv_download); - this.viewHolder = new WeakReference(viewHolder); - this.position = position; - } - - private boolean canUpdateView() { - ListView lv_download = wr_lv_download.get(); - return lv_download != null && viewHolder.get() != null && lv_download.getChildAt(position - lv_download.getFirstVisiblePosition()) != null; - } - - @Override - public void onStart() { - if (canUpdateView()) { - viewHolder.get().iv_start.setImageResource(R.drawable.polyv_btn_dlpause); - viewHolder.get().tv_status.setText(DOWNLOADING); - viewHolder.get().tv_status.setSelected(false); - } - } - } - - private static class MyDownloaderWaitingListener implements IPolyvDownloaderWaitingListener { - private WeakReference wr_lv_download; - private WeakReference viewHolder; - private int position; - - MyDownloaderWaitingListener(ListView lv_download, ViewHolder viewHolder, int position) { - this.wr_lv_download = new WeakReference(lv_download); - this.viewHolder = new WeakReference(viewHolder); - this.position = position; - } - - private boolean canUpdateView() { - ListView lv_download = wr_lv_download.get(); - return lv_download != null && viewHolder.get() != null && lv_download.getChildAt(position - lv_download.getFirstVisiblePosition()) != null; - } - - @Override - public void onEnterWaiting() { - if (canUpdateView()) { - viewHolder.get().iv_start.setImageResource(R.drawable.polyv_btn_download); - viewHolder.get().tv_status.setText(WAITED); - viewHolder.get().tv_status.setSelected(true); - } - } - } - - private static void showPauseSpeeView(PolyvDownloadInfo downloadInfo, TextView tv_speed) { - long percent = downloadInfo.getPercent(); - long total = downloadInfo.getTotal(); - int progress = 0; - if (total != 0) - progress = (int) (percent * 100 / total); - // 已下载的文件大小 - long downloaded = downloadInfo.getFilesize() * progress / 100; - tv_speed.setText(Formatter.formatFileSize(appContext, downloaded)); - } - - private class ViewHolder { - FrameLayout fl_start; - ImageView iv_start; - TextView tv_seri, tv_title, tv_size, tv_status, tv_speed, tv_delete; - ProgressBar pb_progress; - - public void setDownloadListener(PolyvDownloader downloader, final PolyvDownloadInfo downloadInfo, final int position, List lists) { - downloader.setPolyvDownloadSpeedListener(new MyDownloadSpeedListener(lv_download, this, downloader, position)); - downloader.setPolyvDownloadProressListener2(new MyDownloadListener(context, lv_download, this, downloadInfo, position, lists)); - downloader.setPolyvDownloadStartListener2(new MyDownloaderStartListener(lv_download, this, position)); - downloader.setPolyvDownloadWaitingListener(new MyDownloaderWaitingListener(lv_download, this, position)); - } - } - - private class DownloadOnClickListener implements View.OnClickListener { - private PolyvDownloadInfo downloadInfo; - private ImageView iv_start; - private TextView tv_status; - private TextView tv_speed; - - public DownloadOnClickListener(PolyvDownloadInfo downloadInfo, ImageView iv_start, TextView tv_status, TextView tv_speed) { - this.downloadInfo = downloadInfo; - this.iv_start = iv_start; - this.tv_status = tv_status; - this.tv_speed = tv_speed; - } - - @Override - public void onClick(View v) { - String vid = downloadInfo.getVid(); - int bitrate = downloadInfo.getBitrate(); - int fileType = downloadInfo.getFileType(); - final PolyvDownloader downloader = PolyvDownloaderManager.getPolyvDownloader(vid, bitrate, fileType); - if (tv_status.getText().equals(DOWNLOADED)) { - Intent intent = PolyvPlayerActivity.newIntent(context, PolyvPlayerActivity.PlayMode.portrait, vid, bitrate, true, true, fileType); - // 在线视频和下载的视频播放的时候只显示播放器窗口,用该参数来控制 - intent.putExtra(PolyvMainActivity.IS_VLMS_ONLINE, false); - context.startActivity(intent); - } else if (tv_status.getText().equals(DOWNLOADING) || tv_status.getText().equals(WAITED)) { - tv_status.setText(PAUSEED); - tv_status.setSelected(true); - iv_start.setImageResource(R.drawable.polyv_btn_download); - downloader.stop(); - showPauseSpeeView(downloadInfo, tv_speed); - } else { - tv_status.setText(DOWNLOADING); - tv_status.setSelected(false); - iv_start.setImageResource(R.drawable.polyv_btn_dlpause); - downloader.start(context); - } - } - } -} +package com.easefun.polyvsdk.adapter; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import androidx.annotation.NonNull; +import android.text.format.Formatter; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.daimajia.swipe.SwipeLayout; +import com.daimajia.swipe.adapters.BaseSwipeAdapter; +import com.easefun.polyvsdk.PolyvDownloader; +import com.easefun.polyvsdk.PolyvDownloaderErrorReason; +import com.easefun.polyvsdk.PolyvDownloaderManager; +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.activity.PolyvMainActivity; +import com.easefun.polyvsdk.activity.PolyvPlayerActivity; +import com.easefun.polyvsdk.bean.PolyvDownloadInfo; +import com.easefun.polyvsdk.database.PolyvDownloadSQLiteHelper; +import com.easefun.polyvsdk.download.listener.IPolyvDownloaderProgressListener2; +import com.easefun.polyvsdk.download.listener.IPolyvDownloaderSpeedListener; +import com.easefun.polyvsdk.download.listener.IPolyvDownloaderStartListener2; +import com.easefun.polyvsdk.download.listener.IPolyvDownloaderWaitingListener; +import com.easefun.polyvsdk.util.PolyvErrorMessageUtils; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; + +public class PolyvDownloadListViewAdapter extends BaseSwipeAdapter { + private static final String TAG = PolyvDownloadListViewAdapter.class.getSimpleName(); + private static final String DOWNLOADED = "已下载"; + private static final String DOWNLOADING = "正在下载"; + private static final String PAUSEED = "暂停下载"; + private static final String WAITED = "等待下载"; + private static PolyvDownloadSQLiteHelper downloadSQLiteHelper; + private static Context appContext; + private Context context; + private ListView lv_download; + private List lists; + private LayoutInflater inflater; + private ViewHolder viewHolder; + + public PolyvDownloadListViewAdapter(List lists, Context context, ListView lv_download) { + this.lists = lists; + this.context = context; + appContext = context.getApplicationContext(); + this.inflater = LayoutInflater.from(this.context); + this.lv_download = lv_download; + downloadSQLiteHelper = PolyvDownloadSQLiteHelper.getInstance(this.context); + init(); + } + + private void init() { + for (int i = 0; i < lists.size(); i++) { + PolyvDownloadInfo downloadInfo = lists.get(i); + String vid = downloadInfo.getVid(); + int bitrate = downloadInfo.getBitrate(); + PolyvDownloaderManager.getPolyvDownloader(vid, bitrate, downloadInfo.getFileType()); + } + } + + /** + * 下载全部任务 + */ + public void downloadAll() { + // 已完成的任务key集合 + List finishKey = new ArrayList<>(); + List downloadInfos = downloadSQLiteHelper.getAll(); + for (int i = 0; i < downloadInfos.size(); i++) { + PolyvDownloadInfo downloadInfo = downloadInfos.get(i); + long percent = downloadInfo.getPercent(); + long total = downloadInfo.getTotal(); + int progress = 0; + if (total != 0) + progress = (int) (percent * 100 / total); + if (progress == 100) + finishKey.add(PolyvDownloaderManager.getKey(downloadInfo.getVid(), downloadInfo.getBitrate(), downloadInfo.getFileType())); + } + updateButtonStatus(false); + PolyvDownloaderManager.startUnfinished(finishKey, context); + } + + /** + * 暂停全部任务 + */ + public void pauseAll() { + PolyvDownloaderManager.stopAll(); + updateButtonStatus(true); + for (int i = 0; i < lists.size(); i++) { + View child = null; + if ((child = lv_download.getChildAt(i - lv_download.getFirstVisiblePosition())) != null) { + TextView tv_speed = (TextView) child.findViewById(R.id.tv_speed); + showPauseSpeeView(lists.get(i), tv_speed); + } + } + } + + /** + * 删除当前列表的所有任务 + */ + public void deleteAllTask() { + for (int i = 0; i < lists.size(); i++) { + PolyvDownloadInfo downloadInfo = lists.get(i); + //移除任务 + PolyvDownloader downloader = PolyvDownloaderManager.clearPolyvDownload(downloadInfo.getVid(), downloadInfo.getBitrate(), downloadInfo.getFileType()); + //删除文件 + downloader.deleteVideo(); + //移除数据库的下载信息 + downloadSQLiteHelper.delete(downloadInfo); + } + lists.clear(); + notifyDataSetChanged(); + } + + /** + * 删除任务 + */ + public void deleteTask(int position) { + PolyvDownloadInfo downloadInfo = lists.remove(position); + //移除任务 + PolyvDownloader downloader = PolyvDownloaderManager.clearPolyvDownload(downloadInfo.getVid(), downloadInfo.getBitrate(), downloadInfo.getFileType()); + //删除文件 + downloader.deleteVideo(); + //移除数据库的下载信息 + downloadSQLiteHelper.delete(downloadInfo); + notifyDataSetChanged(); + } + + /** + * 更新按钮状态 + * + * @param isPause 之后的状态是否是暂停状态 + */ + private void updateButtonStatus(boolean isPause) { + for (int i = 0; i < lv_download.getChildCount(); i++) { + TextView tv_status = (TextView) lv_download.getChildAt(i).findViewById(R.id.tv_status); + ImageView iv_start = (ImageView) lv_download.getChildAt(i).findViewById(R.id.iv_start); + if (!tv_status.getText().equals(DOWNLOADED)) { + if (isPause) { + tv_status.setText(PAUSEED); + tv_status.setSelected(true); + iv_start.setImageResource(R.drawable.polyv_btn_download); + } else { + if (!tv_status.getText().equals(DOWNLOADING)) { + tv_status.setText(WAITED); + tv_status.setSelected(true); + iv_start.setImageResource(R.drawable.polyv_btn_download); + } + } + } + } + } + + @Override + public int getCount() { + return lists.size(); + } + + @Override + public Object getItem(int position) { + return lists.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public int getSwipeLayoutResourceId(int position) { + return R.id.sl_download; + } + + @Override + public View generateView(int position, ViewGroup parent) { + View view = LayoutInflater.from(context).inflate(R.layout.polyv_listview_download_item, null); + SwipeLayout swipeLayout = (SwipeLayout) view.findViewById(getSwipeLayoutResourceId(position)); + swipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown); + swipeLayout.addDrag(SwipeLayout.DragEdge.Right, swipeLayout.findViewWithTag("ll_delete")); + + viewHolder = new ViewHolder(); + viewHolder.fl_start = (FrameLayout) view.findViewById(R.id.fl_start); + viewHolder.iv_start = (ImageView) view.findViewById(R.id.iv_start); + viewHolder.tv_seri = (TextView) view.findViewById(R.id.tv_seri); + viewHolder.tv_size = (TextView) view.findViewById(R.id.tv_size); + viewHolder.tv_speed = (TextView) view.findViewById(R.id.tv_speed); + viewHolder.tv_status = (TextView) view.findViewById(R.id.tv_status); + viewHolder.tv_title = (TextView) view.findViewById(R.id.tv_title); + viewHolder.pb_progress = (ProgressBar) view.findViewById(R.id.pb_progress); + viewHolder.tv_delete = (TextView) view.findViewById(R.id.tv_delete); + view.setTag(viewHolder); + return view; + } + + @Override + public void fillValues(final int position, View convertView) { + viewHolder = (ViewHolder) convertView.getTag(); + + PolyvDownloadInfo downloadInfo = lists.get(position); + String vid = downloadInfo.getVid(); + int bitrate = downloadInfo.getBitrate(); + long percent = downloadInfo.getPercent(); + long total = downloadInfo.getTotal(); + String title = downloadInfo.getTitle(); + long filesize = downloadInfo.getFilesize(); + int fileType = downloadInfo.getFileType(); + // 已下载的百分比 + int progress = 0; + if (total != 0) { + progress = (int) (percent * 100 / total); + } + PolyvDownloader downloader = PolyvDownloaderManager.getPolyvDownloader(vid, bitrate, fileType); + viewHolder.pb_progress.setVisibility(View.VISIBLE); + viewHolder.tv_speed.setVisibility(View.VISIBLE); + viewHolder.tv_status.setSelected(false); + if (progress == 100) { + viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_play); + viewHolder.tv_status.setText(DOWNLOADED); + viewHolder.pb_progress.setVisibility(View.GONE); + viewHolder.tv_speed.setVisibility(View.GONE); + } else if (downloader.isDownloading()) { + viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_dlpause); + viewHolder.tv_status.setText(DOWNLOADING); + viewHolder.tv_speed.setText("0.00B/S"); + } else if (PolyvDownloaderManager.isWaitingDownload(vid, bitrate, fileType)) { + viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_download); + viewHolder.tv_status.setText(WAITED); + viewHolder.tv_status.setSelected(true); + viewHolder.tv_speed.setText(Formatter.formatFileSize(context, filesize * progress / 100)); + } else { + viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_download); + viewHolder.tv_status.setText(PAUSEED); + viewHolder.tv_status.setSelected(true); + viewHolder.tv_speed.setText(Formatter.formatFileSize(context, filesize * progress / 100)); + } + if (position + 1 < 10) { + viewHolder.tv_seri.setText("0" + (position + 1)); + } else { + viewHolder.tv_seri.setText("" + (position + 1)); + } + viewHolder.tv_title.setText(title); + viewHolder.tv_size.setText(Formatter.formatFileSize(context, filesize)); + viewHolder.pb_progress.setProgress(progress); + viewHolder.fl_start.setOnClickListener(new DownloadOnClickListener(downloadInfo, viewHolder.iv_start, viewHolder.tv_status, viewHolder.tv_speed)); + viewHolder.setDownloadListener(downloader, downloadInfo, position, lists); + viewHolder.tv_delete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ((SwipeLayout) lv_download.getChildAt(position - lv_download.getFirstVisiblePosition())).close(false); + deleteTask(position); + } + }); + } + + public interface DownloadSuccessListener { + void onDownloadSuccess(PolyvDownloadInfo downloadInfo); + } + + private static DownloadSuccessListener downloadSuccessListener; + + public void setDownloadSuccessListener(DownloadSuccessListener downloadSuccessListener) { + this.downloadSuccessListener = downloadSuccessListener; + } + + private static class MyDownloadListener implements IPolyvDownloaderProgressListener2 { + private WeakReference contextWeakReference; + private WeakReference wr_lv_download; + private WeakReference viewHolder; + private PolyvDownloadInfo downloadInfo; + private List lists; + private int position; + private long total; + + MyDownloadListener(Context context, ListView lv_download, ViewHolder viewHolder, PolyvDownloadInfo downloadInfo, int position, List lists) { + this.contextWeakReference = new WeakReference<>(context); + this.wr_lv_download = new WeakReference<>(lv_download); + this.viewHolder = new WeakReference<>(viewHolder); + this.downloadInfo = downloadInfo; + this.position = position; + this.lists = lists; + } + + private boolean canUpdateView() { + ListView lv_download = wr_lv_download.get(); + return lv_download != null && viewHolder.get() != null && lv_download.getChildAt(position - lv_download.getFirstVisiblePosition()) != null; + } + + private void removeToDownloadedQueue() { + lists.remove(downloadInfo); + ((BaseSwipeAdapter) wr_lv_download.get().getAdapter()).notifyDataSetChanged(); + if (downloadSuccessListener != null) { + downloadSuccessListener.onDownloadSuccess(downloadInfo); + } + } + + @Override + public void onDownload(long current, long total) { + this.total = total; + downloadInfo.setPercent(current); + downloadInfo.setTotal(total); + downloadSQLiteHelper.update(downloadInfo, current, total); + if (canUpdateView()) { + // 已下载的百分比 + int progress = (int) (current * 100 / total); + viewHolder.get().pb_progress.setProgress(progress); + } + } + + @Override + public void onDownloadSuccess(int bitrate) { + if (total == 0) + total = 1; + downloadInfo.setPercent(total); + downloadInfo.setTotal(total); + downloadSQLiteHelper.update(downloadInfo, total, total); + if (canUpdateView()) { + viewHolder.get().tv_status.setText(DOWNLOADED); + viewHolder.get().tv_status.setSelected(false); + viewHolder.get().iv_start.setImageResource(R.drawable.polyv_btn_play); + viewHolder.get().pb_progress.setVisibility(View.GONE); + viewHolder.get().tv_speed.setVisibility(View.GONE); + +// Toast.makeText(appContext, "第" + (position + 1) + "个任务下载成功", Toast.LENGTH_SHORT).show(); + removeToDownloadedQueue(); + } + } + + @Override + public void onDownloadFail(@NonNull PolyvDownloaderErrorReason errorReason) { + if (canUpdateView()) { + viewHolder.get().tv_status.setText(PAUSEED); + viewHolder.get().tv_status.setSelected(true); + viewHolder.get().iv_start.setImageResource(R.drawable.polyv_btn_download); + showPauseSpeeView(downloadInfo, viewHolder.get().tv_speed); + String message = "第" + (position + 1) + "个任务"; + message += PolyvErrorMessageUtils.getDownloaderErrorMessage(errorReason.getType(), downloadInfo.getFileType()); + message += "(error code " + errorReason.getType().getCode() + ")"; + + Context context = contextWeakReference.get(); + if (!(context instanceof Activity) || ((Activity) context).isFinishing()) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(contextWeakReference.get()); + builder.setTitle("错误"); + builder.setMessage(message); + builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + dialog.dismiss(); + } + }); + + if (((Activity) context).isFinishing()) { + return; + } + builder.show(); + } + } + } + + private static class MyDownloadSpeedListener implements IPolyvDownloaderSpeedListener { + private WeakReference wr_lv_download; + private WeakReference viewHolder; + private PolyvDownloader downloader; + private int position; + + MyDownloadSpeedListener(ListView lv_download, ViewHolder viewHolder, PolyvDownloader downloader, int position) { + this.wr_lv_download = new WeakReference(lv_download); + this.viewHolder = new WeakReference(viewHolder); + this.downloader = downloader; + this.position = position; + } + + private boolean canUpdateView() { + ListView lv_download = wr_lv_download.get(); + return lv_download != null && viewHolder.get() != null && lv_download.getChildAt(position - lv_download.getFirstVisiblePosition()) != null; + } + + @Override + public void onSpeed(int speed) { + if (canUpdateView() && downloader.isDownloading()) { + viewHolder.get().tv_speed.setText(Formatter.formatShortFileSize(appContext, speed) + "/S"); + } + } + } + + private static class MyDownloaderStartListener implements IPolyvDownloaderStartListener2 { + private WeakReference wr_lv_download; + private WeakReference viewHolder; + private int position; + + MyDownloaderStartListener(ListView lv_download, ViewHolder viewHolder, int position) { + this.wr_lv_download = new WeakReference(lv_download); + this.viewHolder = new WeakReference(viewHolder); + this.position = position; + } + + private boolean canUpdateView() { + ListView lv_download = wr_lv_download.get(); + return lv_download != null && viewHolder.get() != null && lv_download.getChildAt(position - lv_download.getFirstVisiblePosition()) != null; + } + + @Override + public void onStart() { + if (canUpdateView()) { + viewHolder.get().iv_start.setImageResource(R.drawable.polyv_btn_dlpause); + viewHolder.get().tv_status.setText(DOWNLOADING); + viewHolder.get().tv_status.setSelected(false); + } + } + } + + private static class MyDownloaderWaitingListener implements IPolyvDownloaderWaitingListener { + private WeakReference wr_lv_download; + private WeakReference viewHolder; + private int position; + + MyDownloaderWaitingListener(ListView lv_download, ViewHolder viewHolder, int position) { + this.wr_lv_download = new WeakReference(lv_download); + this.viewHolder = new WeakReference(viewHolder); + this.position = position; + } + + private boolean canUpdateView() { + ListView lv_download = wr_lv_download.get(); + return lv_download != null && viewHolder.get() != null && lv_download.getChildAt(position - lv_download.getFirstVisiblePosition()) != null; + } + + @Override + public void onEnterWaiting() { + if (canUpdateView()) { + viewHolder.get().iv_start.setImageResource(R.drawable.polyv_btn_download); + viewHolder.get().tv_status.setText(WAITED); + viewHolder.get().tv_status.setSelected(true); + } + } + } + + private static void showPauseSpeeView(PolyvDownloadInfo downloadInfo, TextView tv_speed) { + long percent = downloadInfo.getPercent(); + long total = downloadInfo.getTotal(); + int progress = 0; + if (total != 0) + progress = (int) (percent * 100 / total); + // 已下载的文件大小 + long downloaded = downloadInfo.getFilesize() * progress / 100; + tv_speed.setText(Formatter.formatFileSize(appContext, downloaded)); + } + + private class ViewHolder { + FrameLayout fl_start; + ImageView iv_start; + TextView tv_seri, tv_title, tv_size, tv_status, tv_speed, tv_delete; + ProgressBar pb_progress; + + public void setDownloadListener(PolyvDownloader downloader, final PolyvDownloadInfo downloadInfo, final int position, List lists) { + downloader.setPolyvDownloadSpeedListener(new MyDownloadSpeedListener(lv_download, this, downloader, position)); + downloader.setPolyvDownloadProressListener2(new MyDownloadListener(context, lv_download, this, downloadInfo, position, lists)); + downloader.setPolyvDownloadStartListener2(new MyDownloaderStartListener(lv_download, this, position)); + downloader.setPolyvDownloadWaitingListener(new MyDownloaderWaitingListener(lv_download, this, position)); + } + } + + private class DownloadOnClickListener implements View.OnClickListener { + private PolyvDownloadInfo downloadInfo; + private ImageView iv_start; + private TextView tv_status; + private TextView tv_speed; + + public DownloadOnClickListener(PolyvDownloadInfo downloadInfo, ImageView iv_start, TextView tv_status, TextView tv_speed) { + this.downloadInfo = downloadInfo; + this.iv_start = iv_start; + this.tv_status = tv_status; + this.tv_speed = tv_speed; + } + + @Override + public void onClick(View v) { + String vid = downloadInfo.getVid(); + int bitrate = downloadInfo.getBitrate(); + int fileType = downloadInfo.getFileType(); + final PolyvDownloader downloader = PolyvDownloaderManager.getPolyvDownloader(vid, bitrate, fileType); + if (tv_status.getText().equals(DOWNLOADED)) { + Intent intent = PolyvPlayerActivity.newIntent(context, PolyvPlayerActivity.PlayMode.portrait, vid, bitrate, true, true, fileType); + // 在线视频和下载的视频播放的时候只显示播放器窗口,用该参数来控制 + intent.putExtra(PolyvMainActivity.IS_VLMS_ONLINE, false); + context.startActivity(intent); + } else if (tv_status.getText().equals(DOWNLOADING) || tv_status.getText().equals(WAITED)) { + tv_status.setText(PAUSEED); + tv_status.setSelected(true); + iv_start.setImageResource(R.drawable.polyv_btn_download); + downloader.stop(); + showPauseSpeeView(downloadInfo, tv_speed); + } else { + tv_status.setText(DOWNLOADING); + tv_status.setSelected(false); + iv_start.setImageResource(R.drawable.polyv_btn_dlpause); + downloader.start(context); + } + } + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvHotCoursesGridViewAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvHotCoursesGridViewAdapter.java index 514c107..53e4d91 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvHotCoursesGridViewAdapter.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvHotCoursesGridViewAdapter.java @@ -1,78 +1,77 @@ -package com.easefun.polyvsdk.adapter; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvCoursesInfo; -import com.easefun.polyvsdk.util.PolyvImageLoader; -import com.easefun.polyvsdk.util.PolyvVlmsHelper; - -import java.util.List; - -public class PolyvHotCoursesGridViewAdapter extends BaseAdapter { - private Context context; - private List lists; - private LayoutInflater inflater; - private ViewHolder viewHolder; - - private class ViewHolder { - ImageView iv_demo; - TextView tv_teac, tv_title, tv_learn, tv_money; - } - - public PolyvHotCoursesGridViewAdapter(Context context, List lists) { - this.context = context; - this.lists = lists; - this.inflater = LayoutInflater.from(context); - } - - @Override - public int getCount() { - return lists.size(); - } - - @Override - public Object getItem(int position) { - return lists.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = inflater.inflate(R.layout.polyv_gridview_hc_item, null); - viewHolder = new ViewHolder(); - viewHolder.iv_demo = (ImageView) convertView.findViewById(R.id.iv_demo); - viewHolder.tv_learn = (TextView) convertView.findViewById(R.id.tv_learn); - viewHolder.tv_title = (TextView) convertView.findViewById(R.id.tv_title); - viewHolder.tv_teac = (TextView) convertView.findViewById(R.id.tv_tv_teac); - viewHolder.tv_money = (TextView) convertView.findViewById(R.id.tv_money); - convertView.setTag(viewHolder); - } else { - viewHolder = (ViewHolder) convertView.getTag(); - } - PolyvVlmsHelper.CoursesDetail coursesDetail = lists.get(position); - viewHolder.tv_title.setText(coursesDetail.course.title); - viewHolder.tv_teac.setText(coursesDetail.teacher.teacher_name); - viewHolder.tv_learn.setText(coursesDetail.course.student_count + "人在学"); - if (coursesDetail.course.is_free.equals(PolyvCoursesInfo.IS_FREE_YES)) { - viewHolder.tv_money.setText("免费"); - viewHolder.tv_money.setTextColor(context.getResources().getColor(R.color.center_right_text_color_green)); - } else { - viewHolder.tv_money.setText("¥" + coursesDetail.course.price); - viewHolder.tv_money.setTextColor(context.getResources().getColor(R.color.center_bottom_text_color_red)); - } - PolyvImageLoader.getInstance().loadImageWithCache(context, coursesDetail.course.cover_image, viewHolder.iv_demo, R.drawable.polyv_demo); - return convertView; - } -} +package com.easefun.polyvsdk.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvVlmsCoursesInfo; +import com.easefun.polyvsdk.util.PolyvImageLoader; + +import java.util.List; + +public class PolyvHotCoursesGridViewAdapter extends BaseAdapter { + private Context context; + private List lists; + private LayoutInflater inflater; + private ViewHolder viewHolder; + + private class ViewHolder { + ImageView iv_demo; + TextView tv_teac, tv_title, tv_learn, tv_money; + } + + public PolyvHotCoursesGridViewAdapter(Context context, List lists) { + this.context = context; + this.lists = lists; + this.inflater = LayoutInflater.from(context); + } + + @Override + public int getCount() { + return lists.size(); + } + + @Override + public Object getItem(int position) { + return lists.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = inflater.inflate(R.layout.polyv_gridview_hc_item, null); + viewHolder = new ViewHolder(); + viewHolder.iv_demo = (ImageView) convertView.findViewById(R.id.iv_demo); + viewHolder.tv_learn = (TextView) convertView.findViewById(R.id.tv_learn); + viewHolder.tv_title = (TextView) convertView.findViewById(R.id.tv_title); + viewHolder.tv_teac = (TextView) convertView.findViewById(R.id.tv_tv_teac); + viewHolder.tv_money = (TextView) convertView.findViewById(R.id.tv_money); + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + PolyvVlmsCoursesInfo coursesDetail = lists.get(position); + viewHolder.tv_title.setText(coursesDetail.getTitle()); + viewHolder.tv_teac.setText(coursesDetail.getTeacherName()); + viewHolder.tv_learn.setText(coursesDetail.getStudentNum() + "人在学"); + if (coursesDetail.getIsFree().equals(PolyvVlmsCoursesInfo.IS_FREE_YES)) { + viewHolder.tv_money.setText("免费"); + viewHolder.tv_money.setTextColor(context.getResources().getColor(R.color.center_right_text_color_green)); + } else { + viewHolder.tv_money.setText("¥" + coursesDetail.getPrice()); + viewHolder.tv_money.setTextColor(context.getResources().getColor(R.color.center_bottom_text_color_red)); + } + PolyvImageLoader.getInstance().loadImageWithCache(context, coursesDetail.getCoverImage(), viewHolder.iv_demo, R.drawable.polyv_demo); + return convertView; + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvOnlineListViewAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvOnlineListViewAdapter.java index 34b0666..170d339 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvOnlineListViewAdapter.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvOnlineListViewAdapter.java @@ -1,234 +1,247 @@ -package com.easefun.polyvsdk.adapter; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.os.AsyncTask; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import com.easefun.polyvsdk.PolyvBitRate; -import com.easefun.polyvsdk.PolyvDownloader; -import com.easefun.polyvsdk.PolyvDownloaderErrorReason; -import com.easefun.polyvsdk.PolyvDownloaderManager; -import com.easefun.polyvsdk.PolyvSDKUtil; -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.RestVO; -import com.easefun.polyvsdk.activity.PolyvMainActivity; -import com.easefun.polyvsdk.activity.PolyvPlayerActivity; -import com.easefun.polyvsdk.bean.PolyvDownloadInfo; -import com.easefun.polyvsdk.database.PolyvDownloadSQLiteHelper; -import com.easefun.polyvsdk.download.listener.IPolyvDownloaderProgressListener2; -import com.easefun.polyvsdk.util.PolyvErrorMessageUtils; -import com.easefun.polyvsdk.util.PolyvImageLoader; -import com.easefun.polyvsdk.vo.PolyvVideoVO; - -import java.lang.ref.WeakReference; -import java.util.List; - - -public class PolyvOnlineListViewAdapter extends AbsRecyclerViewAdapter { - private static final String TAG = PolyvOnlineListViewAdapter.class.getSimpleName(); - private Context context; - private List videos; - private static PolyvDownloadSQLiteHelper downloadSQLiteHelper; - - public PolyvOnlineListViewAdapter(RecyclerView recyclerView, Context context, List videos) { - super(recyclerView); - this.context = context; - this.videos = videos; - downloadSQLiteHelper = PolyvDownloadSQLiteHelper.getInstance(context); - } - - private class ItemViewHolder extends AbsRecyclerViewAdapter.ClickableViewHolder { - // 封面图 - ImageView iv_cover; - // 标题,时间,下载按钮,播放按钮 - TextView tv_title, tv_time, tv_download, tv_play; - - ItemViewHolder(View itemView) { - super(itemView); - iv_cover = $(R.id.iv_cover); - tv_title = $(R.id.tv_title); - tv_time = $(R.id.tv_time); - tv_download = $(R.id.tv_download); - tv_play = $(R.id.tv_play); - } - } - - @Override - public ClickableViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - bindContext(parent.getContext()); - return new ItemViewHolder(LayoutInflater.from(getContext()). - inflate(R.layout.polyv_listview_online_item, parent, false)); - } - - @Override - public void onBindViewHolder(ClickableViewHolder holder, int position) { - if (holder instanceof ItemViewHolder) { - ItemViewHolder mHolder = (ItemViewHolder) holder; - RestVO restVO = videos.get(position); - mHolder.tv_title.setText(restVO.getTitle()); - mHolder.tv_time.setText(restVO.getDuration()); - mHolder.tv_download.setOnClickListener(new DownloadListener(restVO.getVid(), restVO.getTitle())); - mHolder.tv_play.setOnClickListener(new PlayListener(restVO.getVid())); - PolyvImageLoader.getInstance() - .loadImageWithCache(context, restVO.getFirstImage().trim(), - mHolder.iv_cover,R.drawable.polyv_pic_demo ); - } - super.onBindViewHolder(holder, position); - } - - @Override - public int getItemCount() { - return videos.size(); - } - - private class PlayListener implements View.OnClickListener { - private String vid; - - PlayListener(String vid) { - this.vid = vid; - } - - @Override - public void onClick(View arg0) { - Intent intent = PolyvPlayerActivity.newIntent(context, PolyvPlayerActivity.PlayMode.portrait, vid); - intent.putExtra(PolyvMainActivity.IS_VLMS_ONLINE, false); - context.startActivity(intent); - } - } - - private static class MyDownloadListener implements IPolyvDownloaderProgressListener2 { - private long total; - private WeakReference contextWeakReference; - private PolyvDownloadInfo downloadInfo; - - MyDownloadListener(Context context, PolyvDownloadInfo downloadInfo) { - this.contextWeakReference = new WeakReference<>(context); - this.downloadInfo = downloadInfo; - } - - @Override - public void onDownloadSuccess(int bitrate) { - if (total == 0) - total = 1; - - downloadInfo.setBitrate(bitrate); - downloadSQLiteHelper.update(downloadInfo, total, total); - } - - @Override - public void onDownloadFail(@NonNull PolyvDownloaderErrorReason errorReason) { - String errorMsg = PolyvErrorMessageUtils.getDownloaderErrorMessage(errorReason.getType(), downloadInfo.getFileType()); - errorMsg += "(error code " + errorReason.getType().getCode() + ")"; - Log.e(TAG, errorMsg); - if (contextWeakReference.get() != null) - Toast.makeText(contextWeakReference.get(), errorMsg, Toast.LENGTH_LONG).show(); - } - - @Override - public void onDownload(long current, long total) { - this.total = total; - } - } - - private class DownloadListener implements View.OnClickListener { - private String vid; - private String title; - - DownloadListener(String vid, String title) { - this.vid = vid; - this.title = title; - } - - @Override - public void onClick(final View view) { - LoadVideoInfoTask loadVideoInfoTask = new LoadVideoInfoTask(new ILoadVideoInfoListener() { - - @Override - public void onloaded(final PolyvVideoVO v) { - if (v == null) { - Toast.makeText(context, "获取下载信息失败,请重试", Toast.LENGTH_SHORT).show(); - return; - } - - // 码率数 - String[] items = PolyvBitRate.getBitRateNameArray(v.getDfNum()); - final AlertDialog.Builder selectDialog = new AlertDialog.Builder(context).setTitle("请选择下载码率").setSingleChoiceItems(items, 0, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - int bitrate = which + 1; - - final PolyvDownloadInfo downloadInfo = new PolyvDownloadInfo(vid, v.getDuration(), - v.getFileSizeMatchVideoType(bitrate,PolyvDownloader.FILE_VIDEO), bitrate, title); - //设置下载的文件类型,视频/音频,可以用v.hasAudioPath()判断是否有音频 - downloadInfo.setFileType(PolyvDownloader.FILE_VIDEO); - Log.i("videoAdapter", downloadInfo.toString()); - if (downloadSQLiteHelper != null && !downloadSQLiteHelper.isAdd(downloadInfo)) { - downloadSQLiteHelper.insert(downloadInfo); - PolyvDownloader polyvDownloader = PolyvDownloaderManager.getPolyvDownloader(vid, bitrate, downloadInfo.getFileType()); - polyvDownloader.setPolyvDownloadProressListener2(new MyDownloadListener(context, downloadInfo)); - polyvDownloader.start(context); - } else { - ((Activity) context).runOnUiThread(new Runnable() { - - @Override - public void run() { - Toast.makeText(context, "下载任务已经增加到队列", Toast.LENGTH_SHORT).show(); - } - }); - } - - dialog.dismiss(); - } - }); - - if (view.getWindowToken() != null) - selectDialog.show().setCanceledOnTouchOutside(true); - } - }); - - loadVideoInfoTask.execute(vid); - } - } - - private static class LoadVideoInfoTask extends AsyncTask { - - private final ILoadVideoInfoListener l; - - LoadVideoInfoTask(ILoadVideoInfoListener l) { - this.l = l; - } - - @Override - protected PolyvVideoVO doInBackground(String... params) { - try { - return PolyvSDKUtil.loadVideoJSON2Video(params[0]); - } catch (Exception e) { - Log.e(TAG, PolyvSDKUtil.getExceptionFullMessage(e, -1)); - return null; - } - } - - @Override - protected void onPostExecute(PolyvVideoVO v) { - super.onPostExecute(v); - l.onloaded(v); - } - } - - private interface ILoadVideoInfoListener { - void onloaded(PolyvVideoVO v); - } -} +package com.easefun.polyvsdk.adapter; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.AsyncTask; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.easefun.polyvsdk.PolyvBitRate; +import com.easefun.polyvsdk.PolyvDownloader; +import com.easefun.polyvsdk.PolyvDownloaderErrorReason; +import com.easefun.polyvsdk.PolyvDownloaderManager; +import com.easefun.polyvsdk.PolyvSDKUtil; +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.RestVO; +import com.easefun.polyvsdk.activity.PolyvMainActivity; +import com.easefun.polyvsdk.activity.PolyvPlayerActivity; +import com.easefun.polyvsdk.bean.PolyvDownloadInfo; +import com.easefun.polyvsdk.database.PolyvDownloadSQLiteHelper; +import com.easefun.polyvsdk.download.listener.IPolyvDownloaderProgressListener2; +import com.easefun.polyvsdk.util.PolyvErrorMessageUtils; +import com.easefun.polyvsdk.util.PolyvImageLoader; +import com.easefun.polyvsdk.vo.PolyvVideoVO; + +import java.lang.ref.WeakReference; +import java.util.List; + + +public class PolyvOnlineListViewAdapter extends AbsRecyclerViewAdapter { + private static final String TAG = PolyvOnlineListViewAdapter.class.getSimpleName(); + private Context context; + private List videos; + private static PolyvDownloadSQLiteHelper downloadSQLiteHelper; + + public PolyvOnlineListViewAdapter(RecyclerView recyclerView, Context context, List videos) { + super(recyclerView); + this.context = context; + this.videos = videos; + downloadSQLiteHelper = PolyvDownloadSQLiteHelper.getInstance(context); + } + + private class ItemViewHolder extends AbsRecyclerViewAdapter.ClickableViewHolder { + // 封面图 + ImageView iv_cover; + // 标题,时间,下载按钮,播放按钮 + TextView tv_title, tv_time, tv_download, tv_play; + + ItemViewHolder(View itemView) { + super(itemView); + iv_cover = $(R.id.iv_cover); + tv_title = $(R.id.tv_title); + tv_time = $(R.id.tv_time); + tv_download = $(R.id.tv_download); + tv_play = $(R.id.tv_play); + } + } + + @Override + public ClickableViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + bindContext(parent.getContext()); + return new ItemViewHolder(LayoutInflater.from(getContext()). + inflate(R.layout.polyv_listview_online_item, parent, false)); + } + + @Override + public void onBindViewHolder(ClickableViewHolder holder, int position) { + if (holder instanceof ItemViewHolder) { + ItemViewHolder mHolder = (ItemViewHolder) holder; + RestVO restVO = videos.get(position); + mHolder.tv_title.setText(restVO.getTitle()); + mHolder.tv_time.setText(restVO.getDuration()); + mHolder.tv_download.setOnClickListener(new DownloadListener(restVO.getVid(), restVO.getTitle())); + mHolder.tv_play.setOnClickListener(new PlayListener(restVO.getVid())); + PolyvImageLoader.getInstance() + .loadImageWithCache(context, restVO.getFirstImage().trim(), + mHolder.iv_cover,R.drawable.polyv_pic_demo ); + } + super.onBindViewHolder(holder, position); + } + + @Override + public int getItemCount() { + return videos.size(); + } + + private class PlayListener implements View.OnClickListener { + private String vid; + + PlayListener(String vid) { + this.vid = vid; + } + + @Override + public void onClick(View arg0) { + Intent intent = PolyvPlayerActivity.newIntent(context, PolyvPlayerActivity.PlayMode.portrait, vid); + intent.putExtra(PolyvMainActivity.IS_VLMS_ONLINE, false); + context.startActivity(intent); + } + } + + private static class MyDownloadListener implements IPolyvDownloaderProgressListener2 { + private long total; + private WeakReference contextWeakReference; + private PolyvDownloadInfo downloadInfo; + + MyDownloadListener(Context context, PolyvDownloadInfo downloadInfo) { + this.contextWeakReference = new WeakReference<>(context); + this.downloadInfo = downloadInfo; + } + + @Override + public void onDownloadSuccess(int bitrate) { + if (total == 0) + total = 1; + + downloadInfo.setBitrate(bitrate); + downloadSQLiteHelper.update(downloadInfo, total, total); + } + + @Override + public void onDownloadFail(@NonNull PolyvDownloaderErrorReason errorReason) { + String errorMsg = PolyvErrorMessageUtils.getDownloaderErrorMessage(errorReason.getType(), downloadInfo.getFileType()); + errorMsg += "(error code " + errorReason.getType().getCode() + ")"; + Log.e(TAG, errorMsg); + if (contextWeakReference.get() != null) { + Toast.makeText(contextWeakReference.get(), errorMsg, Toast.LENGTH_LONG).show(); + } + } + + @Override + public void onDownload(long current, long total) { + this.total = total; + } + } + + private class DownloadListener implements View.OnClickListener { + private String vid; + private String title; + + DownloadListener(String vid, String title) { + this.vid = vid; + this.title = title; + } + + @Override + public void onClick(final View view) { + LoadVideoInfoTask loadVideoInfoTask = new LoadVideoInfoTask(new ILoadVideoInfoListener() { + + @Override + public void onloaded(final PolyvVideoVO v) { + if (v == null) { + Toast.makeText(context, "获取下载信息失败,请重试", Toast.LENGTH_SHORT).show(); + return; + } + if (v.getPlayerErrorCode()!=null && !v.getPlayerErrorCode().equals("0")) { + String tipsZhCn = v.getPlayerErrorTipsZhCn(); + String tipsEn = v.getPlayerErrorTipsEn(); + + Log.e(TAG, "视频错误状态码: " + v.getPlayerErrorCode()); + Log.e(TAG, "视频错误提示: " + tipsZhCn); + + String errorMessage = TextUtils.isEmpty(tipsZhCn) ? tipsEn : tipsZhCn; + Toast.makeText(context, errorMessage, Toast.LENGTH_LONG).show(); + return; + } + + // 码率数 + String[] items = PolyvBitRate.getBitRateNameArray(v.getDfNum()); + final AlertDialog.Builder selectDialog = new AlertDialog.Builder(context).setTitle("请选择下载码率").setSingleChoiceItems(items, 0, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + int bitrate = which + 1; + + final PolyvDownloadInfo downloadInfo = new PolyvDownloadInfo(vid, v.getDuration(), + v.getFileSizeMatchVideoType(bitrate,PolyvDownloader.FILE_VIDEO), bitrate, title); + //设置下载的文件类型,视频/音频,可以用v.hasAudioPath()判断是否有音频 + downloadInfo.setFileType(PolyvDownloader.FILE_VIDEO); + Log.i("videoAdapter", downloadInfo.toString()); + if (downloadSQLiteHelper != null && !downloadSQLiteHelper.isAdd(downloadInfo)) { + downloadSQLiteHelper.insert(downloadInfo); + PolyvDownloader polyvDownloader = PolyvDownloaderManager.getPolyvDownloader(vid, bitrate, downloadInfo.getFileType()); + polyvDownloader.setPolyvDownloadProressListener2(new MyDownloadListener(context, downloadInfo)); + polyvDownloader.start(context); + } else { + ((Activity) context).runOnUiThread(new Runnable() { + + @Override + public void run() { + Toast.makeText(context, "下载任务已经增加到队列", Toast.LENGTH_SHORT).show(); + } + }); + } + + dialog.dismiss(); + } + }); + + if (view.getWindowToken() != null) + selectDialog.show().setCanceledOnTouchOutside(true); + } + }); + + loadVideoInfoTask.execute(vid); + } + } + + private static class LoadVideoInfoTask extends AsyncTask { + + private final ILoadVideoInfoListener l; + + LoadVideoInfoTask(ILoadVideoInfoListener l) { + this.l = l; + } + + @Override + protected PolyvVideoVO doInBackground(String... params) { + try { + return PolyvSDKUtil.loadVideoJSON2Video(params[0]); + } catch (Exception e) { + Log.e(TAG, PolyvSDKUtil.getExceptionFullMessage(e, -1)); + return null; + } + } + + @Override + protected void onPostExecute(PolyvVideoVO v) { + super.onPostExecute(v); + l.onloaded(v); + } + } + + private interface ILoadVideoInfoListener { + void onloaded(PolyvVideoVO v); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvPPTDirListAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvPPTDirListAdapter.java index 78d72c3..698a995 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvPPTDirListAdapter.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvPPTDirListAdapter.java @@ -3,8 +3,8 @@ import android.content.Context; import android.graphics.Color; import android.graphics.Rect; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvPlayerFragmentAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvPlayerFragmentAdapter.java index b3e19be..a8a137a 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvPlayerFragmentAdapter.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvPlayerFragmentAdapter.java @@ -1,32 +1,32 @@ -package com.easefun.polyvsdk.adapter; - -import java.util.ArrayList; -import java.util.List; - -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; - -public class PolyvPlayerFragmentAdapter extends FragmentPagerAdapter { - List fragmentList = new ArrayList(); - - public PolyvPlayerFragmentAdapter(FragmentManager fm) { - super(fm); - } - - public PolyvPlayerFragmentAdapter(FragmentManager fm, List fragmentList) { - super(fm); - this.fragmentList = fragmentList; - } - - @Override - public Fragment getItem(int position) { - return fragmentList.get(position); - } - - @Override - public int getCount() { - return fragmentList.size(); - } - -} +package com.easefun.polyvsdk.adapter; + +import java.util.ArrayList; +import java.util.List; + +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +public class PolyvPlayerFragmentAdapter extends FragmentPagerAdapter { + List fragmentList = new ArrayList(); + + public PolyvPlayerFragmentAdapter(FragmentManager fm) { + super(fm); + } + + public PolyvPlayerFragmentAdapter(FragmentManager fm, List fragmentList) { + super(fm); + this.fragmentList = fragmentList; + } + + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } + +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvScreencastDeviceListAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvScreencastDeviceListAdapter.java deleted file mode 100644 index 17f3816..0000000 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvScreencastDeviceListAdapter.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.easefun.polyvsdk.adapter; - -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.easefun.polyvsdk.R; -import com.hpplay.sdk.source.browse.api.LelinkServiceInfo; - -import java.util.ArrayList; -import java.util.List; - -public class PolyvScreencastDeviceListAdapter extends AbsRecyclerViewAdapter { - private List mDatas; - private OnItemClickListener mItemClickListener; - private LelinkServiceInfo mSelectInfo; - private int mLayoutId; - - public PolyvScreencastDeviceListAdapter(RecyclerView recyclerView, int layoutId) { - super(recyclerView); - mDatas = new ArrayList<>(); - mLayoutId = layoutId; - } - - public void setOnItemClickListener(OnItemClickListener l) { - this.mItemClickListener = l; - } - - public void updateDatas(List infos) { - if (null != infos) { - mDatas.clear(); - mDatas.addAll(infos); - notifyDataSetChanged(); - } - } - - public LelinkServiceInfo getSelectInfo() { - return mSelectInfo; - } - - public void setSelectInfo(LelinkServiceInfo selectInfo) { - mSelectInfo = selectInfo; - } - - private View.OnClickListener mOnItemClickListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - int position = (int) v.getTag(R.id.id_position); - LelinkServiceInfo info = (LelinkServiceInfo) v.getTag(R.id.id_info); - if (null != mItemClickListener) { - mItemClickListener.onClick(position, info); - } - } - }; - - @Override - public ClickableViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - bindContext(parent.getContext()); - return new ItemViewHolder(LayoutInflater.from(getContext()). - inflate(mLayoutId, parent, false)); - } - - @Override - public void onBindViewHolder(ClickableViewHolder holder, int position) { - super.onBindViewHolder(holder, position); - if (holder instanceof ItemViewHolder) { - ItemViewHolder itemViewHolder = (ItemViewHolder) holder; - LelinkServiceInfo info = mDatas.get(position); - if (null == info) { - return; - } - String item = info.getName()/* + " isOnLine:" + info.isOnLine() + " uid:" + info.getUid() + " types:" + info.getTypes()*/; - itemViewHolder.tv_device_name.setText(item); - if (info == mSelectInfo || - (mSelectInfo != null && info.getUid() != null && info.getUid().equals(mSelectInfo.getUid()))) { - itemViewHolder.tv_device_name.setSelected(true); - } else { - itemViewHolder.tv_device_name.setSelected(false); - } - itemViewHolder.tv_device_name.setTag(R.id.id_position, position); - itemViewHolder.tv_device_name.setTag(R.id.id_info, info); - itemViewHolder.tv_device_name.setOnClickListener(mOnItemClickListener); - } - } - - @Override - public int getItemCount() { - return null == mDatas ? 0 : mDatas.size(); - } - - public class ItemViewHolder extends AbsRecyclerViewAdapter.ClickableViewHolder { - TextView tv_device_name; - - public ItemViewHolder(View itemView) { - super(itemView); - tv_device_name = $(R.id.tv_device_name); - } - } - - public interface OnItemClickListener { - void onClick(int position, LelinkServiceInfo pInfo); - } -} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvSubTalkListViewAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvSubTalkListViewAdapter.java index 4cb95fb..b49699a 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvSubTalkListViewAdapter.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvSubTalkListViewAdapter.java @@ -1,85 +1,85 @@ -package com.easefun.polyvsdk.adapter; - -import android.content.Context; -import android.text.Spannable; -import android.text.SpannableStringBuilder; -import android.text.style.ForegroundColorSpan; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.util.PolyvImageLoader; -import com.easefun.polyvsdk.util.PolyvTextImageLoader; -import com.easefun.polyvsdk.util.PolyvTimeUtils; -import com.easefun.polyvsdk.util.PolyvVlmsHelper; - -import java.util.LinkedList; -import java.util.List; - -import pl.droidsonroids.gif.GifSpanTextView; - -public class PolyvSubTalkListViewAdapter extends BaseAdapter { - private Context context; - private LayoutInflater inflater; - private ViewHolder viewHolder; - private List lists; - private PolyvTextImageLoader textImageLoader; - - public PolyvSubTalkListViewAdapter(Context context, List lists) { - this.context = context; - this.lists = lists; - if (this.lists == null) - this.lists = new LinkedList<>(); - this.inflater = LayoutInflater.from(context); - this.textImageLoader = new PolyvTextImageLoader(context); - } - - @Override - public int getCount() { - return lists.size(); - } - - @Override - public Object getItem(int position) { - return lists.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - // 如果是ListView,那么会由于无法测量高度,导致这个方法不断地执行 - if (convertView == null) { - convertView = inflater.inflate(R.layout.polyv_listview_talk_sub_item, parent, false); - viewHolder = new ViewHolder(); - viewHolder.iv_avatar = (ImageView) convertView.findViewById(R.id.iv_avatar); - viewHolder.tv_msg = (GifSpanTextView) convertView.findViewById(R.id.tv_msg); - viewHolder.tv_time = (TextView) convertView.findViewById(R.id.tv_time); - convertView.setTag(viewHolder); - } else { - viewHolder = (ViewHolder) convertView.getTag(); - } - PolyvVlmsHelper.QuestionsDetail.AnswerDetail polyvAnswer = lists.get(position); - SpannableStringBuilder span = polyvAnswer.content_display; - span.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.center_bottom_text_color_blue)), 0, polyvAnswer.answer.nickname.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - textImageLoader.displayTextImage(span, viewHolder.tv_msg); - viewHolder.tv_time.setText(PolyvTimeUtils.friendlyTime(polyvAnswer.answer.last_modified)); - PolyvImageLoader.getInstance().loadImageOriginCircle(context, polyvAnswer.answer.avatar, viewHolder.iv_avatar, R.drawable.polyv_avatar_def); - - return convertView; - } - - private class ViewHolder { - ImageView iv_avatar; - GifSpanTextView tv_msg; - TextView tv_time; - } - -} +package com.easefun.polyvsdk.adapter; + +import android.content.Context; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.style.ForegroundColorSpan; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.util.PolyvImageLoader; +import com.easefun.polyvsdk.util.PolyvTextImageLoader; +import com.easefun.polyvsdk.util.PolyvTimeUtils; +import com.easefun.polyvsdk.util.PolyvVlmsHelper; + +import java.util.LinkedList; +import java.util.List; + +import pl.droidsonroids.gif.GifSpanTextView; + +public class PolyvSubTalkListViewAdapter extends BaseAdapter { + private Context context; + private LayoutInflater inflater; + private ViewHolder viewHolder; + private List lists; + private PolyvTextImageLoader textImageLoader; + + public PolyvSubTalkListViewAdapter(Context context, List lists) { + this.context = context; + this.lists = lists; + if (this.lists == null) + this.lists = new LinkedList<>(); + this.inflater = LayoutInflater.from(context); + this.textImageLoader = new PolyvTextImageLoader(context); + } + + @Override + public int getCount() { + return lists.size(); + } + + @Override + public Object getItem(int position) { + return lists.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + // 如果是ListView,那么会由于无法测量高度,导致这个方法不断地执行 + if (convertView == null) { + convertView = inflater.inflate(R.layout.polyv_listview_talk_sub_item, parent, false); + viewHolder = new ViewHolder(); + viewHolder.iv_avatar = (ImageView) convertView.findViewById(R.id.iv_avatar); + viewHolder.tv_msg = (GifSpanTextView) convertView.findViewById(R.id.tv_msg); + viewHolder.tv_time = (TextView) convertView.findViewById(R.id.tv_time); + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + PolyvVlmsHelper.QuestionsDetail.AnswerDetail polyvAnswer = lists.get(position); + SpannableStringBuilder span = polyvAnswer.content_display; + span.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.center_bottom_text_color_blue)), 0, polyvAnswer.answer.nickname.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + textImageLoader.displayTextImage(span, viewHolder.tv_msg); + viewHolder.tv_time.setText(PolyvTimeUtils.friendlyTime(polyvAnswer.answer.last_modified)); + PolyvImageLoader.getInstance().loadImageOriginCircle(context, polyvAnswer.answer.avatar, viewHolder.iv_avatar, R.drawable.polyv_avatar_def); + + return convertView; + } + + private class ViewHolder { + ImageView iv_avatar; + GifSpanTextView tv_msg; + TextView tv_time; + } + +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvTalkListViewAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvTalkListViewAdapter.java index d7d4dc0..4735349 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvTalkListViewAdapter.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvTalkListViewAdapter.java @@ -1,124 +1,124 @@ -package com.easefun.polyvsdk.adapter; - -import android.app.Activity; -import android.content.Intent; -import android.text.Html; -import android.text.Spannable; -import android.text.SpannableStringBuilder; -import android.text.style.ForegroundColorSpan; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.activity.PolyvTalkEdittextActivity; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvQuestionInfo; -import com.easefun.polyvsdk.util.PolyvClipboardUtils; -import com.easefun.polyvsdk.util.PolyvImageLoader; -import com.easefun.polyvsdk.util.PolyvTextImageLoader; -import com.easefun.polyvsdk.util.PolyvTimeUtils; -import com.easefun.polyvsdk.util.PolyvVlmsHelper; -import com.easefun.polyvsdk.view.LinearListView; - -import java.util.List; - -import pl.droidsonroids.gif.GifSpanTextView; - - -public class PolyvTalkListViewAdapter extends BaseAdapter { - private Activity context; - private List lists; - private LayoutInflater inflater; - private ViewHolder viewHolder; - private PolyvTextImageLoader textImageLoader; - - - public PolyvTalkListViewAdapter(Activity context, List lists) { - this.context = context; - this.lists = lists; - this.inflater = LayoutInflater.from(context); - this.textImageLoader = new PolyvTextImageLoader(context); - } - - @Override - public int getCount() { - return lists.size(); - } - - @Override - public Object getItem(int position) { - return lists.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(final int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = inflater.inflate(R.layout.polyv_listview_talk_item, null); - viewHolder = new ViewHolder(); - viewHolder.iv_avatar = (ImageView) convertView.findViewById(R.id.iv_avatar); - viewHolder.tv_msg = (GifSpanTextView) convertView.findViewById(R.id.tv_msg); - viewHolder.tv_time = (TextView) convertView.findViewById(R.id.tv_time); - viewHolder.tv_topic = (TextView) convertView.findViewById(R.id.tv_topic); - viewHolder.sublv_talk = (LinearListView) convertView.findViewById(R.id.sublv_talk); - convertView.setTag(viewHolder); - } else { - viewHolder = (ViewHolder) convertView.getTag(); - } - final int pPosition = position; - final PolyvQuestionInfo.Question polyvQuestion = lists.get(pPosition).question; - final List polyvAnswers = lists.get(pPosition).answers; - if (polyvAnswers.size() > 0) { - viewHolder.adapter = new PolyvSubTalkListViewAdapter(context, polyvAnswers); - viewHolder.sublv_talk.setVisibility(View.VISIBLE); - viewHolder.sublv_talk.setAdapter(viewHolder.adapter); - viewHolder.sublv_talk.setOnItemLongClickListener(new LinearListView.OnItemLongClickListener() { - - @Override - public boolean onItemLongClick(LinearListView parent, View view, int position, long id) { - PolyvVlmsHelper.QuestionsDetail.AnswerDetail polyvAnswer = polyvAnswers.get(position); - PolyvClipboardUtils.copyToClipboard(context, Html.fromHtml(polyvAnswer.answer.content)); - Toast.makeText(context, "已复制" + polyvAnswer.answer.nickname + "的评论", Toast.LENGTH_SHORT).show(); - return true; - } - }); - viewHolder.sublv_talk.setOnItemClickListener(new LinearListView.OnItemClickListener() { - - @Override - public void onItemClick(LinearListView parent, View view, int position, long id) { - Intent intent = new Intent(context, PolyvTalkEdittextActivity.class); - intent.putExtra("question_id", polyvQuestion.question_id); - intent.putExtra("position", pPosition); - // 由于接口只能回复发表讨论的人,故这里使用发表讨论的人的昵称 - intent.putExtra("nickname", polyvQuestion.nickname); - context.startActivityForResult(intent, 13); - } - }); - } else { - viewHolder.sublv_talk.setVisibility(View.INVISIBLE); - } - SpannableStringBuilder span = lists.get(pPosition).content_display; - span.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.center_bottom_text_color_blue)), 0, polyvQuestion.nickname.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - textImageLoader.displayTextImage(span, viewHolder.tv_msg); - viewHolder.tv_topic.setText(polyvQuestion.title); - viewHolder.tv_time.setText(PolyvTimeUtils.friendlyTime(polyvQuestion.last_modified)); - PolyvImageLoader.getInstance().loadImageOriginCircle(context, polyvQuestion.avatar, viewHolder.iv_avatar, R.drawable.polyv_avatar_def); - return convertView; - } - - private class ViewHolder { - ImageView iv_avatar; - GifSpanTextView tv_msg; - TextView tv_topic, tv_time; - LinearListView sublv_talk; - PolyvSubTalkListViewAdapter adapter; - } -} +package com.easefun.polyvsdk.adapter; + +import android.app.Activity; +import android.content.Intent; +import android.text.Html; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.style.ForegroundColorSpan; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.activity.PolyvTalkEdittextActivity; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvQuestionInfo; +import com.easefun.polyvsdk.util.PolyvClipboardUtils; +import com.easefun.polyvsdk.util.PolyvImageLoader; +import com.easefun.polyvsdk.util.PolyvTextImageLoader; +import com.easefun.polyvsdk.util.PolyvTimeUtils; +import com.easefun.polyvsdk.util.PolyvVlmsHelper; +import com.easefun.polyvsdk.view.LinearListView; + +import java.util.List; + +import pl.droidsonroids.gif.GifSpanTextView; + + +public class PolyvTalkListViewAdapter extends BaseAdapter { + private Activity context; + private List lists; + private LayoutInflater inflater; + private ViewHolder viewHolder; + private PolyvTextImageLoader textImageLoader; + + + public PolyvTalkListViewAdapter(Activity context, List lists) { + this.context = context; + this.lists = lists; + this.inflater = LayoutInflater.from(context); + this.textImageLoader = new PolyvTextImageLoader(context); + } + + @Override + public int getCount() { + return lists.size(); + } + + @Override + public Object getItem(int position) { + return lists.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = inflater.inflate(R.layout.polyv_listview_talk_item, null); + viewHolder = new ViewHolder(); + viewHolder.iv_avatar = (ImageView) convertView.findViewById(R.id.iv_avatar); + viewHolder.tv_msg = (GifSpanTextView) convertView.findViewById(R.id.tv_msg); + viewHolder.tv_time = (TextView) convertView.findViewById(R.id.tv_time); + viewHolder.tv_topic = (TextView) convertView.findViewById(R.id.tv_topic); + viewHolder.sublv_talk = (LinearListView) convertView.findViewById(R.id.sublv_talk); + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + final int pPosition = position; + final PolyvQuestionInfo.Question polyvQuestion = lists.get(pPosition).question; + final List polyvAnswers = lists.get(pPosition).answers; + if (polyvAnswers.size() > 0) { + viewHolder.adapter = new PolyvSubTalkListViewAdapter(context, polyvAnswers); + viewHolder.sublv_talk.setVisibility(View.VISIBLE); + viewHolder.sublv_talk.setAdapter(viewHolder.adapter); + viewHolder.sublv_talk.setOnItemLongClickListener(new LinearListView.OnItemLongClickListener() { + + @Override + public boolean onItemLongClick(LinearListView parent, View view, int position, long id) { + PolyvVlmsHelper.QuestionsDetail.AnswerDetail polyvAnswer = polyvAnswers.get(position); + PolyvClipboardUtils.copyToClipboard(context, Html.fromHtml(polyvAnswer.answer.content)); + Toast.makeText(context, "已复制" + polyvAnswer.answer.nickname + "的评论", Toast.LENGTH_SHORT).show(); + return true; + } + }); + viewHolder.sublv_talk.setOnItemClickListener(new LinearListView.OnItemClickListener() { + + @Override + public void onItemClick(LinearListView parent, View view, int position, long id) { + Intent intent = new Intent(context, PolyvTalkEdittextActivity.class); + intent.putExtra("question_id", polyvQuestion.question_id); + intent.putExtra("position", pPosition); + // 由于接口只能回复发表讨论的人,故这里使用发表讨论的人的昵称 + intent.putExtra("nickname", polyvQuestion.nickname); + context.startActivityForResult(intent, 13); + } + }); + } else { + viewHolder.sublv_talk.setVisibility(View.GONE); + } + SpannableStringBuilder span = lists.get(pPosition).content_display; + span.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.center_bottom_text_color_blue)), 0, polyvQuestion.nickname.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + textImageLoader.displayTextImage(span, viewHolder.tv_msg); + viewHolder.tv_topic.setText(polyvQuestion.title); + viewHolder.tv_time.setText(PolyvTimeUtils.friendlyTime(polyvQuestion.last_modified)); + PolyvImageLoader.getInstance().loadImageOriginCircle(context, polyvQuestion.avatar, viewHolder.iv_avatar, R.drawable.polyv_avatar_def); + return convertView; + } + + private class ViewHolder { + ImageView iv_avatar; + GifSpanTextView tv_msg; + TextView tv_topic, tv_time; + LinearListView sublv_talk; + PolyvSubTalkListViewAdapter adapter; + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvUploadListViewAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvUploadListViewAdapter.java index 135726a..8719256 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvUploadListViewAdapter.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/adapter/PolyvUploadListViewAdapter.java @@ -1,329 +1,329 @@ -package com.easefun.polyvsdk.adapter; - -import android.content.Context; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.format.Formatter; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.ProgressBar; -import android.widget.TextView; -import android.widget.Toast; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.bean.PolyvUploadInfo; -import com.easefun.polyvsdk.database.PolyvUploadSQLiteHelper; -import com.easefun.polyvsdk.upload.IPolyvUploader; -import com.easefun.polyvsdk.upload.PolyvUploader; -import com.easefun.polyvsdk.upload.PolyvUploaderManager; - -import java.lang.ref.WeakReference; -import java.util.List; - -public class PolyvUploadListViewAdapter extends BaseAdapter { - private static final int REFRESH_PROGRESS = 1; - private static final int SUCCESS = 2; - private static final int FAILURE = 3; - private static final String UPLOADED = "已上传"; - private static final String UPLOADING = "正在上传"; - private static final String PAUSEED = "暂停上传"; - private static PolyvUploadSQLiteHelper uploadSQLiteHelper; - private static Context context; - private MyHandler handler; - private List lists; - private LayoutInflater inflater; - private ViewHolder viewHolder; - - private static class MyHandler extends Handler { - private final WeakReference wr_lv_upload; - - public MyHandler(ListView lv_upload) { - this.wr_lv_upload = new WeakReference(lv_upload); - } - - @Override - public void handleMessage(Message msg) { - ListView lv_upload = wr_lv_upload.get(); - if (lv_upload != null) { - int position = msg.arg1; - View view = lv_upload.getChildAt(position - lv_upload.getFirstVisiblePosition()); - if (view == null) - return; - TextView tv_status = null; - ImageView iv_start = null; - FrameLayout fl_start = null; - ProgressBar pb_progress = null; - TextView tv_speed = null; - switch (msg.what) { - case REFRESH_PROGRESS: - pb_progress = (ProgressBar) view.findViewById(R.id.pb_progress); - tv_speed = (TextView) view.findViewById(R.id.tv_speed); - int progress = msg.getData().getInt("progress"); - long uploaded = msg.getData().getLong("uploaded"); - pb_progress.setProgress(progress); - tv_speed.setText(Formatter.formatFileSize(context, uploaded)); - break; - case SUCCESS: - tv_status = (TextView) view.findViewById(R.id.tv_status); - iv_start = (ImageView) view.findViewById(R.id.iv_start); - fl_start = (FrameLayout) view.findViewById(R.id.fl_start); - pb_progress = (ProgressBar) view.findViewById(R.id.pb_progress); - tv_speed = (TextView) view.findViewById(R.id.tv_speed); - tv_status.setText(UPLOADED); - tv_status.setSelected(false); - iv_start.setImageResource(R.drawable.polyv_btn_play); - fl_start.setEnabled(false); - pb_progress.setVisibility(View.INVISIBLE); - tv_speed.setVisibility(View.INVISIBLE); - Toast.makeText(context, "第" + (position + 1) + "个任务上传成功", Toast.LENGTH_SHORT).show(); - break; - case FAILURE: - tv_status = (TextView) view.findViewById(R.id.tv_status); - iv_start = (ImageView) view.findViewById(R.id.iv_start); - tv_status.setText(PAUSEED); - tv_status.setSelected(true); - iv_start.setImageResource(R.drawable.polyv_btn_upload); - int category = (int) msg.obj; - switch (category) { - case PolyvUploader.FFILE: - Toast.makeText(context, "第" + (position + 1) + "个任务文件不存在,或者大小为0", Toast.LENGTH_SHORT).show(); - break; - case PolyvUploader.FVIDEO: - Toast.makeText(context, "第" + (position + 1) + "个任务不是支持上传的视频格式", Toast.LENGTH_SHORT).show(); - break; - case PolyvUploader.NETEXCEPTION: - Toast.makeText(context, "第" + (position + 1) + "个任务网络异常,请重试", Toast.LENGTH_SHORT).show(); - break; - case PolyvUploader.SPACE_FULL: - // 使用uploader.start(sign, ptime)方法才能监听到。当账号空间满时,上传到服务器的视频是不合规的。 - Toast.makeText(context, "账号空间已满,请清理后重试", Toast.LENGTH_SHORT).show(); - break; - } - break; - } - } - } - } - - private class ViewHolder { - FrameLayout fl_start; - ImageView iv_start; - TextView tv_seri, tv_title, tv_size, tv_status, tv_speed; - ProgressBar pb_progress; - } - - public PolyvUploadListViewAdapter(Context context, List lists, ListView lv_upload) { - this.context = context.getApplicationContext(); - this.lists = lists; - this.inflater = LayoutInflater.from(this.context); - this.handler = new MyHandler(lv_upload); - this.uploadSQLiteHelper = PolyvUploadSQLiteHelper.getInstance(this.context); - initUploader(); - } - - private static class MyUploadListener implements PolyvUploader.UploadListener { - private final WeakReference wr_handler; - private PolyvUploadInfo uploadInfo; - private int position; - - public MyUploadListener(MyHandler myHandler, PolyvUploadInfo uploadInfo, int position) { - this.wr_handler = new WeakReference(myHandler); - this.uploadInfo = uploadInfo; - this.position = position; - } - - @Override - public void fail(int category) { - MyHandler myHandler = wr_handler.get(); - if (myHandler != null) { - Message message = myHandler.obtainMessage(FAILURE); - message.arg1 = position; - message.obj = category; - myHandler.sendMessage(message); - } - } - - @Override - public void upCount(long count, long total) { - // 已下载的百分比 - int progress = (int) (count * 100 / total); - // 已下载的文件大小 - long uploaded = uploadInfo.getFilesize() * progress / 100; - uploadInfo.setPercent(count); - uploadInfo.setTotal(total); - uploadSQLiteHelper.update(uploadInfo, count, total); - MyHandler myHandler = wr_handler.get(); - if (myHandler != null) { - Message message = myHandler.obtainMessage(REFRESH_PROGRESS); - message.arg1 = position; - Bundle bundle = new Bundle(); - bundle.putInt("progress", progress); - bundle.putLong("uploaded", uploaded); - message.setData(bundle); - myHandler.sendMessage(message); - } - } - - @Override - public void success(long total, String vid) { - uploadInfo.setPercent(total); - uploadInfo.setTotal(total); - uploadSQLiteHelper.update(uploadInfo, total, total); - MyHandler myHandler = wr_handler.get(); - if (myHandler != null) { - Message message = myHandler.obtainMessage(SUCCESS); - message.arg1 = position; - myHandler.sendMessage(message); - } - } - } - - // 初始化上传器的监听器 - public void initUploader() { - for (int i = 0; i < lists.size(); i++) { - PolyvUploadInfo uploadInfo = lists.get(i); - String filepath = uploadInfo.getFilepath(); - String title = uploadInfo.getTitle(); - String desc = uploadInfo.getDesc(); - String cataid = uploadInfo.getCataid(); - IPolyvUploader uploader = PolyvUploaderManager.getPolyvUploader(filepath, title, desc, cataid); - uploader.setUploadListener(new MyUploadListener(handler, uploadInfo, i)); - } - } - - /** - * 把任务从列表中移除 - */ - public void removeTask(int position) { - PolyvUploadInfo uploadInfo = lists.remove(position); - // 该方法会先暂停上传再移除任务 - PolyvUploaderManager.removePolyvUpload(uploadInfo.getFilepath()); - initUploader(); - uploadSQLiteHelper.delete(uploadInfo); - notifyDataSetChanged(); - } - - @Override - public int getCount() { - return lists.size(); - } - - @Override - public Object getItem(int position) { - return lists.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(final int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = inflater.inflate(R.layout.polyv_listview_upload_item, null); - viewHolder = new ViewHolder(); - viewHolder.fl_start = (FrameLayout) convertView.findViewById(R.id.fl_start); - viewHolder.iv_start = (ImageView) convertView.findViewById(R.id.iv_start); - viewHolder.tv_seri = (TextView) convertView.findViewById(R.id.tv_seri); - viewHolder.tv_size = (TextView) convertView.findViewById(R.id.tv_size); - viewHolder.tv_speed = (TextView) convertView.findViewById(R.id.tv_speed); - viewHolder.tv_status = (TextView) convertView.findViewById(R.id.tv_status); - viewHolder.tv_title = (TextView) convertView.findViewById(R.id.tv_title); - viewHolder.pb_progress = (ProgressBar) convertView.findViewById(R.id.pb_progress); - convertView.setTag(viewHolder); - } else { - viewHolder = (ViewHolder) convertView.getTag(); - } - final PolyvUploadInfo uploadInfo = lists.get(position); - long percent = uploadInfo.getPercent(); - long total = uploadInfo.getTotal(); - String title = uploadInfo.getTitle(); - String filepath = uploadInfo.getFilepath(); - String desc = uploadInfo.getDesc(); - String cataid = uploadInfo.getCataid(); - long filesize = uploadInfo.getFilesize(); - // 已上传的百分比 - int progress = 0; - if (total != 0) - progress = (int) (percent * 100 / total); - IPolyvUploader uploader = PolyvUploaderManager.getPolyvUploader(filepath, title, desc, cataid); - viewHolder.pb_progress.setVisibility(View.VISIBLE); - viewHolder.tv_speed.setVisibility(View.VISIBLE); - viewHolder.tv_status.setSelected(false); - viewHolder.fl_start.setEnabled(true); - if (progress == 100) { - viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_play); - viewHolder.fl_start.setEnabled(false); - viewHolder.tv_status.setText(UPLOADED); - viewHolder.pb_progress.setVisibility(View.INVISIBLE); - viewHolder.tv_speed.setVisibility(View.INVISIBLE); - } else if (uploader.isUploading()) { - viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_dlpause); - viewHolder.tv_status.setText(UPLOADING); - } else { - viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_upload); - viewHolder.tv_status.setText(PAUSEED); - viewHolder.tv_status.setSelected(true); - } - if (position + 1 < 10) - viewHolder.tv_seri.setText("0" + (position + 1)); - else - viewHolder.tv_seri.setText("" + (position + 1)); - viewHolder.tv_title.setText(title); - viewHolder.tv_size.setText(Formatter.formatFileSize(context, filesize)); - viewHolder.tv_speed.setText(Formatter.formatFileSize(context, filesize * progress / 100)); - viewHolder.pb_progress.setProgress(progress); - viewHolder.fl_start.setOnClickListener(new UploadOnClickListener(uploadInfo, viewHolder.iv_start, viewHolder.tv_status)); - return convertView; - } - - // 注:如果一个视频使用uploader.start()上传了数据,之后再改变为其他的cataid上传,也会上传到之前有数据的那个cataid目录下。 - private void updateCataid(String cataid, int position){ - PolyvUploadInfo info = lists.get(position); - info.setCataid(cataid); - uploadSQLiteHelper.updateCataid(info); - PolyvUploader uploader = PolyvUploaderManager.getPolyvUploader(info.getFilepath(), info.getTitle(), info.getDesc(), info.getCataid()); - uploader.setUploadListener(new MyUploadListener(handler, info, position)); - } - - private class UploadOnClickListener implements View.OnClickListener { - private PolyvUploadInfo uploadInfo; - private ImageView iv_start; - private TextView tv_status; - - public UploadOnClickListener(PolyvUploadInfo uploadInfo, ImageView iv_start, TextView tv_status) { - this.uploadInfo = uploadInfo; - this.iv_start = iv_start; - this.tv_status = tv_status; - } - - @Override - public void onClick(View v) { - String filepath = uploadInfo.getFilepath(); - String title = uploadInfo.getTitle(); - String desc = uploadInfo.getDesc(); - String cataid = uploadInfo.getCataid(); - IPolyvUploader uploader = PolyvUploaderManager.getPolyvUploader(filepath, title, desc, cataid); - if (tv_status.getText().equals(UPLOADED)) { - //... - } else if (tv_status.getText().equals(UPLOADING)) { - tv_status.setText(PAUSEED); - tv_status.setSelected(true); - iv_start.setImageResource(R.drawable.polyv_btn_upload); - uploader.pause(); - } else { - tv_status.setText(UPLOADING); - tv_status.setSelected(false); - iv_start.setImageResource(R.drawable.polyv_btn_dlpause); - uploader.start(); - } - } - } -} +package com.easefun.polyvsdk.adapter; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.format.Formatter; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.bean.PolyvUploadInfo; +import com.easefun.polyvsdk.database.PolyvUploadSQLiteHelper; +import com.easefun.polyvsdk.upload.IPolyvUploader; +import com.easefun.polyvsdk.upload.PolyvUploader; +import com.easefun.polyvsdk.upload.PolyvUploaderManager; + +import java.lang.ref.WeakReference; +import java.util.List; + +public class PolyvUploadListViewAdapter extends BaseAdapter { + private static final int REFRESH_PROGRESS = 1; + private static final int SUCCESS = 2; + private static final int FAILURE = 3; + private static final String UPLOADED = "已上传"; + private static final String UPLOADING = "正在上传"; + private static final String PAUSEED = "暂停上传"; + private static PolyvUploadSQLiteHelper uploadSQLiteHelper; + private static Context context; + private MyHandler handler; + private List lists; + private LayoutInflater inflater; + private ViewHolder viewHolder; + + private static class MyHandler extends Handler { + private final WeakReference wr_lv_upload; + + public MyHandler(ListView lv_upload) { + this.wr_lv_upload = new WeakReference(lv_upload); + } + + @Override + public void handleMessage(Message msg) { + ListView lv_upload = wr_lv_upload.get(); + if (lv_upload != null) { + int position = msg.arg1; + View view = lv_upload.getChildAt(position - lv_upload.getFirstVisiblePosition()); + if (view == null) + return; + TextView tv_status = null; + ImageView iv_start = null; + FrameLayout fl_start = null; + ProgressBar pb_progress = null; + TextView tv_speed = null; + switch (msg.what) { + case REFRESH_PROGRESS: + pb_progress = (ProgressBar) view.findViewById(R.id.pb_progress); + tv_speed = (TextView) view.findViewById(R.id.tv_speed); + int progress = msg.getData().getInt("progress"); + long uploaded = msg.getData().getLong("uploaded"); + pb_progress.setProgress(progress); + tv_speed.setText(Formatter.formatFileSize(context, uploaded)); + break; + case SUCCESS: + tv_status = (TextView) view.findViewById(R.id.tv_status); + iv_start = (ImageView) view.findViewById(R.id.iv_start); + fl_start = (FrameLayout) view.findViewById(R.id.fl_start); + pb_progress = (ProgressBar) view.findViewById(R.id.pb_progress); + tv_speed = (TextView) view.findViewById(R.id.tv_speed); + tv_status.setText(UPLOADED); + tv_status.setSelected(false); + iv_start.setImageResource(R.drawable.polyv_btn_play); + fl_start.setEnabled(false); + pb_progress.setVisibility(View.GONE); + tv_speed.setVisibility(View.GONE); + Toast.makeText(context, "第" + (position + 1) + "个任务上传成功", Toast.LENGTH_SHORT).show(); + break; + case FAILURE: + tv_status = (TextView) view.findViewById(R.id.tv_status); + iv_start = (ImageView) view.findViewById(R.id.iv_start); + tv_status.setText(PAUSEED); + tv_status.setSelected(true); + iv_start.setImageResource(R.drawable.polyv_btn_upload); + int category = (int) msg.obj; + switch (category) { + case PolyvUploader.FFILE: + Toast.makeText(context, "第" + (position + 1) + "个任务文件不存在,或者大小为0", Toast.LENGTH_SHORT).show(); + break; + case PolyvUploader.FVIDEO: + Toast.makeText(context, "第" + (position + 1) + "个任务不是支持上传的视频格式", Toast.LENGTH_SHORT).show(); + break; + case PolyvUploader.NETEXCEPTION: + Toast.makeText(context, "第" + (position + 1) + "个任务网络异常,请重试", Toast.LENGTH_SHORT).show(); + break; + case PolyvUploader.SPACE_FULL: + // 使用uploader.start(sign, ptime)方法才能监听到。当账号空间满时,上传到服务器的视频是不合规的。 + Toast.makeText(context, "账号空间已满,请清理后重试", Toast.LENGTH_SHORT).show(); + break; + } + break; + } + } + } + } + + private class ViewHolder { + FrameLayout fl_start; + ImageView iv_start; + TextView tv_seri, tv_title, tv_size, tv_status, tv_speed; + ProgressBar pb_progress; + } + + public PolyvUploadListViewAdapter(Context context, List lists, ListView lv_upload) { + this.context = context.getApplicationContext(); + this.lists = lists; + this.inflater = LayoutInflater.from(this.context); + this.handler = new MyHandler(lv_upload); + this.uploadSQLiteHelper = PolyvUploadSQLiteHelper.getInstance(this.context); + initUploader(); + } + + private static class MyUploadListener implements PolyvUploader.UploadListener { + private final WeakReference wr_handler; + private PolyvUploadInfo uploadInfo; + private int position; + + public MyUploadListener(MyHandler myHandler, PolyvUploadInfo uploadInfo, int position) { + this.wr_handler = new WeakReference(myHandler); + this.uploadInfo = uploadInfo; + this.position = position; + } + + @Override + public void fail(int category) { + MyHandler myHandler = wr_handler.get(); + if (myHandler != null) { + Message message = myHandler.obtainMessage(FAILURE); + message.arg1 = position; + message.obj = category; + myHandler.sendMessage(message); + } + } + + @Override + public void upCount(long count, long total) { + // 已下载的百分比 + int progress = (int) (count * 100 / total); + // 已下载的文件大小 + long uploaded = uploadInfo.getFilesize() * progress / 100; + uploadInfo.setPercent(count); + uploadInfo.setTotal(total); + uploadSQLiteHelper.update(uploadInfo, count, total); + MyHandler myHandler = wr_handler.get(); + if (myHandler != null) { + Message message = myHandler.obtainMessage(REFRESH_PROGRESS); + message.arg1 = position; + Bundle bundle = new Bundle(); + bundle.putInt("progress", progress); + bundle.putLong("uploaded", uploaded); + message.setData(bundle); + myHandler.sendMessage(message); + } + } + + @Override + public void success(long total, String vid) { + uploadInfo.setPercent(total); + uploadInfo.setTotal(total); + uploadSQLiteHelper.update(uploadInfo, total, total); + MyHandler myHandler = wr_handler.get(); + if (myHandler != null) { + Message message = myHandler.obtainMessage(SUCCESS); + message.arg1 = position; + myHandler.sendMessage(message); + } + } + } + + // 初始化上传器的监听器 + public void initUploader() { + for (int i = 0; i < lists.size(); i++) { + PolyvUploadInfo uploadInfo = lists.get(i); + String filepath = uploadInfo.getFilepath(); + String title = uploadInfo.getTitle(); + String desc = uploadInfo.getDesc(); + String cataid = uploadInfo.getCataid(); + IPolyvUploader uploader = PolyvUploaderManager.getPolyvUploader(filepath, title, desc, cataid); + uploader.setUploadListener(new MyUploadListener(handler, uploadInfo, i)); + } + } + + /** + * 把任务从列表中移除 + */ + public void removeTask(int position) { + PolyvUploadInfo uploadInfo = lists.remove(position); + // 该方法会先暂停上传再移除任务 + PolyvUploaderManager.removePolyvUpload(uploadInfo.getFilepath()); + initUploader(); + uploadSQLiteHelper.delete(uploadInfo); + notifyDataSetChanged(); + } + + @Override + public int getCount() { + return lists.size(); + } + + @Override + public Object getItem(int position) { + return lists.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = inflater.inflate(R.layout.polyv_listview_upload_item, null); + viewHolder = new ViewHolder(); + viewHolder.fl_start = (FrameLayout) convertView.findViewById(R.id.fl_start); + viewHolder.iv_start = (ImageView) convertView.findViewById(R.id.iv_start); + viewHolder.tv_seri = (TextView) convertView.findViewById(R.id.tv_seri); + viewHolder.tv_size = (TextView) convertView.findViewById(R.id.tv_size); + viewHolder.tv_speed = (TextView) convertView.findViewById(R.id.tv_speed); + viewHolder.tv_status = (TextView) convertView.findViewById(R.id.tv_status); + viewHolder.tv_title = (TextView) convertView.findViewById(R.id.tv_title); + viewHolder.pb_progress = (ProgressBar) convertView.findViewById(R.id.pb_progress); + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + final PolyvUploadInfo uploadInfo = lists.get(position); + long percent = uploadInfo.getPercent(); + long total = uploadInfo.getTotal(); + String title = uploadInfo.getTitle(); + String filepath = uploadInfo.getFilepath(); + String desc = uploadInfo.getDesc(); + String cataid = uploadInfo.getCataid(); + long filesize = uploadInfo.getFilesize(); + // 已上传的百分比 + int progress = 0; + if (total != 0) + progress = (int) (percent * 100 / total); + IPolyvUploader uploader = PolyvUploaderManager.getPolyvUploader(filepath, title, desc, cataid); + viewHolder.pb_progress.setVisibility(View.VISIBLE); + viewHolder.tv_speed.setVisibility(View.VISIBLE); + viewHolder.tv_status.setSelected(false); + viewHolder.fl_start.setEnabled(true); + if (progress == 100) { + viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_play); + viewHolder.fl_start.setEnabled(false); + viewHolder.tv_status.setText(UPLOADED); + viewHolder.pb_progress.setVisibility(View.GONE); + viewHolder.tv_speed.setVisibility(View.GONE); + } else if (uploader.isUploading()) { + viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_dlpause); + viewHolder.tv_status.setText(UPLOADING); + } else { + viewHolder.iv_start.setImageResource(R.drawable.polyv_btn_upload); + viewHolder.tv_status.setText(PAUSEED); + viewHolder.tv_status.setSelected(true); + } + if (position + 1 < 10) + viewHolder.tv_seri.setText("0" + (position + 1)); + else + viewHolder.tv_seri.setText("" + (position + 1)); + viewHolder.tv_title.setText(title); + viewHolder.tv_size.setText(Formatter.formatFileSize(context, filesize)); + viewHolder.tv_speed.setText(Formatter.formatFileSize(context, filesize * progress / 100)); + viewHolder.pb_progress.setProgress(progress); + viewHolder.fl_start.setOnClickListener(new UploadOnClickListener(uploadInfo, viewHolder.iv_start, viewHolder.tv_status)); + return convertView; + } + + // 注:如果一个视频使用uploader.start()上传了数据,之后再改变为其他的cataid上传,也会上传到之前有数据的那个cataid目录下。 + private void updateCataid(String cataid, int position){ + PolyvUploadInfo info = lists.get(position); + info.setCataid(cataid); + uploadSQLiteHelper.updateCataid(info); + PolyvUploader uploader = PolyvUploaderManager.getPolyvUploader(info.getFilepath(), info.getTitle(), info.getDesc(), info.getCataid()); + uploader.setUploadListener(new MyUploadListener(handler, info, position)); + } + + private class UploadOnClickListener implements View.OnClickListener { + private PolyvUploadInfo uploadInfo; + private ImageView iv_start; + private TextView tv_status; + + public UploadOnClickListener(PolyvUploadInfo uploadInfo, ImageView iv_start, TextView tv_status) { + this.uploadInfo = uploadInfo; + this.iv_start = iv_start; + this.tv_status = tv_status; + } + + @Override + public void onClick(View v) { + String filepath = uploadInfo.getFilepath(); + String title = uploadInfo.getTitle(); + String desc = uploadInfo.getDesc(); + String cataid = uploadInfo.getCataid(); + IPolyvUploader uploader = PolyvUploaderManager.getPolyvUploader(filepath, title, desc, cataid); + if (tv_status.getText().equals(UPLOADED)) { + //... + } else if (tv_status.getText().equals(UPLOADING)) { + tv_status.setText(PAUSEED); + tv_status.setSelected(true); + iv_start.setImageResource(R.drawable.polyv_btn_upload); + uploader.pause(); + } else { + tv_status.setText(UPLOADING); + tv_status.setSelected(false); + iv_start.setImageResource(R.drawable.polyv_btn_dlpause); + uploader.start(); + } + } + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/bean/PolyvAddDanmakuResult.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/bean/PolyvAddDanmakuResult.java index 9309c96..49997bb 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/bean/PolyvAddDanmakuResult.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/bean/PolyvAddDanmakuResult.java @@ -1,6 +1,6 @@ package com.easefun.polyvsdk.bean; -import android.support.annotation.Keep; +import androidx.annotation.Keep; /** * date: 2019/8/9 0009 diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/bean/PolyvDownloadInfo.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/bean/PolyvDownloadInfo.java index be70172..d7f1135 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/bean/PolyvDownloadInfo.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/bean/PolyvDownloadInfo.java @@ -1,123 +1,123 @@ -package com.easefun.polyvsdk.bean; - -import com.easefun.polyvsdk.PolyvDownloader; - -public class PolyvDownloadInfo { - // vid - private String vid; - // 时长 - private String duration; - // 文件大小 - private long filesize; - // 码率 - private int bitrate; - // 标题 - private String title; - // 已下载的文件大小(mp4)/已下载的文件个数(ts) - private long percent; - // 总文件大小(mp4)/总个数(ts) - private long total; - // 下载的文件类型 - private int fileType; - - private float progress; - - public PolyvDownloadInfo(String vid, String duration, long filesize, int bitrate, String title) { - this(vid,duration, filesize, bitrate, title, PolyvDownloader.FILE_VIDEO); - } - - public PolyvDownloadInfo(String vid, String duration, long filesize, int bitrate, String title, int fileType) { - this.vid = vid; - this.duration = duration; - this.filesize = filesize; - this.bitrate = bitrate; - this.title = title; - this.fileType = fileType; - } - - public String getVid() { - return vid; - } - - public void setVid(String vid) { - this.vid = vid; - } - - public String getDuration() { - return duration; - } - - public void setDuration(String duration) { - this.duration = duration; - } - - public long getFilesize() { - return filesize; - } - - public void setFilesize(long filesize) { - this.filesize = filesize; - } - - public int getBitrate() { - return bitrate; - } - - public void setBitrate(int bitrate) { - this.bitrate = bitrate; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public long getPercent() { - return percent; - } - - public void setPercent(long percent) { - this.percent = percent; - } - - public long getTotal() { - return total; - } - - public void setTotal(long total) { - this.total = total; - } - - public int getFileType() { - return fileType; - } - - public void setFileType(int fileType) { - this.fileType = fileType; - } - - @Override - public String toString() { - return "PolyvDownloadInfo{" + - "vid='" + vid + '\'' + - ", duration='" + duration + '\'' + - ", filesize=" + filesize + - ", bitrate=" + bitrate + - ", title='" + title + '\'' + - ", percent=" + percent + - ", total=" + total + - ", fileType=" + fileType + - '}'; - } - - public float getProgress() { - return progress; - } - - public void setProgress(float progress) { - this.progress = progress; - } -} +package com.easefun.polyvsdk.bean; + +import com.easefun.polyvsdk.PolyvDownloader; + +public class PolyvDownloadInfo { + // vid + private String vid; + // 时长 + private String duration; + // 文件大小 + private long filesize; + // 码率 + private int bitrate; + // 标题 + private String title; + // 已下载的文件大小(mp4)/已下载的文件个数(ts) + private long percent; + // 总文件大小(mp4)/总个数(ts) + private long total; + // 下载的文件类型 + private int fileType; + + private float progress; + + public PolyvDownloadInfo(String vid, String duration, long filesize, int bitrate, String title) { + this(vid,duration, filesize, bitrate, title, PolyvDownloader.FILE_VIDEO); + } + + public PolyvDownloadInfo(String vid, String duration, long filesize, int bitrate, String title, int fileType) { + this.vid = vid; + this.duration = duration; + this.filesize = filesize; + this.bitrate = bitrate; + this.title = title; + this.fileType = fileType; + } + + public String getVid() { + return vid; + } + + public void setVid(String vid) { + this.vid = vid; + } + + public String getDuration() { + return duration; + } + + public void setDuration(String duration) { + this.duration = duration; + } + + public long getFilesize() { + return filesize; + } + + public void setFilesize(long filesize) { + this.filesize = filesize; + } + + public int getBitrate() { + return bitrate; + } + + public void setBitrate(int bitrate) { + this.bitrate = bitrate; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public long getPercent() { + return percent; + } + + public void setPercent(long percent) { + this.percent = percent; + } + + public long getTotal() { + return total; + } + + public void setTotal(long total) { + this.total = total; + } + + public int getFileType() { + return fileType; + } + + public void setFileType(int fileType) { + this.fileType = fileType; + } + + @Override + public String toString() { + return "PolyvDownloadInfo{" + + "vid='" + vid + '\'' + + ", duration='" + duration + '\'' + + ", filesize=" + filesize + + ", bitrate=" + bitrate + + ", title='" + title + '\'' + + ", percent=" + percent + + ", total=" + total + + ", fileType=" + fileType + + '}'; + } + + public float getProgress() { + return progress; + } + + public void setProgress(float progress) { + this.progress = progress; + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/bean/PolyvUploadInfo.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/bean/PolyvUploadInfo.java index 5bb6c41..27502c4 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/bean/PolyvUploadInfo.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/bean/PolyvUploadInfo.java @@ -1,102 +1,102 @@ -package com.easefun.polyvsdk.bean; - -public class PolyvUploadInfo { - // 标题 - private String title; - // 文件路径 - private String filepath; - // 文件大小 - private long filesize; - // 描述 - private String desc; - // 分类id - private String cataid; - // 已上传的文件大小 - private long percent; - // 需上传的总文件大小 - private long total; - - public PolyvUploadInfo(){} - - public PolyvUploadInfo(String title, String desc, long filesize, String filepath) { - // cataid默认为0 - this(title, desc, filesize, filepath, "0"); - } - - public PolyvUploadInfo(String title, String desc, long filesize, String filepath, String cataid) { - this.title = title; - this.desc = desc; - this.filesize = filesize; - this.filepath = filepath; - this.cataid = cataid; - } - - public String getCataid() { - return cataid; - } - - public void setCataid(String cataid) { - this.cataid = cataid; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getFilepath() { - return filepath; - } - - public void setFilepath(String filepath) { - this.filepath = filepath; - } - - public long getFilesize() { - return filesize; - } - - public void setFilesize(long filesize) { - this.filesize = filesize; - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } - - public long getPercent() { - return percent; - } - - public void setPercent(long percent) { - this.percent = percent; - } - - public long getTotal() { - return total; - } - - public void setTotal(long total) { - this.total = total; - } - - @Override - public String toString() { - return "PolyvUploadInfo{" + - "title='" + title + '\'' + - ", filepath='" + filepath + '\'' + - ", filesize=" + filesize + - ", desc='" + desc + '\'' + - ", cataid='" + cataid + '\'' + - ", percent=" + percent + - ", total=" + total + - '}'; - } -} +package com.easefun.polyvsdk.bean; + +public class PolyvUploadInfo { + // 标题 + private String title; + // 文件路径 + private String filepath; + // 文件大小 + private long filesize; + // 描述 + private String desc; + // 分类id + private String cataid; + // 已上传的文件大小 + private long percent; + // 需上传的总文件大小 + private long total; + + public PolyvUploadInfo(){} + + public PolyvUploadInfo(String title, String desc, long filesize, String filepath) { + // cataid默认为0 + this(title, desc, filesize, filepath, "0"); + } + + public PolyvUploadInfo(String title, String desc, long filesize, String filepath, String cataid) { + this.title = title; + this.desc = desc; + this.filesize = filesize; + this.filepath = filepath; + this.cataid = cataid; + } + + public String getCataid() { + return cataid; + } + + public void setCataid(String cataid) { + this.cataid = cataid; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getFilepath() { + return filepath; + } + + public void setFilepath(String filepath) { + this.filepath = filepath; + } + + public long getFilesize() { + return filesize; + } + + public void setFilesize(long filesize) { + this.filesize = filesize; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public long getPercent() { + return percent; + } + + public void setPercent(long percent) { + this.percent = percent; + } + + public long getTotal() { + return total; + } + + public void setTotal(long total) { + this.total = total; + } + + @Override + public String toString() { + return "PolyvUploadInfo{" + + "title='" + title + '\'' + + ", filepath='" + filepath + '\'' + + ", filesize=" + filesize + + ", desc='" + desc + '\'' + + ", cataid='" + cataid + '\'' + + ", percent=" + percent + + ", total=" + total + + '}'; + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/database/PolyvDownloadSQLiteHelper.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/database/PolyvDownloadSQLiteHelper.java index 4b2d699..bb94019 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/database/PolyvDownloadSQLiteHelper.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/database/PolyvDownloadSQLiteHelper.java @@ -1,236 +1,236 @@ -package com.easefun.polyvsdk.database; - -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; - -import com.easefun.polyvsdk.PolyvSDKClient; -import com.easefun.polyvsdk.bean.PolyvDownloadInfo; -import com.easefun.polyvsdk.log.PolyvCommonLog; - -import java.io.File; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class PolyvDownloadSQLiteHelper extends SQLiteOpenHelper { - private static final String TAG = "PolyvDownloadSQLiteHelp"; - private static PolyvDownloadSQLiteHelper sqLiteHelper; - private static final String DATABASENAME = "downloadlist.db"; - private static final String TABLE_NAME = "downloadlist"; - private static final int VERSION = 7; - - private static final Executor SINGLE_EXECUTOR = Executors.newSingleThreadExecutor(); - - public static PolyvDownloadSQLiteHelper getInstance(Context context) { - if (sqLiteHelper == null) { - synchronized (PolyvDownloadSQLiteHelper.class) { - if (sqLiteHelper == null) { - //如果开启多账户体系,设置绝对路径 - File downloadPath = PolyvSDKClient.getInstance().getDownloadDir(); - sqLiteHelper = new PolyvDownloadSQLiteHelper(context.getApplicationContext(), - PolyvSDKClient.getInstance().isMultiDownloadAccount() && downloadPath != null - ? downloadPath.getAbsolutePath() + File.separator + DATABASENAME : DATABASENAME, - null, VERSION); - } - } - } - return sqLiteHelper; - } - - private PolyvDownloadSQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { - super(context, name, factory, version); - } - - @Override - public void onCreate(SQLiteDatabase db) { - db.execSQL( - "create table if not exists downloadlist(vid varchar(20),title varchar(100),duration varchar(20),filesize int,bitrate int,fileType int,percent int default 0,total int default 0,primary key (vid, bitrate, fileType))"); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - db.execSQL("drop table if exists downloadlist"); - onCreate(db); - } - - /** - * 添加下载信息至数据库 - * - * @param info - */ - public void insert(final PolyvDownloadInfo info) { - SINGLE_EXECUTOR.execute(new Runnable() { - @Override - public void run() { - SQLiteDatabase db = getWritableDatabase(); - String sql = "insert into downloadlist(vid,title,duration,filesize,bitrate, fileType) values(?,?,?,?,?,?)"; - db.execSQL(sql, new Object[]{info.getVid(), info.getTitle(), info.getDuration(), - info.getFilesize(), info.getBitrate(), info.getFileType()}); - } - }); - } - - /** - * 批量添加数据 - * - * @param infos - */ - public void insert(final List infos) { - SINGLE_EXECUTOR.execute(new Runnable() { - @Override - public void run() { - SQLiteDatabase db = null; - try { - db = getWritableDatabase(); - db.beginTransaction(); - for (PolyvDownloadInfo info : infos) { - ContentValues contentValues = createValues(info); - db.insertWithOnConflict(TABLE_NAME, null, contentValues,SQLiteDatabase.CONFLICT_IGNORE); - } - db.setTransactionSuccessful(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (db != null) { - db.endTransaction(); - } - } - } - }); - - } - - private ContentValues createValues(PolyvDownloadInfo info) { - ContentValues contentValues = new ContentValues(); - contentValues.put("vid", info.getVid()); - contentValues.put("title", info.getTitle()); - contentValues.put("duration", info.getDuration()); - contentValues.put("filesize", info.getFilesize()); - contentValues.put("bitrate", info.getBitrate()); - contentValues.put("fileType", info.getFileType()); - contentValues.put("percent", info.getPercent()); - contentValues.put("total", info.getTotal()); - return contentValues; - } - - /** - * 移除下载信息从数据库中 - * - * @param info - */ - public void delete(final PolyvDownloadInfo info) { - SINGLE_EXECUTOR.execute(new Runnable() { - @Override - public void run() { - SQLiteDatabase db = getWritableDatabase(); - String sql = "delete from downloadlist where vid=? and bitrate=? and fileType=?"; - db.execSQL(sql, new Object[]{info.getVid(), info.getBitrate(), info.getFileType()}); - } - }); - } - - /** - * 更新下载的进度至数据库 - * - * @param info - * @param percent - * @param total - */ - public void update(final PolyvDownloadInfo info, final long percent, final long total) { - SINGLE_EXECUTOR.execute(new Runnable() { - @Override - public void run() { - SQLiteDatabase db = getWritableDatabase(); - String sql = "update downloadlist set percent=?,total=? where vid=? and bitrate=? and fileType=?"; - db.execSQL(sql, new Object[]{percent, total, info.getVid(), info.getBitrate(), info.getFileType()}); - } - }); - } - - /** - * 判断该下载信息是否已以添加过 - * - * @param info - * @return - */ - public boolean isAdd(PolyvDownloadInfo info) { - SQLiteDatabase db = getWritableDatabase(); - String sql = "select vid ,duration,filesize,bitrate,fileType from downloadlist where vid=? and bitrate=? and fileType=?"; - Cursor cursor = null; - try { - cursor = db.rawQuery(sql, new String[]{info.getVid(), info.getBitrate() + "", info.getFileType() + ""}); - return cursor.getCount() == 1 ? true : false; - } finally { - if (cursor != null) - cursor.close(); - } - } - - public boolean isInDatabase(String vid){ - SQLiteDatabase db = getWritableDatabase(); - String sql = "select vid from downloadlist where vid=? "; - Cursor cursor = null; - try { - cursor = db.rawQuery(sql, new String[]{vid}); - return cursor.getCount() == 1; - } finally { - if (cursor != null) - cursor.close(); - } - } - - /** - * 获取所有的下载信息对象 - * - * @return - */ - public LinkedList getAll() { - LinkedList infos = new LinkedList(); - SQLiteDatabase db = getWritableDatabase(); - String sql = "select vid,title,duration,filesize,bitrate,fileType,percent,total from downloadlist"; - Cursor cursor = null; - try { - cursor = db.rawQuery(sql, null); - while (cursor.moveToNext()) { - String vid = cursor.getString(cursor.getColumnIndex("vid")); - String title = cursor.getString(cursor.getColumnIndex("title")); - String duration = cursor.getString(cursor.getColumnIndex("duration")); - long filesize = cursor.getInt(cursor.getColumnIndex("filesize")); - int bitrate = cursor.getInt(cursor.getColumnIndex("bitrate")); - long percent = cursor.getInt(cursor.getColumnIndex("percent")); - long total = cursor.getInt(cursor.getColumnIndex("total")); - int fileType = cursor.getInt(cursor.getColumnIndex("fileType")); - PolyvDownloadInfo info = new PolyvDownloadInfo(vid, duration, filesize, bitrate, title); - info.setFileType(fileType); - info.setPercent(percent); - info.setTotal(total); - infos.addLast(info); - } - } finally { - if (cursor != null) - cursor.close(); - } - return infos; - } - - public void release() { - try { - if (sqLiteHelper != null) { - if(sqLiteHelper.getDatabaseName().equals(DATABASENAME)){//原有数据库的数据迁移完成后 需要删除原有数据库 - PolyvCommonLog.d("db","delete table"); - sqLiteHelper.getWritableDatabase().delete(TABLE_NAME,null,null); - } - sqLiteHelper.close(); - sqLiteHelper = null; - } - }catch (Exception e){ - PolyvCommonLog.exception(e); - } - - } -} +package com.easefun.polyvsdk.database; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +import com.easefun.polyvsdk.PolyvSDKClient; +import com.easefun.polyvsdk.bean.PolyvDownloadInfo; +import com.easefun.polyvsdk.log.PolyvCommonLog; + +import java.io.File; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class PolyvDownloadSQLiteHelper extends SQLiteOpenHelper { + private static final String TAG = "PolyvDownloadSQLiteHelp"; + private static PolyvDownloadSQLiteHelper sqLiteHelper; + private static final String DATABASENAME = "downloadlist.db"; + private static final String TABLE_NAME = "downloadlist"; + private static final int VERSION = 7; + + private static final Executor SINGLE_EXECUTOR = Executors.newSingleThreadExecutor(); + + public static PolyvDownloadSQLiteHelper getInstance(Context context) { + if (sqLiteHelper == null) { + synchronized (PolyvDownloadSQLiteHelper.class) { + if (sqLiteHelper == null) { + //如果开启多账户体系,设置绝对路径 + File downloadPath = PolyvSDKClient.getInstance().getDownloadDir(); + sqLiteHelper = new PolyvDownloadSQLiteHelper(context.getApplicationContext(), + PolyvSDKClient.getInstance().isMultiDownloadAccount() && downloadPath != null + ? downloadPath.getAbsolutePath() + File.separator + DATABASENAME : DATABASENAME, + null, VERSION); + } + } + } + return sqLiteHelper; + } + + private PolyvDownloadSQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { + super(context, name, factory, version); + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL( + "create table if not exists downloadlist(vid varchar(20),title varchar(100),duration varchar(20),filesize int,bitrate int,fileType int,percent int default 0,total int default 0,primary key (vid, bitrate, fileType))"); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + db.execSQL("drop table if exists downloadlist"); + onCreate(db); + } + + /** + * 添加下载信息至数据库 + * + * @param info + */ + public void insert(final PolyvDownloadInfo info) { + SINGLE_EXECUTOR.execute(new Runnable() { + @Override + public void run() { + SQLiteDatabase db = getWritableDatabase(); + String sql = "insert into downloadlist(vid,title,duration,filesize,bitrate, fileType) values(?,?,?,?,?,?)"; + db.execSQL(sql, new Object[]{info.getVid(), info.getTitle(), info.getDuration(), + info.getFilesize(), info.getBitrate(), info.getFileType()}); + } + }); + } + + /** + * 批量添加数据 + * + * @param infos + */ + public void insert(final List infos) { + SINGLE_EXECUTOR.execute(new Runnable() { + @Override + public void run() { + SQLiteDatabase db = null; + try { + db = getWritableDatabase(); + db.beginTransaction(); + for (PolyvDownloadInfo info : infos) { + ContentValues contentValues = createValues(info); + db.insertWithOnConflict(TABLE_NAME, null, contentValues,SQLiteDatabase.CONFLICT_IGNORE); + } + db.setTransactionSuccessful(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (db != null) { + db.endTransaction(); + } + } + } + }); + + } + + private ContentValues createValues(PolyvDownloadInfo info) { + ContentValues contentValues = new ContentValues(); + contentValues.put("vid", info.getVid()); + contentValues.put("title", info.getTitle()); + contentValues.put("duration", info.getDuration()); + contentValues.put("filesize", info.getFilesize()); + contentValues.put("bitrate", info.getBitrate()); + contentValues.put("fileType", info.getFileType()); + contentValues.put("percent", info.getPercent()); + contentValues.put("total", info.getTotal()); + return contentValues; + } + + /** + * 移除下载信息从数据库中 + * + * @param info + */ + public void delete(final PolyvDownloadInfo info) { + SINGLE_EXECUTOR.execute(new Runnable() { + @Override + public void run() { + SQLiteDatabase db = getWritableDatabase(); + String sql = "delete from downloadlist where vid=? and bitrate=? and fileType=?"; + db.execSQL(sql, new Object[]{info.getVid(), info.getBitrate(), info.getFileType()}); + } + }); + } + + /** + * 更新下载的进度至数据库 + * + * @param info + * @param percent + * @param total + */ + public void update(final PolyvDownloadInfo info, final long percent, final long total) { + SINGLE_EXECUTOR.execute(new Runnable() { + @Override + public void run() { + SQLiteDatabase db = getWritableDatabase(); + String sql = "update downloadlist set percent=?,total=? where vid=? and bitrate=? and fileType=?"; + db.execSQL(sql, new Object[]{percent, total, info.getVid(), info.getBitrate(), info.getFileType()}); + } + }); + } + + /** + * 判断该下载信息是否已以添加过 + * + * @param info + * @return + */ + public boolean isAdd(PolyvDownloadInfo info) { + SQLiteDatabase db = getWritableDatabase(); + String sql = "select vid ,duration,filesize,bitrate,fileType from downloadlist where vid=? and bitrate=? and fileType=?"; + Cursor cursor = null; + try { + cursor = db.rawQuery(sql, new String[]{info.getVid(), info.getBitrate() + "", info.getFileType() + ""}); + return cursor.getCount() == 1 ? true : false; + } finally { + if (cursor != null) + cursor.close(); + } + } + + public boolean isInDatabase(String vid){ + SQLiteDatabase db = getWritableDatabase(); + String sql = "select vid from downloadlist where vid=? "; + Cursor cursor = null; + try { + cursor = db.rawQuery(sql, new String[]{vid}); + return cursor.getCount() == 1; + } finally { + if (cursor != null) + cursor.close(); + } + } + + /** + * 获取所有的下载信息对象 + * + * @return + */ + public LinkedList getAll() { + LinkedList infos = new LinkedList(); + SQLiteDatabase db = getWritableDatabase(); + String sql = "select vid,title,duration,filesize,bitrate,fileType,percent,total from downloadlist"; + Cursor cursor = null; + try { + cursor = db.rawQuery(sql, null); + while (cursor.moveToNext()) { + String vid = cursor.getString(cursor.getColumnIndex("vid")); + String title = cursor.getString(cursor.getColumnIndex("title")); + String duration = cursor.getString(cursor.getColumnIndex("duration")); + long filesize = cursor.getInt(cursor.getColumnIndex("filesize")); + int bitrate = cursor.getInt(cursor.getColumnIndex("bitrate")); + long percent = cursor.getInt(cursor.getColumnIndex("percent")); + long total = cursor.getInt(cursor.getColumnIndex("total")); + int fileType = cursor.getInt(cursor.getColumnIndex("fileType")); + PolyvDownloadInfo info = new PolyvDownloadInfo(vid, duration, filesize, bitrate, title); + info.setFileType(fileType); + info.setPercent(percent); + info.setTotal(total); + infos.addLast(info); + } + } finally { + if (cursor != null) + cursor.close(); + } + return infos; + } + + public void release() { + try { + if (sqLiteHelper != null) { + if(sqLiteHelper.getDatabaseName().equals(DATABASENAME)){//原有数据库的数据迁移完成后 需要删除原有数据库 + PolyvCommonLog.d("db","delete table"); + sqLiteHelper.getWritableDatabase().delete(TABLE_NAME,null,null); + } + sqLiteHelper.close(); + sqLiteHelper = null; + } + }catch (Exception e){ + PolyvCommonLog.exception(e); + } + + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/database/PolyvUploadSQLiteHelper.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/database/PolyvUploadSQLiteHelper.java index ce53e68..8d660a3 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/database/PolyvUploadSQLiteHelper.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/database/PolyvUploadSQLiteHelper.java @@ -1,158 +1,158 @@ -package com.easefun.polyvsdk.database; - -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; - -import com.easefun.polyvsdk.bean.PolyvUploadInfo; - -import java.util.LinkedList; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -public class PolyvUploadSQLiteHelper extends SQLiteOpenHelper{ - private static PolyvUploadSQLiteHelper sqLiteHelper; - private static final String DATABASENAME = "uploadlist.db"; - private static final int VERSION = 6; - - private static final Executor SINGLE_EXECUTOR = Executors.newSingleThreadExecutor(); - - public static PolyvUploadSQLiteHelper getInstance(Context context) { - if (sqLiteHelper == null) { - synchronized (PolyvUploadSQLiteHelper.class) { - if (sqLiteHelper == null) - sqLiteHelper = new PolyvUploadSQLiteHelper(context.getApplicationContext(), DATABASENAME, null, VERSION); - } - } - return sqLiteHelper; - } - - private PolyvUploadSQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { - super(context, name, factory, version); - } - - @Override - public void onCreate(SQLiteDatabase db) { - db.execSQL( - "create table if not exists uploadlist(title varchar(100),filepath varchar(120),desc varchar(20),filesize int,percent int default 0,total int default 0,cataid varchar(20),primary key (filepath))"); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - db.execSQL("drop table if exists uploadlist"); - onCreate(db); - } - - /** - * 添加上传信息至数据库 - * @param info - */ - public void insert(final PolyvUploadInfo info) { - SINGLE_EXECUTOR.execute(new Runnable() { - @Override - public void run() { - SQLiteDatabase db = getWritableDatabase(); - String sql = "insert into uploadlist(title,desc,filesize,filepath,cataid) values(?,?,?,?,?)"; - db.execSQL(sql, new Object[] {info.getTitle(), info.getDesc(), info.getFilesize(), - info.getFilepath(),info.getCataid() }); - } - }); - } - - /** - * 移除上传信息从数据库中 - * @param info - */ - public void delete(final PolyvUploadInfo info) { - SINGLE_EXECUTOR.execute(new Runnable() { - @Override - public void run() { - SQLiteDatabase db = getWritableDatabase(); - String sql = "delete from uploadlist where filepath=?"; - db.execSQL(sql, new Object[] { info.getFilepath() }); - } - }); - } - - /** - * 更新上传的分类id至数据库 - * @param info - */ - public void updateCataid(final PolyvUploadInfo info) { - SINGLE_EXECUTOR.execute(new Runnable() { - @Override - public void run() { - SQLiteDatabase db = getWritableDatabase(); - String sql = "update uploadlist set cataid=? where filepath=?"; - db.execSQL(sql, new Object[]{ info.getCataid(), info.getFilepath() }); - } - }); - } - - /** - * 更新上传的进度至数据库 - * @param info - * @param percent - * @param total - */ - public void update(final PolyvUploadInfo info, final long percent, final long total) { - SINGLE_EXECUTOR.execute(new Runnable() { - @Override - public void run() { - SQLiteDatabase db = getWritableDatabase(); - String sql = "update uploadlist set percent=?,total=? where filepath=?"; - db.execSQL(sql, new Object[]{percent, total, info.getFilepath()}); - } - }); - } - - /** - * 判断该上传信息是否已以添加过 - * @param info - * @return - */ - public boolean isAdd(PolyvUploadInfo info) { - SQLiteDatabase db = getWritableDatabase(); - String sql = "select filepath ,title,desc from uploadlist where filepath=?"; - Cursor cursor = null; - try { - cursor = db.rawQuery(sql, new String[] { info.getFilepath() }); - return cursor.getCount() == 1 ? true : false; - } finally { - if (cursor != null) - cursor.close(); - } - } - - /** - * 获取所有的上传信息对象 - * @return - */ - public LinkedList getAll() { - LinkedList infos = new LinkedList(); - SQLiteDatabase db = getWritableDatabase(); - String sql = "select title,filepath,desc,filesize,percent,total,cataid from uploadlist"; - Cursor cursor = null; - try { - cursor = db.rawQuery(sql, null); - while (cursor.moveToNext()) { - String title = cursor.getString(cursor.getColumnIndex("title")); - String filepath = cursor.getString(cursor.getColumnIndex("filepath")); - String desc = cursor.getString(cursor.getColumnIndex("desc")); - long filesize = cursor.getLong(cursor.getColumnIndex("filesize")); - long percent = cursor.getInt(cursor.getColumnIndex("percent")); - long total = cursor.getInt(cursor.getColumnIndex("total")); - String cataid = cursor.getString(cursor.getColumnIndex("cataid")); - PolyvUploadInfo info = new PolyvUploadInfo(title, desc, filesize, filepath, cataid); - info.setPercent(percent); - info.setTotal(total); - infos.addLast(info); - } - } finally { - if (cursor != null) - cursor.close(); - } - return infos; - } -} +package com.easefun.polyvsdk.database; + +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +import com.easefun.polyvsdk.bean.PolyvUploadInfo; + +import java.util.LinkedList; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +public class PolyvUploadSQLiteHelper extends SQLiteOpenHelper{ + private static PolyvUploadSQLiteHelper sqLiteHelper; + private static final String DATABASENAME = "uploadlist.db"; + private static final int VERSION = 6; + + private static final Executor SINGLE_EXECUTOR = Executors.newSingleThreadExecutor(); + + public static PolyvUploadSQLiteHelper getInstance(Context context) { + if (sqLiteHelper == null) { + synchronized (PolyvUploadSQLiteHelper.class) { + if (sqLiteHelper == null) + sqLiteHelper = new PolyvUploadSQLiteHelper(context.getApplicationContext(), DATABASENAME, null, VERSION); + } + } + return sqLiteHelper; + } + + private PolyvUploadSQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { + super(context, name, factory, version); + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL( + "create table if not exists uploadlist(title varchar(100),filepath varchar(120),desc varchar(20),filesize int,percent int default 0,total int default 0,cataid varchar(20),primary key (filepath))"); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + db.execSQL("drop table if exists uploadlist"); + onCreate(db); + } + + /** + * 添加上传信息至数据库 + * @param info + */ + public void insert(final PolyvUploadInfo info) { + SINGLE_EXECUTOR.execute(new Runnable() { + @Override + public void run() { + SQLiteDatabase db = getWritableDatabase(); + String sql = "insert into uploadlist(title,desc,filesize,filepath,cataid) values(?,?,?,?,?)"; + db.execSQL(sql, new Object[] {info.getTitle(), info.getDesc(), info.getFilesize(), + info.getFilepath(),info.getCataid() }); + } + }); + } + + /** + * 移除上传信息从数据库中 + * @param info + */ + public void delete(final PolyvUploadInfo info) { + SINGLE_EXECUTOR.execute(new Runnable() { + @Override + public void run() { + SQLiteDatabase db = getWritableDatabase(); + String sql = "delete from uploadlist where filepath=?"; + db.execSQL(sql, new Object[] { info.getFilepath() }); + } + }); + } + + /** + * 更新上传的分类id至数据库 + * @param info + */ + public void updateCataid(final PolyvUploadInfo info) { + SINGLE_EXECUTOR.execute(new Runnable() { + @Override + public void run() { + SQLiteDatabase db = getWritableDatabase(); + String sql = "update uploadlist set cataid=? where filepath=?"; + db.execSQL(sql, new Object[]{ info.getCataid(), info.getFilepath() }); + } + }); + } + + /** + * 更新上传的进度至数据库 + * @param info + * @param percent + * @param total + */ + public void update(final PolyvUploadInfo info, final long percent, final long total) { + SINGLE_EXECUTOR.execute(new Runnable() { + @Override + public void run() { + SQLiteDatabase db = getWritableDatabase(); + String sql = "update uploadlist set percent=?,total=? where filepath=?"; + db.execSQL(sql, new Object[]{percent, total, info.getFilepath()}); + } + }); + } + + /** + * 判断该上传信息是否已以添加过 + * @param info + * @return + */ + public boolean isAdd(PolyvUploadInfo info) { + SQLiteDatabase db = getWritableDatabase(); + String sql = "select filepath ,title,desc from uploadlist where filepath=?"; + Cursor cursor = null; + try { + cursor = db.rawQuery(sql, new String[] { info.getFilepath() }); + return cursor.getCount() == 1 ? true : false; + } finally { + if (cursor != null) + cursor.close(); + } + } + + /** + * 获取所有的上传信息对象 + * @return + */ + public LinkedList getAll() { + LinkedList infos = new LinkedList(); + SQLiteDatabase db = getWritableDatabase(); + String sql = "select title,filepath,desc,filesize,percent,total,cataid from uploadlist"; + Cursor cursor = null; + try { + cursor = db.rawQuery(sql, null); + while (cursor.moveToNext()) { + String title = cursor.getString(cursor.getColumnIndex("title")); + String filepath = cursor.getString(cursor.getColumnIndex("filepath")); + String desc = cursor.getString(cursor.getColumnIndex("desc")); + long filesize = cursor.getLong(cursor.getColumnIndex("filesize")); + long percent = cursor.getInt(cursor.getColumnIndex("percent")); + long total = cursor.getInt(cursor.getColumnIndex("total")); + String cataid = cursor.getString(cursor.getColumnIndex("cataid")); + PolyvUploadInfo info = new PolyvUploadInfo(title, desc, filesize, filepath, cataid); + info.setPercent(percent); + info.setTotal(total); + infos.addLast(info); + } + } finally { + if (cursor != null) + cursor.close(); + } + return infos; + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/demo/PolyvDemoService.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/demo/PolyvDemoService.java deleted file mode 100644 index b0744e5..0000000 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/demo/PolyvDemoService.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.easefun.polyvsdk.demo; - -import android.app.Service; -import android.content.Intent; -import android.util.Log; - -import com.easefun.polyvsdk.server.AndroidService; - -/** - * 播放视频已改版,不再需要service来播放视频 - */ -@Deprecated -public class PolyvDemoService extends AndroidService { - private static final String TAG = "PolyvDemoService"; - - // 无参数构造函数,调用父类的super(String name) - public PolyvDemoService() { - super(); - // TODO Auto-generated constructor stub - } - - @Override - public void onStart(Intent intent, int startId) { - // TODO Auto-generated method stub - super.onStart(intent, startId); - // Log.i("TAG","service started"); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - // TODO Auto-generated method stub - // Log.i("TAG","service onStartCommand"); - return super.onStartCommand(intent, flags, startId); - } - - @Override - public void onCreate() { - // TODO Auto-generated method stub - super.onCreate(); - - } - - @Override - protected void onHandleIntent(Intent intent) { - super.onHandleIntent(intent); - } - - @Override - public void onDestroy() { - // TODO Auto-generated method stub - super.onDestroy(); - Log.i(TAG, "server destory"); - } -} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvCurriculumFragment.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvCurriculumFragment.java index 3ec7083..fe89a00 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvCurriculumFragment.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvCurriculumFragment.java @@ -1,289 +1,293 @@ -package com.easefun.polyvsdk.fragment; - -import android.content.Intent; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.AdapterView.OnItemLongClickListener; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.PopupWindow; -import android.widget.ProgressBar; -import android.widget.RelativeLayout; -import android.widget.RelativeLayout.LayoutParams; -import android.widget.TextView; - -import com.easefun.polyvsdk.PolyvBitRate; -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.activity.PolyvDownloadActivity; -import com.easefun.polyvsdk.activity.PolyvPlayerActivity; -import com.easefun.polyvsdk.adapter.PolyvCurriculumListViewAdapter; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvCoursesInfo; -import com.easefun.polyvsdk.util.PolyvVlmsHelper; - -import java.util.ArrayList; -import java.util.List; - -public class PolyvCurriculumFragment extends Fragment implements OnClickListener { - // viewpager切换的时候,fragment执行销毁View方法,但fragment对象没有被销毁 - // 底部下载按钮 - private RelativeLayout rl_bot; - // 底部两边下载按钮布局,中间的下载按钮布局,选择清晰度布局,顶部布局 - private LinearLayout ll_download, ll_center, ll_selbit, ll_top; - // 课程目录的listView - private ListView lv_cur; - private PolyvCurriculumListViewAdapter adapter; - private List lists; - // fragmentView - private View view; - // 取消按钮,下载全部按钮 - private TextView tv_cancle, tv_all; - // 传过来课程对象 - private PolyvCoursesInfo.Course course; - // 加载中控件 - private ProgressBar pb_loading; - // 空数据控件,重新加载控件,选择清晰度控件 - private TextView tv_empty, tv_reload, tv_selbit; - // popupwindow - private PopupWindow popupWindow; - // popupwindowView - private View popupwindow_view; - // 清晰度控件 - private TextView tv_hd, tv_sd, tv_flu; - // 当前选择的下载码率 - private int currentSelcetBitrate = 3; - private PolyvVlmsHelper vlmsHelper; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - super.onCreateView(inflater, container, savedInstanceState); - if (view == null) - view = inflater.inflate(R.layout.polyv_fragment_tab_cur, container, false); - return view; - } - - private void findIdAndNew() { - lv_cur = (ListView) view.findViewById(R.id.lv_cur); - rl_bot = (RelativeLayout) view.findViewById(R.id.rl_bot); - ll_center = (LinearLayout) view.findViewById(R.id.ll_center); - ll_download = (LinearLayout) view.findViewById(R.id.ll_download); - tv_cancle = (TextView) view.findViewById(R.id.tv_cancle); - tv_all = (TextView) view.findViewById(R.id.tv_all); - pb_loading = (ProgressBar) view.findViewById(R.id.pb_loading); - tv_empty = (TextView) view.findViewById(R.id.tv_empty); - tv_reload = (TextView) view.findViewById(R.id.tv_reload); - tv_selbit = (TextView) view.findViewById(R.id.tv_selbit); - ll_selbit = (LinearLayout) view.findViewById(R.id.ll_selbit); - ll_top = (LinearLayout) view.findViewById(R.id.ll_top); - lists = new ArrayList<>(); - vlmsHelper = new PolyvVlmsHelper(); - } - - private void getCurriculumDetail() { - vlmsHelper.getCurriculumDetail(course.course_id, new PolyvVlmsHelper.MyCurriculumDetailListener() { - @Override - public void fail(Throwable t) { - pb_loading.setVisibility(View.INVISIBLE); - tv_reload.setVisibility(View.VISIBLE); - } - - @Override - public void success(final List curriculumsDetails) { - // 注:这里是从子线程回调过来的 - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - pb_loading.setVisibility(View.INVISIBLE); - PolyvCurriculumFragment.this.lists.clear(); - PolyvCurriculumFragment.this.lists.addAll(curriculumsDetails); - if (PolyvCurriculumFragment.this.lists.size() == 0) - tv_empty.setVisibility(View.VISIBLE); - adapter.initSelect(currentSelcetBitrate); - } - }); - } - }); - } - - private void initView() { - // fragment在onCreate之后才可以获取 - course = getArguments().getParcelable("course"); - if (course == null) - return; - getCurriculumDetail(); - initPopupWindow(); - adapter = new PolyvCurriculumListViewAdapter(lists, getContext()); - lv_cur.setAdapter(adapter); - lv_cur.setOnItemClickListener(new OnItemClickListener() { - - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - if (!adapter.getSideIconVisible()) { - String videoId = lists.get(position).lecture.vid; - ((PolyvPlayerActivity) getActivity()).play(videoId, PolyvBitRate.ziDong.getNum(), true, false); - } else { - adapter.putSideIconStatus(currentSelcetBitrate, position, !adapter.getSideIconStatus(currentSelcetBitrate, position, true)); - resetTv_allText(); - } - } - }); - lv_cur.setOnItemLongClickListener(new OnItemLongClickListener() { - - @Override - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - if (!adapter.getSideIconVisible()) { - ll_top.setVisibility(View.VISIBLE); - ll_center.setVisibility(View.INVISIBLE); - ll_download.setVisibility(View.VISIBLE); - adapter.setSideIconVisible(true); - } - return true; - } - }); - rl_bot.setOnClickListener(this); - tv_cancle.setOnClickListener(this); - tv_all.setOnClickListener(this); - tv_reload.setOnClickListener(this); - ll_selbit.setOnClickListener(this); - } - - private void initPopupWindow() { - popupwindow_view = LayoutInflater.from(getContext()).inflate(R.layout.polyv_popupwindow_cur_bit, null); - popupWindow = new PopupWindow(popupwindow_view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true); - popupWindow.setBackgroundDrawable(new BitmapDrawable()); - popupWindow.setOutsideTouchable(true); - popupWindow.setAnimationStyle(R.style.popupwindow); - tv_hd = (TextView) popupwindow_view.findViewById(R.id.tv_hd); - tv_sd = (TextView) popupwindow_view.findViewById(R.id.tv_sd); - tv_flu = (TextView) popupwindow_view.findViewById(R.id.tv_flu); - tv_hd.setOnClickListener(this); - tv_sd.setOnClickListener(this); - tv_flu.setOnClickListener(this); - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - if (course == null) { - findIdAndNew(); - initView(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - if (view != null) - ((ViewGroup) view.getParent()).removeView(view); - } - - @Override - public void onDestroy() { - super.onDestroy(); - vlmsHelper.destroy(); - } - - private void resetTv_allText() { - if (adapter.isHasSelected(true)) - tv_all.setText("确定缓存"); - else - tv_all.setText("全部缓存"); - } - - // 改变选择的清晰度 - private void changeSelcet(int bitrate) { - currentSelcetBitrate = bitrate; - switch (bitrate) { - case 1: - tv_selbit.setText(tv_flu.getText()); - break; - case 2: - tv_selbit.setText(tv_sd.getText()); - break; - case 3: - tv_selbit.setText(tv_hd.getText()); - break; - } - adapter.initSelect(bitrate); - popupWindow.dismiss(); - } - - public boolean isSideIconVisible() { - if (adapter != null) - return adapter.getSideIconVisible(); - return false; - } - - public void setSideIconVisible(boolean visible) { - if (adapter != null) { - if (visible) - sideIconVisible(); - else - sideIconGone(); - } - } - - private void sideIconVisible() { - if (lists.size() == 0) - return; - ll_top.setVisibility(View.VISIBLE); - ll_download.setVisibility(View.VISIBLE); - ll_center.setVisibility(View.INVISIBLE); - adapter.setSideIconVisible(true); - adapter.cancelSideIconSelected(); - adapter.initSelect(currentSelcetBitrate); - resetTv_allText(); - } - - private void sideIconGone() { - adapter.setSideIconVisible(false); - ll_top.setVisibility(View.INVISIBLE); - ll_download.setVisibility(View.INVISIBLE); - ll_center.setVisibility(View.VISIBLE); - } - - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.tv_hd) { - changeSelcet(3); - } else if (id == R.id.tv_sd) { - changeSelcet(2); - } else if (id == R.id.tv_flu) { - changeSelcet(1); - } else if (id == R.id.rl_bot) { - sideIconVisible(); - } else if (id == R.id.tv_cancle) { - sideIconGone(); - } else if (id == R.id.tv_all) { - if (tv_all.getText().toString().equals("全部缓存")) { - adapter.putCurBitSideIconSelected(currentSelcetBitrate); - resetTv_allText(); - } else { - Intent intent = new Intent(getContext(), PolyvDownloadActivity.class); - intent.putExtra("isStarting", true); - startActivity(intent); - adapter.downloadSelected(); - sideIconGone(); - } - } else if (id == R.id.tv_reload) { - pb_loading.setVisibility(View.VISIBLE); - tv_reload.setVisibility(View.INVISIBLE); - getCurriculumDetail(); - } else if (id == R.id.ll_selbit) { - int[] location = new int[2]; - tv_selbit.getLocationOnScreen(location); - int width = tv_selbit.getMeasuredWidth(); - int height = tv_selbit.getMeasuredHeight(); - popupWindow.showAtLocation(popupwindow_view, Gravity.NO_GRAVITY, location[0] + width * 3 / 4, - location[1] + height * 3 / 4); - } - } -} +package com.easefun.polyvsdk.fragment; + +import android.content.Intent; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import androidx.fragment.app.Fragment; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.AdapterView.OnItemLongClickListener; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.PopupWindow; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; +import android.widget.RelativeLayout.LayoutParams; +import android.widget.TextView; + +import com.easefun.polyvsdk.PolyvBitRate; +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.activity.PolyvDownloadActivity; +import com.easefun.polyvsdk.activity.PolyvPlayerActivity; +import com.easefun.polyvsdk.adapter.PolyvCurriculumListViewAdapter; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvVlmsCoursesInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvVlmsCurriculumInfo; +import com.easefun.polyvsdk.sub.vlms.listener.PolyvVlmsApiListener2; +import com.easefun.polyvsdk.sub.vlms.main.PolyvVlmsManager2; +import com.google.gson.Gson; + +import java.util.ArrayList; +import java.util.List; + +public class PolyvCurriculumFragment extends Fragment implements OnClickListener { + // viewpager切换的时候,fragment执行销毁View方法,但fragment对象没有被销毁 + // 底部下载按钮 + private RelativeLayout rl_bot; + // 底部两边下载按钮布局,中间的下载按钮布局,选择清晰度布局,顶部布局 + private LinearLayout ll_download, ll_center, ll_selbit, ll_top; + // 课程目录的listView + private ListView lv_cur; + private PolyvCurriculumListViewAdapter adapter; + private List lists; + // fragmentView + private View view; + // 取消按钮,下载全部按钮 + private TextView tv_cancle, tv_all; + // 传过来课程对象 + private PolyvVlmsCoursesInfo course; + // 加载中控件 + private ProgressBar pb_loading; + // 空数据控件,重新加载控件,选择清晰度控件 + private TextView tv_empty, tv_reload, tv_selbit; + // popupwindow + private PopupWindow popupWindow; + // popupwindowView + private View popupwindow_view; + // 清晰度控件 + private TextView tv_hd, tv_sd, tv_flu; + // 当前选择的下载码率 + private int currentSelcetBitrate = 3; + private PolyvVlmsManager2 vlmsManager2; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + if (view == null) + view = inflater.inflate(R.layout.polyv_fragment_tab_cur, container, false); + return view; + } + + private void findIdAndNew() { + lv_cur = (ListView) view.findViewById(R.id.lv_cur); + rl_bot = (RelativeLayout) view.findViewById(R.id.rl_bot); + ll_center = (LinearLayout) view.findViewById(R.id.ll_center); + ll_download = (LinearLayout) view.findViewById(R.id.ll_download); + tv_cancle = (TextView) view.findViewById(R.id.tv_cancle); + tv_all = (TextView) view.findViewById(R.id.tv_all); + pb_loading = (ProgressBar) view.findViewById(R.id.pb_loading); + tv_empty = (TextView) view.findViewById(R.id.tv_empty); + tv_reload = (TextView) view.findViewById(R.id.tv_reload); + tv_selbit = (TextView) view.findViewById(R.id.tv_selbit); + ll_selbit = (LinearLayout) view.findViewById(R.id.ll_selbit); + ll_top = (LinearLayout) view.findViewById(R.id.ll_top); + lists = new ArrayList<>(); + vlmsManager2 = new PolyvVlmsManager2(getContext()); + } + + private void getCurriculumDetail() { + + vlmsManager2.getCourseVideoByCourseId(course.getCourseId() + "", new PolyvVlmsApiListener2>() { + @Override + public void onFailed(Throwable throwable) { + pb_loading.setVisibility(View.GONE); + tv_reload.setVisibility(View.VISIBLE); + } + + @Override + public void onSuccess(final List data) { + + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + pb_loading.setVisibility(View.GONE); + PolyvCurriculumFragment.this.lists.clear(); + PolyvCurriculumFragment.this.lists.addAll(data); + if (PolyvCurriculumFragment.this.lists.size() == 0) + tv_empty.setVisibility(View.VISIBLE); + adapter.initSelect(currentSelcetBitrate); + } + }); + } + }); + } + + private void initView() { + // fragment在onCreate之后才可以获取 + String courseString = getArguments().getString("course"); + course = new Gson().fromJson(courseString, PolyvVlmsCoursesInfo.class); + if (course == null) + return; + getCurriculumDetail(); + initPopupWindow(); + adapter = new PolyvCurriculumListViewAdapter(lists, getContext()); + lv_cur.setAdapter(adapter); + lv_cur.setOnItemClickListener(new OnItemClickListener() { + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (!adapter.getSideIconVisible()) { + String videoId = lists.get(position).getVideoId(); + ((PolyvPlayerActivity) getActivity()).play(videoId, PolyvBitRate.ziDong.getNum(), true, false); + } else { + adapter.putSideIconStatus(currentSelcetBitrate, position, !adapter.getSideIconStatus(currentSelcetBitrate, position, true)); + resetTv_allText(); + } + } + }); + lv_cur.setOnItemLongClickListener(new OnItemLongClickListener() { + + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + if (!adapter.getSideIconVisible()) { + ll_top.setVisibility(View.VISIBLE); + ll_center.setVisibility(View.GONE); + ll_download.setVisibility(View.VISIBLE); + adapter.setSideIconVisible(true); + } + return true; + } + }); + rl_bot.setOnClickListener(this); + tv_cancle.setOnClickListener(this); + tv_all.setOnClickListener(this); + tv_reload.setOnClickListener(this); + ll_selbit.setOnClickListener(this); + } + + private void initPopupWindow() { + popupwindow_view = LayoutInflater.from(getContext()).inflate(R.layout.polyv_popupwindow_cur_bit, null); + popupWindow = new PopupWindow(popupwindow_view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true); + popupWindow.setBackgroundDrawable(new BitmapDrawable()); + popupWindow.setOutsideTouchable(true); + popupWindow.setAnimationStyle(R.style.popupwindow); + tv_hd = (TextView) popupwindow_view.findViewById(R.id.tv_hd); + tv_sd = (TextView) popupwindow_view.findViewById(R.id.tv_sd); + tv_flu = (TextView) popupwindow_view.findViewById(R.id.tv_flu); + tv_hd.setOnClickListener(this); + tv_sd.setOnClickListener(this); + tv_flu.setOnClickListener(this); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + if (course == null) { + findIdAndNew(); + initView(); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (view != null) + ((ViewGroup) view.getParent()).removeView(view); + } + + @Override + public void onDestroy() { + super.onDestroy(); + } + + private void resetTv_allText() { + if (adapter.isHasSelected(true)) + tv_all.setText("确定缓存"); + else + tv_all.setText("全部缓存"); + } + + // 改变选择的清晰度 + private void changeSelcet(int bitrate) { + currentSelcetBitrate = bitrate; + switch (bitrate) { + case 1: + tv_selbit.setText(tv_flu.getText()); + break; + case 2: + tv_selbit.setText(tv_sd.getText()); + break; + case 3: + tv_selbit.setText(tv_hd.getText()); + break; + } + adapter.initSelect(bitrate); + popupWindow.dismiss(); + } + + public boolean isSideIconVisible() { + if (adapter != null) + return adapter.getSideIconVisible(); + return false; + } + + public void setSideIconVisible(boolean visible) { + if (adapter != null) { + if (visible) + sideIconVisible(); + else + sideIconGone(); + } + } + + private void sideIconVisible() { + if (lists.size() == 0) + return; + ll_top.setVisibility(View.VISIBLE); + ll_download.setVisibility(View.VISIBLE); + ll_center.setVisibility(View.GONE); + adapter.setSideIconVisible(true); + adapter.cancelSideIconSelected(); + adapter.initSelect(currentSelcetBitrate); + resetTv_allText(); + } + + private void sideIconGone() { + adapter.setSideIconVisible(false); + ll_top.setVisibility(View.GONE); + ll_download.setVisibility(View.GONE); + ll_center.setVisibility(View.VISIBLE); + } + + @Override + public void onClick(View v) { + int id = v.getId(); + if (id == R.id.tv_hd) { + changeSelcet(3); + } else if (id == R.id.tv_sd) { + changeSelcet(2); + } else if (id == R.id.tv_flu) { + changeSelcet(1); + } else if (id == R.id.rl_bot) { + sideIconVisible(); + } else if (id == R.id.tv_cancle) { + sideIconGone(); + } else if (id == R.id.tv_all) { + if (tv_all.getText().toString().equals("全部缓存")) { + adapter.putCurBitSideIconSelected(currentSelcetBitrate); + resetTv_allText(); + } else { + Intent intent = new Intent(getContext(), PolyvDownloadActivity.class); + intent.putExtra("isStarting", true); + startActivity(intent); + adapter.downloadSelected(); + sideIconGone(); + } + } else if (id == R.id.tv_reload) { + pb_loading.setVisibility(View.VISIBLE); + tv_reload.setVisibility(View.GONE); + getCurriculumDetail(); + } else if (id == R.id.ll_selbit) { + int[] location = new int[2]; + tv_selbit.getLocationOnScreen(location); + int width = tv_selbit.getMeasuredWidth(); + int height = tv_selbit.getMeasuredHeight(); + popupWindow.showAtLocation(popupwindow_view, Gravity.NO_GRAVITY, location[0] + width * 3 / 4, + location[1] + height * 3 / 4); + } + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvDownloadFragment.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvDownloadFragment.java index 19ee379..e6130b8 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvDownloadFragment.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvDownloadFragment.java @@ -3,10 +3,10 @@ import android.content.DialogInterface; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v4.graphics.drawable.DrawableCompat; -import android.support.v7.app.AlertDialog; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.appcompat.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -72,7 +72,7 @@ public void onDownloadSuccess(PolyvDownloadInfo downloadInfo) { tv_downloadall = (TextView) view.findViewById(R.id.tv_downloadall); DrawableCompat.setTint(DrawableCompat.wrap(((ImageView) view.findViewById(R.id.iv_trash)).getDrawable().mutate()), getResources().getColor(R.color.center_bottom_text_color_red)); if (isFinished) { - rl_bot.setVisibility(View.INVISIBLE); + rl_bot.setVisibility(View.GONE); } ll_downloadall.setOnClickListener(new View.OnClickListener() { diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerDanmuFragment.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerDanmuFragment.java index 2571d99..5ba9fe0 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerDanmuFragment.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerDanmuFragment.java @@ -1,12 +1,14 @@ package com.easefun.polyvsdk.fragment; +import android.content.res.Configuration; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.Message; -import android.support.annotation.ColorInt; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.ColorInt; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import android.view.Display; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -15,25 +17,27 @@ import com.easefun.polyvsdk.R; import com.easefun.polyvsdk.bean.PolyvAddDanmakuResult; import com.easefun.polyvsdk.log.PolyvCommonLog; +import com.easefun.polyvsdk.player.PolyvPlayerMediaController; import com.easefun.polyvsdk.sub.danmaku.auxiliary.BilibiliDanmakuTransfer; import com.easefun.polyvsdk.sub.danmaku.auxiliary.PolyvDanmakuTransfer; import com.easefun.polyvsdk.sub.danmaku.entity.PolyvDanmakuEntity; import com.easefun.polyvsdk.sub.danmaku.entity.PolyvDanmakuInfo; -import com.easefun.polyvsdk.sub.danmaku.entity.PolyvDanmakuSendResult; import com.easefun.polyvsdk.sub.danmaku.main.PolyvDanmakuManager; +import com.easefun.polyvsdk.util.PolyvScreenUtils; +import com.easefun.polyvsdk.video.PolyvBaseMediaController; import com.easefun.polyvsdk.video.PolyvVideoView; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; -import java.util.HashMap; +import net.polyv.danmaku.controller.DrawHandler; +import net.polyv.danmaku.controller.IDanmakuView; +import net.polyv.danmaku.danmaku.model.BaseDanmaku; +import net.polyv.danmaku.danmaku.model.DanmakuTimer; +import net.polyv.danmaku.danmaku.model.IDisplayer; +import net.polyv.danmaku.danmaku.model.android.DanmakuContext; +import net.polyv.danmaku.danmaku.parser.BaseDanmakuParser; -import master.flame.danmaku.controller.DrawHandler; -import master.flame.danmaku.controller.IDanmakuView; -import master.flame.danmaku.danmaku.model.BaseDanmaku; -import master.flame.danmaku.danmaku.model.DanmakuTimer; -import master.flame.danmaku.danmaku.model.IDisplayer; -import master.flame.danmaku.danmaku.model.android.DanmakuContext; -import master.flame.danmaku.danmaku.parser.BaseDanmakuParser; +import java.util.HashMap; public class PolyvPlayerDanmuFragment extends Fragment { private static final String TAG = PolyvPlayerDanmuFragment.class.getSimpleName(); @@ -98,9 +102,9 @@ private void initView() { //-------------------仅对加载的弹幕有效-------------------// // 设置最大显示行数 HashMap maxLinesPair = new HashMap(); - maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL, 5); // 滚动弹幕最大显示5行 - maxLinesPair.put(BaseDanmaku.TYPE_FIX_TOP, 2); - maxLinesPair.put(BaseDanmaku.TYPE_FIX_BOTTOM, 2); + maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL, 6); // 滚动弹幕、顶部弹幕半屏6行,全屏12行 + maxLinesPair.put(BaseDanmaku.TYPE_FIX_TOP, 6); + maxLinesPair.put(BaseDanmaku.TYPE_FIX_BOTTOM, 1); // 设置是否禁止重叠 HashMap overlappingEnablePair = new HashMap(); overlappingEnablePair.put(BaseDanmaku.TYPE_SCROLL_RL, true); @@ -115,6 +119,15 @@ private void initView() { // mCacheStufferAdapter) // 图文混排使用SpannedCacheStuffer //.setCacheStuffer(new BackgroundCacheStuffer(), mCacheStufferAdapter) // 绘制背景使用BackgroundCacheStuffer .setMaximumLines(maxLinesPair).preventOverlapping(overlappingEnablePair); + + if(getActivity() != null) { + //修复高帧率下弹幕会重复的问题 + Display display = getActivity().getWindowManager().getDefaultDisplay(); + float refreshRate = display.getRefreshRate(); + int rate = (int) (1000 / refreshRate); + mContext.setFrameUpateRate(rate); + } + iDanmakuView.showFPS(false); iDanmakuView.enableDanmakuDrawingCache(false); @@ -343,7 +356,7 @@ private void addDanmaku(CharSequence msg, String fontmode, String fontsize, int danmaku.textShadowColor = Color.BLACK; // 重要:如果有图文混排,最好不要设置描边(设textShadowColor=0),否则会进行两次复杂的绘制导致运行效率降低 else danmaku.textShadowColor = Color.WHITE; - danmaku.underlineColor = Color.GREEN; +// danmaku.underlineColor = Color.GREEN; // danmaku.borderColor = Color.BLUE; iDanmakuView.addDanmaku(danmaku); } @@ -360,4 +373,30 @@ public void onDestroy() { super.onDestroy(); release(); } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + if (getContext() == null) { + return; + } + + boolean isFullScreen = PolyvScreenUtils.isLandscape(getContext()); + PolyvBaseMediaController mediaController = videoView.getMediaController(); + if (mediaController instanceof PolyvPlayerMediaController) { + isFullScreen = ((PolyvPlayerMediaController) mediaController).isFullScreen(); + } + + HashMap maxLinesPair = new HashMap<>(); + if (isFullScreen) { + maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL, 12); // 滚动弹幕、顶部弹幕全屏12行 + maxLinesPair.put(BaseDanmaku.TYPE_FIX_TOP, 12); + maxLinesPair.put(BaseDanmaku.TYPE_FIX_BOTTOM, 1); + } else { + maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL, 6); // 滚动弹幕、顶部弹幕半屏6行 + maxLinesPair.put(BaseDanmaku.TYPE_FIX_TOP, 6); + maxLinesPair.put(BaseDanmaku.TYPE_FIX_BOTTOM, 1); + } + mContext.setMaximumLines(maxLinesPair); + } } diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerTabFragment.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerTabFragment.java index 76cdc21..c3eef3e 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerTabFragment.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerTabFragment.java @@ -1,126 +1,126 @@ -package com.easefun.polyvsdk.fragment; - -import android.graphics.Color; -import android.os.Build; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.util.DisplayMetrics; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewTreeObserver; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.util.PolyvScreenUtils; - -public class PolyvPlayerTabFragment extends Fragment implements View.OnClickListener { - //fragmentView - private View view; - //viewpagerFragment - private PolyvPlayerViewPagerFragment viewPagerFragment; - // tab文本的TextView,用于改变颜色 - private TextView tv_cur, tv_sum, tv_talk; - // tab的导航线 - private View v_line; - private int screenWidth; - private int length; - private int eLength; - private LinearLayout.LayoutParams lp; - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - if (view == null) - view = inflater.inflate(R.layout.polyv_fragment_player_tab, container, false); - return view; - } - - private void findIdAndNew() { - tv_cur = (TextView) view.findViewById(R.id.tv_cur); - tv_sum = (TextView) view.findViewById(R.id.tv_sum); - tv_talk = (TextView) view.findViewById(R.id.tv_talk); - v_line = view.findViewById(R.id.v_line); - viewPagerFragment = (PolyvPlayerViewPagerFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.fl_viewpager); - } - - private void initView() { - initLineSetting(); - tv_cur.setSelected(true); - tv_cur.setOnClickListener(this); - tv_sum.setOnClickListener(this); - tv_talk.setOnClickListener(this); - } - - private void initLineSetting() { - lp = (LinearLayout.LayoutParams) v_line.getLayoutParams(); - v_line.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - final DisplayMetrics dm = new DisplayMetrics(); - getActivity().getWindow().getWindowManager().getDefaultDisplay().getMetrics(dm); - if(PolyvScreenUtils.isLandscape(getContext())) - screenWidth = dm.heightPixels; - else - screenWidth = dm.widthPixels; - length = v_line.getWidth(); - int sLength = screenWidth / 3; - eLength = (sLength - length) / 2; - if (viewPagerFragment.getCurrentIndex() == 0) - resetViewStatus(0); - if (Build.VERSION.SDK_INT >= 16) - getView().getViewTreeObserver().removeOnGlobalLayoutListener(this); - else - getView().getViewTreeObserver().removeGlobalOnLayoutListener(this); - } - }); - } - - public void resetViewStatus(int arg0) { - tv_cur.setSelected(false); - tv_sum.setSelected(false); - tv_talk.setSelected(false); - tv_cur.setTextColor(Color.BLACK); - tv_sum.setTextColor(Color.BLACK); - tv_talk.setTextColor(Color.BLACK); - switch (arg0) { - case 0: - tv_cur.setSelected(true); - tv_cur.setTextColor(getResources().getColor(R.color.polyv_tab_text_color)); - lp.leftMargin = (int) (arg0 * (length)) + 1 * eLength; - break; - case 1: - tv_sum.setSelected(true); - tv_sum.setTextColor(getResources().getColor(R.color.polyv_tab_text_color)); - lp.leftMargin = (int) (arg0 * (length)) + 3 * eLength; - break; - case 2: - tv_talk.setSelected(true); - tv_talk.setTextColor(getResources().getColor(R.color.polyv_tab_text_color)); - lp.leftMargin = (int) (arg0 * (length)) + 5 * eLength; - break; - } - v_line.setLayoutParams(lp); - } - - @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - findIdAndNew(); - initView(); - } - - @Override - public void onClick(View view) { - int id = view.getId(); - if (id == R.id.tv_talk) { - viewPagerFragment.setCurrentItem(2); - } else if (id == R.id.tv_sum) { - viewPagerFragment.setCurrentItem(1); - } else if (id == R.id.tv_cur) { - viewPagerFragment.setCurrentItem(0); - } - } -} +package com.easefun.polyvsdk.fragment; + +import android.graphics.Color; +import android.os.Build; +import android.os.Bundle; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.util.PolyvScreenUtils; + +public class PolyvPlayerTabFragment extends Fragment implements View.OnClickListener { + //fragmentView + private View view; + //viewpagerFragment + private PolyvPlayerViewPagerFragment viewPagerFragment; + // tab文本的TextView,用于改变颜色 + private TextView tv_cur, tv_sum, tv_talk; + // tab的导航线 + private View v_line; + private int screenWidth; + private int length; + private int eLength; + private LinearLayout.LayoutParams lp; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + if (view == null) + view = inflater.inflate(R.layout.polyv_fragment_player_tab, container, false); + return view; + } + + private void findIdAndNew() { + tv_cur = (TextView) view.findViewById(R.id.tv_cur); + tv_sum = (TextView) view.findViewById(R.id.tv_sum); + tv_talk = (TextView) view.findViewById(R.id.tv_talk); + v_line = view.findViewById(R.id.v_line); + viewPagerFragment = (PolyvPlayerViewPagerFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.fl_viewpager); + } + + private void initView() { + initLineSetting(); + tv_cur.setSelected(true); + tv_cur.setOnClickListener(this); + tv_sum.setOnClickListener(this); + tv_talk.setOnClickListener(this); + } + + private void initLineSetting() { + lp = (LinearLayout.LayoutParams) v_line.getLayoutParams(); + v_line.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + final DisplayMetrics dm = new DisplayMetrics(); + getActivity().getWindow().getWindowManager().getDefaultDisplay().getMetrics(dm); + if(PolyvScreenUtils.isLandscape(getContext())) + screenWidth = dm.heightPixels; + else + screenWidth = dm.widthPixels; + length = v_line.getWidth(); + int sLength = screenWidth / 2; + eLength = (sLength - length) / 2; + if (viewPagerFragment.getCurrentIndex() == 0) + resetViewStatus(0); + if (Build.VERSION.SDK_INT >= 16) + getView().getViewTreeObserver().removeOnGlobalLayoutListener(this); + else + getView().getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + }); + } + + public void resetViewStatus(int arg0) { + tv_cur.setSelected(false); + tv_sum.setSelected(false); + tv_talk.setSelected(false); + tv_cur.setTextColor(Color.BLACK); + tv_sum.setTextColor(Color.BLACK); + tv_talk.setTextColor(Color.BLACK); + switch (arg0) { + case 0: + tv_cur.setSelected(true); + tv_cur.setTextColor(getResources().getColor(R.color.polyv_tab_text_color)); + lp.leftMargin = (int) (arg0 * (length)) + 1 * eLength; + break; + case 1: + tv_sum.setSelected(true); + tv_sum.setTextColor(getResources().getColor(R.color.polyv_tab_text_color)); + lp.leftMargin = (int) (arg0 * (length)) + 3 * eLength; + break; + case 2: + tv_talk.setSelected(true); + tv_talk.setTextColor(getResources().getColor(R.color.polyv_tab_text_color)); + lp.leftMargin = (int) (arg0 * (length)) + 5 * eLength; + break; + } + v_line.setLayoutParams(lp); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + findIdAndNew(); + initView(); + } + + @Override + public void onClick(View view) { + int id = view.getId(); + if (id == R.id.tv_talk) { + viewPagerFragment.setCurrentItem(2); + } else if (id == R.id.tv_sum) { + viewPagerFragment.setCurrentItem(1); + } else if (id == R.id.tv_cur) { + viewPagerFragment.setCurrentItem(0); + } + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerTopFragment.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerTopFragment.java index 617c717..dfc9454 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerTopFragment.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerTopFragment.java @@ -1,112 +1,114 @@ -package com.easefun.polyvsdk.fragment; - -import android.content.res.Configuration; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.PopupWindow; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvCoursesInfo; -import com.easefun.polyvsdk.util.PolyvScreenUtils; -import com.easefun.polyvsdk.util.PolyvShareUtils; - -public class PolyvPlayerTopFragment extends Fragment implements View.OnClickListener { - //fragmentView - private View view; - // 返回按钮,分享按钮 - private ImageView iv_finish, iv_share; - // 顶部布局 - private RelativeLayout rl_top; - // popupwindowView - private View popupwindow_view; - // popupwindow - private PopupWindow popupWindow; - // 分享控件 - private LinearLayout ll_shareqq, ll_sharewechat, ll_shareweibo; - private TextView tv_title; - - public static final String SHARE_TEXT = "http://www.polyv.net"; - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - if (view == null) - view = inflater.inflate(R.layout.polyv_fragment_player_top, container, false); - return view; - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - if (PolyvScreenUtils.isLandscape(getActivity())) { - rl_top.setVisibility(View.INVISIBLE); - } else { - rl_top.setVisibility(View.VISIBLE); - } - } - - private void findIdAndNew() { - iv_finish = (ImageView) view.findViewById(R.id.iv_finish); - iv_share = (ImageView) view.findViewById(R.id.iv_share); - rl_top = (RelativeLayout) view.findViewById(R.id.rl_top); - tv_title = (TextView) view.findViewById(R.id.tv_title); - } - - private void initView() { - initPopupWindow(); - PolyvCoursesInfo.Course course = getArguments().getParcelable("course"); - String title = ""; - if (course != null) - title = course.title; - tv_title.setText(title); - tv_title.requestFocus(); - iv_finish.setOnClickListener(this); - iv_share.setOnClickListener(this); - } - - @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - findIdAndNew(); - initView(); - } - - private void initPopupWindow() { - popupwindow_view = LayoutInflater.from(getActivity()).inflate(R.layout.polyv_popupwindow_player_share, null); - popupWindow = new PopupWindow(popupwindow_view, RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT, true); - popupWindow.setBackgroundDrawable(new BitmapDrawable()); - popupWindow.setOutsideTouchable(true); - popupWindow.setAnimationStyle(R.style.popupwindow); - ll_shareqq = (LinearLayout) popupwindow_view.findViewById(R.id.ll_shareqq); - ll_sharewechat = (LinearLayout) popupwindow_view.findViewById(R.id.ll_sharewechat); - ll_shareweibo = (LinearLayout) popupwindow_view.findViewById(R.id.ll_shareweibo); - ll_shareqq.setOnClickListener(this); - ll_sharewechat.setOnClickListener(this); - ll_shareweibo.setOnClickListener(this); - } - - @Override - public void onClick(View view) { - int id = view.getId(); - if (id == R.id.iv_share) { - popupWindow.showAsDropDown(iv_share, 0, 1); - } else if (id == R.id.iv_finish) { - getActivity().finish(); - } else if (id == R.id.ll_shareqq) { - PolyvShareUtils.shareQQFriend(getActivity(), "", SHARE_TEXT, PolyvShareUtils.TEXT, null); - } else if (id == R.id.ll_sharewechat) { - PolyvShareUtils.shareWeChatFriend(getActivity(), "", SHARE_TEXT, PolyvShareUtils.TEXT, null); - } else if (id == R.id.ll_shareweibo) { - PolyvShareUtils.shareWeiBo(getActivity(), "", SHARE_TEXT, PolyvShareUtils.TEXT, null); - } - } -} +package com.easefun.polyvsdk.fragment; + +import android.content.res.Configuration; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvVlmsCoursesInfo; +import com.easefun.polyvsdk.util.PolyvScreenUtils; +import com.easefun.polyvsdk.util.PolyvShareUtils; +import com.google.gson.Gson; + +public class PolyvPlayerTopFragment extends Fragment implements View.OnClickListener { + //fragmentView + private View view; + // 返回按钮,分享按钮 + private ImageView iv_finish, iv_share; + // 顶部布局 + private RelativeLayout rl_top; + // popupwindowView + private View popupwindow_view; + // popupwindow + private PopupWindow popupWindow; + // 分享控件 + private LinearLayout ll_shareqq, ll_sharewechat, ll_shareweibo; + private TextView tv_title; + + public static final String SHARE_TEXT = "https://www.polyv.net"; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + if (view == null) + view = inflater.inflate(R.layout.polyv_fragment_player_top, container, false); + return view; + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + if (PolyvScreenUtils.isLandscape(getActivity())) { + rl_top.setVisibility(View.GONE); + } else { + rl_top.setVisibility(View.VISIBLE); + } + } + + private void findIdAndNew() { + iv_finish = (ImageView) view.findViewById(R.id.iv_finish); + iv_share = (ImageView) view.findViewById(R.id.iv_share); + rl_top = (RelativeLayout) view.findViewById(R.id.rl_top); + tv_title = (TextView) view.findViewById(R.id.tv_title); + } + + private void initView() { + initPopupWindow(); + String courseString = getArguments().getString("course"); + PolyvVlmsCoursesInfo course = new Gson().fromJson(courseString, PolyvVlmsCoursesInfo.class); + String title = ""; + if (course != null) + title = course.getTitle(); + tv_title.setText(title); + tv_title.requestFocus(); + iv_finish.setOnClickListener(this); + iv_share.setOnClickListener(this); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + findIdAndNew(); + initView(); + } + + private void initPopupWindow() { + popupwindow_view = LayoutInflater.from(getActivity()).inflate(R.layout.polyv_popupwindow_player_share, null); + popupWindow = new PopupWindow(popupwindow_view, RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT, true); + popupWindow.setBackgroundDrawable(new BitmapDrawable()); + popupWindow.setOutsideTouchable(true); + popupWindow.setAnimationStyle(R.style.popupwindow); + ll_shareqq = (LinearLayout) popupwindow_view.findViewById(R.id.ll_shareqq); + ll_sharewechat = (LinearLayout) popupwindow_view.findViewById(R.id.ll_sharewechat); + ll_shareweibo = (LinearLayout) popupwindow_view.findViewById(R.id.ll_shareweibo); + ll_shareqq.setOnClickListener(this); + ll_sharewechat.setOnClickListener(this); + ll_shareweibo.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + int id = view.getId(); + if (id == R.id.iv_share) { + popupWindow.showAsDropDown(iv_share, 0, 1); + } else if (id == R.id.iv_finish) { + getActivity().finish(); + } else if (id == R.id.ll_shareqq) { + PolyvShareUtils.shareQQFriend(getActivity(), "", SHARE_TEXT, PolyvShareUtils.TEXT, null); + } else if (id == R.id.ll_sharewechat) { + PolyvShareUtils.shareWeChatFriend(getActivity(), "", SHARE_TEXT, PolyvShareUtils.TEXT, null); + } else if (id == R.id.ll_shareweibo) { + PolyvShareUtils.shareWeiBo(getActivity(), "", SHARE_TEXT, PolyvShareUtils.TEXT, null); + } + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerViewPagerFragment.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerViewPagerFragment.java index fef8710..cc32be6 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerViewPagerFragment.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvPlayerViewPagerFragment.java @@ -1,111 +1,111 @@ -package com.easefun.polyvsdk.fragment; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v4.view.ViewPager; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.adapter.PolyvPlayerFragmentAdapter; - -import java.util.ArrayList; -import java.util.List; - -public class PolyvPlayerViewPagerFragment extends Fragment { - //fragmentView - private View view; - // 播放页的viewPager - private ViewPager vp_player; - private PolyvPlayerFragmentAdapter adapter; - // 当前的索引 - private int currentIndex; - private List lists; - // 播放页viewpager的fragment - private Fragment curFragment, sumFragment, talkFragment; - private PolyvPlayerTabFragment tabFragment; - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - if (view == null) - view = inflater.inflate(R.layout.polyv_fragment_player_viewpager, container, false); - return view; - } - - private void findIdAndNew() { - vp_player = (ViewPager) view.findViewById(R.id.vp_player); - tabFragment = (PolyvPlayerTabFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.fl_tab); - lists = new ArrayList(); - } - - private void initView() { - curFragment = new PolyvCurriculumFragment(); - sumFragment = new PolyvSummaryFragment(); - talkFragment = new PolyvTalkFragment(); - lists.add(curFragment); - lists.add(sumFragment); - lists.add(talkFragment); - for (int i = 0; i < lists.size(); i++) - lists.get(i).setArguments(getActivity().getIntent().getExtras()); - adapter = new PolyvPlayerFragmentAdapter(getActivity().getSupportFragmentManager(), lists); - vp_player.setAdapter(adapter); - vp_player.setCurrentItem(0); - currentIndex = 0; - vp_player.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { - - @Override - // arg0:移动后的位置 - public void onPageSelected(int arg0) { - currentIndex = arg0; - tabFragment.resetViewStatus(arg0); - } - - @Override - // arg0:当前位置(右移)/下一位置(左移) - // arg1:页面偏移百分比 - // arg2:页面偏移像素 - public void onPageScrolled(int arg0, float arg1, int arg2) { - } - - @Override - // arg0:移动状态 - public void onPageScrollStateChanged(int arg0) { - } - }); - } - - public boolean isSideIconVisible() { - if (curFragment != null && vp_player.getCurrentItem() == 0) - return ((PolyvCurriculumFragment) curFragment).isSideIconVisible(); - return false; - } - - public void setSideIconVisible(boolean visiable) { - if (curFragment != null) - ((PolyvCurriculumFragment) curFragment).setSideIconVisible(visiable); - } - - - //改变viewpager的当前页 - public void setCurrentItem(int index) { - vp_player.setCurrentItem(index); - } - - public int getCurrentIndex() { - return currentIndex; - } - - public PolyvTalkFragment getTalkFragment() { - return (PolyvTalkFragment) talkFragment; - } - - @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - findIdAndNew(); - initView(); - } -} +package com.easefun.polyvsdk.fragment; + +import android.os.Bundle; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.adapter.PolyvPlayerFragmentAdapter; + +import java.util.ArrayList; +import java.util.List; + +public class PolyvPlayerViewPagerFragment extends Fragment { + //fragmentView + private View view; + // 播放页的viewPager + private ViewPager vp_player; + private PolyvPlayerFragmentAdapter adapter; + // 当前的索引 + private int currentIndex; + private List lists; + // 播放页viewpager的fragment + private Fragment curFragment, sumFragment, talkFragment; + private PolyvPlayerTabFragment tabFragment; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + if (view == null) + view = inflater.inflate(R.layout.polyv_fragment_player_viewpager, container, false); + return view; + } + + private void findIdAndNew() { + vp_player = (ViewPager) view.findViewById(R.id.vp_player); + tabFragment = (PolyvPlayerTabFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.fl_tab); + lists = new ArrayList(); + } + + private void initView() { + curFragment = new PolyvCurriculumFragment(); + sumFragment = new PolyvSummaryFragment(); + talkFragment = new PolyvTalkFragment(); + lists.add(curFragment); + lists.add(sumFragment); +// lists.add(talkFragment); + for (int i = 0; i < lists.size(); i++) + lists.get(i).setArguments(getActivity().getIntent().getExtras()); + adapter = new PolyvPlayerFragmentAdapter(getActivity().getSupportFragmentManager(), lists); + vp_player.setAdapter(adapter); + vp_player.setCurrentItem(0); + currentIndex = 0; + vp_player.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { + + @Override + // arg0:移动后的位置 + public void onPageSelected(int arg0) { + currentIndex = arg0; + tabFragment.resetViewStatus(arg0); + } + + @Override + // arg0:当前位置(右移)/下一位置(左移) + // arg1:页面偏移百分比 + // arg2:页面偏移像素 + public void onPageScrolled(int arg0, float arg1, int arg2) { + } + + @Override + // arg0:移动状态 + public void onPageScrollStateChanged(int arg0) { + } + }); + } + + public boolean isSideIconVisible() { + if (curFragment != null && vp_player.getCurrentItem() == 0) + return ((PolyvCurriculumFragment) curFragment).isSideIconVisible(); + return false; + } + + public void setSideIconVisible(boolean visiable) { + if (curFragment != null) + ((PolyvCurriculumFragment) curFragment).setSideIconVisible(visiable); + } + + + //改变viewpager的当前页 + public void setCurrentItem(int index) { + vp_player.setCurrentItem(index); + } + + public int getCurrentIndex() { + return currentIndex; + } + + public PolyvTalkFragment getTalkFragment() { + return (PolyvTalkFragment) talkFragment; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + findIdAndNew(); + initView(); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvSummaryFragment.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvSummaryFragment.java index 8d60ae0..fe0f8c7 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvSummaryFragment.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvSummaryFragment.java @@ -1,124 +1,124 @@ -package com.easefun.polyvsdk.fragment; - -import android.os.Build; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.text.Html; -import android.text.Layout; -import android.text.TextUtils; -import android.text.TextUtils.TruncateAt; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.view.ViewTreeObserver.OnGlobalLayoutListener; -import android.widget.TextView; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvCoursesInfo; - -public class PolyvSummaryFragment extends Fragment { - // 标题,价格,学习人数,简介,其他,展开 - private TextView tv_title, tv_money, tv_learn, tv_sum, tv_other, tv_expand; - // fragmentView - private View view; - // 课程对象 - private PolyvCoursesInfo.Course course; - - private void findIdAndNew() { - tv_title = (TextView) view.findViewById(R.id.tv_title); - tv_money = (TextView) view.findViewById(R.id.tv_money); - tv_learn = (TextView) view.findViewById(R.id.tv_learn); - tv_sum = (TextView) view.findViewById(R.id.tv_sum); - tv_other = (TextView) view.findViewById(R.id.tv_other); - tv_expand = (TextView) view.findViewById(R.id.tv_expand); - } - - private void initView() { - course = getArguments().getParcelable("course"); - if (course == null) - return; - tv_title.setText(course.title); - tv_learn.setText(course.student_count + "人在学"); - String summary = course.summary; - if (TextUtils.isEmpty(summary)) - tv_sum.setText("暂无"); - else - tv_sum.setText(Html.fromHtml(summary)); - tv_other.setText("暂无"); - if (PolyvCoursesInfo.IS_FREE_YES.equals(course.is_free)) { - tv_money.setText("免费"); - tv_money.setTextColor(getResources().getColor(R.color.center_right_text_color_green)); - } else { - tv_money.setText("¥" + course.price); - tv_money.setTextColor(getResources().getColor(R.color.center_bottom_text_color_red)); - } - tv_sum.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { - - @Override - public void onGlobalLayout() { - Layout layout = tv_sum.getLayout(); - int lines = layout.getLineCount(); - if (lines > 3 || (lines > 0 && layout.getEllipsisCount(lines - 1) > 0)) { - tv_expand.setVisibility(View.VISIBLE); - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) - tv_sum.getViewTreeObserver().removeOnGlobalLayoutListener(this); - else - tv_sum.getViewTreeObserver().removeGlobalOnLayoutListener(this); - } - }); - tv_sum.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - if (tv_expand.getVisibility() == View.INVISIBLE) - return; - expandOrCollapse(); - } - }); - tv_expand.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - expandOrCollapse(); - } - }); - } - - private void expandOrCollapse() { - if (!tv_expand.getText().equals("收起")) { - tv_sum.setMaxLines(Integer.MAX_VALUE); - tv_sum.setEllipsize(null); - tv_expand.setText("收起"); - } else { - tv_sum.setMaxLines(3); - tv_sum.setEllipsize(TruncateAt.END); - tv_expand.setText("展开"); - } - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - super.onCreateView(inflater, container, savedInstanceState); - if (view == null) - view = inflater.inflate(R.layout.polyv_fragment_tab_sum, container, false); - return view; - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - if (course == null) { - findIdAndNew(); - initView(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - if (view != null) - ((ViewGroup) view.getParent()).removeView(view); - } -} +package com.easefun.polyvsdk.fragment; + +import android.os.Build; +import android.os.Bundle; +import androidx.fragment.app.Fragment; +import android.text.Html; +import android.text.Layout; +import android.text.TextUtils; +import android.text.TextUtils.TruncateAt; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.view.ViewTreeObserver.OnGlobalLayoutListener; +import android.widget.TextView; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvCoursesInfo; + +public class PolyvSummaryFragment extends Fragment { + // 标题,价格,学习人数,简介,其他,展开 + private TextView tv_title, tv_money, tv_learn, tv_sum, tv_other, tv_expand; + // fragmentView + private View view; + // 课程对象 + private PolyvCoursesInfo.Course course; + + private void findIdAndNew() { + tv_title = (TextView) view.findViewById(R.id.tv_title); + tv_money = (TextView) view.findViewById(R.id.tv_money); + tv_learn = (TextView) view.findViewById(R.id.tv_learn); + tv_sum = (TextView) view.findViewById(R.id.tv_sum); + tv_other = (TextView) view.findViewById(R.id.tv_other); + tv_expand = (TextView) view.findViewById(R.id.tv_expand); + } + + private void initView() { + course = getArguments().getParcelable("course"); + if (course == null) + return; + tv_title.setText(course.title); + tv_learn.setText(course.student_count + "人在学"); + String summary = course.summary; + if (TextUtils.isEmpty(summary)) + tv_sum.setText("暂无"); + else + tv_sum.setText(Html.fromHtml(summary)); + tv_other.setText("暂无"); + if (PolyvCoursesInfo.IS_FREE_YES.equals(course.is_free)) { + tv_money.setText("免费"); + tv_money.setTextColor(getResources().getColor(R.color.center_right_text_color_green)); + } else { + tv_money.setText("¥" + course.price); + tv_money.setTextColor(getResources().getColor(R.color.center_bottom_text_color_red)); + } + tv_sum.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { + + @Override + public void onGlobalLayout() { + Layout layout = tv_sum.getLayout(); + int lines = layout.getLineCount(); + if (lines > 3 || (lines > 0 && layout.getEllipsisCount(lines - 1) > 0)) { + tv_expand.setVisibility(View.VISIBLE); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) + tv_sum.getViewTreeObserver().removeOnGlobalLayoutListener(this); + else + tv_sum.getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + }); + tv_sum.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + if (tv_expand.getVisibility() == View.GONE) + return; + expandOrCollapse(); + } + }); + tv_expand.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + expandOrCollapse(); + } + }); + } + + private void expandOrCollapse() { + if (!tv_expand.getText().equals("收起")) { + tv_sum.setMaxLines(Integer.MAX_VALUE); + tv_sum.setEllipsize(null); + tv_expand.setText("收起"); + } else { + tv_sum.setMaxLines(3); + tv_sum.setEllipsize(TruncateAt.END); + tv_expand.setText("展开"); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + if (view == null) + view = inflater.inflate(R.layout.polyv_fragment_tab_sum, container, false); + return view; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + if (course == null) { + findIdAndNew(); + initView(); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (view != null) + ((ViewGroup) view.getParent()).removeView(view); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvTalkFragment.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvTalkFragment.java index f91553d..ac7c17e 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvTalkFragment.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/fragment/PolyvTalkFragment.java @@ -1,227 +1,229 @@ -package com.easefun.polyvsdk.fragment; - -import android.content.Intent; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.text.Html; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.AdapterView.OnItemLongClickListener; -import android.widget.ListView; -import android.widget.ProgressBar; -import android.widget.RelativeLayout; -import android.widget.TextView; -import android.widget.Toast; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.activity.PolyvTalkEdittextActivity; -import com.easefun.polyvsdk.activity.PolyvTalkSendActivity; -import com.easefun.polyvsdk.adapter.PolyvTalkListViewAdapter; -import com.easefun.polyvsdk.sub.vlms.auxiliary.PolyvVlmsTransfer; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvAddAnswerInfo; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvAddQuestionInfo; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvCoursesInfo; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvQuestionInfo; -import com.easefun.polyvsdk.sub.vlms.listener.PolyvVlmsApiListener; -import com.easefun.polyvsdk.util.PolyvClipboardUtils; -import com.easefun.polyvsdk.util.PolyvVlmsHelper; - -import java.util.LinkedList; -import java.util.List; - -public class PolyvTalkFragment extends Fragment { - // fragmentView - private View view; - // 讨论的listView - private ListView lv_talk; - private PolyvTalkListViewAdapter adapter; - private LinkedList lists; - // 讨论的布局 - private RelativeLayout rl_bot; - // 点击的父索引 - private int position; - // 话题,发送的信息 - private String topic, sendMsg; - // 传过来课程对象 - private PolyvCoursesInfo.Course course; - // 加载中控件 - private ProgressBar pb_loading; - // 空数据控件,重新加载控件 - private TextView tv_empty, tv_reload; - // question_id - private String question_id; - private PolyvVlmsHelper vlmsHelper; - - private void getQuestionsDetail() { - vlmsHelper.getQuesionsDetail(course.course_id, new PolyvVlmsHelper.MyQuestionDetailListener() { - @Override - public void fail(Throwable t) { - pb_loading.setVisibility(View.INVISIBLE); - tv_reload.setVisibility(View.VISIBLE); - } - - @Override - public void success(List questionsDetails) { - pb_loading.setVisibility(View.INVISIBLE); - PolyvTalkFragment.this.lists.clear(); - PolyvTalkFragment.this.lists.addAll(questionsDetails); - if (PolyvTalkFragment.this.lists.size() == 0) - tv_empty.setVisibility(View.VISIBLE); - adapter.notifyDataSetChanged(); - } - }); - } - - private void addNewQuestion() { - String transferMsg = PolyvVlmsTransfer.toHtmlSign(sendMsg); - vlmsHelper.addNewQuestion(course.course_id, topic, transferMsg, new PolyvVlmsApiListener.AddNewQuestionListener() { - @Override - public void fail(Throwable t) { - Toast.makeText(getContext(), "发表讨论失败,请重试!", Toast.LENGTH_SHORT).show(); - } - - @Override - public void success(PolyvAddQuestionInfo polyvAddQuestionInfo) { - tv_empty.setVisibility(View.INVISIBLE); - PolyvVlmsHelper.QuestionsDetail questionsDetail = vlmsHelper.addQuestionInfoToQuestionDetail(polyvAddQuestionInfo); - lists.addFirst(questionsDetail); - adapter.notifyDataSetChanged(); - Toast.makeText(getContext(), "发送成功!", Toast.LENGTH_SHORT).show(); - } - }); - } - - private void addNewAnswer() { - String transferMsg = PolyvVlmsTransfer.toHtmlSign(sendMsg); - vlmsHelper.addNewAnswer(course.course_id, question_id, transferMsg, new PolyvVlmsApiListener.AddNewAnswerListener() { - @Override - public void fail(Throwable t) { - Toast.makeText(getContext(), "回复失败,请重试!", Toast.LENGTH_SHORT).show(); - } - - @Override - public void success(PolyvAddAnswerInfo polyvAddAnswerInfo) { - PolyvVlmsHelper.QuestionsDetail.AnswerDetail answerDetail = vlmsHelper.addAnswerInfoToAnswerDetail(polyvAddAnswerInfo); - lists.get(position).answers.addFirst(answerDetail); - adapter.notifyDataSetChanged(); - Toast.makeText(getContext(), "回复成功!", Toast.LENGTH_SHORT).show(); - } - }); - } - - private void findIdAndNew() { - lv_talk = (ListView) view.findViewById(R.id.lv_talk); - rl_bot = (RelativeLayout) view.findViewById(R.id.rl_bot); - pb_loading = (ProgressBar) view.findViewById(R.id.pb_loading); - tv_empty = (TextView) view.findViewById(R.id.tv_empty); - tv_reload = (TextView) view.findViewById(R.id.tv_reload); - lists = new LinkedList<>(); - vlmsHelper = new PolyvVlmsHelper(); - } - - private void initView() { - // fragment在onCreate之后才可以获取 - course = getArguments().getParcelable("course"); - if (course == null) - return; - getQuestionsDetail(); - adapter = new PolyvTalkListViewAdapter(getActivity(), lists); - lv_talk.setAdapter(adapter); - lv_talk.setOnItemLongClickListener(new OnItemLongClickListener() { - - @Override - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - PolyvQuestionInfo.Question polyvQuestion = lists.get(position).question; - PolyvClipboardUtils.copyToClipboard(getContext(), Html.fromHtml(polyvQuestion.content)); - Toast.makeText(getContext(), "已复制" + polyvQuestion.nickname + "的评论", Toast.LENGTH_SHORT).show(); - return true; - } - }); - lv_talk.setOnItemClickListener(new OnItemClickListener() { - - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - PolyvQuestionInfo.Question polyvQuestion = lists.get(position).question; - Intent intent = new Intent(getActivity(), PolyvTalkEdittextActivity.class); - intent.putExtra("question_id", polyvQuestion.question_id); - intent.putExtra("position", position); - intent.putExtra("nickname", polyvQuestion.nickname); - getActivity().startActivityForResult(intent, 13); - getActivity().overridePendingTransition(R.anim.polyv_activity_alpha_in, 0); - } - }); - - rl_bot.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - Intent intent = new Intent(getActivity(), PolyvTalkSendActivity.class); - startActivityForResult(intent, 13); - } - }); - tv_reload.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - pb_loading.setVisibility(View.VISIBLE); - tv_reload.setVisibility(View.INVISIBLE); - getQuestionsDetail(); - } - }); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - super.onCreateView(inflater, container, savedInstanceState); - if (view == null) - view = inflater.inflate(R.layout.polyv_fragment_tab_talk, container, false); - return view; - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - if (course == null) { - findIdAndNew(); - initView(); - } - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - switch (resultCode) { - case 19: - // 回答 - question_id = data.getStringExtra("question_id"); - position = data.getIntExtra("position", -1); - sendMsg = data.getStringExtra("sendMsg"); - addNewAnswer(); - break; - - case 12: - // 问题 - topic = data.getStringExtra("topic"); - sendMsg = data.getStringExtra("sendMsg"); - addNewQuestion(); - break; - } - - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - if (view != null) - ((ViewGroup) view.getParent()).removeView(view); - } - - @Override - public void onDestroy() { - super.onDestroy(); - vlmsHelper.destroy(); - } -} +package com.easefun.polyvsdk.fragment; + +import android.content.Intent; +import android.os.Bundle; +import androidx.fragment.app.Fragment; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.AdapterView.OnItemLongClickListener; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.activity.PolyvTalkEdittextActivity; +import com.easefun.polyvsdk.activity.PolyvTalkSendActivity; +import com.easefun.polyvsdk.adapter.PolyvTalkListViewAdapter; +import com.easefun.polyvsdk.sub.vlms.auxiliary.PolyvVlmsTransfer; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvAddAnswerInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvAddQuestionInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvQuestionInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvVlmsCoursesInfo; +import com.easefun.polyvsdk.sub.vlms.listener.PolyvVlmsApiListener; +import com.easefun.polyvsdk.util.PolyvClipboardUtils; +import com.easefun.polyvsdk.util.PolyvVlmsHelper; +import com.google.gson.Gson; + +import java.util.LinkedList; +import java.util.List; + +public class PolyvTalkFragment extends Fragment { + // fragmentView + private View view; + // 讨论的listView + private ListView lv_talk; + private PolyvTalkListViewAdapter adapter; + private LinkedList lists; + // 讨论的布局 + private RelativeLayout rl_bot; + // 点击的父索引 + private int position; + // 话题,发送的信息 + private String topic, sendMsg; + // 传过来课程对象 + private PolyvVlmsCoursesInfo course; + // 加载中控件 + private ProgressBar pb_loading; + // 空数据控件,重新加载控件 + private TextView tv_empty, tv_reload; + // question_id + private String question_id; + private PolyvVlmsHelper vlmsHelper; + + private void getQuestionsDetail() { + vlmsHelper.getQuesionsDetail(course.getCourseId()+"", new PolyvVlmsHelper.MyQuestionDetailListener() { + @Override + public void fail(Throwable t) { + pb_loading.setVisibility(View.GONE); + tv_reload.setVisibility(View.VISIBLE); + } + + @Override + public void success(List questionsDetails) { + pb_loading.setVisibility(View.GONE); + PolyvTalkFragment.this.lists.clear(); + PolyvTalkFragment.this.lists.addAll(questionsDetails); + if (PolyvTalkFragment.this.lists.size() == 0) + tv_empty.setVisibility(View.VISIBLE); + adapter.notifyDataSetChanged(); + } + }); + } + + private void addNewQuestion() { + String transferMsg = PolyvVlmsTransfer.toHtmlSign(sendMsg); + vlmsHelper.addNewQuestion(course.getCourseId()+"", topic, transferMsg, new PolyvVlmsApiListener.AddNewQuestionListener() { + @Override + public void fail(Throwable t) { + Toast.makeText(getContext(), "发表讨论失败,请重试!", Toast.LENGTH_SHORT).show(); + } + + @Override + public void success(PolyvAddQuestionInfo polyvAddQuestionInfo) { + tv_empty.setVisibility(View.GONE); + PolyvVlmsHelper.QuestionsDetail questionsDetail = vlmsHelper.addQuestionInfoToQuestionDetail(polyvAddQuestionInfo); + lists.addFirst(questionsDetail); + adapter.notifyDataSetChanged(); + Toast.makeText(getContext(), "发送成功!", Toast.LENGTH_SHORT).show(); + } + }); + } + + private void addNewAnswer() { + String transferMsg = PolyvVlmsTransfer.toHtmlSign(sendMsg); + vlmsHelper.addNewAnswer(course.getCourseId()+"", question_id, transferMsg, new PolyvVlmsApiListener.AddNewAnswerListener() { + @Override + public void fail(Throwable t) { + Toast.makeText(getContext(), "回复失败,请重试!", Toast.LENGTH_SHORT).show(); + } + + @Override + public void success(PolyvAddAnswerInfo polyvAddAnswerInfo) { + PolyvVlmsHelper.QuestionsDetail.AnswerDetail answerDetail = vlmsHelper.addAnswerInfoToAnswerDetail(polyvAddAnswerInfo); + lists.get(position).answers.addFirst(answerDetail); + adapter.notifyDataSetChanged(); + Toast.makeText(getContext(), "回复成功!", Toast.LENGTH_SHORT).show(); + } + }); + } + + private void findIdAndNew() { + lv_talk = (ListView) view.findViewById(R.id.lv_talk); + rl_bot = (RelativeLayout) view.findViewById(R.id.rl_bot); + pb_loading = (ProgressBar) view.findViewById(R.id.pb_loading); + tv_empty = (TextView) view.findViewById(R.id.tv_empty); + tv_reload = (TextView) view.findViewById(R.id.tv_reload); + lists = new LinkedList<>(); + vlmsHelper = new PolyvVlmsHelper(); + } + + private void initView() { + // fragment在onCreate之后才可以获取 + String courseString = getArguments().getString("course"); + course = new Gson().fromJson(courseString, PolyvVlmsCoursesInfo.class); + if (course == null) + return; + getQuestionsDetail(); + adapter = new PolyvTalkListViewAdapter(getActivity(), lists); + lv_talk.setAdapter(adapter); + lv_talk.setOnItemLongClickListener(new OnItemLongClickListener() { + + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + PolyvQuestionInfo.Question polyvQuestion = lists.get(position).question; + PolyvClipboardUtils.copyToClipboard(getContext(), Html.fromHtml(polyvQuestion.content)); + Toast.makeText(getContext(), "已复制" + polyvQuestion.nickname + "的评论", Toast.LENGTH_SHORT).show(); + return true; + } + }); + lv_talk.setOnItemClickListener(new OnItemClickListener() { + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + PolyvQuestionInfo.Question polyvQuestion = lists.get(position).question; + Intent intent = new Intent(getActivity(), PolyvTalkEdittextActivity.class); + intent.putExtra("question_id", polyvQuestion.question_id); + intent.putExtra("position", position); + intent.putExtra("nickname", polyvQuestion.nickname); + getActivity().startActivityForResult(intent, 13); + getActivity().overridePendingTransition(R.anim.polyv_activity_alpha_in, 0); + } + }); + + rl_bot.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + Intent intent = new Intent(getActivity(), PolyvTalkSendActivity.class); + startActivityForResult(intent, 13); + } + }); + tv_reload.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + pb_loading.setVisibility(View.VISIBLE); + tv_reload.setVisibility(View.GONE); + getQuestionsDetail(); + } + }); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + if (view == null) + view = inflater.inflate(R.layout.polyv_fragment_tab_talk, container, false); + return view; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + if (course == null) { + findIdAndNew(); + initView(); + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + switch (resultCode) { + case 19: + // 回答 + question_id = data.getStringExtra("question_id"); + position = data.getIntExtra("position", -1); + sendMsg = data.getStringExtra("sendMsg"); + addNewAnswer(); + break; + + case 12: + // 问题 + topic = data.getStringExtra("topic"); + sendMsg = data.getStringExtra("sendMsg"); + addNewQuestion(); + break; + } + + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (view != null) + ((ViewGroup) view.getParent()).removeView(view); + } + + @Override + public void onDestroy() { + super.onDestroy(); + vlmsHelper.destroy(); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/IPLVMarqueeView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/IPLVMarqueeView.java new file mode 100644 index 0000000..ca288ce --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/IPLVMarqueeView.java @@ -0,0 +1,30 @@ +package com.easefun.polyvsdk.marquee; + +import com.easefun.polyvsdk.marquee.model.PLVMarqueeModel; + +/** + * 跑马灯 对外调用的接口 + */ +public interface IPLVMarqueeView { + /** + * 更新跑马灯字体和动画样式 + * + * @param marqueeVO + */ + void setPLVMarqueeModel(PLVMarqueeModel marqueeVO); + + /** + * 开始播放跑马灯 + */ + void start(); + + /** + * 暂停播放跑马灯 + */ + void pause(); + + /** + * 停止播放跑马灯 + */ + void stop(); +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/PLVMarqueeTextView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/PLVMarqueeTextView.java new file mode 100644 index 0000000..7e7cd1d --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/PLVMarqueeTextView.java @@ -0,0 +1,81 @@ +package com.easefun.polyvsdk.marquee; + +import android.content.Context; +import android.graphics.Color; +import androidx.annotation.Nullable; +import android.util.AttributeSet; + +import com.easefun.polyvsdk.marquee.model.PLVMarqueeTextVO; + +/** + * 跑马灯view 的实现类 + */ +public class PLVMarqueeTextView extends PLVStrokeTextView { + + // + private PLVMarqueeTextVO textModel; + // + + // + public PLVMarqueeTextView(Context context) { + super(context); + } + + public PLVMarqueeTextView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public PLVMarqueeTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + // + + // + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + // + + // + public void setMarqueeTextModel(PLVMarqueeTextVO textVO) { + this.textModel = textVO; + setText(textVO.getContent()); + setFontStyle(); + setFilterStyle(); + } + // + + // + // 设置字体样式 + private void setFontStyle() { + setTextSize(textModel.getFontSize()); + setTextColor(Color.argb(textModel.getFontAlpha(), + Color.red(textModel.getFontColor()), + Color.green(textModel.getFontColor()), + Color.blue(textModel.getFontColor()))); + } + + // 设置描边样式 + private void setFilterStyle() { + setHasStroke(textModel.isFilter()); + + setStrokeWidth(textModel.getFilterStrength()); + + setStrokeBlurX(textModel.getFilterBlurX()); + setStrokeBlurY(textModel.getFilterBlurY()); + + int strokeColor = Color.argb((int) (textModel.getFilterAlpha()), + Color.red(textModel.getFilterColor()), + Color.green(textModel.getFilterColor()), + Color.blue(textModel.getFilterColor())); + setStrokeColor(strokeColor); + + invalidate(); + } + // +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/PLVMarqueeView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/PLVMarqueeView.java new file mode 100644 index 0000000..1900f03 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/PLVMarqueeView.java @@ -0,0 +1,325 @@ +package com.easefun.polyvsdk.marquee; + +import android.content.Context; +import android.os.Build; +import androidx.annotation.Nullable; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.view.ViewTreeObserver; +import android.widget.RelativeLayout; + +import com.easefun.polyvsdk.log.PolyvCommonLog; +import com.easefun.polyvsdk.marquee.animation.PLVMarqueeAnimation; +import com.easefun.polyvsdk.marquee.animation.PLVMarqueeFlick15PercentAnimation; +import com.easefun.polyvsdk.marquee.animation.PLVMarqueeFlickAdvanceAnimation; +import com.easefun.polyvsdk.marquee.animation.PLVMarqueeFlickAnimation; +import com.easefun.polyvsdk.marquee.animation.PLVMarqueeMergeRollFlickAnimation; +import com.easefun.polyvsdk.marquee.animation.PLVMarqueeRoll15PercentAnimation; +import com.easefun.polyvsdk.marquee.animation.PLVMarqueeRollAdvanceAnimation; +import com.easefun.polyvsdk.marquee.animation.PLVMarqueeRollAnimation; +import com.easefun.polyvsdk.marquee.model.PLVMarqueeAnimationVO; +import com.easefun.polyvsdk.marquee.model.PLVMarqueeModel; +import com.easefun.polyvsdk.marquee.model.PLVMarqueeTextVO; + +import java.util.HashMap; + +/** + * 跑马灯的实现类 + */ +public class PLVMarqueeView extends RelativeLayout implements IPLVMarqueeView { + private static final String TAG = "PLVMarqueeView"; + + // + + private PLVMarqueeTextView mainTextView; + private PLVMarqueeTextView secondTextView; + private PLVMarqueeAnimation marqueeAnimation; + private PLVMarqueeModel plvMarqueeModel; + + private boolean isResetMarqueeVO = false; + // + + // + public PLVMarqueeView(Context context) { + super(context); + Log.i(TAG, "PLVMarqueeView: "); + initView(context); + } + + public PLVMarqueeView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + initView(context); + } + + public PLVMarqueeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(context); + } + // + + // + private void initView(Context context) { + mainTextView = new PLVMarqueeTextView(context); + secondTextView = new PLVMarqueeTextView(context); + addView(mainTextView); + addView(secondTextView); + secondTextView.setAlpha(0F); + } + // + + // + @Override + public void setPLVMarqueeModel(final PLVMarqueeModel marqueeVO) { + plvMarqueeModel = marqueeVO; + isResetMarqueeVO = true; + } + + @Override + public void start() { + if (isResetMarqueeVO) { + updatePLVMarqueeModel(plvMarqueeModel); + isResetMarqueeVO = false; + } else { + if (marqueeAnimation != null) { + marqueeAnimation.start(); + } else { + PolyvCommonLog.d(TAG, "need to excute setPLVMarqueeModel before start"); + } + } + } + + @Override + public void pause() { + if (marqueeAnimation != null) { + marqueeAnimation.pause(); + } + } + + @Override + public void stop() { + if (marqueeAnimation != null) { + marqueeAnimation.stop(); + } + } + // + + // + + /** + * 正式更新跑马灯样式的实现 + * + * @param plvMarqueeVO + */ + private void updatePLVMarqueeModel(final PLVMarqueeModel plvMarqueeVO) { + plvMarqueeVO.setSecondDefaultTextVO(); + + setMainTextVO(plvMarqueeVO.getMainTextVO()); + setSecondTextVO(plvMarqueeVO.getSecondTextVO()); + getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + if (Build.VERSION.SDK_INT >= 16) { + getViewTreeObserver().removeOnGlobalLayoutListener(this); + } else { + getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + mainTextView.setWidth(mainTextView.getWidth() + 2 * mainTextView.getStrokeWidth()); + mainTextView.setHeight(mainTextView.getHeight() + 2 * mainTextView.getStrokeWidth()); + secondTextView.setWidth(secondTextView.getWidth() + 2 * secondTextView.getStrokeWidth()); + secondTextView.setHeight(secondTextView.getHeight() + 2 * secondTextView.getStrokeWidth()); + setMarqueeAnimationType(plvMarqueeVO.getAnimationVO()); + } + }); + } + + /** + * 设置 主跑马灯的样式 + */ + private void setMainTextVO(PLVMarqueeTextVO textVO) { + this.mainTextView.setMarqueeTextModel(textVO); + } + + /** + * 设置 副跑马灯的样式 + */ + private void setSecondTextVO(PLVMarqueeTextVO textVO) { + this.secondTextView.setMarqueeTextModel(textVO); + } + + /** + * 设置 动画类型和参数 + */ + private void setMarqueeAnimationType(PLVMarqueeAnimationVO animationVO) { + mainTextView.clearAnimation(); + secondTextView.clearAnimation(); + + int animationType = animationVO.getAnimationType(); + + int viewHeight = mainTextView.getMeasuredHeight() + 2 * mainTextView.getStrokeWidth(); + int viewWidth = mainTextView.getMeasuredWidth() + 2 * mainTextView.getStrokeWidth(); + + int secondViewHeight = secondTextView.getMeasuredHeight() + 2 * secondTextView.getStrokeWidth(); + int secondViewWidth = secondTextView.getMeasuredWidth() + 2 * secondTextView.getStrokeWidth(); + + int screenWidth = getWidth(); + int screenHeight = getHeight(); + + int duration = animationVO.getSpeed() / 10 * 1000; + int lifeTime = animationVO.getLifeTime() * 1000; + int interval = animationVO.getInterval() * 1000; + int tweenTime = animationVO.getTweenTime() * 1000; + + boolean isAlwaysShowWhenRun = animationVO.isAlwaysShowWhenRun(); + boolean isHiddenWhenPause = animationVO.isHiddenWhenPause(); + + HashMap paramMap = new HashMap<>(); + HashMap viewMap = new HashMap<>(); + + switch (animationType) { + case PLVMarqueeAnimationVO.ROLL: + marqueeAnimation = new PLVMarqueeRollAnimation(); + + viewMap.put(PLVMarqueeAnimation.VIEW_MAIN, mainTextView); + + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_WIDTH, viewWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_HEIGHT, viewHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_WIDTH, screenWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_HEIGHT, screenHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_DURATION, duration); + paramMap.put(PLVMarqueeAnimation.PARAM_INTERVAL, interval); + paramMap.put(PLVMarqueeAnimation.PARAM_ISALWAYS_SHOW_WHEN_RUN, isAlwaysShowWhenRun ? 1 : 0); + paramMap.put(PLVMarqueeAnimation.PARAM_HIDE_WHEN_PAUSE, isHiddenWhenPause ? 1 : 0); + + break; + case PLVMarqueeAnimationVO.ROLL_15PERCENT: + marqueeAnimation = new PLVMarqueeRoll15PercentAnimation(); + + viewMap.put(PLVMarqueeAnimation.VIEW_MAIN, mainTextView); + + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_WIDTH, viewWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_HEIGHT, viewHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_WIDTH, screenWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_HEIGHT, screenHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_DURATION, duration); + paramMap.put(PLVMarqueeAnimation.PARAM_INTERVAL, interval); + paramMap.put(PLVMarqueeAnimation.PARAM_ISALWAYS_SHOW_WHEN_RUN, isAlwaysShowWhenRun ? 1 : 0); + paramMap.put(PLVMarqueeAnimation.PARAM_HIDE_WHEN_PAUSE, isHiddenWhenPause ? 1 : 0); + + break; + case PLVMarqueeAnimationVO.FLICK: + marqueeAnimation = new PLVMarqueeFlickAnimation(); + + viewMap.put(PLVMarqueeAnimation.VIEW_MAIN, mainTextView); + + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_WIDTH, viewWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_HEIGHT, viewHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_WIDTH, screenWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_HEIGHT, screenHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_LIFE_TIME, lifeTime); + paramMap.put(PLVMarqueeAnimation.PARAM_INTERVAL, interval); + paramMap.put(PLVMarqueeAnimation.PARAM_TWEEN_TIME, tweenTime); + paramMap.put(PLVMarqueeAnimation.PARAM_ISALWAYS_SHOW_WHEN_RUN, isAlwaysShowWhenRun ? 1 : 0); + paramMap.put(PLVMarqueeAnimation.PARAM_HIDE_WHEN_PAUSE, isHiddenWhenPause ? 1 : 0); + break; + case PLVMarqueeAnimationVO.FLICK_15PERCENT: + marqueeAnimation = new PLVMarqueeFlick15PercentAnimation(); + + viewMap.put(PLVMarqueeAnimation.VIEW_MAIN, mainTextView); + + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_WIDTH, viewWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_HEIGHT, viewHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_WIDTH, screenWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_HEIGHT, screenHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_LIFE_TIME, lifeTime); + paramMap.put(PLVMarqueeAnimation.PARAM_INTERVAL, interval); + paramMap.put(PLVMarqueeAnimation.PARAM_TWEEN_TIME, tweenTime); + paramMap.put(PLVMarqueeAnimation.PARAM_ISALWAYS_SHOW_WHEN_RUN, isAlwaysShowWhenRun ? 1 : 0); + paramMap.put(PLVMarqueeAnimation.PARAM_HIDE_WHEN_PAUSE, isHiddenWhenPause ? 1 : 0); + break; + case PLVMarqueeAnimationVO.MERGE_ROLL_FLICK: + marqueeAnimation = new PLVMarqueeMergeRollFlickAnimation(); + + viewMap.put(PLVMarqueeAnimation.VIEW_MAIN, mainTextView); + + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_WIDTH, viewWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_HEIGHT, viewHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_WIDTH, screenWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_HEIGHT, screenHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_DURATION, duration); + paramMap.put(PLVMarqueeAnimation.PARAM_INTERVAL, interval); + paramMap.put(PLVMarqueeAnimation.PARAM_TWEEN_TIME, tweenTime); + paramMap.put(PLVMarqueeAnimation.PARAM_ISALWAYS_SHOW_WHEN_RUN, isAlwaysShowWhenRun ? 1 : 0); + paramMap.put(PLVMarqueeAnimation.PARAM_HIDE_WHEN_PAUSE, isHiddenWhenPause ? 1 : 0); + break; + case PLVMarqueeAnimationVO.ROLL_ADVANCE: + marqueeAnimation = new PLVMarqueeRollAdvanceAnimation(); + + viewMap.put(PLVMarqueeAnimation.VIEW_MAIN, mainTextView); + viewMap.put(PLVMarqueeAnimation.VIEW_SECOND, secondTextView); + + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_WIDTH, viewWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_HEIGHT, viewHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_WIDTH, screenWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_HEIGHT, screenHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_DURATION, duration); + paramMap.put(PLVMarqueeAnimation.PARAM_INTERVAL, interval); + paramMap.put(PLVMarqueeAnimation.PARAM_SECOND_VIEW_WIDTH, secondViewWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_SECOND_VIEW_HEIGHT, secondViewHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_ISALWAYS_SHOW_WHEN_RUN, isAlwaysShowWhenRun ? 1 : 0); + paramMap.put(PLVMarqueeAnimation.PARAM_HIDE_WHEN_PAUSE, isHiddenWhenPause ? 1 : 0); + break; + case PLVMarqueeAnimationVO.FLICK_ADVANCE: + marqueeAnimation = new PLVMarqueeFlickAdvanceAnimation(); + + viewMap.put(PLVMarqueeAnimation.VIEW_MAIN, mainTextView); + viewMap.put(PLVMarqueeAnimation.VIEW_SECOND, secondTextView); + + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_WIDTH, viewWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_VIEW_HEIGHT, viewHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_WIDTH, screenWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_SCREEN_HEIGHT, screenHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_LIFE_TIME, lifeTime); + paramMap.put(PLVMarqueeAnimation.PARAM_INTERVAL, interval); + paramMap.put(PLVMarqueeAnimation.PARAM_TWEEN_TIME, tweenTime); + paramMap.put(PLVMarqueeAnimation.PARAM_SECOND_VIEW_WIDTH, secondViewWidth); + paramMap.put(PLVMarqueeAnimation.PARAM_SECOND_VIEW_HEIGHT, secondViewHeight); + paramMap.put(PLVMarqueeAnimation.PARAM_ISALWAYS_SHOW_WHEN_RUN, isAlwaysShowWhenRun ? 1 : 0); + paramMap.put(PLVMarqueeAnimation.PARAM_HIDE_WHEN_PAUSE, isHiddenWhenPause ? 1 : 0); + break; + default: + break; + } + if (marqueeAnimation == null) { + mainTextView.setVisibility(GONE); + secondTextView.setVisibility(GONE); + return; + } + marqueeAnimation.setViews(viewMap); + marqueeAnimation.setParams(paramMap); + if (marqueeAnimation != null) { + marqueeAnimation.start(); + } + } + + // + + // + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + if (marqueeAnimation != null) { + marqueeAnimation.onParentSizeChanged(PLVMarqueeView.this); + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (marqueeAnimation != null) { + marqueeAnimation.stop(); + marqueeAnimation.destroy(); + } + } + // +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/PLVStrokeTextView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/PLVStrokeTextView.java new file mode 100644 index 0000000..445d50b --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/PLVStrokeTextView.java @@ -0,0 +1,148 @@ +package com.easefun.polyvsdk.marquee; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.BlurMaskFilter; +import android.graphics.Canvas; +import android.graphics.Paint; +import androidx.annotation.Nullable; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.style.ScaleXSpan; +import android.util.AttributeSet; +import android.view.View; +import android.widget.TextView; + +import com.easefun.polyvsdk.util.PolyvScreenUtils; + +/** + * 增强显示 的 文字类 + */ +public class PLVStrokeTextView extends TextView { + + // + private float spacing; + private CharSequence srcText; + private boolean hasStroke; + private int strokeWidth; + private int strokeColor; + private int strokeBlurX = 0; + private int strokeBlurY = 0; + // + + // + public PLVStrokeTextView(Context context) { + super(context); + } + + public PLVStrokeTextView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public PLVStrokeTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + // + + // + public int getStrokeWidth() { + return strokeWidth; + } + + public void setSpacing(float spacing) { + this.spacing = spacing; + if (spacing > 0) { + applySpacing(); + } + } + + @Override + public void setText(CharSequence text, BufferType type) { + srcText = text; + if (spacing > 0) { + applySpacing(); + } else { + super.setText(text, type); + } + } + // + + // + protected void setHasStroke(boolean hasStroke) { + this.hasStroke = hasStroke; + } + + protected void setStrokeBlurX(int strokeBlurX) { + this.strokeBlurX = strokeBlurX; + } + + protected void setStrokeBlurY(int strokeBlurY) { + this.strokeBlurY = strokeBlurY; + } + + protected void setStrokeWidth(int strokeWidth) { + this.strokeWidth = strokeWidth; + } + + protected void setStrokeColor(int strokeColor) { + this.strokeColor = strokeColor; + } + // + + // + private void applySpacing() { + if (srcText == null) { + return; + } + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < srcText.length(); i++) { + builder.append(srcText.charAt(i)); + if (i + 1 < srcText.length()) { + // \u00A0 不间断空格 + // 追加空格 + builder.append("\u00A0"); + } + } + SpannableString finalText = new SpannableString(builder.toString()); + if (builder.toString().length() > 1) { // 如果当前TextView内容长度大于1,则进行空格添加 + for (int i = 1; i < builder.toString().length(); i += 2) { // 小demo:100 1 0 0 + // 按照x轴等比例进行缩放 通过我们设置的字间距+1除以10进行等比缩放 + finalText.setSpan(new ScaleXSpan(spacing), i, i + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + super.setText(finalText, BufferType.SPANNABLE); + } + + @SuppressLint("DrawAllocation") + @Override + protected void onDraw(Canvas canvas) { + if (hasStroke) { + // first get because strokeColor will set. + ColorStateList states = getTextColors(); + getPaint().setStyle(Paint.Style.STROKE); + getPaint().setStrokeWidth(/*strokeWidth*/PolyvScreenUtils.dip2px(getContext(), strokeWidth)); + // BlurMaskFilter.Blur.INNER textColor red "e" has a problem.and all is has...if "e" textSize is small. + if (strokeBlurX > 0 && strokeBlurY > 0) { + int strokeBlur = Math.max(strokeBlurX, strokeBlurY); + // if no set,it mask can cover other textView same text. + disableHardwareRendering(this); + getPaint().setMaskFilter( + new BlurMaskFilter(/*strokeWidth*/PolyvScreenUtils.dip2px(getContext(), + strokeBlur), + BlurMaskFilter.Blur.SOLID)); + } + setTextColor(strokeColor); + super.onDraw(canvas); + + getPaint().setStyle(Paint.Style.FILL); + setTextColor(states); + } + super.onDraw(canvas); + } + + public static void disableHardwareRendering(View v) { + v.setLayerType(View.LAYER_TYPE_SOFTWARE, null); + } + // +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeAnimation.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeAnimation.java new file mode 100644 index 0000000..d5fbe2c --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeAnimation.java @@ -0,0 +1,95 @@ +package com.easefun.polyvsdk.marquee.animation; + +import android.view.View; + +import java.util.HashMap; + +/** + * 动画类 的基本类 + */ +public abstract class PLVMarqueeAnimation { + + // + // 生命周期的标识常量 + protected static final int IDLE = 0; + protected static final int STARTED = 1; + protected static final int PAUSE = 2; + protected static final int STOP = 3; + + // 传入参数的标识常量 + public static final int PARAM_VIEW_WIDTH = 0; + public static final int PARAM_VIEW_HEIGHT = 1; + public static final int PARAM_SCREEN_WIDTH = 2; + public static final int PARAM_SCREEN_HEIGHT = 3; + public static final int PARAM_DURATION = 4; + public static final int PARAM_LIFE_TIME = 5; + public static final int PARAM_TWEEN_TIME = 6; + public static final int PARAM_INTERVAL = 7; + public static final int PARAM_SECOND_VIEW_WIDTH = 8; + public static final int PARAM_SECOND_VIEW_HEIGHT = 9; + + public static final int PARAM_ISALWAYS_SHOW_WHEN_RUN = 10; + public static final int PARAM_HIDE_WHEN_PAUSE = 11; + + public static final int VIEW_MAIN = 20; + public static final int VIEW_SECOND = 21; + // + + // + // 动画状态 + protected int animationStatus = IDLE; + // 动画主要参数变量 + protected int viewWidth; + protected int viewHeight; + protected int screenWidth; + protected int screenHeight; + + protected boolean isAlwaysShowWhenRun = false; + protected boolean isHiddenWhenPause = true; + // + + // + /** + * 设置要添加动画的view + * + * @param viewMap + */ + public abstract void setViews(HashMap viewMap); + + /** + * 设置参数 + * + * @param paramMap + */ + public abstract void setParams(HashMap paramMap); + // + + // + /** + * 开始生成并运行动画 + */ + public abstract void start(); + + /** + * 暂停动画的播放 + */ + public abstract void pause(); + + /** + * 停止动画 + */ + public abstract void stop(); + + /** + * 销毁动画 + */ + public abstract void destroy(); + + /** + * 当画面配置切换时,做修改 + * + * @param parentView + */ + public abstract void onParentSizeChanged(View parentView); + // +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeFlick15PercentAnimation.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeFlick15PercentAnimation.java new file mode 100644 index 0000000..912fd72 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeFlick15PercentAnimation.java @@ -0,0 +1,39 @@ +package com.easefun.polyvsdk.marquee.animation; + +/** + * 跑马灯 在总区域上下15%部分闪烁的动画类 + */ +public class PLVMarqueeFlick15PercentAnimation extends PLVMarqueeFlickAnimation { + + // + // 设置活动区域 + @Override + protected void setMainActiveRect() { + if (layoutParams == null) { + return; + } + boolean showOnTopArea = Math.random() < 0.5; + float availableViewHeight = screenHeight * 0.15F; + if (showOnTopArea) { + // 在上面显示 + if (viewHeight < availableViewHeight) { + int space = (int) (availableViewHeight - viewHeight); + layoutParams.topMargin = (int) (Math.random() * space); + } else { + layoutParams.topMargin = 0; + } + } else { + // 在下面显示 + if (viewHeight < availableViewHeight) { + int bottomAreaTop = (int) (screenHeight - availableViewHeight); + int space = (int) (availableViewHeight - viewHeight); + layoutParams.topMargin = (int) (bottomAreaTop + Math.random() * space); + } else { + layoutParams.topMargin = screenHeight - Math.min(screenHeight, viewHeight); + } + } + layoutParams.leftMargin = (int) (Math.random() * (screenWidth - Math.min(screenWidth, viewWidth))); + } + // + +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeFlickAdvanceAnimation.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeFlickAdvanceAnimation.java new file mode 100644 index 0000000..48a11b2 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeFlickAdvanceAnimation.java @@ -0,0 +1,216 @@ +package com.easefun.polyvsdk.marquee.animation; + +import android.animation.Animator; +import android.animation.ObjectAnimator; +import android.os.Build; +import androidx.annotation.Nullable; +import android.view.View; +import android.view.ViewGroup.MarginLayoutParams; +import android.view.ViewTreeObserver; +import android.view.animation.LinearInterpolator; + +import java.util.HashMap; + +/** + * 跑马灯 闪烁增强动画类 + */ +public class PLVMarqueeFlickAdvanceAnimation extends PLVMarqueeFlickAnimation { + + // + private static final String TAG = "PLVMarqueeFlickAdvanceA"; + + @Nullable + private View secondView; + + protected ObjectAnimator secondFlickObjectAnimator1 = new ObjectAnimator(); + protected ObjectAnimator secondFlickObjectAnimator2 = new ObjectAnimator(); + + private boolean isSetSecondParams = false; + // + + // + @Override + public void setViews(HashMap viewMap) { + super.setViews(viewMap); + secondView = viewMap.get(VIEW_SECOND); + if (secondView == null) { + return; + } + secondView.setAlpha(0); + } + // + + // + @Override + public void start() { + if (secondView == null) { + return; + } + if (animationStatus == PAUSE) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (secondFlickObjectAnimator1.isPaused()) { + secondFlickObjectAnimator1.resume(); + } else if (secondFlickObjectAnimator2.isPaused()) { + secondFlickObjectAnimator2.resume(); + } + } else { + secondFlickObjectAnimator1.start(); + } + } else { + setSecondAnimation(); + secondFlickObjectAnimator1.start(); + } + super.start(); + } + + @Override + public void pause() { + super.pause(); + if (secondView == null) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (secondFlickObjectAnimator1.isStarted()) { + secondFlickObjectAnimator1.pause(); + } + if (secondFlickObjectAnimator2.isStarted()) { + secondFlickObjectAnimator2.pause(); + } + } else { + stopSecondAnimator(); + } + secondView.setAlpha(0); + } + + @Override + public void stop() { + super.stop(); + if (secondView == null) { + return; + } + stopSecondAnimator(); + } + + @Override + public void destroy() { + super.destroy(); + secondFlickObjectAnimator1 = null; + secondFlickObjectAnimator2 = null; + } + + @Override + public void onParentSizeChanged(final View parentView) { + super.onParentSizeChanged(parentView); + if (secondView == null) { + return; + } + secondView.clearAnimation(); + secondView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + screenWidth = parentView.getWidth(); + screenHeight = parentView.getHeight(); + if (Build.VERSION.SDK_INT >= 16) { + secondView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } else { + secondView.getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + if (animationStatus == STARTED) { + stopSecondAnimator(); + setSecondAnimation(); + secondFlickObjectAnimator1.start(); + } else if (animationStatus == PAUSE) { + stopSecondAnimator(); + setSecondAnimation(); + } + } + }); + } + // + + // + private void setSecondAnimation() { + if (isSetSecondParams) { + return; + } + if (secondView == null) { + return; + } + isSetSecondParams = true; + secondFlickObjectAnimator1 = ObjectAnimator.ofFloat(secondView, "alpha", 0f, 1f); + secondFlickObjectAnimator1.setDuration(tweenTime); + secondFlickObjectAnimator1.setStartDelay(isAlwaysShowWhenRun ? 0 : interval); + secondFlickObjectAnimator1.setInterpolator(new LinearInterpolator()); + secondFlickObjectAnimator1.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + setSecondActiveRect(); + } + + @Override + public void onAnimationEnd(Animator animation) { + if (animationStatus == STARTED + || (flickObjectAnimator1 != null && flickObjectAnimator1.isStarted()) + || (flickObjectAnimator2 != null && flickObjectAnimator2.isStarted())) { + secondFlickObjectAnimator2.start(); + } + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + }); + + secondFlickObjectAnimator2 = ObjectAnimator.ofFloat(secondView, "alpha", 1f, 0f); + secondFlickObjectAnimator2.setDuration(tweenTime); + secondFlickObjectAnimator2.setStartDelay(lifeTime); + secondFlickObjectAnimator2.setInterpolator(new LinearInterpolator()); + secondFlickObjectAnimator2.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + } + + @Override + public void onAnimationEnd(Animator animation) { + if (animationStatus == STARTED + || (flickObjectAnimator1 != null && flickObjectAnimator1.isStarted()) + || (flickObjectAnimator2 != null && flickObjectAnimator2.isStarted())) { + secondFlickObjectAnimator1.start(); + } + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + }); + } + + // 设置活动区域 + protected void setSecondActiveRect() { + if (secondView == null) { + return; + } + MarginLayoutParams lp = (MarginLayoutParams) secondView.getLayoutParams(); + lp.topMargin = (int) (Math.random() * (screenHeight - Math.min(screenHeight, secondView.getHeight()))); + lp.leftMargin = (int) (Math.random() * (screenWidth - Math.min(screenWidth, secondView.getWidth()))); + secondView.setLayoutParams(lp); + } + + private void stopSecondAnimator() { + secondFlickObjectAnimator1.cancel(); + secondFlickObjectAnimator1.end(); + secondFlickObjectAnimator2.cancel(); + secondFlickObjectAnimator2.end(); + isSetSecondParams = false; + } + // + +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeFlickAnimation.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeFlickAnimation.java new file mode 100644 index 0000000..0d0d9a6 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeFlickAnimation.java @@ -0,0 +1,237 @@ +package com.easefun.polyvsdk.marquee.animation; + +import android.animation.Animator; +import android.animation.ObjectAnimator; +import android.os.Build; +import androidx.annotation.Nullable; +import android.view.View; +import android.view.ViewTreeObserver; +import android.view.animation.Animation; +import android.view.animation.LinearInterpolator; +import android.widget.RelativeLayout; + +import java.util.HashMap; + +/** + * 跑马灯 闪烁动画类 + */ +public class PLVMarqueeFlickAnimation extends PLVMarqueeAnimation { + private static final String TAG = "PLVMarqueeFlickAnimatio"; + + // + protected int lifeTime = 0; + protected int interval = 0; + protected int tweenTime = 0; + + private int repeatCount = Animation.INFINITE; + private int repeatMode = Animation.RESTART; + @Nullable + protected RelativeLayout.LayoutParams layoutParams; + @Nullable + protected View mainView; + + protected ObjectAnimator flickObjectAnimator1 = new ObjectAnimator(); + protected ObjectAnimator flickObjectAnimator2 = new ObjectAnimator(); + // + + // + @Override + public void setViews(HashMap viewMap) { + mainView = viewMap.get(VIEW_MAIN); + if (mainView == null) { + return; + } + layoutParams = (RelativeLayout.LayoutParams) mainView.getLayoutParams(); + mainView.setAlpha(0); + } + + @Override + public void setParams(HashMap paramMap) { + this.viewWidth = paramMap.containsKey(PARAM_VIEW_WIDTH) ? paramMap.get(PARAM_VIEW_WIDTH) : 0; + this.viewHeight = paramMap.containsKey(PARAM_VIEW_HEIGHT) ? paramMap.get(PARAM_VIEW_HEIGHT) : 0; + this.screenWidth = paramMap.containsKey(PARAM_SCREEN_WIDTH) ? paramMap.get(PARAM_SCREEN_WIDTH) : 0; + this.screenHeight = paramMap.containsKey(PARAM_SCREEN_HEIGHT) ? paramMap.get(PARAM_SCREEN_HEIGHT) : 0; + this.lifeTime = paramMap.containsKey(PARAM_LIFE_TIME) ? paramMap.get(PARAM_LIFE_TIME) : 0; + this.interval = paramMap.containsKey(PARAM_INTERVAL) ? paramMap.get(PARAM_INTERVAL) : 0; + this.tweenTime = paramMap.containsKey(PARAM_TWEEN_TIME) ? paramMap.get(PARAM_TWEEN_TIME) : 0; + if (paramMap.containsKey(PARAM_ISALWAYS_SHOW_WHEN_RUN)) { + this.isAlwaysShowWhenRun = paramMap.get(PARAM_ISALWAYS_SHOW_WHEN_RUN) == 1; + } + if (paramMap.containsKey(PARAM_HIDE_WHEN_PAUSE)) { + this.isHiddenWhenPause = paramMap.get(PARAM_HIDE_WHEN_PAUSE) == 1; + } + } + // + + // + @Override + public void start() { + if (mainView == null) { + return; + } + if (animationStatus == PAUSE) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (flickObjectAnimator1.isPaused()) { + flickObjectAnimator1.resume(); + } else if (flickObjectAnimator2.isPaused()) { + flickObjectAnimator2.resume(); + } + } else { + flickObjectAnimator1.start(); + } + + animationStatus = STARTED; + } else { + setAnimation(); + flickObjectAnimator1.start(); + } + } + + @Override + public void pause() { + if (mainView == null) { + return; + } + animationStatus = PAUSE; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (flickObjectAnimator1.isStarted()) { + flickObjectAnimator1.pause(); + } + if (flickObjectAnimator2.isStarted()) { + flickObjectAnimator2.pause(); + } + } else { + stop(); + } + if (isHiddenWhenPause) { + mainView.setAlpha(0); + } + } + + @Override + public void stop() { + if (mainView == null) { + return; + } + animationStatus = STOP; + flickObjectAnimator1.cancel(); + flickObjectAnimator1.end(); + flickObjectAnimator2.cancel(); + flickObjectAnimator2.end(); + } + + @Override + public void destroy() { + flickObjectAnimator1 = null; + flickObjectAnimator2 = null; + } + + @Override + public void onParentSizeChanged(final View parentView) { + if (mainView == null) { + return; + } + mainView.clearAnimation(); + mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + screenWidth = parentView.getWidth(); + screenHeight = parentView.getHeight(); + if (Build.VERSION.SDK_INT >= 16) { + mainView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } else { + mainView.getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + if (animationStatus == STARTED) { + stop(); + start(); + } else if (animationStatus == PAUSE) { + stop(); + setAnimation(); + } + } + }); + } + // + + // + protected void setAnimation() { + if (animationStatus == STARTED) { + return; + } + if (mainView == null) { + return; + } + animationStatus = STARTED; + float minAlpha = 0; + if (isAlwaysShowWhenRun) { + minAlpha = 0.1f; + } + flickObjectAnimator1 = ObjectAnimator.ofFloat(mainView, "alpha", minAlpha, 1f); + flickObjectAnimator1.setDuration(tweenTime); + flickObjectAnimator1.setStartDelay(isAlwaysShowWhenRun ? 0 : interval); + flickObjectAnimator1.setInterpolator(new LinearInterpolator()); + flickObjectAnimator1.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + mainView.setAlpha(0); + setMainActiveRect(); + mainView.setLayoutParams(layoutParams); + } + + @Override + public void onAnimationEnd(Animator animation) { + mainView.setAlpha(1); + if (animationStatus == STARTED) { + flickObjectAnimator2.start(); + } + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + }); + + flickObjectAnimator2 = ObjectAnimator.ofFloat(mainView, "alpha", 1f, minAlpha); + flickObjectAnimator2.setDuration(tweenTime); + flickObjectAnimator2.setStartDelay(lifeTime); + flickObjectAnimator2.setInterpolator(new LinearInterpolator()); + flickObjectAnimator2.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + mainView.setAlpha(1); + + } + + @Override + public void onAnimationEnd(Animator animation) { + mainView.setAlpha(0); + if (animationStatus == STARTED) { + flickObjectAnimator1.start(); + } + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + }); + } + + // 设置活动区域 + protected void setMainActiveRect() { + if (layoutParams == null) { + return; + } + layoutParams.topMargin = (int) (Math.random() * (screenHeight - Math.min(screenHeight, viewHeight))); + layoutParams.leftMargin = (int) (Math.random() * (screenWidth - Math.min(screenWidth, viewWidth))); + } + // +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeMergeRollFlickAnimation.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeMergeRollFlickAnimation.java new file mode 100644 index 0000000..32517ff --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeMergeRollFlickAnimation.java @@ -0,0 +1,149 @@ +package com.easefun.polyvsdk.marquee.animation; + +import android.animation.Animator; +import android.animation.ObjectAnimator; +import android.os.Build; +import android.util.Log; +import android.view.animation.LinearInterpolator; + +import java.util.HashMap; + +/** + * 跑马灯 滚动和闪烁混合动画类 + */ +public class PLVMarqueeMergeRollFlickAnimation extends PLVMarqueeRollAnimation { + + // + private static final String TAG = "PLVMarqueeMergeRollFlic"; + private int tweenTime = 0; + private ObjectAnimator flickObjectAnimation1 = new ObjectAnimator(); + private ObjectAnimator flickObjectAnimation2 = new ObjectAnimator(); + // + + // + @Override + public void setParams(HashMap paramMap) { + super.setParams(paramMap); + tweenTime = paramMap.containsKey(PARAM_TWEEN_TIME) ? paramMap.get(PARAM_TWEEN_TIME) : 0; + } + // + + // + @Override + public void start() { + super.start(); + if (mainView == null) { + return; + } + if (animationStatus == PAUSE) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (flickObjectAnimation1.isPaused()) { + flickObjectAnimation1.resume(); + } else if (flickObjectAnimation2.isPaused()) { + flickObjectAnimation2.resume(); + } + } else { + flickObjectAnimation1.start(); + } + animationStatus = STARTED; + } else { + setAnimation(); + flickObjectAnimation1.start(); + } + } + + @Override + public void pause() { + super.pause(); + if (mainView == null) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (flickObjectAnimation1.isStarted()) { + flickObjectAnimation1.pause(); + } + if (flickObjectAnimation2.isStarted()) { + flickObjectAnimation2.pause(); + } + } else { + stop(); + } + } + + @Override + public void stop() { + super.stop(); + if (mainView == null) { + return; + } + flickObjectAnimation1.cancel(); + flickObjectAnimation1.end(); + flickObjectAnimation2.cancel(); + flickObjectAnimation2.end(); + } + + @Override + public void destroy() { + super.destroy(); + flickObjectAnimation1 = null; + flickObjectAnimation2 = null; + } + // + + // + @Override + protected void setAnimation() { + super.setAnimation(); + final float minAlpha = isAlwaysShowWhenRun ? 0.1F : 0F; + flickObjectAnimation1 = ObjectAnimator.ofFloat(mainView, "alpha", minAlpha, 1F); + flickObjectAnimation1.setDuration(tweenTime); + flickObjectAnimation1.setInterpolator(new LinearInterpolator()); + flickObjectAnimation1.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + } + + @Override + public void onAnimationEnd(Animator animation) { + Log.i(TAG, "onAnimationEnd: "); + if (animationStatus == STARTED) { + flickObjectAnimation2.start(); + } + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + }); + + flickObjectAnimation2 = ObjectAnimator.ofFloat(mainView, "alpha", 1F, minAlpha); + flickObjectAnimation2.setDuration(tweenTime); + flickObjectAnimation2.setStartDelay(isAlwaysShowWhenRun ? 0 : interval); + flickObjectAnimation2.setInterpolator(new LinearInterpolator()); + flickObjectAnimation2.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + } + + @Override + public void onAnimationEnd(Animator animation) { + if (animationStatus == STARTED) { + flickObjectAnimation1.start(); + } + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + }); + } + // +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeRoll15PercentAnimation.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeRoll15PercentAnimation.java new file mode 100644 index 0000000..d2c4610 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeRoll15PercentAnimation.java @@ -0,0 +1,37 @@ +package com.easefun.polyvsdk.marquee.animation; + +/** + * 跑马灯 在总区域上下15%部分滚动的动画类 + */ +public class PLVMarqueeRoll15PercentAnimation extends PLVMarqueeRollAnimation { + + // + // 设置活动区域 + @Override + protected void setActiveRect() { + if (layoutParams == null) { + return; + } + boolean showOnTopArea = Math.random() < 0.5; + float availableViewHeight = screenHeight * 0.15F; + if (showOnTopArea) { + // 在上面显示 + if (viewHeight < availableViewHeight) { + int space = (int) (availableViewHeight - viewHeight); + layoutParams.topMargin = (int) (Math.random() * space); + } else { + layoutParams.topMargin = 0; + } + } else { + // 在下面显示 + if (viewHeight < availableViewHeight) { + int bottomAreaTop = (int) (screenHeight - availableViewHeight); + int space = (int) (availableViewHeight - viewHeight); + layoutParams.topMargin = (int) (bottomAreaTop + Math.random() * space); + } else { + layoutParams.topMargin = screenHeight - Math.min(screenHeight, viewHeight); + } + } + } + // +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeRollAdvanceAnimation.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeRollAdvanceAnimation.java new file mode 100644 index 0000000..ae141a7 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeRollAdvanceAnimation.java @@ -0,0 +1,177 @@ +package com.easefun.polyvsdk.marquee.animation; + +import android.animation.Animator; +import android.animation.ObjectAnimator; +import android.os.Build; +import androidx.annotation.Nullable; +import android.view.View; +import android.view.ViewGroup.MarginLayoutParams; +import android.view.ViewTreeObserver; +import android.view.animation.LinearInterpolator; + +import java.util.HashMap; + +/** + * 跑马灯 滚动 增强的动画类 + */ +public class PLVMarqueeRollAdvanceAnimation extends PLVMarqueeRollAnimation { + private static final String TAG = "PLVMarqueeRollAdvanceAn"; + + // + @Nullable + private View secondView; + + protected ObjectAnimator secondAnimator = new ObjectAnimator(); + + private boolean isSetSecondParams = false; + // + + // + @Override + public void setViews(HashMap viewMap) { + super.setViews(viewMap); + + secondView = viewMap.get(VIEW_SECOND); + if (secondView == null) { + return; + } + secondView.setAlpha(0F); + } + // + + // + @Override + public void start() { + if (secondView == null) { + return; + } + if (animationStatus == PAUSE) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + secondAnimator.resume(); + } else { + secondAnimator.start(); + } + if (secondAnimator.isRunning()) { + secondView.setAlpha(1F); + } + } else { + setSecondAnimation(); + secondAnimator.start(); + } + super.start(); + } + + @Override + public void pause() { + super.pause(); + if (secondView == null) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + secondAnimator.pause(); + } else { + stopSecondAnimator(); + } + secondView.setAlpha(0F); + } + + @Override + public void stop() { + super.stop(); + stopSecondAnimator(); + } + + @Override + public void destroy() { + super.destroy(); + secondAnimator = null; + } + + @Override + public void onParentSizeChanged(final View parentView) { + super.onParentSizeChanged(parentView); + if (secondView == null) { + return; + } + secondView.clearAnimation(); + secondView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + screenWidth = parentView.getWidth(); + screenHeight = parentView.getHeight(); + if (Build.VERSION.SDK_INT >= 16) { + secondView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } else { + secondView.getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + if (animationStatus == STARTED) { + stopSecondAnimator(); + setSecondAnimation(); + secondAnimator.start(); + } else if (animationStatus == PAUSE) { + stopSecondAnimator(); + setSecondAnimation(); + } + } + }); + } + // + + // + private void setSecondAnimation() { + if (isSetSecondParams) { + return; + } + if (secondView == null) { + return; + } + isSetSecondParams = true; + final float startX = isAlwaysShowWhenRun ? screenWidth - secondView.getWidth() : screenWidth; + final float endX = isAlwaysShowWhenRun ? 0 : -secondView.getWidth(); + secondAnimator = ObjectAnimator.ofFloat(secondView, "translationX", startX, endX); + secondAnimator.setDuration(duration); + secondAnimator.setStartDelay(isAlwaysShowWhenRun ? 0 : interval); + secondAnimator.setInterpolator(new LinearInterpolator()); + secondAnimator.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + secondView.setAlpha(1F); + setSecondActiveRect(); + } + + @Override + public void onAnimationEnd(Animator animation) { + secondView.setAlpha(0F); + if (animationStatus == STARTED + || (mainAnimator != null && mainAnimator.isStarted())) { + animation.start(); + } + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + }); + } + + protected void setSecondActiveRect() { + if (secondView == null) { + return; + } + MarginLayoutParams lp = (MarginLayoutParams) secondView.getLayoutParams(); + lp.topMargin = (int) (Math.random() * (screenHeight - Math.min(screenHeight, secondView.getHeight()))); + secondView.setLayoutParams(lp); + } + + private void stopSecondAnimator() { + secondAnimator.cancel(); + secondAnimator.end(); + isSetSecondParams = false; + } + // + +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeRollAnimation.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeRollAnimation.java new file mode 100644 index 0000000..ff550c4 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/animation/PLVMarqueeRollAnimation.java @@ -0,0 +1,193 @@ +package com.easefun.polyvsdk.marquee.animation; + +import android.animation.Animator; +import android.animation.ObjectAnimator; +import android.os.Build; +import androidx.annotation.Nullable; +import android.view.View; +import android.view.ViewTreeObserver; +import android.view.animation.LinearInterpolator; +import android.widget.RelativeLayout; + +import java.util.HashMap; + +public class PLVMarqueeRollAnimation extends PLVMarqueeAnimation { + private static final String TAG = "PLVMarqueeRollAnimation"; + + // + protected int duration; + protected int interval; + + @Nullable + protected RelativeLayout.LayoutParams layoutParams; + @Nullable + protected View mainView; + + protected ObjectAnimator mainAnimator = new ObjectAnimator(); + // + + // + @Override + public void setViews(HashMap viewMap) { + mainView = viewMap.get(VIEW_MAIN); + if (mainView == null) { + return; + } + layoutParams = (RelativeLayout.LayoutParams) mainView.getLayoutParams(); + mainView.setVisibility(View.GONE); + } + + @Override + public void setParams(HashMap paramMap) { + this.viewWidth = paramMap.containsKey(PARAM_VIEW_WIDTH) ? paramMap.get(PARAM_VIEW_WIDTH) : 0; + this.viewHeight = paramMap.containsKey(PARAM_VIEW_HEIGHT) ? paramMap.get(PARAM_VIEW_HEIGHT) : 0; + this.screenWidth = paramMap.containsKey(PARAM_SCREEN_WIDTH) ? paramMap.get(PARAM_SCREEN_WIDTH) : 0; + this.screenHeight = paramMap.containsKey(PARAM_SCREEN_HEIGHT) ? paramMap.get(PARAM_SCREEN_HEIGHT) : 0; + this.duration = paramMap.containsKey(PARAM_DURATION) ? paramMap.get(PARAM_DURATION) : 0; + this.interval = paramMap.containsKey(PARAM_INTERVAL) ? paramMap.get(PARAM_INTERVAL) : 0; + if (paramMap.containsKey(PARAM_ISALWAYS_SHOW_WHEN_RUN)) { + this.isAlwaysShowWhenRun = paramMap.get(PARAM_ISALWAYS_SHOW_WHEN_RUN) == 1; + } + if (paramMap.containsKey(PARAM_HIDE_WHEN_PAUSE)) { + this.isHiddenWhenPause = paramMap.get(PARAM_HIDE_WHEN_PAUSE) == 1; + } + } + // + + // + @Override + public void start() { + if (mainView == null) { + return; + } + if (animationStatus == PAUSE) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + mainAnimator.resume(); + } else { + mainAnimator.start(); + } + animationStatus = STARTED; + if (mainAnimator.isRunning()) { + mainView.setVisibility(View.VISIBLE); + } + } else { + setAnimation(); + mainAnimator.start(); + } + } + + @Override + public void pause() { + if (mainView == null) { + return; + } + animationStatus = PAUSE; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + mainAnimator.pause(); + } else { + stop(); + } + if (isHiddenWhenPause) { + mainView.setVisibility(View.GONE); + } + } + + @Override + public void stop() { + if (mainView == null) { + return; + } + animationStatus = STOP; + mainAnimator.cancel(); + mainAnimator.end(); + } + + @Override + public void destroy() { + mainAnimator = null; + } + + @Override + public void onParentSizeChanged(final View parentView) { + if (mainView == null) { + return; + } + mainView.clearAnimation(); + mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + screenWidth = parentView.getWidth(); + screenHeight = parentView.getHeight(); + if (Build.VERSION.SDK_INT >= 16) { + mainView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } else { + mainView.getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + if (animationStatus == STARTED) { + stop(); + start(); + } else if (animationStatus == PAUSE) { + stop(); + setAnimation(); + } + } + }); + } + // + + // + + /** + * 设置动画 + */ + protected void setAnimation() { + if (animationStatus == STARTED) { + return; + } + if (mainView == null) { + return; + } + animationStatus = STARTED; + final float startX = isAlwaysShowWhenRun && screenWidth > viewWidth ? screenWidth - viewWidth : screenWidth; + final float endX = isAlwaysShowWhenRun && screenWidth > viewWidth ? 0 : -viewWidth; + mainAnimator = ObjectAnimator.ofFloat(mainView, "translationX", startX, endX); + mainAnimator.setStartDelay(isAlwaysShowWhenRun ? 0 : interval); + mainAnimator.setDuration(duration); + mainAnimator.setInterpolator(new LinearInterpolator()); + mainAnimator.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + mainView.setVisibility(View.VISIBLE); + setActiveRect(); + mainView.setLayoutParams(layoutParams); + } + + @Override + public void onAnimationEnd(Animator animation) { + mainView.setVisibility(View.GONE); + if (animationStatus == STARTED) { + animation.start(); + } + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + }); + } + + /** + * 设置 滚动动画的位置 + */ + protected void setActiveRect() { + if (layoutParams == null) { + return; + } + layoutParams.topMargin = (int) (Math.random() * (screenHeight - Math.min(screenHeight, viewHeight))); + } + // +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/model/PLVMarqueeAnimationVO.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/model/PLVMarqueeAnimationVO.java new file mode 100644 index 0000000..c63fc20 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/model/PLVMarqueeAnimationVO.java @@ -0,0 +1,131 @@ +package com.easefun.polyvsdk.marquee.model; + +import androidx.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * 跑马灯 动画样式的描述类 + */ +public class PLVMarqueeAnimationVO { + + // + // 动画类型 + public static final int ROLL = 1; + public static final int FLICK = 2; + public static final int MERGE_ROLL_FLICK = 3; + public static final int ROLL_15PERCENT = 4; + public static final int FLICK_15PERCENT = 5; + public static final int ROLL_ADVANCE = 6; + public static final int FLICK_ADVANCE = 7; + + @IntDef({ROLL, FLICK, MERGE_ROLL_FLICK, ROLL_15PERCENT, FLICK_15PERCENT, ROLL_ADVANCE, FLICK_ADVANCE}) + @Retention(RetentionPolicy.SOURCE) + public @interface AnimationType { + } + + // 动画类型的选择 + @AnimationType + private int animationType; + + // 跑马灯文字移动指定像素所需时间,单位为(秒 /10) + private int speed; + // 跑马灯文本隐藏间隔时间,单位为秒 + private int interval; + // 跑马灯文本显示时间,单位为秒 + private int lifeTime; + // 跑马灯文本渐隐渐现时间,单位为秒 + private int tweenTime; + // 当跑马灯暂停时,设置跑马灯是否隐藏 + private boolean isHiddenWhenPause = true; + // 当跑马灯运行时,是否总是显示 + private boolean isAlwaysShowWhenRun = false; + + // + + // + public PLVMarqueeAnimationVO() { + animationType = ROLL; + speed = 200; + interval = 5; + lifeTime = 3; + tweenTime = 1; + } + // + + // + public int getAnimationType() { + return animationType; + } + + public PLVMarqueeAnimationVO setAnimationType(@AnimationType int animationType) { + this.animationType = animationType; + return this; + } + + public PLVMarqueeAnimationVO setSpeed(int speed) { + if (speed > 0) { + this.speed = speed; + } + return this; + } + + public PLVMarqueeAnimationVO setInterval(int interval) { + if (interval >= 0) { + this.interval = interval; + } + return this; + } + + public PLVMarqueeAnimationVO setLifeTime(int lifeTime) { + if (lifeTime >= 0) { + this.lifeTime = lifeTime; + } + return this; + } + + public PLVMarqueeAnimationVO setTweenTime(int tweenTime) { + if (tweenTime >= 0) { + this.tweenTime = tweenTime; + } + return this; + } + + public PLVMarqueeAnimationVO setAlwaysShowWhenRun(boolean isAlwaysShowWhenRun) { + this.isAlwaysShowWhenRun = isAlwaysShowWhenRun; + return this; + } + + public PLVMarqueeAnimationVO setHiddenWhenPause(boolean hiddenWhenPause) { + this.isHiddenWhenPause = hiddenWhenPause; + return this; + } + + public int getSpeed() { + return speed; + } + + public int getInterval() { + return interval; + } + + public int getLifeTime() { + return lifeTime; + } + + public int getTweenTime() { + return tweenTime; + } + + public boolean isAlwaysShowWhenRun(){ + return isAlwaysShowWhenRun; + } + + public boolean isHiddenWhenPause(){ + return isHiddenWhenPause; + } + + // + +} \ No newline at end of file diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/model/PLVMarqueeModel.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/model/PLVMarqueeModel.java new file mode 100644 index 0000000..b49bed5 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/model/PLVMarqueeModel.java @@ -0,0 +1,226 @@ +package com.easefun.polyvsdk.marquee.model; + + +import android.util.Log; + +import org.json.JSONException; +import org.json.JSONObject; + +/** + * 跑马灯 设置的字体样式 和 动画样式的描述类 + */ +public class PLVMarqueeModel { + + // + private static final String TAG = "PLVMarqueeModel"; + private PLVMarqueeTextVO mainTextVO; + private PLVMarqueeTextVO secondTextVO; + + private PLVMarqueeAnimationVO animationVO; + // + + // + public PLVMarqueeModel() { + mainTextVO = new PLVMarqueeTextVO(); + secondTextVO = new PLVMarqueeTextVO(); + animationVO = new PLVMarqueeAnimationVO(); + } + // + + // + public PLVMarqueeTextVO getMainTextVO() { + return mainTextVO; + } + + public PLVMarqueeTextVO getSecondTextVO() { + return secondTextVO; + } + + public PLVMarqueeAnimationVO getAnimationVO() { + return animationVO; + } + + public PLVMarqueeModel setUserName(String userName) { + mainTextVO.setContent(userName); + return this; + } + + public PLVMarqueeModel setFontColor(int color) { + mainTextVO.setFontColor(color); + return this; + } + + public PLVMarqueeModel setFontSize(int fontSize) { + mainTextVO.setFontSize(fontSize); + return this; + } + + public PLVMarqueeModel setFontAlpha(int fontAlpha) { + mainTextVO.setFontAlpha(fontAlpha); + return this; + } + + public PLVMarqueeModel setFilter(boolean isFilter) { + mainTextVO.setFilter(isFilter); + return this; + } + + public PLVMarqueeModel setFilterColor(int color) { + mainTextVO.setFilterColor(color); + return this; + } + + public PLVMarqueeModel setFilterAlpha(int filterAlpha) { + mainTextVO.setFilterAlpha(filterAlpha); + return this; + } + + public PLVMarqueeModel setFilterStrength(int strength) { + mainTextVO.setFilterStrength(strength); + return this; + } + + public PLVMarqueeModel setFilterBlurX(int filterBlurX) { + mainTextVO.setFilterBlurX(filterBlurX); + return this; + } + + public PLVMarqueeModel setFilterBlurY(int filterBlurY) { + mainTextVO.setFilterBlurY(filterBlurY); + return this; + } + + @PLVMarqueeAnimationVO.AnimationType + public int getSetting() { + return animationVO.getAnimationType(); + } + + public PLVMarqueeModel setSetting(@PLVMarqueeAnimationVO.AnimationType int animationType) { + animationVO.setAnimationType(animationType); + return this; + } + + public PLVMarqueeModel setSpeed(int speed) { + animationVO.setSpeed(speed); + return this; + } + + public PLVMarqueeModel setInterval(int interval) { + animationVO.setInterval(interval); + return this; + } + + public PLVMarqueeModel setLifeTime(int lifeTime) { + animationVO.setLifeTime(lifeTime); + return this; + } + + public PLVMarqueeModel setTweenTime(int tweenTime) { + animationVO.setTweenTime(tweenTime); + return this; + } + + public PLVMarqueeModel setAlwaysShowWhenRun(boolean isAlwaysShowWhenRun) { + animationVO.setAlwaysShowWhenRun(isAlwaysShowWhenRun); + return this; + } + + public PLVMarqueeModel setHiddenWhenPause(boolean hiddenWhenPause) { + animationVO.setHiddenWhenPause(hiddenWhenPause); + return this; + } + + /** + * 注意,该方法需要在确定了animationType 和 mainTextModel后,再执行 + * 只被PLVMarqueeView调用 + */ + public void setSecondDefaultTextVO() { + switch (animationVO.getAnimationType()) { + case PLVMarqueeAnimationVO.ROLL_ADVANCE: + case PLVMarqueeAnimationVO.FLICK_ADVANCE: + secondTextVO.setContent(mainTextVO.getContent()); + secondTextVO.setFontColor(mainTextVO.getFontColor()); + secondTextVO.setFontSize(mainTextVO.getFontSize()); + secondTextVO.setFontAlpha((int) (0.01F * 255)); + secondTextVO.setFilter(mainTextVO.isFilter()); + secondTextVO.setFilterBlurY(mainTextVO.getFilterBlurY()); + secondTextVO.setFilterBlurX(mainTextVO.getFilterBlurX()); + secondTextVO.setFilterStrength(mainTextVO.getFilterStrength()); + secondTextVO.setFilterAlpha((int) (0.01F * 255)); + secondTextVO.setFilterColor(mainTextVO.getFilterColor()); + break; + default: + break; + } + } + + public void setParamsByJsonObject(JSONObject jsonObject) { + if (jsonObject != null) { + try { + if (!jsonObject.isNull("userName")) { + Log.i(TAG, "setParamsByJsonObject: userName:" + jsonObject.getString("userName")); + setUserName(jsonObject.getString("userName")); + } + if (!jsonObject.isNull("fontSize")) { + Log.i(TAG, "setFontSize: fontSize:" + jsonObject.getInt("fontSize")); + setFontSize(jsonObject.getInt("fontSize")); + } + if (!jsonObject.isNull("fontColor")) { + Log.i(TAG, "setFontColor: fontColor:" + jsonObject.getInt("fontColor")); + setFontColor(jsonObject.getInt("fontColor")); + } + if (!jsonObject.isNull("fontAlpha")) { + Log.i(TAG, "setFontAlpha: fontAlpha:" + jsonObject.getInt("fontAlpha")); + setFontAlpha(jsonObject.getInt("fontAlpha")); + } + if (!jsonObject.isNull("filter")) { + Log.i(TAG, "setFilter: filter:" + jsonObject.getBoolean("filter")); + setFilter(jsonObject.getBoolean("filter")); + } + if (!jsonObject.isNull("filterColor")) { + Log.i(TAG, "setFilterColor: filterColor:" + jsonObject.getInt("filterColor")); + setFilterColor(jsonObject.getInt("filterColor")); + } + if (!jsonObject.isNull("filterBlurX")) { + Log.i(TAG, "setFilterBlurX: filterBlurX:" + jsonObject.getInt("filterBlurX")); + setFilterBlurX(jsonObject.getInt("filterBlurX")); + } + if (!jsonObject.isNull("filterBlurY")) { + Log.i(TAG, "setFilterBlurX: filterBlurY:" + jsonObject.getInt("filterBlurY")); + setFilterBlurY(jsonObject.getInt("filterBlurY")); + } + if (!jsonObject.isNull("filterAlpha")) { + Log.i(TAG, "setFilterAlpha: filterAlpha:" + jsonObject.getInt("filterAlpha")); + setFilterAlpha(jsonObject.getInt("filterAlpha")); + } + if (!jsonObject.isNull("filterStrength")) { + Log.i(TAG, "setFilterStrength: filterStrength:" + jsonObject.getInt("filterStrength")); + setFilterStrength(jsonObject.getInt("filterStrength")); + } + if (!jsonObject.isNull("setting")) { + Log.i(TAG, "setSetting: setting:" + jsonObject.getInt("setting")); + setSetting(jsonObject.getInt("setting")); + } + if (!jsonObject.isNull("speed")) { + Log.i(TAG, "setSpeed: speed:" + jsonObject.getInt("speed")); + setSpeed(jsonObject.getInt("speed")); + } + if (!jsonObject.isNull("interval")) { + Log.i(TAG, "setInterval: interval:" + jsonObject.getInt("interval")); + setInterval(jsonObject.getInt("interval")); + } + if (!jsonObject.isNull("lifeTime")) { + Log.i(TAG, "setLifeTime: lifeTime:" + jsonObject.getInt("lifeTime")); + setLifeTime(jsonObject.getInt("lifeTime")); + } + if (!jsonObject.isNull("tweenTime")) { + Log.i(TAG, "setTweenTime: tweenTime:" + jsonObject.getInt("tweenTime")); + setTweenTime(jsonObject.getInt("tweenTime")); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + // +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/model/PLVMarqueeTextVO.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/model/PLVMarqueeTextVO.java new file mode 100644 index 0000000..b4617cc --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/marquee/model/PLVMarqueeTextVO.java @@ -0,0 +1,134 @@ +package com.easefun.polyvsdk.marquee.model; + +import android.graphics.Color; + +/** + * 跑马灯 字体样式的描述类 + */ +public class PLVMarqueeTextVO { + + // + private String content; + + private int fontColor; + private int fontSize; + private int fontAlpha; + + private boolean isFilter; + private float filterAlpha; + private int filterColor; + private int filterBlurX; + private int filterBlurY; + private int filterStrength; + // + + // + public PLVMarqueeTextVO() { + content = "Polyv跑马灯"; + + fontColor = Color.BLACK; + fontSize = 30; + fontAlpha = 255; + + isFilter = false; + filterColor = Color.BLACK; + filterAlpha = 255; + filterStrength = 4; + filterBlurX = 2; + filterBlurY = 2; + } + // + + // + public int getFontColor() { + return fontColor; + } + + public PLVMarqueeTextVO setFontColor(int fontColor) { + this.fontColor = fontColor; + return this; + } + + public int getFontSize() { + return fontSize; + } + + public PLVMarqueeTextVO setFontSize(int fontSize) { + this.fontSize = fontSize; + return this; + } + + public int getFontAlpha() { + return fontAlpha; + } + + public PLVMarqueeTextVO setFontAlpha(int fontAlpha) { + this.fontAlpha = fontAlpha; + return this; + } + + public boolean isFilter() { + return isFilter; + } + + public PLVMarqueeTextVO setFilter(boolean filter) { + isFilter = filter; + return this; + } + + public float getFilterAlpha() { + return filterAlpha; + } + + public PLVMarqueeTextVO setFilterAlpha(float filterAlpha) { + this.filterAlpha = filterAlpha; + return this; + } + + public int getFilterColor() { + return filterColor; + } + + public PLVMarqueeTextVO setFilterColor(int filterColor) { + this.filterColor = filterColor; + return this; + } + + public int getFilterBlurX() { + return filterBlurX; + } + + public PLVMarqueeTextVO setFilterBlurX(int filterBlurX) { + this.filterBlurX = filterBlurX; + return this; + } + + public int getFilterBlurY() { + return filterBlurY; + } + + public PLVMarqueeTextVO setFilterBlurY(int filterBlurY) { + this.filterBlurY = filterBlurY; + return this; + } + + public int getFilterStrength() { + return filterStrength; + } + + public PLVMarqueeTextVO setFilterStrength(int filterStrength) { + this.filterStrength = filterStrength; + return this; + } + + public String getContent() { + return content; + } + + public PLVMarqueeTextVO setContent(String content) { + this.content = content; + return this; + } + // +} + diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/permission/PolyvPermission.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/permission/PolyvPermission.java index bd624a6..13f3d66 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/permission/PolyvPermission.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/permission/PolyvPermission.java @@ -1,226 +1,211 @@ -package com.easefun.polyvsdk.permission; - -import android.Manifest; -import android.annotation.TargetApi; -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.net.Uri; -import android.os.Build; -import android.preference.PreferenceManager; -import android.provider.Settings; -import android.support.annotation.NonNull; -import android.support.v4.app.ActivityCompat; -import android.widget.Toast; - -import java.util.ArrayList; - -/** - * Polyv权限 - * targetSdkVersion 设置了23或以上需要实现运行时权限功能,否则无法播放视频 - */ -public class PolyvPermission { - private ResponseCallback responseCallback = null; - private Activity activity = null; - - public enum OperationType { - play(100), - download(101), - upload(102), - playAndDownload(103), - readImei(104); - - private final int num; - private OperationType(int num) { - this.num = num; - } - - public int getNum() { - return num; - } - - public static OperationType getOperationType(int num) { - if (num == play.getNum()) { - return play; - } else if (num == download.getNum()) { - return download; - } else if (num == readImei.getNum()) { - return readImei; - } else if (num == upload.getNum()) { - return upload; - } else if (num == playAndDownload.getNum()) { - return playAndDownload; - } - - return play; - } - } - - @TargetApi(Build.VERSION_CODES.M) - public void applyPermission(Activity activity, OperationType type) { - this.activity = activity; - if (!canMakeSmores()) { - if (responseCallback != null) { - responseCallback.callback(type); - } - - return; - } - - ArrayList permissions = new ArrayList<>(); - int resultCode = 0; - switch (type) { - case play: - //播放视频需要的权限 - permissions.add(Manifest.permission.READ_PHONE_STATE); - //投屏功能在android9.0获取wifi名称及搜索设备所需的权限 - permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION); - permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); - resultCode = OperationType.play.getNum(); - break; - case readImei: - permissions.add(Manifest.permission.READ_PHONE_STATE); - resultCode = OperationType.readImei.getNum(); - break; - case download: - //下载需要的权限 - permissions.add(Manifest.permission.READ_PHONE_STATE); - permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); - resultCode = OperationType.download.getNum(); - break; - case upload: - //上传需要的权限 - permissions.add(Manifest.permission.READ_PHONE_STATE); - permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); - resultCode = OperationType.upload.getNum(); - break; - case playAndDownload: - //播放视频和下载需要的权限 - permissions.add(Manifest.permission.READ_PHONE_STATE); - //投屏功能在android9.0获取wifi名称及搜索设备所需的权限 - permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION); - permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); - resultCode = OperationType.playAndDownload.getNum(); - break; - } - - //筛选出我们已经接受的权限 - /* 请求的权限列表 */ - ArrayList permissionsToRequest = findUnAskedPermissions(permissions); - //get the permissions we have asked for before but are not granted.. - //we will store this in a global list to access later. - /* 拒绝的权限列表 */ - ArrayList permissionsRejected = findRejectedPermissions(permissions); - - if(permissionsToRequest.size()>0){//we need to ask for permissions - //but have we already asked for them? - activity.requestPermissions(permissionsToRequest.toArray(new String[permissionsToRequest.size()]), resultCode); - }else{ - if(permissionsRejected.size()>0){ - for (int i = 0; i < permissionsRejected.size() ; i++) { - if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, permissionsRejected.get(i))) { - Toast.makeText(activity, "点击权限,并打开全部权限", Toast.LENGTH_LONG).show(); - Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - intent.setData(Uri.fromParts("package", activity.getPackageName(), null)); - activity.startActivityForResult(intent, type.getNum()); - return; - } - } - } else { - if (responseCallback != null) { - responseCallback.callback(type); - } - } - } - } - - public boolean operationHasPermission(int num) { - OperationType operationType = OperationType.getOperationType(num); - if (operationType == null) return false; - switch (operationType) { - case play: - return hasPermission(Manifest.permission.READ_PHONE_STATE) - && hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); - case download: - return hasPermission(Manifest.permission.READ_PHONE_STATE) - && hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); - case upload: - return hasPermission(Manifest.permission.READ_PHONE_STATE) - && hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); - case playAndDownload: - return hasPermission(Manifest.permission.READ_PHONE_STATE) - && hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); - } - - return false; - } - - /** - * method that will return whether the permission is accepted. By default it is true if the user is using a device below - * version 23 - * @param permission - * @return - */ - @TargetApi(Build.VERSION_CODES.M) - private boolean hasPermission(String permission) { - if (canMakeSmores()) { - return(activity.checkSelfPermission(permission)== PackageManager.PERMISSION_GRANTED); - } - return true; - } - - /** - * This method is used to determine the permissions we do not have accepted yet and ones that we have not already - * bugged the user about. This comes in handle when you are asking for multiple permissions at once. - * @param wanted - * @return - */ - private ArrayList findUnAskedPermissions(ArrayList wanted) { - ArrayList result = new ArrayList<>(); - for (String perm : wanted) { - if (!hasPermission(perm)) { - result.add(perm); - } - } - - return result; - } - - /** - * this will return us all the permissions we have previously asked for but - * currently do not have permission to use. This may be because they declined us - * or later revoked our permission. This becomes useful when you want to tell the user - * what permissions they declined and why they cannot use a feature. - * @param wanted - * @return - */ - private ArrayList findRejectedPermissions(ArrayList wanted) { - ArrayList result = new ArrayList<>(); - for (String perm : wanted) { - if (!hasPermission(perm)) { - result.add(perm); - } - } - - return result; - } - - /** - * Just a check to see if we have marshmallows (version 23) - * @return - */ - public static boolean canMakeSmores() { - return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1); - } - - public void setResponseCallback(ResponseCallback responseCallback) { - this.responseCallback = responseCallback; - } - - public interface ResponseCallback { - void callback(@NonNull OperationType type); - } -} +package com.easefun.polyvsdk.permission; + +import android.Manifest; +import android.annotation.TargetApi; +import android.app.Activity; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import android.provider.Settings; +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import android.widget.Toast; + +import java.util.ArrayList; + +/** + * Polyv权限 + * targetSdkVersion 设置了23或以上需要实现运行时权限功能,否则无法播放视频 + */ +public class PolyvPermission { + private ResponseCallback responseCallback = null; + private Activity activity = null; + + public enum OperationType { + play(100), + download(101), + upload(102), + playAndDownload(103), + ; + + private final int num; + private OperationType(int num) { + this.num = num; + } + + public int getNum() { + return num; + } + + public static OperationType getOperationType(int num) { + if (num == play.getNum()) { + return play; + } else if (num == download.getNum()) { + return download; + } else if (num == upload.getNum()) { + return upload; + } else if (num == playAndDownload.getNum()) { + return playAndDownload; + } + + return play; + } + } + + @TargetApi(Build.VERSION_CODES.M) + public void applyPermission(Activity activity, OperationType type) { + this.activity = activity; + if (!canMakeSmores()) { + if (responseCallback != null) { + responseCallback.callback(type); + } + + return; + } + + ArrayList permissions = new ArrayList<>(); + int resultCode = 0; + switch (type) { + case play: + //播放视频需要的权限 + //投屏功能在android9.0获取wifi名称及搜索设备所需的权限 + //Android 10起需要精确定位权限,才能获取wifi详细信息 + permissions.add(Manifest.permission.ACCESS_FINE_LOCATION); + permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + resultCode = OperationType.play.getNum(); + break; + case download: + //下载需要的权限 + permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + resultCode = OperationType.download.getNum(); + break; + case upload: + //上传需要的权限 + permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + resultCode = OperationType.upload.getNum(); + break; + case playAndDownload: + //播放视频和下载需要的权限 + //投屏功能在android9.0获取wifi名称及搜索设备所需的权限 + permissions.add(Manifest.permission.ACCESS_FINE_LOCATION); + permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + resultCode = OperationType.playAndDownload.getNum(); + break; + } + + //筛选出我们已经接受的权限 + /* 请求的权限列表 */ + ArrayList permissionsToRequest = findUnAskedPermissions(permissions); + //get the permissions we have asked for before but are not granted.. + //we will store this in a global list to access later. + /* 拒绝的权限列表 */ + ArrayList permissionsRejected = findRejectedPermissions(permissions); + + if(permissionsToRequest.size()>0){//we need to ask for permissions + //but have we already asked for them? + activity.requestPermissions(permissionsToRequest.toArray(new String[permissionsToRequest.size()]), resultCode); + }else{ + if(permissionsRejected.size()>0){ + for (int i = 0; i < permissionsRejected.size() ; i++) { + if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, permissionsRejected.get(i))) { + Toast.makeText(activity, "点击权限,并打开全部权限", Toast.LENGTH_LONG).show(); + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.setData(Uri.fromParts("package", activity.getPackageName(), null)); + activity.startActivityForResult(intent, type.getNum()); + return; + } + } + } else { + if (responseCallback != null) { + responseCallback.callback(type); + } + } + } + } + + public boolean operationHasPermission(int num) { + OperationType operationType = OperationType.getOperationType(num); + if (operationType == null) return false; + switch (operationType) { + case play: + return hasPermission(Manifest.permission.ACCESS_FINE_LOCATION) + && hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); + case download: + return hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); + case upload: + return hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); + case playAndDownload: + return hasPermission(Manifest.permission.ACCESS_FINE_LOCATION) + && hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + + return false; + } + + /** + * method that will return whether the permission is accepted. By default it is true if the user is using a device below + * version 23 + * @param permission + * @return + */ + @TargetApi(Build.VERSION_CODES.M) + private boolean hasPermission(String permission) { + if (canMakeSmores()) { + return(activity.checkSelfPermission(permission)== PackageManager.PERMISSION_GRANTED); + } + return true; + } + + /** + * This method is used to determine the permissions we do not have accepted yet and ones that we have not already + * bugged the user about. This comes in handle when you are asking for multiple permissions at once. + * @param wanted + * @return + */ + private ArrayList findUnAskedPermissions(ArrayList wanted) { + ArrayList result = new ArrayList<>(); + for (String perm : wanted) { + if (!hasPermission(perm)) { + result.add(perm); + } + } + + return result; + } + + /** + * this will return us all the permissions we have previously asked for but + * currently do not have permission to use. This may be because they declined us + * or later revoked our permission. This becomes useful when you want to tell the user + * what permissions they declined and why they cannot use a feature. + * @param wanted + * @return + */ + private ArrayList findRejectedPermissions(ArrayList wanted) { + ArrayList result = new ArrayList<>(); + for (String perm : wanted) { + if (!hasPermission(perm)) { + result.add(perm); + } + } + + return result; + } + + /** + * Just a check to see if we have marshmallows (version 23) + * @return + */ + public static boolean canMakeSmores() { + return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1); + } + + public void setResponseCallback(ResponseCallback responseCallback) { + this.responseCallback = responseCallback; + } + + public interface ResponseCallback { + void callback(@NonNull OperationType type); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAnswerView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAnswerView.java index 35ff0af..2cb0ba0 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAnswerView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAnswerView.java @@ -3,17 +3,18 @@ import android.content.Context; import android.content.res.Configuration; import android.graphics.Color; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.util.AttributeSet; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -27,6 +28,7 @@ import com.easefun.polyvsdk.R; import com.easefun.polyvsdk.adapter.PolyvAnswerAdapter; import com.easefun.polyvsdk.fragment.PolyvPlayerDanmuFragment; +import com.easefun.polyvsdk.player.fillblank.FillBlankView; import com.easefun.polyvsdk.question.PolyvQuestionDoneAction; import com.easefun.polyvsdk.util.PolyvCustomQuestionBuilder; import com.easefun.polyvsdk.util.PolyvImageLoader; @@ -48,8 +50,14 @@ public class PolyvPlayerAnswerView extends RelativeLayout implements View.OnClickListener { // private LinearLayout answerContentLayout; - private TextView answerTitle, answerResponseContent; + private ScrollView choiceLayout; + private RelativeLayout fillBankLayout; + private FillBlankView fillBankContent; + private TextView choiceQuestionContent; + private TextView answerResponseTitle; + private TextView answerResponseContent; private ScrollView answerResponseScroll; + private RelativeLayout answerResponseLayout; private ImageView answerIllustration; private RecyclerView answerList; private TextView answerKnow; @@ -64,9 +72,14 @@ public class PolyvPlayerAnswerView extends RelativeLayout implements View.OnClic // /** - * 回答选择 + * 选择题的回答选择 */ private LinkedList answerSelect = new LinkedList<>(); + /** + * 填空题的回答 + */ + private LinkedList answerSupplyBlankList = new LinkedList<>(); + /** * 问答值对象 */ @@ -124,9 +137,17 @@ private void initView() { LayoutInflater.from(getContext()).inflate(R.layout.polyv_player_question_view_refactor, this); answerContentLayout = (LinearLayout) findViewById(R.id.answer_content_layout); - answerTitle = (TextView) findViewById(R.id.answer_title); + choiceLayout = findViewById(R.id.sc_choice); + fillBankLayout = findViewById(R.id.rl_fillbank); + fillBankContent = findViewById(R.id.fill_blank_text); + +// // 答案范围集合 + + choiceQuestionContent = (TextView) findViewById(R.id.choice_question_content); answerResponseContent = (TextView) findViewById(R.id.answer_response_content); + answerResponseTitle = (TextView) findViewById(R.id.answer_response_title); answerResponseScroll = (ScrollView) findViewById(R.id.answer_response_scroll); + answerResponseLayout = findViewById(R.id.answer_response_layout); answerIllustration = (ImageView) findViewById(R.id.answer_illustration); answerList = (RecyclerView) findViewById(R.id.answer_list); answerKnow = (TextView) findViewById(R.id.answer_know); @@ -148,9 +169,21 @@ private void addListener() { } // + // + + @Override + public boolean onTouchEvent(MotionEvent event) { + // 避免全屏情况下事件传递至播放器,引起弹出问答窗口后仍可播放视频 + return true; + } + + // + // + /** * 插入自定义的问答,详细请看{@link IPolyvVideoView#insertQuestion(PolyvQuestionVO)}方法注释。 + * * @param questionVO 问答值对象 */ public void insertCustomQuestion(@NonNull PolyvQuestionVO questionVO) { @@ -159,7 +192,8 @@ public void insertCustomQuestion(@NonNull PolyvQuestionVO questionVO) { /** * 替换问答,详细请看{@link IPolyvVideoView#changeQuestion(int, ArrayList)}方法注释 - * @param showTime 题目出现时间点 + * + * @param showTime 题目出现时间点 * @param questionVOList 问答值对象列表 */ public void changeQuestion(int showTime, @Nullable ArrayList questionVOList) { @@ -185,8 +219,10 @@ private void showQuestion(@NonNull PolyvQuestionVO questionVO) throws InvalidPar show(); resetViewStatus(questionVO); resetProperty(); - setTitle(questionVO); - intialAdapter(questionVO); + setQuestionContentAndAnswerIllustration(questionVO); + if (questionVO.getType() != PolyvQuestionVO.TYPE_FILL_BLANK) { + intialAdapter(questionVO); + } } /** @@ -195,13 +231,20 @@ private void showQuestion(@NonNull PolyvQuestionVO questionVO) throws InvalidPar private void resetViewStatus(@NonNull PolyvQuestionVO questionVO) { answerBottomLayout.setVisibility(VISIBLE); answerKnow.setVisibility(GONE); - answerResponseScroll.setVisibility(GONE); + answerResponseLayout.setVisibility(GONE); answerIllustration.setVisibility(VISIBLE); answerList.setVisibility(VISIBLE); polyvAnswerSkip.setVisibility(questionVO.isSkip() ? VISIBLE : GONE); answerContentLayout.setVisibility(VISIBLE); answerTipLayout.setVisibility(GONE); + if (questionVO.getType() == PolyvQuestionVO.TYPE_FILL_BLANK) { + choiceLayout.setVisibility(GONE); + fillBankLayout.setVisibility(VISIBLE); + } else { + choiceLayout.setVisibility(VISIBLE); + fillBankLayout.setVisibility(GONE); + } } /** @@ -209,21 +252,22 @@ private void resetViewStatus(@NonNull PolyvQuestionVO questionVO) { */ private void resetProperty() { answerSelect.clear(); + answerSupplyBlankList.clear(); } /** - * 设置标题 + * 设置题目内容和 图片 * * @param questionVO */ - private void setTitle(PolyvQuestionVO questionVO) { + private void setQuestionContentAndAnswerIllustration(PolyvQuestionVO questionVO) { //格式化问题,因为后台支持在问题中配置图片。 List list = PolyvQuestionUtil.parseQA2(questionVO.getQuestion()); - StringBuilder title = new StringBuilder(); + StringBuilder questionMainContent = new StringBuilder(); String imgUrl = ""; for (PolyvQAFormatVO polyvQAFormatVO : list) { if (polyvQAFormatVO.getStringType().ordinal() == PolyvQAFormatVO.StringType.STRING.ordinal()) { - title.append(polyvQAFormatVO.getStr()); + questionMainContent.append(polyvQAFormatVO.getStr()); } if (polyvQAFormatVO.getStringType().ordinal() == PolyvQAFormatVO.StringType.URL.ordinal() @@ -234,18 +278,31 @@ private void setTitle(PolyvQuestionVO questionVO) { } boolean isMultiSelected = questionVO.isMultiSelected(); - SpannableStringBuilder span = new SpannableStringBuilder(isMultiSelected ? "【多选题】" : "【单选题】"); - span.setSpan(new ForegroundColorSpan(Color.parseColor("#4A90E2")), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - span.append(title); - answerTitle.setText(span); - - if (!questionVO.illustrationIsEmpty()) { - answerIllustration.setVisibility(VISIBLE); - PolyvImageLoader.getInstance().loadImageOrigin(getContext(), questionVO.getIllustration(), answerIllustration, R.drawable.polyv_avatar_def); - } else if (!TextUtils.isEmpty(imgUrl)) { - answerIllustration.setVisibility(VISIBLE); - PolyvImageLoader.getInstance().loadImageOrigin(getContext(), imgUrl, answerIllustration, R.drawable.polyv_avatar_def); + SpannableStringBuilder span; + if (questionVO.getType() == PolyvQuestionVO.TYPE_QUESTION) { + span = new SpannableStringBuilder(isMultiSelected ? "【多选题】" : "【单选题】"); + } else { + span = new SpannableStringBuilder("【填空题】"); + } + + span.append(questionMainContent); + span.setSpan(new ForegroundColorSpan(Color.parseColor("#333333")), 0, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + if (questionVO.getType() == PolyvQuestionVO.TYPE_QUESTION) { + choiceQuestionContent.setText(span); + } else { + fillBankContent.setData(new SpannableStringBuilder(span)); + } + if (questionVO.getType() == PolyvQuestionVO.TYPE_QUESTION) { + if (!questionVO.illustrationIsEmpty()) { + answerIllustration.setVisibility(VISIBLE); + PolyvImageLoader.getInstance().loadImageOrigin(getContext(), fixUrl(questionVO.getIllustration()), answerIllustration, R.drawable.polyv_loading); + } else if (!TextUtils.isEmpty(imgUrl)) { + answerIllustration.setVisibility(VISIBLE); + PolyvImageLoader.getInstance().loadImageOrigin(getContext(), fixUrl(imgUrl), answerIllustration, R.drawable.polyv_loading); + } else { + answerIllustration.setVisibility(GONE); + } } else { answerIllustration.setVisibility(GONE); } @@ -286,11 +343,14 @@ public void onSelectAnswer(Integer pos, boolean isSelected) { }); if (answerIllustration.getVisibility() == VISIBLE || PolyvScreenUtils.isLandscape(getContext())) { - answerList.setLayoutManager(new LinearLayoutManager(getContext())); - } else { - answerList.setLayoutManager(new GridLayoutManager(getContext(), 2)); + } + answerList.setLayoutManager(new LinearLayoutManager(getContext())); +// } else { +// answerList.setLayoutManager(new GridLayoutManager(getContext(), 2)); +// } + answerList.setAdapter(polyvAnswerAdapter); } @@ -326,18 +386,30 @@ private void skip() { * 提交答案 */ private void submitAnswer() { - if (!isAnswer()) { - Toast.makeText(getContext(), R.string.no_choice, Toast.LENGTH_LONG).show(); - return; - } - - hide(); - if (polyvQuestionVO == null) { return; } + switch (polyvQuestionVO.getType()) { + case PolyvQuestionVO.TYPE_QUESTION: + case PolyvQuestionVO.TYPE_AUDITION: + if (!isAnswerSelect()) { + Toast.makeText(getContext(), R.string.no_choice, Toast.LENGTH_LONG).show(); + return; + } + hide(); + polyvVideoView.answerQuestion2(answerSelect); + break; + case PolyvQuestionVO.TYPE_FILL_BLANK: + answerSupplyBlankList = fillBankContent.getRightAnswerList(); + if (!isAnswerSupplyBlank()) { + Toast.makeText(getContext(), R.string.no_answer_supply_blank, Toast.LENGTH_LONG).show(); + return; + } + hide(); + polyvVideoView.answerQuestion3(answerSupplyBlankList); + break; + } - polyvVideoView.answerQuestion2(answerSelect); //自定义问答的答题结果回调 if (answerResultListener != null) { answerResultListener.onAnswerResult(polyvQuestionVO); @@ -349,7 +421,7 @@ private void submitAnswer() { * * @param msg 内容 */ - public void showAnswerTips(final boolean isAnswerRight, String msg, final int seek) { + private void showAnswerTips(final boolean isAnswerRight, String msg, final int seek) { show(); answerIllustration.setVisibility(GONE); answerList.setVisibility(GONE); @@ -360,9 +432,11 @@ public void showAnswerTips(final boolean isAnswerRight, String msg, final int se if (isAnswerRight) {//正确 answerTipImg.setImageResource(R.drawable.polyv_answer_right); polyvAnswerTipContent.setText(R.string.answer_right); + polyvAnswerTipContent.setTextColor(Color.parseColor("#4A90E2")); } else {// 错误 answerTipImg.setImageResource(R.drawable.polyv_answer_wrong); polyvAnswerTipContent.setText(R.string.answer_wrong); + polyvAnswerTipContent.setTextColor(Color.parseColor("#F95652")); } answerTipLayout.postDelayed(new Runnable() { @@ -379,10 +453,13 @@ public void run() { answerBottomLayout.setVisibility(GONE); answerKnow.setVisibility(VISIBLE); - answerResponseScroll.setVisibility(VISIBLE); - + answerContentLayout.setVisibility(GONE); + answerResponseLayout.setVisibility(VISIBLE); + answerResponseTitle.setText(isAnswerRight ? R.string.answer_right : R.string.answer_wrong); + answerResponseTitle.setTextColor(Color.parseColor(isAnswerRight ? "#6FAB32" : "#F95652")); answerResponseContent.setText(msg); - answerTitle.setText(isAnswerRight ? R.string.answer_right : R.string.answer_wrong); + + } } @@ -398,6 +475,7 @@ public void setPolyvVideoView(@NonNull PolyvVideoView polyvVideoView) { public void onPopUp(@NonNull PolyvQuestionVO questionVO) { switch (questionVO.getType()) { case PolyvQuestionVO.TYPE_QUESTION: + case PolyvQuestionVO.TYPE_FILL_BLANK: showQuestion(questionVO); break; @@ -426,7 +504,7 @@ public void onSkipCallback(@NonNull PolyvQuestionVO questionVO) { /** * 播放 */ - public void play() { + private void play() { hide(); polyvVideoView.start(); if (danmuFragment != null) { @@ -436,6 +514,7 @@ public void play() { /** * 跳跃播放 + * * @param seek */ private void seekPlay(int seek) { @@ -487,10 +566,14 @@ public void show() { * * @return {@code true}:正确,{@code false}:错误 */ - private boolean isAnswer() { + private boolean isAnswerSelect() { return !answerSelect.isEmpty(); } + private boolean isAnswerSupplyBlank() { + return !answerSupplyBlankList.isEmpty(); + } + @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); @@ -528,6 +611,7 @@ protected void onConfigurationChanged(Configuration newConfig) { // // + /** * 设置自定义问答的答题结果回调 * diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAudioCoverView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAudioCoverView.java index 5fba4e1..cf6839d 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAudioCoverView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAudioCoverView.java @@ -5,8 +5,8 @@ import android.content.Context; import android.content.res.TypedArray; import android.net.Uri; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -60,7 +60,7 @@ private void init() { fl_cover = (FrameLayout) findViewById(R.id.fl_cover); if (!isShowFilm) { iv_audio_cover_m.setScaleType(ImageView.ScaleType.FIT_CENTER); - fl_cover.setVisibility(View.INVISIBLE); + fl_cover.setVisibility(View.GONE); } else { iv_audio_cover_m.setAlpha(0.4f); } @@ -107,9 +107,9 @@ public void changeModeFitCover(PolyvVideoView videoView, String changedMode) { public void hide() { if (animator != null) animator.cancel(); - fl_cover.setVisibility(View.INVISIBLE); - iv_audio_cover.setVisibility(View.INVISIBLE); - iv_audio_cover_m.setVisibility(View.INVISIBLE); + fl_cover.setVisibility(View.GONE); + iv_audio_cover.setVisibility(View.GONE); + iv_audio_cover_m.setVisibility(View.GONE); } public void fitLocationChange(boolean isInMainScreen) { diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAuditionView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAuditionView.java index 21f8ffb..c3d6dd3 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAuditionView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAuditionView.java @@ -1,184 +1,184 @@ -package com.easefun.polyvsdk.player; - -import java.io.IOException; -import java.util.ArrayList; - -import com.easefun.polyvsdk.PolyvSDKUtil; -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.SDKUtil; -import com.easefun.polyvsdk.ijk.IjkVideoView; -import com.easefun.polyvsdk.video.PolyvVideoView; -import com.easefun.polyvsdk.vo.PolyvQuestionVO; - -import android.content.Context; -import android.media.MediaPlayer; -import android.net.Uri; -import android.os.Handler; -import android.os.Message; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.ImageButton; -import android.widget.PopupWindow; -import android.widget.ProgressBar; -import android.widget.RelativeLayout; -import android.widget.TextView; - -/** - * 听力问答视图 - * @author TanQu 2016-1-25 - */ -public class PolyvPlayerAuditionView extends RelativeLayout { - private Context mContext = null; - private PolyvVideoView polyvVideoView = null; - private TextView passBtn = null; - private TextView title = null; - private ImageButton playPauseBtn = null; - private ProgressBar progressBar = null; - private TextView progressTotalText = null; - private MediaPlayer mediaPlayer = null; - private PolyvQuestionVO questionVO = null; - - private static final int UPDATE_PROGRESS = 1; - private static final int CLOSE_QUESTION = 2; - private Handler handler = new Handler(){ - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case UPDATE_PROGRESS: - setProgress(); - handler.removeMessages(UPDATE_PROGRESS); - handler.sendEmptyMessageDelayed(UPDATE_PROGRESS, 1000); - break; - case CLOSE_QUESTION: - polyvVideoView.answerQuestion(new ArrayList(0)); - hide(); - break; - } - } - }; - - public PolyvPlayerAuditionView(Context context) { - this(context, null); - } - - public PolyvPlayerAuditionView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PolyvPlayerAuditionView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - this.mContext = context; - initViews(); - } - - public void setPolyvVideoView(PolyvVideoView polyvVideoView) { - this.polyvVideoView = polyvVideoView; - } - - private void initViews() { - LayoutInflater.from(getContext()).inflate(R.layout.polyv_player_audition_view, this); - passBtn = (TextView) findViewById(R.id.audition_pass_btn); - passBtn.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - polyvVideoView.skipQuestion(); - handler.post(new Runnable() { - - @Override - public void run() { - hide(); - } - }); - } - }); - title = (TextView) findViewById(R.id.title); - playPauseBtn = (ImageButton) findViewById(R.id.audition_play_pause); - playPauseBtn.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - if (mediaPlayer == null) return; - if (mediaPlayer.isPlaying()) { - playPauseBtn.setImageResource(R.drawable.polyv_btn_play_s); - mediaPlayer.pause(); - } else { - playPauseBtn.setImageResource(R.drawable.polyv_btn_pause); - mediaPlayer.start(); - } - } - }); - progressBar = (ProgressBar) findViewById(R.id.audition_progress); - progressBar.setMax(1000); - - progressTotalText = (TextView) findViewById(R.id.audition_progress_total_text); - progressTotalText.setText(String.format("%s/%s", PolyvSDKUtil.getVideoDisplayTime(0), PolyvSDKUtil.getVideoDisplayTime(0))); - } - - private void setProgress() { - long currentTime = mediaPlayer.getCurrentPosition(); - long durationTime = mediaPlayer.getDuration(); - float percentage = ((float) currentTime) / durationTime; - int progress = (int) (percentage * progressBar.getMax()); - progressBar.setProgress(progress); - progressTotalText.setText(String.format("%s/%s", PolyvSDKUtil.getVideoDisplayTime(currentTime), PolyvSDKUtil.getVideoDisplayTime(durationTime))); - } - - /** - * 显示 - * @param questionVO - */ - public void show(PolyvQuestionVO questionVO) { - this.questionVO = questionVO; - if (questionVO.isSkip()) { - passBtn.setVisibility(View.VISIBLE); - } - - title.setText(questionVO.getQuestion()); - if (mediaPlayer != null) { - mediaPlayer.release(); - } - - mediaPlayer = new MediaPlayer(); - try { - mediaPlayer.setDataSource(mContext, Uri.parse(questionVO.getMp3url())); - mediaPlayer.prepare(); - } catch (IllegalArgumentException | SecurityException | IllegalStateException | IOException e) { - e.printStackTrace(); - } - - mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { - - @Override - public void onCompletion(MediaPlayer mp) { - setProgress(); - if (PolyvPlayerAuditionView.this.questionVO.getWrongTime() <= 0) { - handler.sendEmptyMessage(CLOSE_QUESTION); - } else { - handler.sendEmptyMessageDelayed(CLOSE_QUESTION, PolyvPlayerAuditionView.this.questionVO.getWrongTime() * 1000); - } - } - }); - mediaPlayer.start(); - handler.removeMessages(UPDATE_PROGRESS); - handler.sendEmptyMessageDelayed(UPDATE_PROGRESS, 1000); - setVisibility(View.VISIBLE); - } - - /** - * 隐藏 - */ - public void hide() { - if (mediaPlayer != null) { - mediaPlayer.release(); - } - - if (handler != null) { - handler.removeMessages(UPDATE_PROGRESS); - } - - setVisibility(View.INVISIBLE); - } -} +package com.easefun.polyvsdk.player; + +import java.io.IOException; +import java.util.ArrayList; + +import com.easefun.polyvsdk.PolyvSDKUtil; +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.SDKUtil; +import com.easefun.polyvsdk.ijk.IjkVideoView; +import com.easefun.polyvsdk.video.PolyvVideoView; +import com.easefun.polyvsdk.vo.PolyvQuestionVO; + +import android.content.Context; +import android.media.MediaPlayer; +import android.net.Uri; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageButton; +import android.widget.PopupWindow; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; +import android.widget.TextView; + +/** + * 听力问答视图 + * @author TanQu 2016-1-25 + */ +public class PolyvPlayerAuditionView extends RelativeLayout { + private Context mContext = null; + private PolyvVideoView polyvVideoView = null; + private TextView passBtn = null; + private TextView title = null; + private ImageButton playPauseBtn = null; + private ProgressBar progressBar = null; + private TextView progressTotalText = null; + private MediaPlayer mediaPlayer = null; + private PolyvQuestionVO questionVO = null; + + private static final int UPDATE_PROGRESS = 1; + private static final int CLOSE_QUESTION = 2; + private Handler handler = new Handler(){ + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case UPDATE_PROGRESS: + setProgress(); + handler.removeMessages(UPDATE_PROGRESS); + handler.sendEmptyMessageDelayed(UPDATE_PROGRESS, 1000); + break; + case CLOSE_QUESTION: + polyvVideoView.answerQuestion(new ArrayList(0)); + hide(); + break; + } + } + }; + + public PolyvPlayerAuditionView(Context context) { + this(context, null); + } + + public PolyvPlayerAuditionView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public PolyvPlayerAuditionView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + this.mContext = context; + initViews(); + } + + public void setPolyvVideoView(PolyvVideoView polyvVideoView) { + this.polyvVideoView = polyvVideoView; + } + + private void initViews() { + LayoutInflater.from(getContext()).inflate(R.layout.polyv_player_audition_view, this); + passBtn = (TextView) findViewById(R.id.audition_pass_btn); + passBtn.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + polyvVideoView.skipQuestion(); + handler.post(new Runnable() { + + @Override + public void run() { + hide(); + } + }); + } + }); + title = (TextView) findViewById(R.id.title); + playPauseBtn = (ImageButton) findViewById(R.id.audition_play_pause); + playPauseBtn.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + if (mediaPlayer == null) return; + if (mediaPlayer.isPlaying()) { + playPauseBtn.setImageResource(R.drawable.polyv_btn_play_s); + mediaPlayer.pause(); + } else { + playPauseBtn.setImageResource(R.drawable.polyv_btn_pause); + mediaPlayer.start(); + } + } + }); + progressBar = (ProgressBar) findViewById(R.id.audition_progress); + progressBar.setMax(1000); + + progressTotalText = (TextView) findViewById(R.id.audition_progress_total_text); + progressTotalText.setText(String.format("%s/%s", PolyvSDKUtil.getVideoDisplayTime(0), PolyvSDKUtil.getVideoDisplayTime(0))); + } + + private void setProgress() { + long currentTime = mediaPlayer.getCurrentPosition(); + long durationTime = mediaPlayer.getDuration(); + float percentage = ((float) currentTime) / durationTime; + int progress = (int) (percentage * progressBar.getMax()); + progressBar.setProgress(progress); + progressTotalText.setText(String.format("%s/%s", PolyvSDKUtil.getVideoDisplayTime(currentTime), PolyvSDKUtil.getVideoDisplayTime(durationTime))); + } + + /** + * 显示 + * @param questionVO + */ + public void show(PolyvQuestionVO questionVO) { + this.questionVO = questionVO; + if (questionVO.isSkip()) { + passBtn.setVisibility(View.VISIBLE); + } + + title.setText(questionVO.getQuestion()); + if (mediaPlayer != null) { + mediaPlayer.release(); + } + + mediaPlayer = new MediaPlayer(); + try { + mediaPlayer.setDataSource(mContext, Uri.parse(questionVO.getMp3url())); + mediaPlayer.prepare(); + } catch (IllegalArgumentException | SecurityException | IllegalStateException | IOException e) { + e.printStackTrace(); + } + + mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + + @Override + public void onCompletion(MediaPlayer mp) { + setProgress(); + if (PolyvPlayerAuditionView.this.questionVO.getWrongTime() <= 0) { + handler.sendEmptyMessage(CLOSE_QUESTION); + } else { + handler.sendEmptyMessageDelayed(CLOSE_QUESTION, PolyvPlayerAuditionView.this.questionVO.getWrongTime() * 1000); + } + } + }); + mediaPlayer.start(); + handler.removeMessages(UPDATE_PROGRESS); + handler.sendEmptyMessageDelayed(UPDATE_PROGRESS, 1000); + setVisibility(View.VISIBLE); + } + + /** + * 隐藏 + */ + public void hide() { + if (mediaPlayer != null) { + mediaPlayer.release(); + } + + if (handler != null) { + handler.removeMessages(UPDATE_PROGRESS); + } + + setVisibility(View.GONE); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAuxiliaryView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAuxiliaryView.java index 9ff7e69..9e7a89d 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAuxiliaryView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerAuxiliaryView.java @@ -1,8 +1,11 @@ package com.easefun.polyvsdk.player; +import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.content.res.Configuration; import android.net.Uri; +import androidx.annotation.IntRange; import android.text.TextUtils; import android.util.AttributeSet; import android.view.LayoutInflater; @@ -15,6 +18,7 @@ import com.easefun.polyvsdk.R; import com.easefun.polyvsdk.fragment.PolyvPlayerDanmuFragment; import com.easefun.polyvsdk.util.PolyvImageLoader; +import com.easefun.polyvsdk.util.PolyvScreenUtils; import com.easefun.polyvsdk.video.PolyvVideoView; import com.easefun.polyvsdk.vo.PolyvADMatterVO; @@ -31,17 +35,22 @@ public class PolyvPlayerAuxiliaryView extends RelativeLayout { private ImageView mAdvertisementImage = null; private ImageButton mStartBtn = null; private PolyvADMatterVO mADMatter = null; -// private PolyvPlayerDanmuFragment danmuFragment = null; + private PolyvPlayerDanmuFragment danmuFragment = null; - public PolyvPlayerAuxiliaryView(Context context) { - this(context, null); - } - - public PolyvPlayerAuxiliaryView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PolyvPlayerAuxiliaryView(Context context, AttributeSet attrs, int defStyle) { + private int preferImageWidthPercent = 0; + private int preferImageHeightPercent = 0; + private int preferImageCenterToLeftPercent = 0; + private int preferImageCenterToTopPercent = 0; + + public PolyvPlayerAuxiliaryView(Context context) { + this(context, null); + } + + public PolyvPlayerAuxiliaryView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public PolyvPlayerAuxiliaryView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; initViews(); @@ -52,7 +61,7 @@ public void setPolyvVideoView(PolyvVideoView mVideoView) { } public void setDanmakuFragment(PolyvPlayerDanmuFragment danmakuFragment){ -// this.danmuFragment=danmakuFragment; + this.danmuFragment=danmakuFragment; } private void initViews() { @@ -80,30 +89,43 @@ public void onClick(View v) { mStartBtn = (ImageButton) findViewById(R.id.advertisement_start_btn); mStartBtn.setOnClickListener(new OnClickListener() { - + @Override public void onClick(View v) { mVideoView.start(); -// danmuFragment.resume(); + danmuFragment.resume(); hide(); } }); - } + } - /** - * 设置图片并显示 - * @param adMatter - */ - public void show(PolyvADMatterVO adMatter) { - mADMatter = adMatter; - PolyvImageLoader.getInstance().loadImageOrigin(mContext, mADMatter.getMatterUrl(), mAdvertisementImage,R.drawable.polyv_avatar_def); - - //暂停图片广告不需要倒计时,是点击开始按钮继续 - if (PolyvADMatterVO.LOCATION_PAUSE.equals(adMatter.getLocation())) { - mStartBtn.setVisibility(View.VISIBLE); + @Override + public boolean onTouchEvent(MotionEvent event) { + super.onTouchEvent(event); + return true; + } + + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + updateAuxiliaryImageSizePosition(); + } + + /** + * 设置图片并显示 + * + * @param adMatter + */ + public void show(PolyvADMatterVO adMatter) { + mADMatter = adMatter; + PolyvImageLoader.getInstance().loadImageOrigin(mContext, mADMatter.getMatterUrl(), mAdvertisementImage, R.drawable.polyv_loading); + + //暂停图片广告不需要倒计时,是点击开始按钮继续 + if (PolyvADMatterVO.LOCATION_PAUSE.equals(adMatter.getLocation())) { + mStartBtn.setVisibility(View.VISIBLE); } else { - mStartBtn.setVisibility(View.INVISIBLE); + mStartBtn.setVisibility(View.GONE); } setVisibility(View.VISIBLE); @@ -115,9 +137,9 @@ public void show(PolyvADMatterVO adMatter) { */ public void show(String url) { mADMatter = null; - PolyvImageLoader.getInstance().loadImageOrigin(mContext, url, mAdvertisementImage, R.drawable.polyv_avatar_def); + PolyvImageLoader.getInstance().loadImageOrigin(mContext, url, mAdvertisementImage, R.drawable.polyv_loading); - mStartBtn.setVisibility(View.INVISIBLE); + mStartBtn.setVisibility(View.GONE); setVisibility(View.VISIBLE); } @@ -125,16 +147,115 @@ public boolean isPauseAdvert() { return mADMatter != null && PolyvADMatterVO.LOCATION_PAUSE.equals(mADMatter.getLocation()); } - /** - * 隐藏 - */ - public void hide() { - setVisibility(View.INVISIBLE); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - super.onTouchEvent(event); - return true; + /** + * 隐藏 + */ + public void hide() { + setVisibility(View.GONE); + } + + /** + * 设置片头图片和暂停图片的显示大小 + * 取值单位为相对于播放器大小的百分比,范围为[0, 100] + * 当widthPercent取值为0,heightPercent为1-100时,宽度随高度自适应 + * 当heightPercent取值为0,widthPercent为1-100时,高度随宽度自适应 + * 当两个取值均为0时,大小为默认的铺满播放器 + * + * @param widthPercent 宽度比例 范围0-100 + * @param heightPercent 高度比例 范围0-100 + */ + public void setAuxiliaryImageSize(@IntRange(from = 0, to = 100) int widthPercent, @IntRange(from = 0, to = 100) int heightPercent) { + preferImageWidthPercent = clampInt(widthPercent, 0, 100); + preferImageHeightPercent = clampInt(heightPercent, 0, 100); + post(new Runnable() { + @Override + public void run() { + updateAuxiliaryImageSizePosition(); + } + }); } + + /** + * 设置片头图片和暂停图片的中心点位置 + * 取值单位为相对于播放器大小的百分比,范围为[0, 100] + * 当图片任一侧边超出播放器范围,或范围设置不正确时,图片居中显示 + * + * @param centerToLeftPercent 中心点距离左侧边百分比 + * @param centerToTopPercent 中心点距离顶边百分比 + */ + public void setAuxiliaryImagePosition(@IntRange(from = 0, to = 100) int centerToLeftPercent, @IntRange(from = 0, to = 100) int centerToTopPercent) { + preferImageCenterToLeftPercent = clampInt(centerToLeftPercent, 0, 100); + preferImageCenterToTopPercent = clampInt(centerToTopPercent, 0, 100); + post(new Runnable() { + @Override + public void run() { + updateAuxiliaryImageSizePosition(); + } + }); + } + + private void updateAuxiliaryImageSizePosition() { + if (!(getContext() instanceof Activity)) { + return; + } + final int[] screenWH = PolyvScreenUtils.getNormalWH((Activity) getContext()); + final int playerWidth = screenWH[0]; + final int playerHeight = PolyvScreenUtils.isLandscape(getContext()) ? screenWH[1] : PolyvScreenUtils.getHeight16_9(); + + int imageWidth = (int) (playerWidth * (preferImageWidthPercent / 100F)); + int imageHeight = (int) (playerHeight * (preferImageHeightPercent / 100F)); + if (imageWidth == 0 && imageHeight == 0) { + // 宽高均为0,充满播放器 + imageWidth = playerWidth; + imageHeight = playerHeight; + } else if (imageWidth == 0) { + // 宽度根据高度的比例自适应 + imageWidth = (int) (playerWidth * (preferImageHeightPercent / 100F)); + } else if (imageHeight == 0) { + // 高度根据宽度的比例自适应 + imageHeight = (int) (playerHeight * (preferImageWidthPercent / 100F)); + } + + final int imageLeft = (int) (playerWidth * (preferImageCenterToLeftPercent / 100F) - imageWidth / 2); + final int imageTop = (int) (playerHeight * (preferImageCenterToTopPercent / 100F) - imageHeight / 2); + + final boolean fillPlayer = imageWidth == playerWidth && imageHeight == playerHeight; + + RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) mAdvertisementImage.getLayoutParams(); + if (fillPlayer) { + lp.width = LayoutParams.MATCH_PARENT; + lp.height = LayoutParams.MATCH_PARENT; + } else { + lp.width = imageWidth; + lp.height = imageHeight; + } + + if (imageLeft < 0 + || imageTop < 0 + || imageLeft > playerWidth - imageWidth + || imageTop > playerHeight - imageHeight) { + // 边距设置不正确时 居中显示 + lp.addRule(RelativeLayout.CENTER_IN_PARENT); + lp.leftMargin = 0; + lp.topMargin = 0; + } else { + // subject == 0, remove rule + lp.addRule(RelativeLayout.CENTER_IN_PARENT, 0); + lp.leftMargin = imageLeft; + lp.topMargin = imageTop; + } + + mAdvertisementImage.setLayoutParams(lp); + } + + private static int clampInt(int value, int min, int max) { + if (value > max) { + return max; + } + if (value < min) { + return min; + } + return value; + } + } diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerLightView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerLightView.java index 0b70f4f..c9321d0 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerLightView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerLightView.java @@ -1,50 +1,50 @@ -package com.easefun.polyvsdk.player; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import com.easefun.polyvsdk.R; - -public class PolyvPlayerLightView extends FrameLayout { - //lightView - private View view; - private RelativeLayout rl_center_light; - private TextView tv_light; - - public PolyvPlayerLightView(Context context) { - this(context, null); - } - - public PolyvPlayerLightView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PolyvPlayerLightView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - this.view = LayoutInflater.from(context).inflate(R.layout.polyv_player_media_center_light, this); - findIdAndNew(); - } - - private void findIdAndNew() { - rl_center_light = (RelativeLayout) view.findViewById(R.id.rl_center_light); - tv_light = (TextView) view.findViewById(R.id.tv_light); - } - - public void hide() { - if (rl_center_light != null) - rl_center_light.setVisibility(View.INVISIBLE); - } - - public void setViewLightValue(int brightness, boolean end) { - if (end) - rl_center_light.setVisibility(View.INVISIBLE); - else - rl_center_light.setVisibility(View.VISIBLE); - tv_light.setText(brightness + "%"); - } -} +package com.easefun.polyvsdk.player; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.easefun.polyvsdk.R; + +public class PolyvPlayerLightView extends FrameLayout { + //lightView + private View view; + private RelativeLayout rl_center_light; + private TextView tv_light; + + public PolyvPlayerLightView(Context context) { + this(context, null); + } + + public PolyvPlayerLightView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public PolyvPlayerLightView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + this.view = LayoutInflater.from(context).inflate(R.layout.polyv_player_media_center_light, this); + findIdAndNew(); + } + + private void findIdAndNew() { + rl_center_light = (RelativeLayout) view.findViewById(R.id.rl_center_light); + tv_light = (TextView) view.findViewById(R.id.tv_light); + } + + public void hide() { + if (rl_center_light != null) + rl_center_light.setVisibility(View.GONE); + } + + public void setViewLightValue(int brightness, boolean end) { + if (end) + rl_center_light.setVisibility(View.GONE); + else + rl_center_light.setVisibility(View.VISIBLE); + tv_light.setText(brightness + "%"); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerLogoView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerLogoView.java index a1f11f0..ba36a99 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerLogoView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerLogoView.java @@ -3,8 +3,8 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; @@ -97,7 +97,7 @@ public void onGetBitmapSize(int bitmapWidth, int bitmapHeight) { //设置可见度 if (logoParam.pos == 0) { - imageView.setVisibility(View.INVISIBLE); + imageView.setVisibility(View.GONE); } imageView.setAlpha(logoParam.alpha / 100f); diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerMediaController.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerMediaController.java index 989f73f..0472bbb 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerMediaController.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerMediaController.java @@ -15,7 +15,7 @@ import android.os.Handler; import android.os.Message; import android.provider.MediaStore; -import android.support.annotation.DrawableRes; +import androidx.annotation.DrawableRes; import android.text.TextUtils; import android.util.AttributeSet; import android.view.KeyEvent; @@ -34,11 +34,12 @@ import com.easefun.polyvsdk.PolyvDownloader; import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.application.PolyvSettings; import com.easefun.polyvsdk.fragment.PolyvPlayerDanmuFragment; import com.easefun.polyvsdk.fragment.PolyvPlayerTopFragment; import com.easefun.polyvsdk.ijk.PolyvPlayerScreenRatio; -import com.easefun.polyvsdk.ijk.widget.media.IRenderView; -import com.easefun.polyvsdk.log.PolyvCommonLog; +import com.easefun.polyvsdk.player.knowledge.PolyvPlayerKnowledgeLayout; +import com.easefun.polyvsdk.player.knowledge.vo.PolyvPlayerKnowledgeVO; import com.easefun.polyvsdk.ppt.PolyvPPTDirLayout; import com.easefun.polyvsdk.ppt.PolyvViceScreenLayout; import com.easefun.polyvsdk.sub.auxilliary.IOUtil; @@ -73,7 +74,7 @@ public class PolyvPlayerMediaController extends PolyvBaseMediaController impleme private Context mContext = null; private PolyvVideoView videoView = null; private PolyvVideoVO videoVO; -// private PolyvPlayerDanmuFragment danmuFragment; + private PolyvPlayerDanmuFragment danmuFragment; //播放器所在的activity private Activity videoActivity; //播放器的ParentView @@ -97,6 +98,10 @@ public class PolyvPlayerMediaController extends PolyvBaseMediaController impleme private TextView tv_curtime, tv_tottime, tv_bit_portrait, tv_speed_portrait, tv_route_portrait; // 竖屏的进度条 private SeekBar sb_play; + private RelativeLayout controllerCodecPortraitRl; + private TextView controllerMediaCodecPortraitTv; + private TextView controllerAvCodecPortraitTv; + private TextView tvCodecPortrait; /** * 竖屏的播放速度布局 */ @@ -126,9 +131,14 @@ public class PolyvPlayerMediaController extends PolyvBaseMediaController impleme //横屏的切屏按钮,横屏的播放/暂停按钮,横屏的返回按钮,设置按钮,分享按钮,弹幕开关 private ImageView iv_port, iv_play_land, iv_finish, iv_set, iv_share, iv_dmswitch, iv_vice_status, iv_pip; // 横屏的显示播放进度控件,视频的标题,选择播放速度按钮,选择码率按钮,选择线路按钮 - private TextView tv_curtime_land, tv_tottime_land, tv_title, tv_speed, tv_bit, tv_route, tv_ppt_dir; + private TextView tv_curtime_land, tv_tottime_land, tv_title, tv_speed, tv_bit, tv_route, tv_ppt_dir, tvKnowledge; // 横屏的进度条 private PolyvTickSeekBar sb_play_land; + private RelativeLayout controllerCodecRl; + private ImageView controllerCodecCloseIv; + private TextView controllerMediaCodecTv; + private TextView controllerAvCodecTv; + private TextView tvCodecLand; /** * 侧边布局的view */ @@ -204,6 +214,8 @@ public class PolyvPlayerMediaController extends PolyvBaseMediaController impleme private TextView tv_route1, tv_route2, tv_route3; //关闭布局按钮 private ImageView iv_close_route; + // 知识清单布局 + private PolyvPlayerKnowledgeLayout knowledgeLayout; //----------------------------------------- // 进度条是否处于拖动的状态 private boolean status_dragging; @@ -218,7 +230,7 @@ public class PolyvPlayerMediaController extends PolyvBaseMediaController impleme private ImageView polyvScreenLock, polyvScreenLockAudio; //网络监测 - public PolyvNetworkDetection networkDetection; + private PolyvNetworkDetection networkDetection; private LinearLayout flowPlayLayout; private View flowButton, cancelFlowButton; private int fileType; @@ -230,11 +242,13 @@ public class PolyvPlayerMediaController extends PolyvBaseMediaController impleme private PictureInPictureParams.Builder pipBuilder; private boolean isViceHideInPipMode; + private PolyvSettings videoSetting = new PolyvSettings(getContext()); + //全屏策略 private static final int FULLSCREEN_RATIO = 0;//根据视频宽高判断,当宽>=高时,使用横屏全屏 private static final int FULLSCREEN_LANDSCAPE = 1;//使用横屏全屏 private static final int FULLSCREEN_PORTRAIT = 2;//使用竖屏全屏 - private int fullScreenStrategy = FULLSCREEN_LANDSCAPE; + private int fullScreenStrategy = FULLSCREEN_RATIO; private int videoWidth, videoHeight; private boolean isFullScreen; @@ -242,7 +256,9 @@ public class PolyvPlayerMediaController extends PolyvBaseMediaController impleme public static final int DRAG_SEEK_ALLOW = 0;//允许拖动进度条跳转进度 public static final int DRAG_SEEK_BAN = 1;//禁止拖动进度条跳转进度 public static final int DRAG_SEEK_PLAYED = 2;//只允许在已播放进度区域拖动跳转播放进度 - private int dragSeekStrategy = DRAG_SEEK_ALLOW; + private int dragSeekStrategy = DRAG_SEEK_PLAYED; + private OnDragSeekListener onDragSeekListener; + private static final int SAVE_PROGRESS = 30; //用于处理控制栏的显示状态 @@ -283,13 +299,24 @@ private int getSavePosition() { return 0; } + @Override public boolean canDragSeek(int seekPosition) { + boolean canDragSeek = true; if (dragSeekStrategy == DRAG_SEEK_PLAYED) { - return seekPosition <= getSavePosition(); + canDragSeek = seekPosition <= getSavePosition(); } else if (dragSeekStrategy == DRAG_SEEK_BAN) { - return false; + canDragSeek = false; } - return true; + + if (onDragSeekListener == null || videoView == null) { + return canDragSeek; + } + if (canDragSeek) { + onDragSeekListener.onDragSeekSuccess(videoView.getCurrentPosition(), seekPosition); + } else { + onDragSeekListener.onDragSeekBan(dragSeekStrategy); + } + return canDragSeek; } private void saveProgress() { @@ -377,7 +404,7 @@ public void setPPTLayout(PolyvViceScreenLayout viceLayout, PolyvPPTDirLayout lan } public void setDanmuFragment(PolyvPlayerDanmuFragment danmuFragment) { -// this.danmuFragment = danmuFragment; + this.danmuFragment = danmuFragment; } public void setAudioCoverView(PolyvPlayerAudioCoverView coverView) { @@ -397,6 +424,10 @@ private void findIdAndNew() { tv_speed_portrait = (TextView) view.findViewById(R.id.tv_speed_portrait); tv_route_portrait = (TextView) view.findViewById(R.id.tv_route_portrait); sb_play = (SeekBar) view.findViewById(R.id.sb_play); + controllerCodecPortraitRl = findViewById(R.id.plv_controller_codec_portrait_rl); + controllerMediaCodecPortraitTv = findViewById(R.id.plv_controller_media_codec_portrait_tv); + controllerAvCodecPortraitTv = findViewById(R.id.plv_controller_av_codec_portrait_tv); + tvCodecPortrait = findViewById(R.id.tv_codec_portrait); //竖屏的播放速度布局的view rl_center_speed_portrait = (RelativeLayout) view.findViewById(R.id.rl_center_speed_portrait); tv_speed05_portrait = (TextView) view.findViewById(R.id.tv_speed05_portrait); @@ -435,6 +466,12 @@ private void findIdAndNew() { tv_bit = (TextView) view.findViewById(R.id.tv_bit); tv_route = (TextView) view.findViewById(R.id.tv_route); tv_ppt_dir = (TextView) view.findViewById(R.id.tv_ppt_dir); + tvKnowledge = (TextView) view.findViewById(R.id.tv_knowledge); + controllerCodecRl = findViewById(R.id.plv_controller_codec_rl); + controllerCodecCloseIv = findViewById(R.id.plv_controller_codec_close_iv); + controllerMediaCodecTv = findViewById(R.id.plv_controller_media_codec_tv); + controllerAvCodecTv = findViewById(R.id.plv_controller_av_codec_tv); + tvCodecLand = findViewById(R.id.tv_codec_land); //设置布局的view rl_center_set = (RelativeLayout) view.findViewById(R.id.rl_center_set); sb_light = (SeekBar) view.findViewById(R.id.sb_light); @@ -514,6 +551,8 @@ private void findIdAndNew() { tv_route2 = (TextView) view.findViewById(R.id.tv_route2); tv_route3 = (TextView) view.findViewById(R.id.tv_route3); iv_close_route = (ImageView) view.findViewById(R.id.iv_close_route); + // 知识清单布局 + knowledgeLayout = (PolyvPlayerKnowledgeLayout) view.findViewById(R.id.knowledge_layout); sensorHelper = new PolyvSensorHelper(videoActivity); tickTips = (PolyvTickTips) view.findViewById(R.id.fl_tt); @@ -530,6 +569,34 @@ public void onSeekClick(PolyvTickSeekBar.TickData tickData) { } }); + knowledgeLayout.setOnViewActionListener(new PolyvPlayerKnowledgeLayout.OnViewActionListener() { + @Override + public void onReady() { + tvKnowledge.setVisibility(VISIBLE); + } + + @Override + public void onClickClose() { + if (isShowing() && status_showalways) { + show(longTime); + } + } + + @Override + public void onClickKnowledgePoint(PolyvPlayerKnowledgeVO.WordType.WordKey.KnowledgePoint knowledgePoint) { + if (knowledgePoint != null && knowledgePoint.getTime() != null) { + videoView.seekTo(knowledgePoint.getTime() * 1000); + } + } + + @Override + public void onAutoClose() { + if (isShowing() && status_showalways) { + show(longTime); + } + } + }); + polyvScreenLock = (ImageView) view.findViewById(R.id.polyv_screen_lock); polyvScreenLockAudio = (ImageView) view.findViewById(R.id.polyv_screen_lock_audio); @@ -643,12 +710,16 @@ private void initView() { iv_vice_status_portrait.setOnClickListener(this); iv_vice_status.setOnClickListener(this); tv_ppt_dir.setOnClickListener(this); + tvKnowledge.setOnClickListener(this); iv_pip_portrait.setOnClickListener(this); iv_pip.setOnClickListener(this); - - //关闭弹幕 - iv_dmswitch.setVisibility(View.GONE); - iv_danmu.setVisibility(View.INVISIBLE); + controllerAvCodecPortraitTv.setOnClickListener(this); + controllerMediaCodecPortraitTv.setOnClickListener(this); + tvCodecPortrait.setOnClickListener(this); + controllerAvCodecTv.setOnClickListener(this); + controllerMediaCodecTv.setOnClickListener(this); + controllerCodecCloseIv.setOnClickListener(this); + tvCodecLand.setOnClickListener(this); } //是否显示左侧边的切换音视频的布局 @@ -659,10 +730,10 @@ private boolean canShowLeftSideView() { public void resetView() { if (ll_subtitle != null) { - ll_subtitle.setVisibility(View.INVISIBLE); + ll_subtitle.setVisibility(View.GONE); } if (ll_subtitle_b != null) { - ll_subtitle_b.setVisibility(View.INVISIBLE); + ll_subtitle_b.setVisibility(View.GONE); } } @@ -672,7 +743,7 @@ public void preparedSRT(IPolyvVideoView videoView) { this.videoVO = videoView.getVideo(); //初始化字幕控件 initSrtView(videoView.getCurrSRTKey()); - int visibility = PolyvVideoVO.MODE_AUDIO.equals(videoView.getCurrentMode()) ? View.INVISIBLE : View.VISIBLE; + int visibility = PolyvVideoVO.MODE_AUDIO.equals(videoView.getCurrentMode()) ? View.GONE : View.VISIBLE; ll_subtitle.setVisibility(visibility); ll_subtitle_b.setVisibility(visibility); } @@ -699,12 +770,12 @@ public void preparedView() { //初始化切换线路及其可见性 initRouteView(); //非全屏和全屏的控制栏的切换线路按钮默认不可见,如需更改为可见,注释这两行代码即可 -// tv_route_portrait.setVisibility(View.GONE); -// tv_route.setVisibility(View.GONE); + tv_route_portrait.setVisibility(View.GONE); + tv_route.setVisibility(View.GONE); //音频模式下,隐藏切换码率/填充模式/字幕/截图的按钮 - int visibility = PolyvVideoVO.MODE_AUDIO.equals(videoView.getCurrentMode()) ? View.INVISIBLE : View.VISIBLE; - if (visibility == View.INVISIBLE) { + int visibility = PolyvVideoVO.MODE_AUDIO.equals(videoView.getCurrentMode()) ? View.GONE : View.VISIBLE; + if (visibility == View.GONE) { rl_center_bit.setVisibility(visibility); rl_center_bit_portrait.setVisibility(visibility); rl_center_route.setVisibility(visibility); @@ -757,7 +828,7 @@ public boolean onSeekBarClick() { resetModeView(false); } } else { - resetLeftSideView(View.INVISIBLE); + resetLeftSideView(View.GONE); } //ppt状态 if (videoVO != null && videoVO.hasPPT() && videoView.isPPTEnabled()) { @@ -769,10 +840,7 @@ public boolean onSeekBarClick() { iv_vice_status.setVisibility(View.GONE); tv_ppt_dir.setVisibility(View.GONE); } - //RN默认关闭PPT支持 - iv_vice_status_portrait.setVisibility(View.GONE); - iv_vice_status.setVisibility(View.GONE); - tv_ppt_dir.setVisibility(View.GONE); + updateCodecName(); } // 视频准备完成后,开启随手势自动切换屏幕 if (PolyvScreenUtils.isLandscape(mContext)) @@ -811,7 +879,7 @@ public void hide() { handler.removeMessages(SHOW_PROGRESS); resetPopupLayout(); isShowing = !isShowing; - setVisibility(View.INVISIBLE); + setVisibility(View.GONE); } } @@ -852,14 +920,16 @@ public void disable() { } private void resetPopupLayout(){ - resetSetLayout(View.INVISIBLE); - resetDanmuLayout(View.INVISIBLE); - resetShareLayout(View.INVISIBLE); - resetSpeedLayout(View.INVISIBLE); - resetBitRateLayout(View.INVISIBLE); - resetRouteLayout(View.INVISIBLE); + resetSetLayout(View.GONE); + resetDanmuLayout(View.GONE); + resetShareLayout(View.GONE); + resetSpeedLayout(View.GONE); + resetBitRateLayout(View.GONE); + resetRouteLayout(View.GONE); + resetCodecLayout(View.GONE); hidePortraitPopupView(); tickTips.hide(); + knowledgeLayout.show(false); } /** @@ -878,9 +948,9 @@ public void show(int timeout) { updateLockStatus(); resetPopupLayout(); - resetSideLayout(View.INVISIBLE); - resetLeftSideView(View.INVISIBLE); - resetTopBottomLayout(View.INVISIBLE); + resetSideLayout(View.GONE); + resetLeftSideView(View.GONE); + resetTopBottomLayout(View.GONE); isShowing = true; } else { if (!isShowing) { @@ -956,7 +1026,7 @@ private void initFullScreenWH() { vlp.width = ViewGroup.LayoutParams.MATCH_PARENT; vlp.height = ViewGroup.LayoutParams.MATCH_PARENT; rl_land.setVisibility(View.VISIBLE); - rl_port.setVisibility(View.INVISIBLE); + rl_port.setVisibility(View.GONE); } //----- 增加RN适用的方法 -------- @@ -994,7 +1064,6 @@ public void setFullScreenController() { return; } - PolyvCommonLog.d(TAG,"setLandscapeController:"+this); // 通过移除整个播放器布局到窗口的上层布局中,并改变整个播放器布局的大小,实现全屏的播放器。 if (fullVideoView == null) { fullVideoView = ((ViewGroup) videoView.getParent().getParent()); @@ -1020,7 +1089,6 @@ public void setFullScreenController() { } - /** * 切换到竖屏全屏 */ @@ -1028,7 +1096,6 @@ public void changeToFullPortrait() { PolyvScreenUtils.hideStatusBar(videoActivity); PolyvScreenUtils.hideNavigationBar(videoActivity); // initFullScreenWH(); - setFullScreenController(); } @@ -1041,13 +1108,13 @@ public void changeToSmallScreen() { setSmallScreenController(); } - public void initSmallScreenWH() { + private void initSmallScreenWH() { isFullScreen = false; ViewGroup.LayoutParams vlp = parentView.getLayoutParams(); vlp.width = ViewGroup.LayoutParams.MATCH_PARENT; vlp.height = PolyvScreenUtils.getHeight16_9(); rl_port.setVisibility(View.VISIBLE); - rl_land.setVisibility(View.INVISIBLE); + rl_land.setVisibility(View.GONE); } @Override @@ -1080,13 +1147,17 @@ private void resetControllerLayout() { public void playOrPause() { if (videoView != null) { if (videoView.isPlaying()) { -// danmuFragment.pause(); + if (danmuFragment != null) { + danmuFragment.pause(); + } videoView.pause(); status_isPlaying = false; iv_play.setSelected(true); iv_play_land.setSelected(true); } else { -// danmuFragment.resume(); + if (danmuFragment != null) { + danmuFragment.resume(); + } videoView.start(); status_isPlaying = true; iv_play.setSelected(false); @@ -1136,14 +1207,20 @@ public void onStopTrackingTouch(SeekBar seekBar) { if (!videoView.isCompletedState()) { if (canDragSeek(seekToPosition)) { videoView.seekTo(seekToPosition); -// danmuFragment.seekTo(); + if (danmuFragment != null) { + danmuFragment.seekTo(); + } } } else if (videoView.isCompletedState() && seekToPosition / seekBar.getMax() * seekBar.getMax() < videoView.getDuration() / seekBar.getMax() * seekBar.getMax()) { if (canDragSeek(seekToPosition)) { videoView.seekTo(seekToPosition); -// danmuFragment.seekTo(); + if (danmuFragment != null) { + danmuFragment.seekTo(); + } videoView.start(); -// danmuFragment.resume(); + if (danmuFragment != null) { + danmuFragment.resume(); + } } } } @@ -1192,9 +1269,9 @@ private void resetSideLayout(int isVisible) { private void resetSetLayout(int isVisible) { if (isVisible == View.VISIBLE) { show(-1); - resetTopBottomLayout(View.INVISIBLE); - resetSideLayout(View.INVISIBLE); - resetLeftSideView(View.INVISIBLE); + resetTopBottomLayout(View.GONE); + resetSideLayout(View.GONE); + resetLeftSideView(View.GONE); if (videoView != null) { sb_light.setProgress(videoView.getBrightness(videoActivity)); sb_volume.setProgress(videoView.getVolume()); @@ -1207,36 +1284,40 @@ private void resetSetLayout(int isVisible) { private void resetDanmuLayout(int isVisible) { if (isVisible == View.VISIBLE) { show(-1); - resetTopBottomLayout(View.INVISIBLE); - resetSideLayout(View.INVISIBLE); - resetLeftSideView(View.INVISIBLE); - resetBitRateLayout(View.INVISIBLE, false); - resetSpeedLayout(View.INVISIBLE, false); - resetRouteLayout(View.INVISIBLE, false); + resetTopBottomLayout(View.GONE); + resetSideLayout(View.GONE); + resetLeftSideView(View.GONE); + resetBitRateLayout(View.GONE, false); + resetSpeedLayout(View.GONE, false); + resetRouteLayout(View.GONE, false); et_dmedit.requestFocus(); et_dmedit.setText(""); if (videoView != null) { status_isPlaying = videoView.isPlaying(); videoView.pause(true); -// danmuFragment.pause(); + if (danmuFragment != null) { + danmuFragment.pause(); + } } PolyvKeyBoardUtils.openKeybord(et_dmedit, mContext); } else if (rl_center_danmu.getVisibility() == View.VISIBLE) { if (videoView != null && status_isPlaying) { videoView.start(); -// danmuFragment.resume(); + if (danmuFragment != null) { + danmuFragment.resume(); + } } PolyvKeyBoardUtils.closeKeybord(et_dmedit, mContext); } iv_dmset.setSelected(false); - rl_dmbot.setVisibility(View.INVISIBLE); + rl_dmbot.setVisibility(View.GONE); rl_center_danmu.setVisibility(isVisible); } //重置弹幕布局的底部布局的显示状态 private void resetDanmuBottomLayout() { if (rl_dmbot.getVisibility() == View.VISIBLE) { - rl_dmbot.setVisibility(View.INVISIBLE); + rl_dmbot.setVisibility(View.GONE); iv_dmset.setSelected(false); PolyvKeyBoardUtils.openKeybord(et_dmedit, mContext); } else { @@ -1250,9 +1331,9 @@ private void resetDanmuBottomLayout() { private void resetShareLayout(int isVisible) { if (isVisible == View.VISIBLE) { show(-1); - resetTopBottomLayout(View.INVISIBLE); - resetSideLayout(View.INVISIBLE); - resetLeftSideView(View.INVISIBLE); + resetTopBottomLayout(View.GONE); + resetSideLayout(View.GONE); + resetLeftSideView(View.GONE); } rl_center_share.setVisibility(isVisible); } @@ -1400,19 +1481,19 @@ private void initSrtView(String srtKey) { srtKeys.addAll(videoVO.getVideoSRT().keySet()); switch (srtKeys.size()) { case 0: - tv_srt1.setVisibility(View.INVISIBLE); - tv_srt2.setVisibility(View.INVISIBLE); - tv_srt3.setVisibility(View.INVISIBLE); + tv_srt1.setVisibility(View.GONE); + tv_srt2.setVisibility(View.GONE); + tv_srt3.setVisibility(View.GONE); break; case 1: tv_srt1.setText(srtKeys.get(0)); - tv_srt2.setVisibility(View.INVISIBLE); - tv_srt3.setVisibility(View.INVISIBLE); + tv_srt2.setVisibility(View.GONE); + tv_srt3.setVisibility(View.GONE); break; case 2: tv_srt1.setText(srtKeys.get(0)); tv_srt2.setText(srtKeys.get(1)); - tv_srt3.setVisibility(View.INVISIBLE); + tv_srt3.setVisibility(View.GONE); break; default: tv_srt1.setText(srtKeys.get(0)); @@ -1445,17 +1526,16 @@ private void resetSpeedLayout(int isVisible) { private void resetSpeedLayout(int isVisible, boolean isShowTopBottomLayout) { if (isVisible == View.VISIBLE) { show(-1); - resetTopBottomLayout(View.INVISIBLE, true); - resetBitRateLayout(View.INVISIBLE, false); - resetRouteLayout(View.INVISIBLE, false); + resetTopBottomLayout(View.GONE, true); + resetBitRateLayout(View.GONE, false); + resetRouteLayout(View.GONE, false); + resetCodecLayout(View.GONE, false); } else if (isShowTopBottomLayout) { resetTopBottomLayout(View.VISIBLE); requestFocus(); resetHideTime(longTime); } rl_center_speed.setVisibility(isVisible); - -// requestLayout(rl_center_speed); } //初始化选择播放速度的控件 @@ -1553,14 +1633,14 @@ private void initBitRateView(int bitRate) { //初始化选择码率控件的可见性 private void initBitRateViewVisible(int currentBitRate) { - tv_sc.setVisibility(View.INVISIBLE); - tv_sc_portrait.setVisibility(View.INVISIBLE); - tv_hd.setVisibility(View.INVISIBLE); - tv_hd_portrait.setVisibility(View.INVISIBLE); - tv_flu.setVisibility(View.INVISIBLE); - tv_flu_portrait.setVisibility(View.INVISIBLE); - tv_auto.setVisibility(View.INVISIBLE); - tv_auto_portrait.setVisibility(View.INVISIBLE); + tv_sc.setVisibility(View.GONE); + tv_sc_portrait.setVisibility(View.GONE); + tv_hd.setVisibility(View.GONE); + tv_hd_portrait.setVisibility(View.GONE); + tv_flu.setVisibility(View.GONE); + tv_flu_portrait.setVisibility(View.GONE); + tv_auto.setVisibility(View.GONE); + tv_auto_portrait.setVisibility(View.GONE); if (videoVO != null) { switch (videoVO.getDfNum()) { case 1: @@ -1618,9 +1698,10 @@ private void resetBitRateLayout(int isVisible) { private void resetBitRateLayout(int isVisible, boolean isShowTopBottomLayout) { if (isVisible == View.VISIBLE) { show(-1); - resetTopBottomLayout(View.INVISIBLE, true); - resetSpeedLayout(View.INVISIBLE, false); - resetRouteLayout(View.INVISIBLE, false); + resetTopBottomLayout(View.GONE, true); + resetSpeedLayout(View.GONE, false); + resetRouteLayout(View.GONE, false); + resetCodecLayout(View.GONE, false); } else if (isShowTopBottomLayout) { resetTopBottomLayout(View.VISIBLE); requestFocus(); @@ -1660,7 +1741,7 @@ private void resetBitRateView(final int bitRate) { @Override public void onClick(View v) { networkDetection.allowMobile(); - flowPlayLayout.setVisibility(View.INVISIBLE); + flowPlayLayout.setVisibility(View.GONE); resetBitRateView(bitRate); } })) { @@ -1694,9 +1775,10 @@ private void resetRouteLayout(int isVisible) { private void resetRouteLayout(int isVisible, boolean isShowTopBottomLayout) { if (isVisible == View.VISIBLE) { show(-1); - resetTopBottomLayout(View.INVISIBLE, true); - resetSpeedLayout(View.INVISIBLE, false); - resetBitRateLayout(View.INVISIBLE, false); + resetTopBottomLayout(View.GONE, true); + resetSpeedLayout(View.GONE, false); + resetBitRateLayout(View.GONE, false); + resetCodecLayout(View.GONE, false); } else if (isShowTopBottomLayout) { resetTopBottomLayout(View.VISIBLE); requestFocus(); @@ -1749,16 +1831,39 @@ private void initSelectedRouteView(int currentRoute) { } } + private void resetCodecLayout(int isVisible) { + resetCodecLayout(isVisible, true); + } + + private void resetCodecLayout(int isVisible, boolean isShowTopBottomLayout) { + if (isVisible == View.VISIBLE) { + show(-1); + resetTopBottomLayout(View.GONE, true); + resetSpeedLayout(View.GONE, false); + resetBitRateLayout(View.GONE, false); + resetRouteLayout(View.GONE, false); + } else if (isShowTopBottomLayout) { + resetTopBottomLayout(View.VISIBLE); + requestFocus(); + resetHideTime(longTime); + } + controllerCodecRl.setVisibility(isVisible); + } + //重置显示/隐藏弹幕的控件 private void resetDmSwitchView() { if (iv_dmswitch.isSelected()) { iv_dmswitch.setSelected(false); -// danmuFragment.show(); + if (danmuFragment != null) { + danmuFragment.show(); + } iv_danmu.setVisibility(View.VISIBLE); } else { iv_dmswitch.setSelected(true); -// danmuFragment.hide(); - iv_danmu.setVisibility(View.INVISIBLE); + if (danmuFragment != null) { + danmuFragment.hide(); + } + iv_danmu.setVisibility(View.GONE); } } @@ -1855,7 +1960,9 @@ public void success(String s) { //发送弹幕并隐藏布局 private void sendDanmaku() { -// danmuFragment.send(videoView, et_dmedit.getText().toString(), fontmode, fontsize, color); + if (danmuFragment != null) { + danmuFragment.send(videoView, et_dmedit.getText().toString(), fontmode, fontsize, color); + } hide(); } @@ -1882,9 +1989,10 @@ private void resetModeView(boolean isVideo) { } private void hidePortraitPopupView() { - rl_center_bit_portrait.setVisibility(View.INVISIBLE); - rl_center_speed_portrait.setVisibility(View.INVISIBLE); - rl_center_route_portrait.setVisibility(View.INVISIBLE); + rl_center_bit_portrait.setVisibility(View.GONE); + rl_center_speed_portrait.setVisibility(View.GONE); + rl_center_route_portrait.setVisibility(View.GONE); + controllerCodecPortraitRl.setVisibility(View.GONE); } public boolean isLocked() { @@ -1899,7 +2007,7 @@ private void changeVideoMode() { @Override public void onClick(View v) { networkDetection.allowMobile(); - flowPlayLayout.setVisibility(View.INVISIBLE); + flowPlayLayout.setVisibility(View.GONE); changeVideoMode(); } })) { @@ -1922,7 +2030,7 @@ private void changeAudioMode() { @Override public void onClick(View v) { networkDetection.allowMobile(); - flowPlayLayout.setVisibility(View.INVISIBLE); + flowPlayLayout.setVisibility(View.GONE); changeAudioMode(); } })) { @@ -1936,6 +2044,22 @@ public void onClick(View v) { } } + private void changeCodecType(boolean isMediaCodec) { + videoSetting.setUsingMediaCodec(isMediaCodec); + videoView.changeMode(videoView.getPriorityMode()); + updateCodecName(); + } + + private void updateCodecName() { + final boolean isMediaCodec = videoSetting.getUsingMediaCodec(); + controllerMediaCodecPortraitTv.setSelected(isMediaCodec); + controllerAvCodecPortraitTv.setSelected(!isMediaCodec); + controllerMediaCodecTv.setSelected(isMediaCodec); + controllerAvCodecTv.setSelected(!isMediaCodec); + tvCodecPortrait.setText(isMediaCodec ? "硬解" : "软解"); + tvCodecLand.setText(isMediaCodec ? "硬解" : "软解"); + } + public void updatePictureInPictureActions(@DrawableRes int iconId, String title, int controlType, int requestCode) { if (Build.VERSION.SDK_INT < 26) return; @@ -1970,6 +2094,10 @@ public boolean isViceHideInPipMode() { return isViceHideInPipMode; } + public void setOnDragSeekListener(OnDragSeekListener listener) { + this.onDragSeekListener = listener; + } + @Override public void onClick(View view) { int id = view.getId(); @@ -2029,7 +2157,7 @@ public void onClick(View view) { } else if (id == R.id.tv_dmfontl) { resetDanmaFontView(PolyvDanmakuInfo.FONTSIZE_LARGE); } else if (id == R.id.et_dmedit) { - rl_dmbot.setVisibility(View.INVISIBLE); + rl_dmbot.setVisibility(View.GONE); iv_dmset.setSelected(false); } else if (id == R.id.iv_shareqq) { PolyvShareUtils.shareQQFriend(mContext, "", PolyvPlayerTopFragment.SHARE_TEXT, PolyvShareUtils.TEXT, null); @@ -2057,10 +2185,10 @@ public void onClick(View view) { rl_center_speed_portrait.setVisibility(View.VISIBLE); } } else if (id == R.id.tv_speed) { - if (rl_center_speed.getVisibility() == View.INVISIBLE) + if (rl_center_speed.getVisibility() == View.GONE) resetSpeedLayout(View.VISIBLE); else - resetSpeedLayout(View.INVISIBLE); + resetSpeedLayout(View.GONE); } else if (id == R.id.tv_bit_portrait) { boolean isVisibleBit = rl_center_bit_portrait.getVisibility() == View.VISIBLE; hidePortraitPopupView(); @@ -2068,10 +2196,10 @@ public void onClick(View view) { rl_center_bit_portrait.setVisibility(View.VISIBLE); } } else if (id == R.id.tv_bit) { - if (rl_center_bit.getVisibility() == View.INVISIBLE) + if (rl_center_bit.getVisibility() == View.GONE) resetBitRateLayout(View.VISIBLE); else - resetBitRateLayout(View.INVISIBLE); + resetBitRateLayout(View.GONE); } else if (id == R.id.tv_sc_portrait || id == R.id.tv_sc) { resetBitRateView(3); } else if (id == R.id.tv_hd_portrait || id == R.id.tv_hd) { @@ -2099,10 +2227,10 @@ public void onClick(View view) { rl_center_route_portrait.setVisibility(View.VISIBLE); } } else if (id == R.id.tv_route) { - if (rl_center_route.getVisibility() == View.INVISIBLE) + if (rl_center_route.getVisibility() == View.GONE) resetRouteLayout(View.VISIBLE); else - resetRouteLayout(View.INVISIBLE); + resetRouteLayout(View.GONE); } else if (id == R.id.tv_route1_portrait || id == R.id.tv_route1) { changeRoute(1); } else if (id == R.id.tv_route2_portrait || id == R.id.tv_route2) { @@ -2159,9 +2287,32 @@ public void onClick(View view) { viceLayout.hide(); } } + } else if (id == R.id.tv_knowledge) { + knowledgeLayout.show(!knowledgeLayout.isShowing()); + show(-1); + } else if (id == R.id.tv_codec_portrait) { + final boolean showCodecLayout = controllerCodecPortraitRl.getVisibility() != View.VISIBLE; + hidePortraitPopupView(); + controllerCodecPortraitRl.setVisibility(showCodecLayout ? View.VISIBLE : View.GONE); + } else if (id == R.id.tv_codec_land) { + resetCodecLayout(controllerCodecRl.getVisibility() != View.VISIBLE ? View.VISIBLE : View.GONE); + } else if (id == R.id.plv_controller_av_codec_portrait_tv || id == R.id.plv_controller_av_codec_tv) { + changeCodecType(false); + hide(); + } else if (id == R.id.plv_controller_media_codec_portrait_tv || id == R.id.plv_controller_media_codec_tv) { + changeCodecType(true); + hide(); + } else if (id == R.id.plv_controller_codec_close_iv) { + hide(); } //如果控制栏不是处于一直显示的状态,那么重置控制栏隐藏的时间 if (!status_showalways) resetHideTime(longTime); } + + public interface OnDragSeekListener { + void onDragSeekSuccess(int positionBeforeSeek, int positionAfterSeek); + + void onDragSeekBan(int dragSeekStrategy); + } } diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerMediaControllerRN.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerMediaControllerRN.java deleted file mode 100644 index 0bc0476..0000000 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerMediaControllerRN.java +++ /dev/null @@ -1,1533 +0,0 @@ -package com.easefun.polyvsdk.player; - -import android.app.Activity; -import android.content.Context; -import android.content.res.Configuration; -import android.graphics.Color; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.util.Log; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import android.view.inputmethod.EditorInfo; -import android.widget.EditText; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; -import android.widget.SeekBar; -import android.widget.TextView; -import android.widget.Toast; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.fragment.PolyvPlayerTopFragment; -import com.easefun.polyvsdk.ijk.PolyvPlayerScreenRatio; -import com.easefun.polyvsdk.log.PolyvCommonLog; -import com.easefun.polyvsdk.util.PolyvKeyBoardUtils; -import com.easefun.polyvsdk.util.PolyvScreenUtils; -import com.easefun.polyvsdk.util.PolyvSensorHelper; -import com.easefun.polyvsdk.util.PolyvShareUtils; -import com.easefun.polyvsdk.util.PolyvTimeUtils; -import com.easefun.polyvsdk.video.IPolyvVideoView; -import com.easefun.polyvsdk.video.PolyvBaseMediaController; -import com.easefun.polyvsdk.video.PolyvVideoView; -import com.easefun.polyvsdk.view.PolyvTickSeekBar; -import com.easefun.polyvsdk.view.PolyvTickTips; -import com.easefun.polyvsdk.vo.PolyvVideoVO; - -import java.util.ArrayList; -import java.util.List; - -//import com.easefun.polyvsdk.sub.danmaku.entity.PolyvDanmakuInfo; -//import com.easefun.polyvsdk.sub.screenshot.PolyvScreenShot; - -public class PolyvPlayerMediaControllerRN extends PolyvBaseMediaController implements View.OnClickListener { - private static final String TAG = PolyvPlayerMediaControllerRN.class.getSimpleName(); - private Context mContext = null; - private PolyvVideoView videoView = null; - private PolyvVideoVO videoVO; -// private PolyvPlayerDanmuLayout danmuFragment; - //播放器所在的activity - private Activity videoActivity; - //播放器的ParentView - private View parentView; - //显示的状态 - private boolean isShowing; - //控制栏显示的时间 - private static final int longTime = 5000; - private static final int HIDE = 12; - private static final int SHOW_PROGRESS = 13; - //controllerView - private View view; - /** - * 竖屏的view - */ - // 竖屏的控制栏 - private RelativeLayout rl_port; - // 竖屏的切屏按钮,竖屏的播放/暂停按钮 - private ImageView iv_land, iv_play; - // 竖屏的显示播放进度控件 - private TextView tv_curtime, tv_tottime; - // 竖屏的进度条 - private SeekBar sb_play; - /** - * 横屏的view - */ - //横屏的控制栏,顶部布局,底部布局 - private RelativeLayout rl_land, rl_top, rl_bot; - //横屏的切屏按钮,横屏的播放/暂停按钮,横屏的返回按钮,设置按钮,分享按钮,弹幕开关 - private ImageView iv_port, iv_play_land, iv_finish, iv_set, iv_share, iv_dmswitch; - // 横屏的显示播放进度控件,视频的标题,选择播放速度按钮,选择码率按钮 - private TextView tv_curtime_land, tv_tottime_land, tv_title, tv_speed, tv_bit; - // 横屏的进度条 - private PolyvTickSeekBar sb_play_land; - /** - * 侧边布局的view - */ - //侧边布局 - private LinearLayout ll_side; - //弹幕按钮,截图按钮 - private ImageView iv_danmu, iv_screens; - /** - * 左侧边布局的view - */ - //左侧边布局 - private LinearLayout ll_left_side, ll_left_side_land, ll_left_side_t, ll_left_side_t_land; - //视频/音频切换按钮 - private ImageView iv_video, iv_video_land, iv_audio, iv_audio_land; - private TextView tv_video, tv_video_land, tv_audio, tv_audio_land; - /** - * 设置布局的view - */ - //设置布局 - private RelativeLayout rl_center_set; - //调节亮度控件,调节音量控件 - private SeekBar sb_light, sb_volume; - // 设置播放器银幕比率控件,设置字幕的控件 - private LinearLayout ll_adaptive_mode, ll_subtitle, ll_subtitle_b; - private TextView tv_full, tv_fit, tv_sixteennine, tv_fourthree, tv_srt1, tv_srt2, tv_srt3, tv_srtnone; - // 关闭布局按钮 - private ImageView iv_close_set; - /** - * 弹幕布局的view - */ - //弹幕布局,底部的设置布局 - private RelativeLayout rl_center_danmu, rl_dmbot; - //设置按钮,返回按钮,选择颜色按钮 - private ImageView iv_dmset, iv_finish_danmu, iv_dmwhite, iv_dmred, iv_dmpurple, iv_dmblue, iv_dmgreen, iv_dmyellow; - //选择弹幕样式按钮,选择弹幕字体大小按钮,发送弹幕按钮 - private TextView tv_dmroll, tv_dmtop, tv_dmbottom, tv_dmfonts, tv_dmfontm, tv_dmfontl, tv_dmsend; - //弹幕输入栏 - private EditText et_dmedit; - //弹幕的配置信息 - private String fontmode, fontsize; - private int color; - /** - * 分享布局的view - */ - //分享布局 - private RelativeLayout rl_center_share; - // 分享控件,关闭布局按钮 - private ImageView iv_shareqq, iv_sharewechat, iv_shareweibo, iv_close_share; - /** - * 播放速度布局 - */ - //播放速度布局 - private RelativeLayout rl_center_speed; - //选择播放速度控件 - private TextView tv_speed05, tv_speed10, tv_speed12, tv_speed15, tv_speed20; - //关闭布局按钮 - private ImageView iv_close_speed; - /** - * 播放码率布局 - */ - //播放码率布局 - private RelativeLayout rl_center_bit; - //选择播放码率的控件 - private TextView tv_sc, tv_hd, tv_flu, tv_auto; - //关闭布局按钮 - private ImageView iv_close_bit; - //----------------------------------------- - // 进度条是否处于拖动的状态 - private boolean status_dragging; - // 控制栏是否处于一直显示的状态 - private boolean status_showalways; - // 播放器在显示弹幕布局前的状态 - private boolean status_isPlaying; - private PolyvSensorHelper sensorHelper; - private PolyvPlayerAudioCoverView coverView; - private PolyvTickTips tickTips; - - private volatile static boolean hasVideoLandscape;//是否已经有视频全屏 - - //用于处理控制栏的显示状态 - private Handler handler = new Handler() { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case HIDE: - hide(); - break; - case SHOW_PROGRESS: - showProgress(); - break; - } - } - }; - - // 更新显示的播放进度,以及暂停/播放按钮 - private void showProgress() { - if (isShowing && videoView != null) { - // 单位:毫秒 - int position = videoView.getCurrentPosition(); - int totalTime = videoView.getDuration() / 1000 * 1000; - if (!videoView.isExceptionCompleted() && (videoView.isCompletedState() || position > totalTime)) - position = totalTime; - int bufPercent = videoView.getBufferPercentage(); - //在拖动进度条的时候,这里不更新 - if (!status_dragging) { - tv_curtime.setText(PolyvTimeUtils.generateTime(position)); - tv_curtime_land.setText(PolyvTimeUtils.generateTime(position)); - if (totalTime > 0) { - sb_play.setProgress((int) (sb_play.getMax() * 1L * position / totalTime)); - sb_play_land.setProgress((int) (sb_play_land.getMax() * 1L * position / totalTime)); - } else { - sb_play.setProgress(0); - sb_play_land.setProgress(0); - } - } - sb_play.setSecondaryProgress(sb_play.getMax() * bufPercent / 100); - sb_play_land.setSecondaryProgress(sb_play_land.getMax() * bufPercent / 100); - if (videoView.isPlaying()) { - iv_play.setSelected(false); - iv_play_land.setSelected(false); - } else { - iv_play.setSelected(true); - iv_play_land.setSelected(true); - } - handler.sendMessageDelayed(handler.obtainMessage(SHOW_PROGRESS), 1000 - (position % 1000)); - } - } - - public PolyvPlayerMediaControllerRN(Context context) { - this(context, null); - } - - public PolyvPlayerMediaControllerRN(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PolyvPlayerMediaControllerRN(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - this.mContext = context; - this.videoActivity = (Activity) mContext; - this.view = LayoutInflater.from(getContext()).inflate(R.layout.polyv_controller_media, this); - findIdAndNew(); - initView(); - } - - /** - * 初始化控制栏的配置 - * - * @param parentView 播放器的父控件 - */ - public void initConfig(ViewGroup parentView) { - this.parentView = parentView; - } - -// public void setDanmuFragment(PolyvPlayerDanmuLayout danmuFragment) { -// this.danmuFragment = danmuFragment; -// } - - public void setAudioCoverView(PolyvPlayerAudioCoverView coverView) { - this.coverView = coverView; - } - - private void findIdAndNew() { - //竖屏的view - rl_port = (RelativeLayout) view.findViewById(R.id.rl_port); - iv_land = (ImageView) view.findViewById(R.id.iv_land); - iv_play = (ImageView) view.findViewById(R.id.iv_play); - tv_curtime = (TextView) view.findViewById(R.id.tv_curtime); - tv_tottime = (TextView) view.findViewById(R.id.tv_tottime); - sb_play = (SeekBar) view.findViewById(R.id.sb_play); - //横屏的view - rl_land = (RelativeLayout) view.findViewById(R.id.rl_land); - rl_top = (RelativeLayout) view.findViewById(R.id.rl_top); - rl_bot = (RelativeLayout) view.findViewById(R.id.rl_bot); - iv_port = (ImageView) view.findViewById(R.id.iv_port); - iv_play_land = (ImageView) view.findViewById(R.id.iv_play_land); - iv_finish = (ImageView) view.findViewById(R.id.iv_finish); - tv_curtime_land = (TextView) view.findViewById(R.id.tv_curtime_land); - tv_tottime_land = (TextView) view.findViewById(R.id.tv_tottime_land); - sb_play_land = (PolyvTickSeekBar) view.findViewById(R.id.sb_play_land); - tv_title = (TextView) view.findViewById(R.id.tv_title); - iv_set = (ImageView) view.findViewById(R.id.iv_set); - iv_share = (ImageView) view.findViewById(R.id.iv_share); - iv_dmswitch = (ImageView) view.findViewById(R.id.iv_dmswitch); - tv_speed = (TextView) view.findViewById(R.id.tv_speed); - tv_bit = (TextView) view.findViewById(R.id.tv_bit); - //设置布局的view - rl_center_set = (RelativeLayout) view.findViewById(R.id.rl_center_set); - sb_light = (SeekBar) view.findViewById(R.id.sb_light); - sb_volume = (SeekBar) view.findViewById(R.id.sb_volume); - tv_full = (TextView) view.findViewById(R.id.tv_full); - tv_fit = (TextView) view.findViewById(R.id.tv_fit); - tv_sixteennine = (TextView) view.findViewById(R.id.tv_sixteennine); - tv_fourthree = (TextView) view.findViewById(R.id.tv_fourthree); - tv_srt1 = (TextView) view.findViewById(R.id.tv_srt1); - tv_srt2 = (TextView) view.findViewById(R.id.tv_srt2); - tv_srt3 = (TextView) view.findViewById(R.id.tv_srt3); - tv_srtnone = (TextView) view.findViewById(R.id.tv_srtnone); - iv_close_set = (ImageView) view.findViewById(R.id.iv_close_set); - ll_adaptive_mode = (LinearLayout) findViewById(R.id.ll_adaptive_mode); - ll_subtitle = (LinearLayout) findViewById(R.id.ll_subtitle); - ll_subtitle_b = (LinearLayout) findViewById(R.id.ll_subtitle_b); - //侧边布局的view - ll_side = (LinearLayout) view.findViewById(R.id.ll_side); - iv_danmu = (ImageView) view.findViewById(R.id.iv_danmu); - iv_screens = (ImageView) view.findViewById(R.id.iv_screens); - //左侧边布局的view - ll_left_side = (LinearLayout) view.findViewById(R.id.ll_left_side); - ll_left_side_land = (LinearLayout) view.findViewById(R.id.ll_left_side_land); - ll_left_side_t = (LinearLayout) view.findViewById(R.id.ll_left_side_t); - ll_left_side_t_land = (LinearLayout) view.findViewById(R.id.ll_left_side_t_land); - iv_video = (ImageView) view.findViewById(R.id.iv_video); - iv_video_land = (ImageView) view.findViewById(R.id.iv_video_land); - iv_audio = (ImageView) view.findViewById(R.id.iv_audio); - iv_audio_land = (ImageView) view.findViewById(R.id.iv_audio_land); - tv_video = (TextView) view.findViewById(R.id.tv_video); - tv_video_land = (TextView) view.findViewById(R.id.tv_video_land); - tv_audio = (TextView) view.findViewById(R.id.tv_audio); - tv_audio_land = (TextView) view.findViewById(R.id.tv_audio_land); - //弹幕布局的view - rl_center_danmu = (RelativeLayout) view.findViewById(R.id.rl_center_danmu); - rl_dmbot = (RelativeLayout) view.findViewById(R.id.rl_dmbot); - iv_dmset = (ImageView) view.findViewById(R.id.iv_dmset); - iv_finish_danmu = (ImageView) view.findViewById(R.id.iv_finish_danmu); - et_dmedit = (EditText) view.findViewById(R.id.et_dmedit); - iv_dmwhite = (ImageView) view.findViewById(R.id.iv_dmwhite); - iv_dmblue = (ImageView) view.findViewById(R.id.iv_dmblue); - iv_dmgreen = (ImageView) view.findViewById(R.id.iv_dmgreen); - iv_dmpurple = (ImageView) view.findViewById(R.id.iv_dmpurple); - iv_dmred = (ImageView) view.findViewById(R.id.iv_dmred); - iv_dmyellow = (ImageView) view.findViewById(R.id.iv_dmyellow); - tv_dmroll = (TextView) view.findViewById(R.id.tv_dmroll); - tv_dmtop = (TextView) view.findViewById(R.id.tv_dmtop); - tv_dmbottom = (TextView) view.findViewById(R.id.tv_dmbottom); - tv_dmfonts = (TextView) view.findViewById(R.id.tv_dmfonts); - tv_dmfontm = (TextView) view.findViewById(R.id.tv_dmfontm); - tv_dmfontl = (TextView) view.findViewById(R.id.tv_dmfontl); - tv_dmsend = (TextView) view.findViewById(R.id.tv_dmsend); - //分享布局的view - rl_center_share = (RelativeLayout) view.findViewById(R.id.rl_center_share); - iv_shareqq = (ImageView) view.findViewById(R.id.iv_shareqq); - iv_sharewechat = (ImageView) view.findViewById(R.id.iv_sharewechat); - iv_shareweibo = (ImageView) view.findViewById(R.id.iv_shareweibo); - iv_close_share = (ImageView) view.findViewById(R.id.iv_close_share); - //播放速度布局的view - rl_center_speed = (RelativeLayout) view.findViewById(R.id.rl_center_speed); - tv_speed05 = (TextView) view.findViewById(R.id.tv_speed05); - tv_speed10 = (TextView) view.findViewById(R.id.tv_speed10); - tv_speed12 = (TextView) view.findViewById(R.id.tv_speed12); - tv_speed15 = (TextView) view.findViewById(R.id.tv_speed15); - tv_speed20 = (TextView) view.findViewById(R.id.tv_speed20); - iv_close_speed = (ImageView) view.findViewById(R.id.iv_close_speed); - //播放码率布局的view - rl_center_bit = (RelativeLayout) view.findViewById(R.id.rl_center_bit); - tv_sc = (TextView) view.findViewById(R.id.tv_sc); - tv_hd = (TextView) view.findViewById(R.id.tv_hd); - tv_flu = (TextView) view.findViewById(R.id.tv_flu); - tv_auto = (TextView) view.findViewById(R.id.tv_auto); - iv_close_bit = (ImageView) view.findViewById(R.id.iv_close_bit); - - sensorHelper = new PolyvSensorHelper(videoActivity); - tickTips = (PolyvTickTips) view.findViewById(R.id.fl_tt); - tickTips.setOnSeekClickListener(new PolyvTickTips.OnSeekClickListener() { - @Override - public void onSeekClick(PolyvTickSeekBar.TickData tickData) { - if (videoView != null) { - videoView.seekTo((int) (tickData.getProgress() * 1000)); - tickTips.hide(); - } - } - }); - } - - private void initView() { - iv_land.setOnClickListener(this); - iv_port.setOnClickListener(this); - iv_play.setOnClickListener(this); - iv_play_land.setOnClickListener(this); - iv_finish.setOnClickListener(this); - iv_set.setOnClickListener(this); - iv_danmu.setOnClickListener(this); - iv_dmset.setOnClickListener(this); - iv_finish_danmu.setOnClickListener(this); - iv_share.setOnClickListener(this); - tv_full.setOnClickListener(this); - tv_fit.setOnClickListener(this); - tv_sixteennine.setOnClickListener(this); - tv_fourthree.setOnClickListener(this); - iv_dmwhite.setOnClickListener(this); - //弹幕的初始化配置 - iv_dmwhite.setSelected(true); - tv_dmroll.setSelected(true); - tv_dmfontm.setSelected(true); - color = Color.WHITE; -// fontmode = PolyvDanmakuInfo.FONTMODE_ROLL; -// fontsize = PolyvDanmakuInfo.FONTSIZE_MIDDLE; - //------------------------------ - iv_dmyellow.setOnClickListener(this); - iv_dmred.setOnClickListener(this); - iv_dmpurple.setOnClickListener(this); - iv_dmgreen.setOnClickListener(this); - iv_dmblue.setOnClickListener(this); - tv_dmroll.setOnClickListener(this); - tv_dmtop.setOnClickListener(this); - tv_dmbottom.setOnClickListener(this); - tv_dmfonts.setOnClickListener(this); - tv_dmfontm.setOnClickListener(this); - tv_dmfontl.setOnClickListener(this); - et_dmedit.setOnClickListener(this); - et_dmedit.setOnEditorActionListener(editorActionListener); - iv_shareqq.setOnClickListener(this); - iv_sharewechat.setOnClickListener(this); - iv_shareweibo.setOnClickListener(this); - iv_dmswitch.setOnClickListener(this); - tv_srt1.setOnClickListener(this); - tv_srt2.setOnClickListener(this); - tv_srt3.setOnClickListener(this); - tv_srtnone.setOnClickListener(this); - tv_speed.setOnClickListener(this); - tv_speed05.setOnClickListener(this); - tv_speed10.setOnClickListener(this); - tv_speed12.setOnClickListener(this); - tv_speed15.setOnClickListener(this); - tv_speed20.setOnClickListener(this); - tv_bit.setOnClickListener(this); - tv_sc.setOnClickListener(this); - tv_hd.setOnClickListener(this); - tv_flu.setOnClickListener(this); - tv_auto.setOnClickListener(this); - iv_close_bit.setOnClickListener(this); - iv_close_set.setOnClickListener(this); - iv_close_share.setOnClickListener(this); - iv_close_speed.setOnClickListener(this); - tv_dmsend.setOnClickListener(this); - iv_screens.setOnClickListener(this); - sb_play.setOnSeekBarChangeListener(seekBarChangeListener); - sb_play_land.setOnSeekBarChangeListener(seekBarChangeListener); - sb_light.setOnSeekBarChangeListener(seekBarChangeListener); - sb_volume.setOnSeekBarChangeListener(seekBarChangeListener); - iv_video.setOnClickListener(this); - iv_video_land.setOnClickListener(this); - iv_audio.setOnClickListener(this); - iv_audio_land.setOnClickListener(this); - } - - //是否显示左侧边的切换音视频的布局 - private boolean canShowLeftSideView() { - //是否可以获取到音频的播放地址 - return videoVO != null && videoVO.hasAudioPath(); - } - - public void preparedView() { - if (videoView != null) { - videoVO = videoView.getVideo(); - if (videoVO != null) - tv_title.setText(videoVO.getTitle()); - int totalTime = videoView.getDuration(); - tv_tottime.setText(PolyvTimeUtils.generateTime(totalTime)); - tv_tottime_land.setText(PolyvTimeUtils.generateTime(totalTime)); - //初始化播放器的银幕比率的显示控件 - initRatioView(videoView.getCurrentAspectRatio()); - //初始化字幕控件 - initSrtView(videoView.getCurrSRTKey()); - //初始化倍速控件及其可见性 - initSpeedView((int) (videoView.getSpeed() * 10)); - //初始化码率控件及其可见性 - initBitRateView(videoView.getBitRate()); - initBitRateViewVisible(videoView.getBitRate()); - - //音频模式下,隐藏切换码率/填充模式/字幕/截图的按钮 - int visibility = PolyvVideoVO.MODE_AUDIO.equals(videoView.getCurrentMode()) ? View.INVISIBLE : View.VISIBLE; - if (visibility == View.GONE) - rl_center_bit.setVisibility(visibility); - tv_bit.setVisibility(visibility); - ll_adaptive_mode.setVisibility(visibility); - ll_subtitle.setVisibility(visibility); - ll_subtitle_b.setVisibility(visibility); - iv_screens.setVisibility(visibility); - //设置进度条的打点位置 - if (PolyvVideoVO.MODE_VIDEO.equals(videoView.getCurrentMode())) { - List videokeyframes; - if (videoVO != null && (videokeyframes = videoVO.getVideokeyframes()) != null) { - int maxProgress = videoView.getDuration() / 1000; - double rate = 1; - if (maxProgress < 1000) {//最大进度最小为1000 - rate = 1000 * 1.0 / maxProgress; - maxProgress = 1000; - } - List tickDataList = new ArrayList<>(); - for (PolyvVideoVO.Videokeyframe videokeyframe : videokeyframes) { - //打点的颜色请设置和seekBar的thumb的颜色一致,因为打点是在thumb上层的 - tickDataList.add(new PolyvTickSeekBar.TickData((float) (videokeyframe.getKeytime() * rate), Color.WHITE, videokeyframe)); - } - sb_play_land.setMax(maxProgress); - sb_play_land.setTicks(tickDataList); - sb_play_land.setOnTickClickListener(new PolyvTickSeekBar.OnTickClickListener() { - @Override - public void onTickClick(PolyvTickSeekBar.TickData tickData) { - tickTips.show(tickData); - resetHideTime(longTime); - } - - @Override - public boolean onSeekBarClick() { - tickTips.hide(); - resetHideTime(longTime); - return false;//false:点击非打点处不触发onProgressChanged - } - }); - } - } - - //如果可以获取到音频的播放地址,则显示切换到音频的按钮 - if (canShowLeftSideView()) { - resetLeftSideView(View.VISIBLE); - if (PolyvVideoVO.MODE_VIDEO.equals(videoView.getCurrentMode())) { - resetModeView(true); - } else { - resetModeView(false); - } - } - } - // 视频准备完成后,开启随手势自动切换屏幕 - if (PolyvScreenUtils.isLandscape(mContext)) - sensorHelper.toggle(true, false); - else - sensorHelper.toggle(true, true); - } - - @Override - public void setMediaPlayer(IPolyvVideoView player) { - videoView = (PolyvVideoView) player; - } - - @Override - public void release() { - //播放器release时主动调用 - } - - @Override - public void destroy() { - //播放器destroy时主动调用 - } - - @Override - public void hide() { - if (isShowing) { - handler.removeMessages(HIDE); - handler.removeMessages(SHOW_PROGRESS); - resetSetLayout(View.GONE); -// resetDanmuLayout(View.GONE); - resetShareLayout(View.GONE); - resetSpeedLayout(View.GONE); - resetBitRateLayout(View.GONE); - tickTips.hide(); - isShowing = !isShowing; - setVisibility(View.GONE); - } - } - - @Override - public boolean isShowing() { - return isShowing; - } - - @Override - public void setAnchorView(View view) { - //... - } - - public void hideTickTips() { - tickTips.hide(); - } - - // 关闭监听 - public void pause() { - sensorHelper.disable(); - } - - // 开启监听 - public void resume() { - sensorHelper.enable(); - } - - /** - * 退出播放器的Activity时需调用 - */ - public void disable() { - hide(); - sensorHelper.disable(); - } - - /** - * 显示控制栏 - * - * @param timeout 显示的时间,<0时将一直显示 - */ - @Override - public void show(int timeout) { - if (timeout < 0) - status_showalways = true; - else - status_showalways = false; - - if (!isShowing) { - resetTopBottomLayout(View.VISIBLE); - resetSideLayout(View.VISIBLE); - if (canShowLeftSideView()) { - resetLeftSideView(View.VISIBLE); - } - //获取焦点 - requestFocus(); - handler.removeMessages(SHOW_PROGRESS); - handler.sendEmptyMessage(SHOW_PROGRESS); - isShowing = !isShowing; - setVisibility(View.VISIBLE); - } - resetHideTime(timeout); - } - - @Override - public void show() { - show(longTime); - } - - private static final String landTag = "land"; - private static final String portraitTag = "portrait"; - private ViewGroup contentView, fullVideoViewParent; - private ViewGroup.LayoutParams portraitLP;//(需要移动的整个播放器布局)在竖屏下的LayoutParams - private ViewGroup fullVideoView;//需要移动的整个播放器布局 - - /** - * 切换到横屏 - */ - public void changeToLandscape() { - PolyvScreenUtils.setLandscape(videoActivity); - //初始为横屏时,状态栏需要隐藏 - PolyvScreenUtils.hideStatusBar(videoActivity); -// //初始为横屏时,控制栏的宽高需要设置 -// initLandScapeWH(); - -// setLandscapeController(); - } - - public void setLandscapeController() { - hide(); - if(videoView == null || hasVideoLandscape){ - PolyvCommonLog.e(TAG,"setLandscapeController videoview is null"); - return; - } - - PolyvCommonLog.d(TAG,"setLandscapeController:"+this); - // 通过移除整个播放器布局到窗口的上层布局中,并改变整个播放器布局的大小,实现全屏的播放器。 - if (fullVideoView == null) { - fullVideoView = ((ViewGroup) videoView.getParent().getParent()); - fullVideoViewParent = (ViewGroup) fullVideoView.getParent(); - contentView = (ViewGroup) ((Activity) mContext).findViewById(Window.ID_ANDROID_CONTENT); - } - if (!landTag.equals(fullVideoView.getTag())) { - hasVideoLandscape = true; - fullVideoView.setTag(landTag); - portraitLP = fullVideoView.getLayoutParams(); - fullVideoViewParent.removeView(fullVideoView); - FrameLayout.LayoutParams flp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); - fullVideoView.setLayoutParams(flp); - contentView.addView(fullVideoView); - } - - rl_land.setVisibility(View.VISIBLE); - rl_port.setVisibility(View.GONE); - } - - private void initLandScapeWH() { - ViewGroup.LayoutParams vlp = parentView.getLayoutParams(); - vlp.width = ViewGroup.LayoutParams.MATCH_PARENT; - vlp.height = ViewGroup.LayoutParams.MATCH_PARENT; - rl_land.setVisibility(View.VISIBLE); - rl_port.setVisibility(View.GONE); - } - - /** - * 切换到竖屏 - */ - public void changeToPortrait() { - PolyvScreenUtils.setPortrait(videoActivity); -// initPortraitWH(); -// setPortraitController(); - } - - public void setPortraitController() { - hasVideoLandscape = false; - hide(); - - // 把全屏下窗口布局中的整个播放器布局移除出来,并放回原本竖屏下的父控件中,使用竖屏下的LayoutParams - if (fullVideoView != null && landTag.equals(fullVideoView.getTag())) { - fullVideoView.setTag(portraitTag); - contentView.removeView(fullVideoView); - fullVideoView.setLayoutParams(portraitLP); - fullVideoViewParent.addView(fullVideoView, 0); - } - - rl_port.setVisibility(View.VISIBLE); - rl_land.setVisibility(View.GONE); - } - - private void initPortraitWH() { - ViewGroup.LayoutParams vlp = parentView.getLayoutParams(); - vlp.width = ViewGroup.LayoutParams.MATCH_PARENT; - vlp.height = PolyvScreenUtils.getHeight16_9(); - rl_port.setVisibility(View.VISIBLE); - rl_land.setVisibility(View.GONE); - } - - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - resetControllerLayout(); - } - - //根据屏幕状态改变控制栏布局 - public void resetControllerLayout() { - hide(); - PolyvScreenUtils.reSetStatusBar(videoActivity); - if (PolyvScreenUtils.isLandscape(mContext)) { - // 横屏下开启自动切换横竖屏 - sensorHelper.toggle(true, true); - setLandscapeController(); - } else { - // 竖屏下开启自动切换横竖屏 - sensorHelper.toggle(true, false); - setPortraitController(); - } - } - - //根据视频的播放状态去暂停或播放 - public void playOrPause() { - if (videoView != null) { - if (videoView.isPlaying()) { -// danmuFragment.pause(); - videoPause(); - } else { -// danmuFragment.resume(); - vdieoStart(); - } - } - } - - private void videoPause() { - videoView.pause(); - status_isPlaying = false; - iv_play.setSelected(true); - iv_play_land.setSelected(true); - } - - private void vdieoStart() { - videoView.start(); - status_isPlaying = true; - iv_play.setSelected(false); - iv_play_land.setSelected(false); - } - - SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int i, boolean b) { - if (!b) - return; - tickTips.hide(); - int i1 = seekBar.getId(); - if (i1 == R.id.sb_play || i1 == R.id.sb_play_land) { - resetHideTime(longTime); - status_dragging = true; - if (videoView != null) { - int newPosition = (int) (videoView.getDuration() * (long) i / seekBar.getMax()); - tv_curtime.setText(PolyvTimeUtils.generateTime(newPosition)); - tv_curtime_land.setText(PolyvTimeUtils.generateTime(newPosition)); - } - - } else if (i1 == R.id.sb_light) { - if (videoView != null) - videoView.setBrightness(videoActivity, i); - - } else if (i1 == R.id.sb_volume) { - if (videoView != null) - videoView.setVolume(i); - - } - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - if (!seekBar.isSelected()) - seekBar.setSelected(true); - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - if (seekBar.isSelected()) - seekBar.setSelected(false); - int i = seekBar.getId(); - if (i == R.id.sb_play || i == R.id.sb_play_land) { - if (videoView != null) { - int seekToPosition = (int) (videoView.getDuration() * (long) seekBar.getProgress() / seekBar.getMax()); - if (!videoView.isCompletedState()) { - videoView.seekTo(seekToPosition); -// danmuFragment.seekTo(); - } else if (videoView.isCompletedState() && seekToPosition / seekBar.getMax() * seekBar.getMax() < videoView.getDuration() / seekBar.getMax() * seekBar.getMax()) { - videoView.seekTo(seekToPosition); -// danmuFragment.seekTo(); - videoView.start(); -// danmuFragment.resume(); - } - } - status_dragging = false; - - } - } - }; - - TextView.OnEditorActionListener editorActionListener = new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { - if (i == EditorInfo.IME_ACTION_SEND) { -// sendDanmaku(); - return true; - } - return false; - } - }; - - //重置控制栏的隐藏时间 - private void resetHideTime(int delayedTime) { - handler.removeMessages(HIDE); - if (delayedTime >= 0) - handler.sendMessageDelayed(handler.obtainMessage(HIDE), delayedTime); - } - - //重置控制栏的顶部和底部布局以及进度条的显示状态 - private void resetTopBottomLayout(int isVisible) { - resetTopBottomLayout(isVisible, false); - } - - private void resetTopBottomLayout(int isVisible, boolean onlyHideTop) { - rl_top.setVisibility(isVisible); - if (!onlyHideTop) { - rl_bot.setVisibility(isVisible); - sb_play_land.setVisibility(isVisible); - } - } - - //重置侧边的布局的显示状态 - private void resetSideLayout(int isVisible) { - ll_side.setVisibility(isVisible); - } - - //重置设置布局的显示状态 - private void resetSetLayout(int isVisible) { - if (isVisible == View.VISIBLE) { - show(-1); - resetTopBottomLayout(View.GONE); - resetSideLayout(View.GONE); - resetLeftSideView(View.GONE); - if (videoView != null) { - sb_light.setProgress(videoView.getBrightness(videoActivity)); - sb_volume.setProgress(videoView.getVolume()); - } - } - rl_center_set.setVisibility(isVisible); - } - - //重置弹幕布局的显示状态 - private void resetDanmuLayout(int isVisible) { - if (isVisible == View.VISIBLE) { - show(-1); - resetTopBottomLayout(View.GONE); - resetSideLayout(View.GONE); - resetLeftSideView(View.GONE); - resetBitRateLayout(View.GONE, false); - resetSpeedLayout(View.GONE, false); - et_dmedit.requestFocus(); - et_dmedit.setText(""); - if (videoView != null) { - status_isPlaying = videoView.isPlaying(); - videoView.pause(true); -// danmuFragment.pause(); - } - PolyvKeyBoardUtils.openKeybord(et_dmedit, mContext); - } else if (rl_center_danmu.getVisibility() == View.VISIBLE) { - if (videoView != null && status_isPlaying) { - videoView.start(); -// danmuFragment.resume(); - } - PolyvKeyBoardUtils.closeKeybord(et_dmedit, mContext); - } - iv_dmset.setSelected(false); - rl_dmbot.setVisibility(View.GONE); - rl_center_danmu.setVisibility(isVisible); - } - - //重置弹幕布局的底部布局的显示状态 - private void resetDanmuBottomLayout() { - if (rl_dmbot.getVisibility() == View.VISIBLE) { - rl_dmbot.setVisibility(View.GONE); - iv_dmset.setSelected(false); - PolyvKeyBoardUtils.openKeybord(et_dmedit, mContext); - } else { - rl_dmbot.setVisibility(View.VISIBLE); - iv_dmset.setSelected(true); - PolyvKeyBoardUtils.closeKeybord(et_dmedit, mContext); - } - } - - //重置分享布局的显示状态 - private void resetShareLayout(int isVisible) { - if (isVisible == View.VISIBLE) { - show(-1); - resetTopBottomLayout(View.GONE); - resetSideLayout(View.GONE); - resetLeftSideView(View.GONE); - } - rl_center_share.setVisibility(isVisible); - } - - //重置选择播放器银幕比率控件的状态 - private void resetRatioView(int screenRatio) { - initRatioView(screenRatio); - if (videoView != null) - videoView.setAspectRatio(screenRatio); - } - - //初始化选择播放器银幕比率控件 - private void initRatioView(int screenRatio) { - tv_full.setSelected(false); - tv_fit.setSelected(false); - tv_sixteennine.setSelected(false); - tv_fourthree.setSelected(false); - switch (screenRatio) { - case PolyvPlayerScreenRatio.AR_ASPECT_FILL_PARENT: - tv_full.setSelected(true); - break; - case PolyvPlayerScreenRatio.AR_ASPECT_FIT_PARENT: - tv_fit.setSelected(true); - break; - case PolyvPlayerScreenRatio.AR_16_9_FIT_PARENT: - tv_sixteennine.setSelected(true); - break; - case PolyvPlayerScreenRatio.AR_4_3_FIT_PARENT: - tv_fourthree.setSelected(true); - break; - } - } - - //重置弹幕颜色按钮的状态 - private void resetDammuColorView(int color) { - this.color = color; - iv_dmblue.setSelected(false); - iv_dmgreen.setSelected(false); - iv_dmpurple.setSelected(false); - iv_dmred.setSelected(false); - iv_dmwhite.setSelected(false); - iv_dmyellow.setSelected(false); - switch (color) { - case Color.WHITE: - iv_dmwhite.setSelected(true); - break; - case Color.BLUE: - iv_dmblue.setSelected(true); - break; - case Color.GREEN: - iv_dmgreen.setSelected(true); - break; - case Color.YELLOW: - iv_dmyellow.setSelected(true); - break; - case Color.RED: - iv_dmred.setSelected(true); - break; - case Color.MAGENTA: - iv_dmpurple.setSelected(true); - break; - } - } - - //重置弹幕样式按钮的状态 - private void resetDanmaStyleView(String style) { - this.fontmode = style; - tv_dmroll.setSelected(false); - tv_dmtop.setSelected(false); - tv_dmbottom.setSelected(false); -// switch (style) { -// case PolyvDanmakuInfo.FONTMODE_ROLL: -// tv_dmroll.setSelected(true); -// break; -// case PolyvDanmakuInfo.FONTMODE_TOP: -// tv_dmtop.setSelected(true); -// break; -// case PolyvDanmakuInfo.FONTMODE_BOTTOM: -// tv_dmbottom.setSelected(true); -// break; -// } - } - - //重置弹幕字体大小按钮的状态 - private void resetDanmaFontView(String fontSize) { - this.fontsize = fontSize; - tv_dmfonts.setSelected(false); - tv_dmfontm.setSelected(false); - tv_dmfontl.setSelected(false); -// switch (fontSize) { -// case PolyvDanmakuInfo.FONTSIZE_SMALL: -// tv_dmfonts.setSelected(true); -// break; -// case PolyvDanmakuInfo.FONTSIZE_MIDDLE: -// tv_dmfontm.setSelected(true); -// break; -// case PolyvDanmakuInfo.FONTSIZE_LARGE: -// tv_dmfontl.setSelected(true); -// break; -// } - } - - //重置选择字幕的控件 - private void resetSrtView(int srtPosition) { - if (videoView != null) - videoView.changeSRT(initSrtView(srtPosition)); - } - - private String initSrtView(int srtPosition) { - tv_srt1.setSelected(false); - tv_srt2.setSelected(false); - tv_srt3.setSelected(false); - tv_srtnone.setSelected(false); - List srtKeys = new ArrayList(); - if (videoVO != null) - srtKeys.addAll(videoVO.getVideoSRT().keySet()); - switch (srtPosition) { - case 0: - tv_srt1.setSelected(true); - break; - case 1: - tv_srt2.setSelected(true); - break; - case 2: - tv_srt3.setSelected(true); - break; - case 3: - tv_srtnone.setSelected(true); - break; - } - return srtPosition == 3 ? "不显示" : srtKeys.get(srtPosition); - } - - //初始化选择字幕的控件 - private void initSrtView(String srtKey) { - tv_srt1.setSelected(false); - tv_srt2.setSelected(false); - tv_srt3.setSelected(false); - tv_srt1.setVisibility(View.VISIBLE); - tv_srt2.setVisibility(View.VISIBLE); - tv_srt3.setVisibility(View.VISIBLE); - tv_srtnone.setSelected(false); - List srtKeys = new ArrayList(); - if (videoVO != null) - srtKeys.addAll(videoVO.getVideoSRT().keySet()); - switch (srtKeys.size()) { - case 0: - tv_srt1.setVisibility(View.GONE); - tv_srt2.setVisibility(View.GONE); - tv_srt3.setVisibility(View.GONE); - break; - case 1: - tv_srt1.setText(srtKeys.get(0)); - tv_srt2.setVisibility(View.GONE); - tv_srt3.setVisibility(View.GONE); - break; - case 2: - tv_srt1.setText(srtKeys.get(0)); - tv_srt2.setText(srtKeys.get(1)); - tv_srt3.setVisibility(View.GONE); - break; - default: - tv_srt1.setText(srtKeys.get(0)); - tv_srt2.setText(srtKeys.get(1)); - tv_srt3.setText(srtKeys.get(2)); - break; - } - if (TextUtils.isEmpty(srtKey)) { - tv_srtnone.setSelected(true); - return; - } - switch (srtKeys.indexOf(srtKey)) { - case 0: - tv_srt1.setSelected(true); - break; - case 1: - tv_srt2.setSelected(true); - break; - case 2: - tv_srt3.setSelected(true); - break; - } - } - - //重置选择播放速度的布局 - private void resetSpeedLayout(int isVisible) { - resetSpeedLayout(isVisible, true); - } - - private void resetSpeedLayout(int isVisible, boolean isShowTopBottomLayout) { - if (isVisible == View.VISIBLE) { - show(-1); - resetTopBottomLayout(View.GONE, true); - resetBitRateLayout(View.GONE, false); - } else if (isShowTopBottomLayout) { - resetTopBottomLayout(View.VISIBLE); - requestFocus(); - resetHideTime(longTime); - } - rl_center_speed.setVisibility(isVisible); - } - - //初始化选择播放速度的控件 - private void initSpeedView(int speed) { - tv_speed05.setSelected(false); - tv_speed10.setSelected(false); - tv_speed12.setSelected(false); - tv_speed15.setSelected(false); - tv_speed20.setSelected(false); - switch (speed) { - case 5: - tv_speed05.setSelected(true); - tv_speed.setText("0.5x"); - break; - case 10: - tv_speed10.setSelected(true); - tv_speed.setText("1x"); - break; - case 12: - tv_speed12.setSelected(true); - tv_speed.setText("1.2x"); - break; - case 15: - tv_speed15.setSelected(true); - tv_speed.setText("1.5x"); - break; - case 20: - tv_speed20.setSelected(true); - tv_speed.setText("2x"); - break; - } - } - - //重置选择播放速度的控件 - private void resetSpeedView(int speed) { - initSpeedView(speed); - if (videoView != null) { - videoView.setSpeed(speed / 10f); - } - hide(); - } - - //初始化选择码率的控件 - private void initBitRateView(int bitRate) { - tv_sc.setSelected(false); - tv_hd.setSelected(false); - tv_flu.setSelected(false); - tv_auto.setSelected(false); - switch (bitRate) { - case 0: - tv_bit.setText("自动"); - tv_auto.setSelected(true); - break; - case 1: - tv_bit.setText("流畅"); - tv_flu.setSelected(true); - break; - case 2: - tv_bit.setText("高清"); - tv_hd.setSelected(true); - break; - case 3: - tv_bit.setText("超清"); - tv_sc.setSelected(true); - break; - } - } - - //初始化选择码率控件的可见性 - private void initBitRateViewVisible(int currentBitRate) { - tv_sc.setVisibility(View.GONE); - tv_hd.setVisibility(View.GONE); - tv_flu.setVisibility(View.GONE); - tv_auto.setVisibility(View.GONE); - if (videoVO != null) { - switch (videoVO.getDfNum()) { - case 1: - tv_flu.setVisibility(View.VISIBLE); - tv_auto.setVisibility(View.VISIBLE); - break; - case 2: - tv_hd.setVisibility(View.VISIBLE); - tv_flu.setVisibility(View.VISIBLE); - tv_auto.setVisibility(View.VISIBLE); - break; - case 3: - tv_sc.setVisibility(View.VISIBLE); - tv_hd.setVisibility(View.VISIBLE); - tv_flu.setVisibility(View.VISIBLE); - tv_auto.setVisibility(View.VISIBLE); - break; - } - } else { - switch (currentBitRate) { - case 0: - tv_auto.setVisibility(View.VISIBLE); - break; - case 1: - tv_flu.setVisibility(View.VISIBLE); - break; - case 2: - tv_hd.setVisibility(View.VISIBLE); - break; - case 3: - tv_sc.setVisibility(View.VISIBLE); - break; - } - } - } - - //重置播放码率布局的状态 - private void resetBitRateLayout(int isVisible) { - resetBitRateLayout(isVisible, true); - } - - private void resetBitRateLayout(int isVisible, boolean isShowTopBottomLayout) { - if (isVisible == View.VISIBLE) { - show(-1); - resetTopBottomLayout(View.GONE, true); - resetSpeedLayout(View.GONE, false); - } else if (isShowTopBottomLayout) { - resetTopBottomLayout(View.VISIBLE); - requestFocus(); - resetHideTime(longTime); - } - rl_center_bit.setVisibility(isVisible); - } - - //重置选择码率的控件 - private void resetBitRateView(int bitRate) { - boolean isChangeSuccess = false; - if (videoView != null) - isChangeSuccess = videoView.changeBitRate(bitRate); - if (isChangeSuccess) { - initBitRateView(bitRate); - hide(); - } - } - - //重置显示/隐藏弹幕的控件 - private void resetDmSwitchView() { - if (iv_dmswitch.isSelected()) { - iv_dmswitch.setSelected(false); -// danmuFragment.show(); - } else { - iv_dmswitch.setSelected(true); -// danmuFragment.hide(); - } - } - - //网络截图 - private void screenshot() { - String vid = null; - int bit = 0; - int currentTime_second = 0; - int videoVODuration = 0; - if (videoVO != null) { - vid = videoVO.getVid(); - bit = videoVO.getDfNum(); - try { - videoVODuration = (int) Float.parseFloat(videoVO.getDuration()) * 1000; - } catch (Exception e) { - } - } else { - toastMsg("截图失败:videoVO is null"); - return; - } - if (videoView != null) { - int currentPosition = videoView.getCurrentPosition(); - int totalPosition = videoVODuration > 0 ? videoVODuration : videoView.getDuration(); - currentPosition = currentPosition > totalPosition ? totalPosition : currentPosition; - currentTime_second = currentPosition / 1000; - } else { - toastMsg("截图失败:videoView is null"); - return; - } -// new PolyvScreenShot(mContext).snapshot(vid, bit, currentTime_second, new PolyvScreenShot.ScreenshotListener() { -// @Override -// public void fail(Throwable throwable) { -// toastMsg("截图失败:" + throwable.getMessage()); -// } -// -// @Override -// public void success(String s) { -// toastMsg("截图成功:" + s); -// } -// }); - } - - //发送弹幕并隐藏布局 - private void sendDanmaku() { -// danmuFragment.send(videoView, et_dmedit.getText().toString(), fontmode, fontsize, color); - hide(); - } - - private void toastMsg(final String msg) { - Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show(); - } - - private void resetLeftSideView(int visibility) { - ll_left_side.setVisibility(visibility); - ll_left_side_land.setVisibility(visibility); - ll_left_side_t.setVisibility(visibility); - ll_left_side_t_land.setVisibility(visibility); - Log.e("tag", "visibility " + visibility); - } - - private void resetModeView(boolean isVideo) { - iv_video.setSelected(isVideo); - iv_video_land.setSelected(isVideo); - iv_audio.setSelected(!isVideo); - iv_audio_land.setSelected(!isVideo); - tv_video.setSelected(isVideo); - tv_video_land.setSelected(isVideo); - tv_audio.setSelected(!isVideo); - tv_audio_land.setSelected(!isVideo); - } - - @Override - public void onClick(View view) { - int i = view.getId(); - if (i == R.id.iv_land) { - changeToLandscape(); - - } else if (i == R.id.iv_port) { - changeToPortrait(); - - } else if (i == R.id.iv_play) { - playOrPause(); - - } else if (i == R.id.iv_play_land) { - playOrPause(); - - } else if (i == R.id.iv_finish) { - changeToPortrait(); - - } else if (i == R.id.iv_set) { - resetSetLayout(View.VISIBLE); - -// case R.id.iv_danmu: -// resetDanmuLayout(View.VISIBLE); -// break; - } else if (i == R.id.iv_dmset) { - resetDanmuBottomLayout(); - - } else if (i == R.id.iv_finish_danmu) { - hide(); - - } else if (i == R.id.iv_share) { - resetShareLayout(View.VISIBLE); - - } else if (i == R.id.tv_full) { - resetRatioView(PolyvPlayerScreenRatio.AR_ASPECT_FILL_PARENT); - - } else if (i == R.id.tv_fit) { - resetRatioView(PolyvPlayerScreenRatio.AR_ASPECT_FIT_PARENT); - - } else if (i == R.id.tv_sixteennine) { - resetRatioView(PolyvPlayerScreenRatio.AR_16_9_FIT_PARENT); - - } else if (i == R.id.tv_fourthree) { - resetRatioView(PolyvPlayerScreenRatio.AR_4_3_FIT_PARENT); - - } else if (i == R.id.iv_dmblue) { - resetDammuColorView(Color.BLUE); - - } else if (i == R.id.iv_dmgreen) { - resetDammuColorView(Color.GREEN); - - } else if (i == R.id.iv_dmpurple) { - resetDammuColorView(Color.MAGENTA); - - } else if (i == R.id.iv_dmred) { - resetDammuColorView(Color.RED); - - } else if (i == R.id.iv_dmwhite) { - resetDammuColorView(Color.WHITE); - - } else if (i == R.id.iv_dmyellow) { - resetDammuColorView(Color.YELLOW); - -// case R.id.tv_dmroll: -// resetDanmaStyleView(PolyvDanmakuInfo.FONTMODE_ROLL); -// break; -// case R.id.tv_dmtop: -// resetDanmaStyleView(PolyvDanmakuInfo.FONTMODE_TOP); -// break; -// case R.id.tv_dmbottom: -// resetDanmaStyleView(PolyvDanmakuInfo.FONTMODE_BOTTOM); -// break; -// case R.id.tv_dmfonts: -// resetDanmaFontView(PolyvDanmakuInfo.FONTSIZE_SMALL); -// break; -// case R.id.tv_dmfontm: -// resetDanmaFontView(PolyvDanmakuInfo.FONTSIZE_MIDDLE); -// break; -// case R.id.tv_dmfontl: -// resetDanmaFontView(PolyvDanmakuInfo.FONTSIZE_LARGE); -// break; - } else if (i == R.id.et_dmedit) { - rl_dmbot.setVisibility(View.GONE); - iv_dmset.setSelected(false); - - } else if (i == R.id.iv_shareqq) { - PolyvShareUtils.shareQQFriend(mContext, "", PolyvPlayerTopFragment.SHARE_TEXT, PolyvShareUtils.TEXT, null); - hide(); - - } else if (i == R.id.iv_sharewechat) { - PolyvShareUtils.shareWeChatFriend(mContext, "", PolyvPlayerTopFragment.SHARE_TEXT, PolyvShareUtils.TEXT, null); - hide(); - - } else if (i == R.id.iv_shareweibo) { - PolyvShareUtils.shareWeiBo(mContext, "", PolyvPlayerTopFragment.SHARE_TEXT, PolyvShareUtils.TEXT, null); - hide(); - -// case R.id.iv_dmswitch: -// resetDmSwitchView(); -// break; - } else if (i == R.id.tv_srt1) { - resetSrtView(0); - - } else if (i == R.id.tv_srt2) { - resetSrtView(1); - - } else if (i == R.id.tv_srt3) { - resetSrtView(2); - - } else if (i == R.id.tv_srtnone) { - resetSrtView(3); - - } else if (i == R.id.tv_speed) { - if (rl_center_speed.getVisibility() == View.GONE) - resetSpeedLayout(View.VISIBLE); - else - resetSpeedLayout(View.GONE); - - } else if (i == R.id.tv_bit) { - if (rl_center_bit.getVisibility() == View.GONE) - resetBitRateLayout(View.VISIBLE); - else - resetBitRateLayout(View.GONE); - - } else if (i == R.id.tv_sc) { - resetBitRateView(3); - - } else if (i == R.id.tv_hd) { - resetBitRateView(2); - - } else if (i == R.id.tv_flu) { - resetBitRateView(1); - - } else if (i == R.id.tv_auto) { - resetBitRateView(0); - - } else if (i == R.id.tv_speed05) { - resetSpeedView(5); - - } else if (i == R.id.tv_speed10) { - resetSpeedView(10); - - } else if (i == R.id.tv_speed12) { - resetSpeedView(12); - - } else if (i == R.id.tv_speed15) { - resetSpeedView(15); - - } else if (i == R.id.tv_speed20) { - resetSpeedView(20); - - } else if (i == R.id.iv_close_bit) { - hide(); - - } else if (i == R.id.iv_close_set) { - hide(); - - } else if (i == R.id.iv_close_share) { - hide(); - - } else if (i == R.id.iv_close_speed) { - hide(); - - } else if (i == R.id.tv_dmsend) { - sendDanmaku(); - - } else if (i == R.id.iv_screens) { - screenshot(); - - } else if (i == R.id.iv_video || i == R.id.iv_video_land) {//如果当前已经是优先视频模式,则不再切换 - if (videoView != null && !PolyvVideoVO.MODE_VIDEO.equals(videoView.getPriorityMode())) { - resetModeView(true); - videoView.changeMode(PolyvVideoVO.MODE_VIDEO); - if (coverView != null) - coverView.hide(); - } - - } else if (i == R.id.iv_audio || i == R.id.iv_audio_land) {//如果当前已经是优先音频模式,则不再切换 - if (videoView != null && !PolyvVideoVO.MODE_AUDIO.equals(videoView.getPriorityMode())) { - resetModeView(false); - videoView.changeMode(PolyvVideoVO.MODE_AUDIO); - } - - } - //如果控制栏不是处于一直显示的状态,那么重置控制栏隐藏的时间 - if (!status_showalways) - resetHideTime(longTime); - } - - public void setSeekBarEnabled(final boolean enabled) { - if (sb_play != null) -// sb_play.setEnabled(enabled); - sb_play.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return !enabled; - } - }); - if (sb_play_land != null) - sb_play_land.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return !enabled; - } - }); -// sb_play_land.setEnabled(enabled); - } -} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerPlayErrorView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerPlayErrorView.java index b80ea4c..2dc731d 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerPlayErrorView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerPlayErrorView.java @@ -1,7 +1,7 @@ package com.easefun.polyvsdk.player; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -96,11 +96,18 @@ public void show(@PolyvPlayErrorReason.PlayErrorReason int playErrorReason, @Non //播放异常才能切换线路 if (playErrorReason == PolyvPlayErrorReason.VIDEO_ERROR) { //判断是否有线路可以切换 - videoErrorRoute.setVisibility(videoView.getRouteCount() > 1 ? View.VISIBLE : View.INVISIBLE); + videoErrorRoute.setVisibility(videoView.getRouteCount() > 1 ? View.VISIBLE : View.GONE); } else { - videoErrorRoute.setVisibility(View.INVISIBLE); + videoErrorRoute.setVisibility(View.GONE); } + videoErrorRetry.setVisibility(VISIBLE); + setVisibility(View.VISIBLE); + } + public void show(String tips, String code, @NonNull PolyvVideoView videoView){ + videoErrorContent.setText(tips); + videoErrorRetry.setVisibility(GONE); + videoErrorRoute.setVisibility(View.GONE); setVisibility(View.VISIBLE); } @@ -108,7 +115,7 @@ public void show(@PolyvPlayErrorReason.PlayErrorReason int playErrorReason, @Non * 隐藏界面 */ public void hide() { - setVisibility(View.INVISIBLE); + setVisibility(View.GONE); } // diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerPlayRouteView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerPlayRouteView.java index 774177c..71c185d 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerPlayRouteView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerPlayRouteView.java @@ -1,7 +1,7 @@ package com.easefun.polyvsdk.player; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -95,9 +95,9 @@ public void show(@NonNull PolyvVideoView videoView) { private void initSelectedRouteView(@NonNull PolyvVideoView videoView) { int routeCount = videoView.getRouteCount(); - tvRoute1.setVisibility(routeCount >= 1 ? View.VISIBLE : View.INVISIBLE); - tvRoute2.setVisibility(routeCount >= 2 ? View.VISIBLE : View.INVISIBLE); - tvRoute3.setVisibility(routeCount >= 3 ? View.VISIBLE : View.INVISIBLE); + tvRoute1.setVisibility(routeCount >= 1 ? View.VISIBLE : View.GONE); + tvRoute2.setVisibility(routeCount >= 2 ? View.VISIBLE : View.GONE); + tvRoute3.setVisibility(routeCount >= 3 ? View.VISIBLE : View.GONE); tvRoute1.setSelected(false); tvRoute2.setSelected(false); @@ -117,7 +117,7 @@ private void initSelectedRouteView(@NonNull PolyvVideoView videoView) { * 隐藏界面 */ public void hide() { - setVisibility(View.INVISIBLE); + setVisibility(View.GONE); } // diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerPreviewView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerPreviewView.java index d6ebd31..eba1870 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerPreviewView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerPreviewView.java @@ -1,155 +1,155 @@ -package com.easefun.polyvsdk.player; - -import android.app.Activity; -import android.content.Context; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Build; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.RelativeLayout; - -import com.easefun.polyvsdk.PolyvSDKUtil; -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.util.PolyvDownloadDirUtil; -import com.easefun.polyvsdk.util.PolyvImageLoader; -import com.easefun.polyvsdk.vo.PolyvVideoVO; - -import java.io.File; - -/** - * 预览图视图 - * @author Lion 2016-3-3 - */ -public class PolyvPlayerPreviewView extends RelativeLayout { - private static final String TAG = PolyvPlayerPreviewView.class.getSimpleName(); - private Context mContext = null; - private ImageView mPreviewImage = null; - private ImageButton mStartBtn = null; - private Callback mCallback = null; - - public PolyvPlayerPreviewView(Context context) { - this(context, null); - } - - public PolyvPlayerPreviewView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PolyvPlayerPreviewView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - mContext = context; - initViews(); - } - - private void initViews() { - LayoutInflater.from(getContext()).inflate(R.layout.polyv_player_preview_view, this); - mPreviewImage = (ImageView) findViewById(R.id.preview_image); - mStartBtn = (ImageButton) findViewById(R.id.start_btn); - mStartBtn.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - if (mCallback != null) { - mCallback.onClickStart(); - } - - hide(); - } - }); - } - - /** - * 设置图片并显示 - * @param vid - */ - public void show(String vid) { - new LoadVideoJson(vid).execute(); - setVisibility(View.VISIBLE); - } - - private class LoadVideoJson extends AsyncTask { - - private final String mVid; - - LoadVideoJson(String vid) { - mVid = vid; - } - - @Override - protected PolyvVideoVO doInBackground(String... params) { - PolyvVideoVO video = null; - try { - video = PolyvSDKUtil.loadVideoJSON2Video(mVid); - } catch (Exception e) { - e.printStackTrace(); - } - - return video; - } - - @Override - protected void onPostExecute(PolyvVideoVO v) { - super.onPostExecute(v); - if (v == null) { - return; - } - - if (TextUtils.isEmpty(v.getFirstImage())) { - return; - } - - if(isDestroy((Activity) getContext())){ - return; - } - - int index = 0; - if (v.getFirstImage().contains("/")) { - index = v.getFirstImage().lastIndexOf("/"); - } - - String fileName = v.getFirstImage().substring(index); - File file = PolyvDownloadDirUtil.getFileFromExtraResourceDir(mVid, fileName); - if (file != null) { - mPreviewImage.setImageURI(Uri.parse(file.getAbsolutePath())); - } else { - PolyvImageLoader.getInstance().loadImageOrigin(getContext(), v.getFirstImage(), mPreviewImage, R.drawable.polyv_avatar_def); - } - } - } - - /** - * 隐藏 - */ - public void hide() { - setVisibility(View.INVISIBLE); - } - - private boolean isDestroy(Activity activity){ - if(activity == null || activity.isFinishing() || - (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed())){ - return true; - } else { - return false; - } - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - super.onTouchEvent(event); - return true; - } - - public void setCallback(Callback callback) { - mCallback = callback; - } - - public interface Callback { - public void onClickStart(); - } -} +package com.easefun.polyvsdk.player; + +import android.app.Activity; +import android.content.Context; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.RelativeLayout; + +import com.easefun.polyvsdk.PolyvSDKUtil; +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.util.PolyvDownloadDirUtil; +import com.easefun.polyvsdk.util.PolyvImageLoader; +import com.easefun.polyvsdk.vo.PolyvVideoVO; + +import java.io.File; + +/** + * 预览图视图 + * @author Lion 2016-3-3 + */ +public class PolyvPlayerPreviewView extends RelativeLayout { + private static final String TAG = PolyvPlayerPreviewView.class.getSimpleName(); + private Context mContext = null; + private ImageView mPreviewImage = null; + private ImageButton mStartBtn = null; + private Callback mCallback = null; + + public PolyvPlayerPreviewView(Context context) { + this(context, null); + } + + public PolyvPlayerPreviewView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public PolyvPlayerPreviewView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mContext = context; + initViews(); + } + + private void initViews() { + LayoutInflater.from(getContext()).inflate(R.layout.polyv_player_preview_view, this); + mPreviewImage = (ImageView) findViewById(R.id.preview_image); + mStartBtn = (ImageButton) findViewById(R.id.start_btn); + mStartBtn.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + if (mCallback != null) { + mCallback.onClickStart(); + } + + hide(); + } + }); + } + + /** + * 设置图片并显示 + * @param vid + */ + public void show(String vid) { + new LoadVideoJson(vid).execute(); + setVisibility(View.VISIBLE); + } + + private class LoadVideoJson extends AsyncTask { + + private final String mVid; + + LoadVideoJson(String vid) { + mVid = vid; + } + + @Override + protected PolyvVideoVO doInBackground(String... params) { + PolyvVideoVO video = null; + try { + video = PolyvSDKUtil.loadVideoJSON2Video(mVid); + } catch (Exception e) { + e.printStackTrace(); + } + + return video; + } + + @Override + protected void onPostExecute(PolyvVideoVO v) { + super.onPostExecute(v); + if (v == null) { + return; + } + + if (TextUtils.isEmpty(v.getFirstImage())) { + return; + } + + if(isDestroy((Activity) getContext())){ + return; + } + + int index = 0; + if (v.getFirstImage().contains("/")) { + index = v.getFirstImage().lastIndexOf("/"); + } + + String fileName = v.getFirstImage().substring(index); + File file = PolyvDownloadDirUtil.getFileFromExtraResourceDir(mVid, fileName); + if (file != null) { + mPreviewImage.setImageURI(Uri.parse(file.getAbsolutePath())); + } else { + PolyvImageLoader.getInstance().loadImageOrigin(getContext(), v.getFirstImage(), mPreviewImage, R.drawable.polyv_loading); + } + } + } + + /** + * 隐藏 + */ + public void hide() { + setVisibility(View.GONE); + } + + private boolean isDestroy(Activity activity){ + if(activity == null || activity.isFinishing() || + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed())){ + return true; + } else { + return false; + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + super.onTouchEvent(event); + return true; + } + + public void setCallback(Callback callback) { + mCallback = callback; + } + + public interface Callback { + public void onClickStart(); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerProgressView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerProgressView.java index b36da5c..f2f4a7c 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerProgressView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerProgressView.java @@ -1,75 +1,75 @@ -package com.easefun.polyvsdk.player; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.util.PolyvTimeUtils; - -public class PolyvPlayerProgressView extends FrameLayout { - //progressView - private View view; - private RelativeLayout rl_center_progress; - private TextView tv_curtime, tv_tottime; - private ImageView iv_left, iv_right; - - public PolyvPlayerProgressView(Context context) { - this(context, null); - } - - public PolyvPlayerProgressView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PolyvPlayerProgressView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - this.view = LayoutInflater.from(context).inflate(R.layout.polyv_player_media_center_progress, this); - findIdAndNew(); - } - - private void findIdAndNew() { - rl_center_progress = (RelativeLayout) view.findViewById(R.id.rl_center_progress); - tv_curtime = (TextView) view.findViewById(R.id.tv_curtime); - tv_tottime = (TextView) view.findViewById(R.id.tv_tottime); - iv_left = (ImageView) view.findViewById(R.id.iv_left); - iv_right = (ImageView) view.findViewById(R.id.iv_right); - } - - public void hide() { - if (rl_center_progress != null) - rl_center_progress.setVisibility(View.GONE); - } - - public void resetMaxValue() { - setViewMaxValue(0); - } - - public void setViewMaxValue(int totaltime) { - tv_tottime.setText(PolyvTimeUtils.generateTime(totaltime)); - } - - public void setViewProgressValue(int fastForwardPos, int totaltime, boolean end, boolean isRightSwipe) { - if (end) - rl_center_progress.setVisibility(View.GONE); - else - rl_center_progress.setVisibility(View.VISIBLE); - if (isRightSwipe) { - iv_left.setVisibility(View.GONE); - iv_right.setVisibility(View.VISIBLE); - } else { - iv_left.setVisibility(View.VISIBLE); - iv_right.setVisibility(View.GONE); - } - if (fastForwardPos < 0) - fastForwardPos = 0; - if (fastForwardPos > totaltime) - fastForwardPos = totaltime; - tv_curtime.setText(PolyvTimeUtils.generateTime(fastForwardPos)); - } -} +package com.easefun.polyvsdk.player; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.util.PolyvTimeUtils; + +public class PolyvPlayerProgressView extends FrameLayout { + //progressView + private View view; + private RelativeLayout rl_center_progress; + private TextView tv_curtime, tv_tottime; + private ImageView iv_left, iv_right; + + public PolyvPlayerProgressView(Context context) { + this(context, null); + } + + public PolyvPlayerProgressView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public PolyvPlayerProgressView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + this.view = LayoutInflater.from(context).inflate(R.layout.polyv_player_media_center_progress, this); + findIdAndNew(); + } + + private void findIdAndNew() { + rl_center_progress = (RelativeLayout) view.findViewById(R.id.rl_center_progress); + tv_curtime = (TextView) view.findViewById(R.id.tv_curtime); + tv_tottime = (TextView) view.findViewById(R.id.tv_tottime); + iv_left = (ImageView) view.findViewById(R.id.iv_left); + iv_right = (ImageView) view.findViewById(R.id.iv_right); + } + + public void hide() { + if (rl_center_progress != null) + rl_center_progress.setVisibility(View.GONE); + } + + public void resetMaxValue() { + setViewMaxValue(0); + } + + public void setViewMaxValue(int totaltime) { + tv_tottime.setText(PolyvTimeUtils.generateTime(totaltime)); + } + + public void setViewProgressValue(int fastForwardPos, int totaltime, boolean end, boolean isRightSwipe) { + if (end) + rl_center_progress.setVisibility(View.GONE); + else + rl_center_progress.setVisibility(View.VISIBLE); + if (isRightSwipe) { + iv_left.setVisibility(View.GONE); + iv_right.setVisibility(View.VISIBLE); + } else { + iv_left.setVisibility(View.VISIBLE); + iv_right.setVisibility(View.GONE); + } + if (fastForwardPos < 0) + fastForwardPos = 0; + if (fastForwardPos > totaltime) + fastForwardPos = totaltime; + tv_curtime.setText(PolyvTimeUtils.generateTime(fastForwardPos)); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerQuestionView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerQuestionView.java index fea50f3..3f26426 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerQuestionView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerQuestionView.java @@ -1,376 +1,376 @@ -package com.easefun.polyvsdk.player; - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.RadioButton; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import com.easefun.polyvsdk.PolyvQuestionUtil; -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.util.PolyvImageLoader; -import com.easefun.polyvsdk.video.PolyvVideoView; -import com.easefun.polyvsdk.vo.PolyvQAFormatVO; -import com.easefun.polyvsdk.vo.PolyvQuestionChoicesVO; -import com.easefun.polyvsdk.vo.PolyvQuestionVO; - -import java.util.ArrayList; -import java.util.List; - -/** - * 问答视图,已经废弃 - * @author TanQu 2016-1-25 - * @see PolyvPlayerAnswerView - */ -@Deprecated -public class PolyvPlayerQuestionView extends RelativeLayout implements OnCheckedChangeListener { - - private Context context = null; - private PolyvVideoView polyvVideoView = null; - private TextView passBtn = null; - private LinearLayout questionLayout = null; - private LinearLayout choicesRadioLayout = null; - private LinearLayout choicesCheckLayout = null; - private List answerRadioLayoutList = null; - private List answerRadioList = null; - private List answerCheckLayoutList = null; - private List answerCheckList = null; - private int rightAnswerNum = 0; - private static final int PLEASE_SELECT_MSG = 1; - private static final int ANSWER_TIPS_MSG = 2; - private Handler handler = new Handler(Looper.getMainLooper()) { - - @Override - public void handleMessage(Message msg) { - if (!((Activity) context).isFinishing()) { - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setMessage(msg.getData().getString("msg")); - builder.setCancelable(false); - - switch (msg.what) { - case PLEASE_SELECT_MSG: - builder.setTitle("提示"); - builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - dialog.dismiss(); - } - }); - break; - case ANSWER_TIPS_MSG: - builder.setTitle("答案提示"); - builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - dialog.dismiss(); - //重要,调用此方法,才会继续问答逻辑 - polyvVideoView.answerQuestionFault(); - } - }); - break; - } - - builder.show(); - } - } - }; - - public PolyvPlayerQuestionView(Context context) { - this(context, null); - } - - public PolyvPlayerQuestionView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PolyvPlayerQuestionView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - this.context = context; - initViews(); - } - - public void setPolyvVideoView(PolyvVideoView polyvVideoView) { - this.polyvVideoView = polyvVideoView; - } - - @SuppressLint("ShowToast") - private void initViews(){ - LayoutInflater.from(getContext()).inflate(R.layout.polyv_player_question_view, this); - passBtn = (TextView) findViewById(R.id.pass_btn); - passBtn.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - polyvVideoView.skipQuestion(); - handler.post(new Runnable() { - - @Override - public void run() { - hide(); - } - }); - } - }); - - Button submitBtn = (Button) findViewById(R.id.submit_btn); - submitBtn.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - if (rightAnswerNum == 0) return; - List indexList = new ArrayList<>(); - if (rightAnswerNum > 1) { - int index = 0; - for (CheckBox answerCheckBox : answerCheckList) { - if (answerCheckBox.isChecked()) { - indexList.add(index); - } - - index++; - } - } else { - int index = 0; - for (RadioButton answerRadioBtn : answerRadioList) { - if (answerRadioBtn.isChecked()) { - indexList.add(index); - } - - index++; - } - } - - if (indexList.size() == 0) { - Message message = new Message(); - message.what = PLEASE_SELECT_MSG; - - Bundle bundle = new Bundle(); - bundle.putString("msg", "请选择一个答案"); - message.setData(bundle); - - handler.sendMessage(message); - return; - } - - polyvVideoView.answerQuestion(indexList); - handler.post(new Runnable() { - - @Override - public void run() { - hide(); - } - }); - } - }); - - questionLayout = (LinearLayout) findViewById(R.id.question_layout); - choicesRadioLayout = (LinearLayout) findViewById(R.id.choices_radio_layout); - choicesCheckLayout = (LinearLayout) findViewById(R.id.choices_check_layout); - - answerRadioLayoutList = new ArrayList<>(); - LinearLayout answerRadioLayout1 = (LinearLayout) findViewById(R.id.answer_radio_layout_1); - answerRadioLayoutList.add(answerRadioLayout1); - LinearLayout answerRadioLayout2 = (LinearLayout) findViewById(R.id.answer_radio_layout_2); - answerRadioLayoutList.add(answerRadioLayout2); - LinearLayout answerRadioLayout3 = (LinearLayout) findViewById(R.id.answer_radio_layout_3); - answerRadioLayoutList.add(answerRadioLayout3); - LinearLayout answerRadioLayout4 = (LinearLayout) findViewById(R.id.answer_radio_layout_4); - answerRadioLayoutList.add(answerRadioLayout4); - - answerRadioList = new ArrayList<>(); - RadioButton answerRadio1 = (RadioButton) findViewById(R.id.answer_radio_1); - answerRadio1.setOnCheckedChangeListener(this); - answerRadioList.add(answerRadio1); - RadioButton answerRadio2 = (RadioButton) findViewById(R.id.answer_radio_2); - answerRadio2.setOnCheckedChangeListener(this); - answerRadioList.add(answerRadio2); - RadioButton answerRadio3 = (RadioButton) findViewById(R.id.answer_radio_3); - answerRadio3.setOnCheckedChangeListener(this); - answerRadioList.add(answerRadio3); - RadioButton answerRadio4 = (RadioButton) findViewById(R.id.answer_radio_4); - answerRadio4.setOnCheckedChangeListener(this); - answerRadioList.add(answerRadio4); - - answerCheckLayoutList = new ArrayList<>(); - LinearLayout answerCheckLayout1 = (LinearLayout) findViewById(R.id.answer_check_layout_1); - answerCheckLayoutList.add(answerCheckLayout1); - LinearLayout answerCheckLayout2 = (LinearLayout) findViewById(R.id.answer_check_layout_2); - answerCheckLayoutList.add(answerCheckLayout2); - LinearLayout answerCheckLayout3 = (LinearLayout) findViewById(R.id.answer_check_layout_3); - answerCheckLayoutList.add(answerCheckLayout3); - LinearLayout answerCheckLayout4 = (LinearLayout) findViewById(R.id.answer_check_layout_4); - answerCheckLayoutList.add(answerCheckLayout4); - - answerCheckList = new ArrayList<>(); - CheckBox answerCheck1 = (CheckBox) findViewById(R.id.answer_check_1); - answerCheckList.add(answerCheck1); - CheckBox answerCheck2 = (CheckBox) findViewById(R.id.answer_check_2); - answerCheckList.add(answerCheck2); - CheckBox answerCheck3 = (CheckBox) findViewById(R.id.answer_check_3); - answerCheckList.add(answerCheck3); - CheckBox answerCheck4 = (CheckBox) findViewById(R.id.answer_check_4); - answerCheckList.add(answerCheck4); - } - - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (isChecked) { - for (RadioButton radioButton : answerRadioList) { - if (radioButton.getId() != buttonView.getId()) { - radioButton.setChecked(false); - } - } - } - } - - /** - * 显示 - * @param questionVO - */ - public void show(PolyvQuestionVO questionVO) { - if (questionVO.isSkip()) { - passBtn.setVisibility(View.VISIBLE); - } - - questionLayout.removeAllViews(); - - for (RadioButton answerRadioBtn : answerRadioList) { - answerRadioBtn.setVisibility(View.INVISIBLE); - answerRadioBtn.setChecked(false); - } - - for (CheckBox answerCheckBox : answerCheckList) { - answerCheckBox.setVisibility(View.INVISIBLE); - answerCheckBox.setChecked(false); - } - - for (LinearLayout answerRadioLayout : answerRadioLayoutList) { - answerRadioLayout.setVisibility(View.INVISIBLE); - for (int i = 1, length = answerRadioLayout.getChildCount() ; i < length ; i++) { - answerRadioLayout.removeViewAt(1); - } - } - - for (LinearLayout answerCheckLayout : answerCheckLayoutList) { - answerCheckLayout.setVisibility(View.INVISIBLE); - for (int i = 1, length = answerCheckLayout.getChildCount() ; i < length ; i++) { - answerCheckLayout.removeViewAt(1); - } - } - - List list = PolyvQuestionUtil.parseQA2(questionVO.getQuestion()); - TextView textView; - ImageView imageView; - for (PolyvQAFormatVO qaFormatVO : list) { - switch (qaFormatVO.getStringType()) { - case STRING: - textView = new TextView(context); - textView.setText(qaFormatVO.getStr()); - textView.setTextColor(Color.parseColor("#ffffff")); - questionLayout.addView(textView); - break; - case URL: - imageView = new ImageView(context); - PolyvImageLoader.getInstance().loadImageOrigin(context, qaFormatVO.getStr(), - imageView, R.drawable.polyv_avatar_def); - questionLayout.addView(imageView); - break; - } - } - - //单个正确答案是单选 - //多个正确答案是多选 - int rightAnswerNum = 0; - List choicesList = questionVO.getChoicesList2(); - for (PolyvQuestionChoicesVO choicesVO : choicesList) { - if (choicesVO.getRightAnswer() == 1) { - rightAnswerNum++; - } - } - - this.rightAnswerNum = rightAnswerNum; - if (rightAnswerNum > 1) { - choicesCheckLayout.setVisibility(View.VISIBLE); - choicesRadioLayout.setVisibility(View.INVISIBLE); - } else { - choicesCheckLayout.setVisibility(View.INVISIBLE); - choicesRadioLayout.setVisibility(View.VISIBLE); - } - - LinearLayout answerLayout = null; - RadioButton answerRadioBtn = null; - CheckBox answerCheckBox = null; - int index = 0; - for (PolyvQuestionChoicesVO choicesVO : choicesList) { - if (rightAnswerNum > 1) { - answerLayout = answerCheckLayoutList.get(index); - answerCheckBox = answerCheckList.get(index); - answerCheckBox.setVisibility(View.VISIBLE); - } else { - answerLayout = answerRadioLayoutList.get(index); - answerRadioBtn = answerRadioList.get(index); - answerRadioBtn.setVisibility(View.VISIBLE); - } - - answerLayout.setVisibility(View.VISIBLE); - list = PolyvQuestionUtil.parseQA2(choicesVO.getAnswer()); - - for (PolyvQAFormatVO qaFormatVO : list) { - switch (qaFormatVO.getStringType()) { - case STRING: - textView = new TextView(context); - textView.setText(qaFormatVO.getStr()); - textView.setTextColor(Color.parseColor("#ffffff")); - answerLayout.addView(textView); - break; - case URL: - imageView = new ImageView(context); - PolyvImageLoader.getInstance().loadImageOrigin(context, qaFormatVO.getStr(), - imageView, R.drawable.polyv_avatar_def); - answerLayout.addView(imageView); - break; - } - } - - index++; - } - - setVisibility(View.VISIBLE); - } - - /** - * 隐藏 - */ - public void hide() { - setVisibility(View.INVISIBLE); - } - - /** - * 显示答案提示 - * @param msg - */ - public void showAnswerTips(String msg) { - Message message = new Message(); - message.what = ANSWER_TIPS_MSG; - - Bundle bundle = new Bundle(); - bundle.putString("msg", msg); - message.setData(bundle); - - handler.sendMessage(message); - } +package com.easefun.polyvsdk.player; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.easefun.polyvsdk.PolyvQuestionUtil; +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.util.PolyvImageLoader; +import com.easefun.polyvsdk.video.PolyvVideoView; +import com.easefun.polyvsdk.vo.PolyvQAFormatVO; +import com.easefun.polyvsdk.vo.PolyvQuestionChoicesVO; +import com.easefun.polyvsdk.vo.PolyvQuestionVO; + +import java.util.ArrayList; +import java.util.List; + +/** + * 问答视图,已经废弃 + * @author TanQu 2016-1-25 + * @see PolyvPlayerAnswerView + */ +@Deprecated +public class PolyvPlayerQuestionView extends RelativeLayout implements OnCheckedChangeListener { + + private Context context = null; + private PolyvVideoView polyvVideoView = null; + private TextView passBtn = null; + private LinearLayout questionLayout = null; + private LinearLayout choicesRadioLayout = null; + private LinearLayout choicesCheckLayout = null; + private List answerRadioLayoutList = null; + private List answerRadioList = null; + private List answerCheckLayoutList = null; + private List answerCheckList = null; + private int rightAnswerNum = 0; + private static final int PLEASE_SELECT_MSG = 1; + private static final int ANSWER_TIPS_MSG = 2; + private Handler handler = new Handler(Looper.getMainLooper()) { + + @Override + public void handleMessage(Message msg) { + if (!((Activity) context).isFinishing()) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setMessage(msg.getData().getString("msg")); + builder.setCancelable(false); + + switch (msg.what) { + case PLEASE_SELECT_MSG: + builder.setTitle("提示"); + builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + dialog.dismiss(); + } + }); + break; + case ANSWER_TIPS_MSG: + builder.setTitle("答案提示"); + builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + dialog.dismiss(); + //重要,调用此方法,才会继续问答逻辑 + polyvVideoView.answerQuestionFault(); + } + }); + break; + } + + builder.show(); + } + } + }; + + public PolyvPlayerQuestionView(Context context) { + this(context, null); + } + + public PolyvPlayerQuestionView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public PolyvPlayerQuestionView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + this.context = context; + initViews(); + } + + public void setPolyvVideoView(PolyvVideoView polyvVideoView) { + this.polyvVideoView = polyvVideoView; + } + + @SuppressLint("ShowToast") + private void initViews(){ + LayoutInflater.from(getContext()).inflate(R.layout.polyv_player_question_view, this); + passBtn = (TextView) findViewById(R.id.pass_btn); + passBtn.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + polyvVideoView.skipQuestion(); + handler.post(new Runnable() { + + @Override + public void run() { + hide(); + } + }); + } + }); + + Button submitBtn = (Button) findViewById(R.id.submit_btn); + submitBtn.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + if (rightAnswerNum == 0) return; + List indexList = new ArrayList<>(); + if (rightAnswerNum > 1) { + int index = 0; + for (CheckBox answerCheckBox : answerCheckList) { + if (answerCheckBox.isChecked()) { + indexList.add(index); + } + + index++; + } + } else { + int index = 0; + for (RadioButton answerRadioBtn : answerRadioList) { + if (answerRadioBtn.isChecked()) { + indexList.add(index); + } + + index++; + } + } + + if (indexList.size() == 0) { + Message message = new Message(); + message.what = PLEASE_SELECT_MSG; + + Bundle bundle = new Bundle(); + bundle.putString("msg", "请选择一个答案"); + message.setData(bundle); + + handler.sendMessage(message); + return; + } + + polyvVideoView.answerQuestion(indexList); + handler.post(new Runnable() { + + @Override + public void run() { + hide(); + } + }); + } + }); + + questionLayout = (LinearLayout) findViewById(R.id.question_layout); + choicesRadioLayout = (LinearLayout) findViewById(R.id.choices_radio_layout); + choicesCheckLayout = (LinearLayout) findViewById(R.id.choices_check_layout); + + answerRadioLayoutList = new ArrayList<>(); + LinearLayout answerRadioLayout1 = (LinearLayout) findViewById(R.id.answer_radio_layout_1); + answerRadioLayoutList.add(answerRadioLayout1); + LinearLayout answerRadioLayout2 = (LinearLayout) findViewById(R.id.answer_radio_layout_2); + answerRadioLayoutList.add(answerRadioLayout2); + LinearLayout answerRadioLayout3 = (LinearLayout) findViewById(R.id.answer_radio_layout_3); + answerRadioLayoutList.add(answerRadioLayout3); + LinearLayout answerRadioLayout4 = (LinearLayout) findViewById(R.id.answer_radio_layout_4); + answerRadioLayoutList.add(answerRadioLayout4); + + answerRadioList = new ArrayList<>(); + RadioButton answerRadio1 = (RadioButton) findViewById(R.id.answer_radio_1); + answerRadio1.setOnCheckedChangeListener(this); + answerRadioList.add(answerRadio1); + RadioButton answerRadio2 = (RadioButton) findViewById(R.id.answer_radio_2); + answerRadio2.setOnCheckedChangeListener(this); + answerRadioList.add(answerRadio2); + RadioButton answerRadio3 = (RadioButton) findViewById(R.id.answer_radio_3); + answerRadio3.setOnCheckedChangeListener(this); + answerRadioList.add(answerRadio3); + RadioButton answerRadio4 = (RadioButton) findViewById(R.id.answer_radio_4); + answerRadio4.setOnCheckedChangeListener(this); + answerRadioList.add(answerRadio4); + + answerCheckLayoutList = new ArrayList<>(); + LinearLayout answerCheckLayout1 = (LinearLayout) findViewById(R.id.answer_check_layout_1); + answerCheckLayoutList.add(answerCheckLayout1); + LinearLayout answerCheckLayout2 = (LinearLayout) findViewById(R.id.answer_check_layout_2); + answerCheckLayoutList.add(answerCheckLayout2); + LinearLayout answerCheckLayout3 = (LinearLayout) findViewById(R.id.answer_check_layout_3); + answerCheckLayoutList.add(answerCheckLayout3); + LinearLayout answerCheckLayout4 = (LinearLayout) findViewById(R.id.answer_check_layout_4); + answerCheckLayoutList.add(answerCheckLayout4); + + answerCheckList = new ArrayList<>(); + CheckBox answerCheck1 = (CheckBox) findViewById(R.id.answer_check_1); + answerCheckList.add(answerCheck1); + CheckBox answerCheck2 = (CheckBox) findViewById(R.id.answer_check_2); + answerCheckList.add(answerCheck2); + CheckBox answerCheck3 = (CheckBox) findViewById(R.id.answer_check_3); + answerCheckList.add(answerCheck3); + CheckBox answerCheck4 = (CheckBox) findViewById(R.id.answer_check_4); + answerCheckList.add(answerCheck4); + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + for (RadioButton radioButton : answerRadioList) { + if (radioButton.getId() != buttonView.getId()) { + radioButton.setChecked(false); + } + } + } + } + + /** + * 显示 + * @param questionVO + */ + public void show(PolyvQuestionVO questionVO) { + if (questionVO.isSkip()) { + passBtn.setVisibility(View.VISIBLE); + } + + questionLayout.removeAllViews(); + + for (RadioButton answerRadioBtn : answerRadioList) { + answerRadioBtn.setVisibility(View.GONE); + answerRadioBtn.setChecked(false); + } + + for (CheckBox answerCheckBox : answerCheckList) { + answerCheckBox.setVisibility(View.GONE); + answerCheckBox.setChecked(false); + } + + for (LinearLayout answerRadioLayout : answerRadioLayoutList) { + answerRadioLayout.setVisibility(View.GONE); + for (int i = 1, length = answerRadioLayout.getChildCount() ; i < length ; i++) { + answerRadioLayout.removeViewAt(1); + } + } + + for (LinearLayout answerCheckLayout : answerCheckLayoutList) { + answerCheckLayout.setVisibility(View.GONE); + for (int i = 1, length = answerCheckLayout.getChildCount() ; i < length ; i++) { + answerCheckLayout.removeViewAt(1); + } + } + + List list = PolyvQuestionUtil.parseQA2(questionVO.getQuestion()); + TextView textView; + ImageView imageView; + for (PolyvQAFormatVO qaFormatVO : list) { + switch (qaFormatVO.getStringType()) { + case STRING: + textView = new TextView(context); + textView.setText(qaFormatVO.getStr()); + textView.setTextColor(Color.parseColor("#ffffff")); + questionLayout.addView(textView); + break; + case URL: + imageView = new ImageView(context); + PolyvImageLoader.getInstance().loadImageOrigin(context, qaFormatVO.getStr(), + imageView, R.drawable.polyv_loading); + questionLayout.addView(imageView); + break; + } + } + + //单个正确答案是单选 + //多个正确答案是多选 + int rightAnswerNum = 0; + List choicesList = questionVO.getChoicesList2(); + for (PolyvQuestionChoicesVO choicesVO : choicesList) { + if (choicesVO.getRightAnswer() == 1) { + rightAnswerNum++; + } + } + + this.rightAnswerNum = rightAnswerNum; + if (rightAnswerNum > 1) { + choicesCheckLayout.setVisibility(View.VISIBLE); + choicesRadioLayout.setVisibility(View.GONE); + } else { + choicesCheckLayout.setVisibility(View.GONE); + choicesRadioLayout.setVisibility(View.VISIBLE); + } + + LinearLayout answerLayout = null; + RadioButton answerRadioBtn = null; + CheckBox answerCheckBox = null; + int index = 0; + for (PolyvQuestionChoicesVO choicesVO : choicesList) { + if (rightAnswerNum > 1) { + answerLayout = answerCheckLayoutList.get(index); + answerCheckBox = answerCheckList.get(index); + answerCheckBox.setVisibility(View.VISIBLE); + } else { + answerLayout = answerRadioLayoutList.get(index); + answerRadioBtn = answerRadioList.get(index); + answerRadioBtn.setVisibility(View.VISIBLE); + } + + answerLayout.setVisibility(View.VISIBLE); + list = PolyvQuestionUtil.parseQA2(choicesVO.getAnswer()); + + for (PolyvQAFormatVO qaFormatVO : list) { + switch (qaFormatVO.getStringType()) { + case STRING: + textView = new TextView(context); + textView.setText(qaFormatVO.getStr()); + textView.setTextColor(Color.parseColor("#ffffff")); + answerLayout.addView(textView); + break; + case URL: + imageView = new ImageView(context); + PolyvImageLoader.getInstance().loadImageOrigin(context, qaFormatVO.getStr(), + imageView, R.drawable.polyv_loading); + answerLayout.addView(imageView); + break; + } + } + + index++; + } + + setVisibility(View.VISIBLE); + } + + /** + * 隐藏 + */ + public void hide() { + setVisibility(View.GONE); + } + + /** + * 显示答案提示 + * @param msg + */ + public void showAnswerTips(String msg) { + Message message = new Message(); + message.what = ANSWER_TIPS_MSG; + + Bundle bundle = new Bundle(); + bundle.putString("msg", msg); + message.setData(bundle); + + handler.sendMessage(message); + } } \ No newline at end of file diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerVolumeView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerVolumeView.java index 03cfc0d..449916f 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerVolumeView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/PolyvPlayerVolumeView.java @@ -1,50 +1,50 @@ -package com.easefun.polyvsdk.player; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import com.easefun.polyvsdk.R; - -public class PolyvPlayerVolumeView extends FrameLayout { - //volumeView - private View view; - private RelativeLayout rl_center_volume; - private TextView tv_volume; - - public PolyvPlayerVolumeView(Context context) { - this(context, null); - } - - public PolyvPlayerVolumeView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PolyvPlayerVolumeView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - this.view = LayoutInflater.from(context).inflate(R.layout.polyv_player_media_center_volume, this); - findIdAndNew(); - } - - private void findIdAndNew() { - rl_center_volume = (RelativeLayout) view.findViewById(R.id.rl_center_volume); - tv_volume = (TextView) view.findViewById(R.id.tv_volume); - } - - public void hide() { - if (rl_center_volume != null) - rl_center_volume.setVisibility(View.INVISIBLE); - } - - public void setViewVolumeValue(int volume, boolean end) { - if (end) - rl_center_volume.setVisibility(View.INVISIBLE); - else - rl_center_volume.setVisibility(View.VISIBLE); - tv_volume.setText(volume + "%"); - } -} +package com.easefun.polyvsdk.player; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.easefun.polyvsdk.R; + +public class PolyvPlayerVolumeView extends FrameLayout { + //volumeView + private View view; + private RelativeLayout rl_center_volume; + private TextView tv_volume; + + public PolyvPlayerVolumeView(Context context) { + this(context, null); + } + + public PolyvPlayerVolumeView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public PolyvPlayerVolumeView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + this.view = LayoutInflater.from(context).inflate(R.layout.polyv_player_media_center_volume, this); + findIdAndNew(); + } + + private void findIdAndNew() { + rl_center_volume = (RelativeLayout) view.findViewById(R.id.rl_center_volume); + tv_volume = (TextView) view.findViewById(R.id.tv_volume); + } + + public void hide() { + if (rl_center_volume != null) + rl_center_volume.setVisibility(View.GONE); + } + + public void setViewVolumeValue(int volume, boolean end) { + if (end) + rl_center_volume.setVisibility(View.GONE); + else + rl_center_volume.setVisibility(View.VISIBLE); + tv_volume.setText(volume + "%"); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/fillblank/AnswerRange.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/fillblank/AnswerRange.java new file mode 100644 index 0000000..9c05d2f --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/fillblank/AnswerRange.java @@ -0,0 +1,12 @@ +package com.easefun.polyvsdk.player.fillblank; + +public class AnswerRange { + + public int start; + public int end; + + public AnswerRange(int start, int end) { + this.start = start; + this.end = end; + } +} \ No newline at end of file diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/fillblank/FillBlankView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/fillblank/FillBlankView.java new file mode 100644 index 0000000..491d569 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/fillblank/FillBlankView.java @@ -0,0 +1,415 @@ +package com.easefun.polyvsdk.player.fillblank; + +import android.content.Context; +import android.graphics.Rect; +import android.os.Build; +import android.text.Editable; +import android.text.InputFilter; +import android.text.Layout; +import android.text.SpannableStringBuilder; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.text.method.LinkMovementMethod; +import android.text.method.ScrollingMovementMethod; +import android.util.AttributeSet; +import android.util.Log; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewTreeObserver; +import android.widget.EditText; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.easefun.polyvsdk.R; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import static android.text.InputType.TYPE_CLASS_TEXT; + +/** + * 填空题 + * Created by yangle on 2017/9/2. + */ + +public class FillBlankView extends RelativeLayout { + private static final String TAG = "FillBlankView"; + private TextView tvContent; + private ObservableScrollView scrollView; + private Context context; + // 答案集合 + private LinkedList rightAnswerList; + // 答案范围集合 + private List rangeList = new ArrayList<>(); + //答案最小长度 + private List rangeMinWidth = new ArrayList<>(); + //编辑框集合 + private List editTexts = new ArrayList<>(); + // 填空题内容 + private SpannableStringBuilder content; + + private boolean isNeedToChangeEditText = true; + + private int tvContentWidth = 0; + + //单行显示的内容 + private int singlePoint = 0; + + public FillBlankView(Context context) { + this(context, null); + } + + public FillBlankView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public FillBlankView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + this.context = context; + initView(); + } + + private void initView() { + LayoutInflater inflater = LayoutInflater.from(context); + inflater.inflate(R.layout.layout_fill_blank, this); + scrollView = findViewById(R.id.scrollView); + tvContent = (TextView) findViewById(R.id.tv_content); + scrollView.setScrollViewListener(new ScrollViewListener() { + @Override + public void onScrollChanged(ObservableScrollView observableScrollView, int x, int y, int oldx, int oldy) { + Log.i(TAG, "onScrollChanged: x:" + x + " y:" + y); + if (rangeList.size() == editTexts.size()) { + changeEditTextList(); + } + } + }); + } + + /** + * 设置数据 + * + * @param originContent 源数据 + */ + public void setData(SpannableStringBuilder originContent) { + isNeedToChangeEditText = true; + // 获取课文内容 +// content = new SpannableStringBuilder(originContent); + addSpaceForContent(originContent); + if (content != null && content.toString().endsWith(originContent.toString())) { + return; + } + + content = originContent; + caculateAnswerRange(); + rangeMinWidth.clear(); + for (AnswerRange range : rangeList) { + int value = range.end - range.start + 1; + rangeMinWidth.add(value); + } + + if (TextUtils.isEmpty(originContent) || rangeList == null + || rangeList.isEmpty()) { + return; + } + + if (editTexts.size() > 0) { + for (EditText editText : editTexts) { + FillBlankView.this.removeView(editText); + } + editTexts.clear(); + } + + // 答案集合 + rightAnswerList = new LinkedList<>(); + for (int i = 0; i < rangeList.size(); i++) { + rightAnswerList.add(""); + } + + // 设置此方法后,点击事件才能生效 + tvContent.setMovementMethod(LinkMovementMethod.getInstance()); +// tvContent.setText(new Spanned()originContent); + tvContent.setText(content); + + tvContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + if (tvContentWidth != tvContent.getWidth()) { + isNeedToChangeEditText = true; + } + if (isNeedToChangeEditText) { + changeEditTextList(); + } + } + }); +// if (originContent.equals(content)) { +// if (editTexts.size() > 0) { +// for (int i = 0; i < editTexts.size(); i++) { +// resetTvContent(i, editTexts.get(i)); +// } +// } +// } + } + + private void changeEditTextList() { + //判断是否有空白处已改变 + int isNeedToChangeNum = 0; + for (int i = 0; i < rangeList.size(); i++) { + AnswerRange answerRange = rangeList.get(i); + final int[] points = new int[3]; + Layout textViewLayout = tvContent.getLayout(); + calcClickPosition(textViewLayout, tvContent, points, answerRange); + if (editTexts.size() < i + 1) { + final EditText editText = new EditText(context); + editTexts.add(editText); + FillBlankView.this.addView(editText); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + editText.setBackground(null); + } + editText.setInputType(TYPE_CLASS_TEXT); + editText.setSingleLine(); + editText.setTextSize(14); + editText.setTextColor(getResources().getColorStateList(R.color.center_fill_blank_color_blue)); + editText.setSelection(editText.getText().length(), editText.getText().length()); + editText.setIncludeFontPadding(false); + editText.setPadding(0, 0, 0, 0); + editText.setLineSpacing(0f, 0f); + final int finalI = i; + editText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void afterTextChanged(Editable s) { + if (singlePoint == 0) + singlePoint = points[2] / (rangeList.get(finalI).end - rangeList.get(finalI).start + 1); + isNeedToChangeEditText = resetTvContent(finalI, editText); + } + }); + editText.setOnTouchListener(new OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { +// scrollView.scrollTo(0, editText.getTop()); + return false; + } + }); + } + editTexts.get(i).setX(points[0]); + editTexts.get(i).setY(points[1]); + if (editTexts.get(i).getWidth() != tvContent.getWidth()) { + + if (singlePoint == 0) + singlePoint = points[2] / (rangeList.get(i).end - rangeList.get(i).start + 1); + editTexts.get(i).setWidth(tvContent.getWidth()-singlePoint); + editTexts.get(i).setFilters(new InputFilter[]{new InputFilter.LengthFilter(200)}); + boolean isNeedToChange = resetTvContent(i, editTexts.get(i)); + if (isNeedToChange) { + isNeedToChangeNum++; + } + } + } + if (isNeedToChangeNum > 0) { + isNeedToChangeEditText = true; + } + tvContentWidth = tvContent.getWidth(); + } + + /** + * 重新调整题目的下划线长度 + * @param index + * @param editText + * @return + */ + private boolean resetTvContent(int index, EditText editText) { + boolean isNeedToChange = false; + Editable s = editText.getText(); + AnswerRange answerRange = rangeList.get(index); + int[] newPoints = new int[3]; + Layout textViewLayout = tvContent.getLayout(); + calcClickPosition(textViewLayout, tvContent, newPoints, answerRange); + + Layout layout = editText.getLayout(); + if (layout == null) { + return false; + } + double pointStart = layout.getPrimaryHorizontal(0); + double pointEnd = layout.getPrimaryHorizontal(s.length()); + editText.setMovementMethod(ScrollingMovementMethod.getInstance()); + editText.setSelection(s.length()); + + int needPoint = (int) ((pointEnd - pointStart) / singlePoint); + if ((pointEnd - pointStart) % singlePoint > 0) { + needPoint++; + } + if (needPoint > tvContent.getWidth() / singlePoint) { + needPoint = tvContent.getWidth() / singlePoint; + } + + if (needPoint > answerRange.end - answerRange.start + 1) { + int addCount = needPoint - (answerRange.end - answerRange.start + 1); + for (int i = 0; i < addCount; i++) { + content.insert(answerRange.end, "_"); + answerRange.end++; + } + isNeedToChange = true; + + } else if (needPoint < answerRange.end - answerRange.start + 1) { + if (needPoint <= rangeMinWidth.get(index)) { + if (answerRange.end - answerRange.start + 1 > rangeMinWidth.get(index)) { + int deleteCount = answerRange.end + 1 - (answerRange.start + rangeMinWidth.get(index)); + content.delete(answerRange.start, answerRange.start + deleteCount); + answerRange.end = answerRange.start + rangeMinWidth.get(index) - 1; + isNeedToChange = true; + } else { + isNeedToChange = false; + } + } else if (needPoint > rangeMinWidth.get(index)) { + int deleteCount = (answerRange.end - answerRange.start + 1) - needPoint; + content.delete(answerRange.start, answerRange.start + deleteCount); + answerRange.end = answerRange.end - deleteCount; + isNeedToChange = true; + } + } else { + isNeedToChange = false; + } + caculateAnswerRange(); + tvContent.setText(content); + return isNeedToChange; + } + + /** + * 给每个下划线前后添加空格 + */ + public void addSpaceForContent(SpannableStringBuilder originContent){ + int i =0; + int start = -1; + int end = -1; + while (i= 2) { + originContent.insert(start, "\r"); + originContent.insert(i+1, "\r"); + } + } + start = -1; + end = -1; + } else { + if (start == -1) { + start = i; + } else { + end = i; + } + } + i++; + } + } + /** + * 重新计算下划线所在的位置 + */ + public void caculateAnswerRange() { + rangeList.clear(); + int i = 0; + int start = -1; + int end = -1; + while (i < content.length()) { + if (content.charAt(i) != '_') { + if (start != -1 && end != -1) { + if (end - start >= 2) { + if (rangeList.size() < 5) { + rangeList.add(new AnswerRange(start, end)); + } + } + start = -1; + end = -1; + } + } else { + if (start == -1) { + start = i; + } else { + end = i; + } + } + if (i == content.length() - 1 && content.charAt(i) == '_') { + if (start != -1 && end != -1) { + if (end - start >= 2) { + if (rangeList.size() < 5) + rangeList.add(new AnswerRange(start, end)); + } + start = -1; + end = -1; + } + } + i++; + } + } + + /** + * 获取答案列表 + * + * @return 答案列表 + */ + public LinkedList getRightAnswerList() { + rightAnswerList.clear(); + for (EditText editText : editTexts) { + String text = editText.getText().toString(); + if (!TextUtils.isEmpty(text)) { + rightAnswerList.add(editText.getText().toString()); + } + } + return rightAnswerList; + } + + /** + * dp转px + * + * @param dp dp值 + * @return px值 + */ + private int dp2px(float dp) { + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, + getResources().getDisplayMetrics()); + } + + // 计算点击的单词的坐标,首先计算单词在整个短文中的起始位置,即可获取到该单词的x偏移。通过起始位置 + // 还可以获取该单词所在的行索引。进而可以获取该行所在的矩形区域。即可获取到该单词的y偏移。在计算 + // padding和scroll的影响,最终可以获得点击位置的屏幕坐标 + private void calcClickPosition(Layout textViewLayout, View widget, int[] pos, AnswerRange answerRange) { + TextView textView = (TextView) widget; + Rect parentTextViewRect = new Rect(); + + int start = answerRange.start; + int end = answerRange.end + 1; + // 获取点击单词所在的行数 + int lineOffset = textViewLayout.getLineForOffset(start); + // 获取点击单词所在的x坐标 + double pointStart = textViewLayout.getPrimaryHorizontal(start); + double pointEnd = textViewLayout.getPrimaryHorizontal(end); + + // 获取点击单词所在一行的矩形 + textViewLayout.getLineBounds(lineOffset, parentTextViewRect); + int[] parentTextViewLocation = {0, 0}; + // 获取TextView左上角的坐标 + + textView.getLocationOnScreen(parentTextViewLocation); + // 加入scroll和padding的偏移的计算 + parentTextViewRect.top += textView.getY() + textView.getCompoundPaddingTop() - scrollView.getScrollY(); + parentTextViewRect.left += textView.getX() + pointStart + textView.getCompoundPaddingLeft() - scrollView.getScrollX(); + pos[0] = parentTextViewRect.left; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + pos[1] = (parentTextViewRect.top); + } + + pos[2] = (int) (pointEnd - pointStart); + + } +} \ No newline at end of file diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/fillblank/ObservableScrollView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/fillblank/ObservableScrollView.java new file mode 100644 index 0000000..b808ac8 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/fillblank/ObservableScrollView.java @@ -0,0 +1,33 @@ +package com.easefun.polyvsdk.player.fillblank; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ScrollView; + +public class ObservableScrollView extends ScrollView { + private ScrollViewListener mScrollViewListener=null; + + public void setScrollViewListener(ScrollViewListener scrollViewListener) { + mScrollViewListener = scrollViewListener; + } + + public ObservableScrollView(Context context) { + super(context); + } + + public ObservableScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ObservableScrollView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onScrollChanged(int x, int y, int oldx, int oldy) { + super.onScrollChanged(x, y, oldx, oldy); + if (mScrollViewListener != null) { + mScrollViewListener.onScrollChanged(this, x, y, oldx, oldy); + } + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/fillblank/ScrollViewListener.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/fillblank/ScrollViewListener.java new file mode 100644 index 0000000..f8205d3 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/fillblank/ScrollViewListener.java @@ -0,0 +1,5 @@ +package com.easefun.polyvsdk.player.fillblank; + +public interface ScrollViewListener { + void onScrollChanged(ObservableScrollView observableScrollView,int x,int y ,int oldx, int oldy); +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/PolyvPlayerKnowledgeLayout.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/PolyvPlayerKnowledgeLayout.java new file mode 100644 index 0000000..36cf24c --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/PolyvPlayerKnowledgeLayout.java @@ -0,0 +1,230 @@ +package com.easefun.polyvsdk.player.knowledge; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.RelativeLayout; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.player.knowledge.adapter.PolyvPlayerKnowledgePointAdapter; +import com.easefun.polyvsdk.player.knowledge.adapter.PolyvPlayerKnowledgeWordKeyAdapter; +import com.easefun.polyvsdk.player.knowledge.adapter.PolyvPlayerKnowledgeWordTypeAdapter; +import com.easefun.polyvsdk.player.knowledge.vo.PolyvPlayerKnowledgeVO; +import com.easefun.polyvsdk.util.PolyvScreenUtils; + +import java.util.List; + +/** + * @author suhongtao + */ +public class PolyvPlayerKnowledgeLayout extends FrameLayout { + + private View rootView; + private RelativeLayout polyvPlayerKnowledgeWordTypeRl; + private ImageView polyvPlayerKnowledgeCloseIv; + private RecyclerView polyvPlayerKnowledgeWordTypeRv; + private RecyclerView polyvPlayerKnowledgeWordKeyRv; + private RecyclerView polyvPlayerKnowledgeDetailRv; + + private PolyvPlayerKnowledgeWordTypeAdapter wordTypeAdapter; + private PolyvPlayerKnowledgeWordKeyAdapter wordKeyAdapter; + private PolyvPlayerKnowledgePointAdapter knowledgePointAdapter; + + private OnViewActionListener onViewActionListener; + + private static final int AUTO_HIDE_IN_NO_OPERATE_TIMEOUT = 10 * 1000; + private static final int MSG_WHAT_HIDE = 0; + private Handler handler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + switch (msg.what) { + case MSG_WHAT_HIDE: + show(false); + if (onViewActionListener != null) { + onViewActionListener.onAutoClose(); + } + break; + default: + } + } + }; + + public PolyvPlayerKnowledgeLayout(@NonNull Context context) { + super(context); + initView(); + } + + public PolyvPlayerKnowledgeLayout(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + initView(); + } + + public PolyvPlayerKnowledgeLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(); + } + + private void initView() { + rootView = LayoutInflater.from(getContext()).inflate(R.layout.polyv_player_knowledge_layout, this); + findView(); + initRecyclerView(); + setOnClickCloseListener(); + } + + private void findView() { + polyvPlayerKnowledgeWordTypeRl = (RelativeLayout) rootView.findViewById(R.id.polyv_player_knowledge_word_type_rl); + polyvPlayerKnowledgeCloseIv = (ImageView) rootView.findViewById(R.id.polyv_player_knowledge_close_iv); + polyvPlayerKnowledgeWordTypeRv = (RecyclerView) rootView.findViewById(R.id.polyv_player_knowledge_word_type_rv); + polyvPlayerKnowledgeWordKeyRv = (RecyclerView) rootView.findViewById(R.id.polyv_player_knowledge_word_key_rv); + polyvPlayerKnowledgeDetailRv = (RecyclerView) rootView.findViewById(R.id.polyv_player_knowledge_detail_rv); + } + + private void initRecyclerView() { + wordTypeAdapter = new PolyvPlayerKnowledgeWordTypeAdapter(); + polyvPlayerKnowledgeWordTypeRv.setAdapter(wordTypeAdapter); + polyvPlayerKnowledgeWordTypeRv.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false)); + wordTypeAdapter.setOnItemClickListener(new PolyvPlayerKnowledgeWordTypeAdapter.OnItemClickListener() { + @Override + public void onClick(PolyvPlayerKnowledgeVO.WordType wordType) { + List wordKeys = wordType.getWordKeys(); + PolyvPlayerKnowledgeVO.WordType.WordKey selectedWordKey = wordKeyAdapter.getSelectedWordKey(); + wordKeyAdapter.setWordKeyList(wordKeys); + if (selectedWordKey != null && wordKeys.contains(selectedWordKey)) { + knowledgePointAdapter.setKnowledgePoints(wordKeyAdapter.getSelectedWordKey().getKnowledgePoints()); + } else { + knowledgePointAdapter.setKnowledgePoints(null); + } + } + }); + + wordKeyAdapter = new PolyvPlayerKnowledgeWordKeyAdapter(); + polyvPlayerKnowledgeWordKeyRv.setAdapter(wordKeyAdapter); + polyvPlayerKnowledgeWordKeyRv.setLayoutManager(new LinearLayoutManager(getContext())); + wordKeyAdapter.setOnItemClickListener(new PolyvPlayerKnowledgeWordKeyAdapter.OnItemClickListener() { + @Override + public void onClick(PolyvPlayerKnowledgeVO.WordType.WordKey wordKey) { + knowledgePointAdapter.setKnowledgePoints(wordKey.getKnowledgePoints()); + } + }); + + knowledgePointAdapter = new PolyvPlayerKnowledgePointAdapter(); + polyvPlayerKnowledgeDetailRv.setAdapter(knowledgePointAdapter); + polyvPlayerKnowledgeDetailRv.setLayoutManager(new LinearLayoutManager(getContext())); + knowledgePointAdapter.setOnItemClickListener(new PolyvPlayerKnowledgePointAdapter.OnItemClickListener() { + @Override + public void onClick(PolyvPlayerKnowledgeVO.WordType.WordKey.KnowledgePoint knowledgePoint) { + if (onViewActionListener != null) { + onViewActionListener.onClickKnowledgePoint(knowledgePoint); + } + } + }); + } + + private void setOnClickCloseListener() { + polyvPlayerKnowledgeCloseIv.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + show(false); + if (onViewActionListener != null) { + onViewActionListener.onClickClose(); + } + } + }); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + setAutoHideInNoOperate(AUTO_HIDE_IN_NO_OPERATE_TIMEOUT); + return super.dispatchTouchEvent(ev); + } + + public void setKnowledgeData(PolyvPlayerKnowledgeVO vo) { + wordTypeAdapter.setWordTypeList(null); + wordKeyAdapter.setWordKeyList(null); + knowledgePointAdapter.setKnowledgePoints(null); + + if (vo == null) { + return; + } + + final boolean fullScreen = vo.getFullScreenStyle() != null && vo.getFullScreenStyle(); + setFullScreenStyle(fullScreen); + knowledgePointAdapter.setShowKnowledgePointDescription(fullScreen); + + wordTypeAdapter.setWordTypeList(vo.getWordTypes()); + if (vo.getWordTypes() != null + && vo.getWordTypes().size() > 0 + && vo.getWordTypes().get(0) != null) { + wordTypeAdapter.setSelectedWordType(vo.getWordTypes().get(0)); + wordKeyAdapter.setWordKeyList(vo.getWordTypes().get(0).getWordKeys()); + if (vo.getWordTypes().get(0).getWordKeys() != null + && vo.getWordTypes().get(0).getWordKeys().size() > 0 + && vo.getWordTypes().get(0).getWordKeys().get(0) != null) { + wordKeyAdapter.setSelectedWordKey(vo.getWordTypes().get(0).getWordKeys().get(0)); + knowledgePointAdapter.setKnowledgePoints(vo.getWordTypes().get(0).getWordKeys().get(0).getKnowledgePoints()); + } + } + wordTypeAdapter.notifyItemChanged(0); + wordKeyAdapter.notifyItemChanged(0); + + if (onViewActionListener != null) { + onViewActionListener.onReady(); + } + } + + public void show(boolean show) { + if (show) { + setVisibility(VISIBLE); + setAutoHideInNoOperate(AUTO_HIDE_IN_NO_OPERATE_TIMEOUT); + } else { + setVisibility(GONE); + } + } + + public boolean isShowing() { + return getVisibility() == VISIBLE; + } + + public void setOnViewActionListener(OnViewActionListener onViewActionListener) { + this.onViewActionListener = onViewActionListener; + } + + private void setFullScreenStyle(boolean isFullScreen) { + ViewGroup.LayoutParams lp = getLayoutParams(); + if (isFullScreen) { + lp.width = ViewGroup.LayoutParams.MATCH_PARENT; + } else { + lp.width = PolyvScreenUtils.dip2px(getContext(), 380); + } + setLayoutParams(lp); + } + + private void setAutoHideInNoOperate(int timeoutInMillis) { + handler.removeMessages(MSG_WHAT_HIDE); + handler.sendEmptyMessageDelayed(MSG_WHAT_HIDE, timeoutInMillis); + } + + public interface OnViewActionListener { + void onReady(); + + void onClickClose(); + + void onClickKnowledgePoint(PolyvPlayerKnowledgeVO.WordType.WordKey.KnowledgePoint knowledgePoint); + + void onAutoClose(); + } + +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/adapter/PolyvPlayerKnowledgePointAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/adapter/PolyvPlayerKnowledgePointAdapter.java new file mode 100644 index 0000000..50a2f87 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/adapter/PolyvPlayerKnowledgePointAdapter.java @@ -0,0 +1,98 @@ +package com.easefun.polyvsdk.player.knowledge.adapter; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.easefun.polyvsdk.player.knowledge.vo.PolyvPlayerKnowledgeVO; +import com.easefun.polyvsdk.player.knowledge.widget.PolyvPlayerKnowledgePointView; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author suhongtao + */ +public class PolyvPlayerKnowledgePointAdapter extends RecyclerView.Adapter { + + private List knowledgePoints = new ArrayList<>(); + + private PolyvPlayerKnowledgeVO.WordType.WordKey.KnowledgePoint selectedKnowledgePoint; + private boolean showKnowledgePointDescription; + + private OnItemClickListener onItemClickListener; + + public PolyvPlayerKnowledgePointAdapter() { + + } + + @NonNull + @Override + public KnowledgePointViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { + return new KnowledgePointViewHolder(new PolyvPlayerKnowledgePointView(viewGroup.getContext())); + } + + @Override + public void onBindViewHolder(@NonNull KnowledgePointViewHolder knowledgePointViewHolder, int i) { + final PolyvPlayerKnowledgeVO.WordType.WordKey.KnowledgePoint knowledgePoint = knowledgePoints.get(i); + knowledgePointViewHolder.bind(knowledgePoint); + knowledgePointViewHolder.knowledgePointView.showDescription(showKnowledgePointDescription); + knowledgePointViewHolder.knowledgePointView.setSelected(knowledgePoint.equals(selectedKnowledgePoint)); + knowledgePointViewHolder.knowledgePointView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + selectedKnowledgePoint = knowledgePoint; + if (onItemClickListener != null) { + onItemClickListener.onClick(knowledgePoint); + } + notifyDataSetChanged(); + } + }); + } + + @Override + public int getItemCount() { + return knowledgePoints.size(); + } + + public void setKnowledgePoints(List list) { + this.knowledgePoints.clear(); + if (list != null) { + knowledgePoints.addAll(list); + } + notifyDataSetChanged(); + } + + public void setSelectedKnowledgePoint(PolyvPlayerKnowledgeVO.WordType.WordKey.KnowledgePoint selectedKnowledgePoint) { + this.selectedKnowledgePoint = selectedKnowledgePoint; + } + + public void setShowKnowledgePointDescription(boolean show) { + this.showKnowledgePointDescription = show; + } + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.onItemClickListener = onItemClickListener; + } + + public static class KnowledgePointViewHolder extends RecyclerView.ViewHolder { + + private PolyvPlayerKnowledgePointView knowledgePointView; + + public KnowledgePointViewHolder(PolyvPlayerKnowledgePointView itemView) { + super(itemView); + this.knowledgePointView = itemView; + } + + public void bind(PolyvPlayerKnowledgeVO.WordType.WordKey.KnowledgePoint knowledgePoint) { + knowledgePointView.setDescription(knowledgePoint.getName()); + knowledgePointView.setTime(knowledgePoint.getTime()); + } + } + + public interface OnItemClickListener { + void onClick(PolyvPlayerKnowledgeVO.WordType.WordKey.KnowledgePoint knowledgePoint); + } + +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/adapter/PolyvPlayerKnowledgeWordKeyAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/adapter/PolyvPlayerKnowledgeWordKeyAdapter.java new file mode 100644 index 0000000..d3e1aac --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/adapter/PolyvPlayerKnowledgeWordKeyAdapter.java @@ -0,0 +1,98 @@ +package com.easefun.polyvsdk.player.knowledge.adapter; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.easefun.polyvsdk.player.knowledge.vo.PolyvPlayerKnowledgeVO; +import com.easefun.polyvsdk.player.knowledge.widget.PolyvPlayerKnowledgeWordKeyView; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author suhongtao + */ +public class PolyvPlayerKnowledgeWordKeyAdapter extends RecyclerView.Adapter { + + private List wordKeyList = new ArrayList<>(); + + private PolyvPlayerKnowledgeVO.WordType.WordKey selectedWordKey; + + private OnItemClickListener onItemClickListener; + + public PolyvPlayerKnowledgeWordKeyAdapter() { + + } + + @NonNull + @Override + public WordKeyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { + return new WordKeyViewHolder(new PolyvPlayerKnowledgeWordKeyView(viewGroup.getContext())); + } + + @Override + public void onBindViewHolder(@NonNull WordKeyViewHolder wordKeyViewHolder, int i) { + final PolyvPlayerKnowledgeVO.WordType.WordKey wordKey = wordKeyList.get(i); + wordKeyViewHolder.bind(wordKey); + wordKeyViewHolder.wordKeyView.setSelected(wordKey.equals(selectedWordKey)); + wordKeyViewHolder.wordKeyView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + selectedWordKey = wordKey; + if (onItemClickListener != null) { + onItemClickListener.onClick(wordKey); + } + notifyDataSetChanged(); + } + }); + } + + @Override + public int getItemCount() { + return wordKeyList.size(); + } + + public void setWordKeyList(List list) { + this.wordKeyList.clear(); + if (list != null) { + this.wordKeyList.addAll(list); + } + notifyDataSetChanged(); + } + + public void setSelectedWordKey(PolyvPlayerKnowledgeVO.WordType.WordKey wordKey) { + this.selectedWordKey = wordKey; + } + + public PolyvPlayerKnowledgeVO.WordType.WordKey getSelectedWordKey() { + return selectedWordKey; + } + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.onItemClickListener = onItemClickListener; + } + + public static class WordKeyViewHolder extends RecyclerView.ViewHolder { + + private PolyvPlayerKnowledgeWordKeyView wordKeyView; + + public WordKeyViewHolder(PolyvPlayerKnowledgeWordKeyView itemView) { + super(itemView); + this.wordKeyView = itemView; + } + + public void bind(PolyvPlayerKnowledgeVO.WordType.WordKey wordKey) { + List points = wordKey.getKnowledgePoints(); + final int size = points == null ? 0 : points.size(); + wordKeyView.setWordKey(wordKey.getName()); + wordKeyView.setKnowledgePointCount(size); + } + } + + public interface OnItemClickListener { + void onClick(PolyvPlayerKnowledgeVO.WordType.WordKey wordKey); + } + +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/adapter/PolyvPlayerKnowledgeWordTypeAdapter.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/adapter/PolyvPlayerKnowledgeWordTypeAdapter.java new file mode 100644 index 0000000..5f3b966 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/adapter/PolyvPlayerKnowledgeWordTypeAdapter.java @@ -0,0 +1,88 @@ +package com.easefun.polyvsdk.player.knowledge.adapter; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.easefun.polyvsdk.player.knowledge.vo.PolyvPlayerKnowledgeVO; +import com.easefun.polyvsdk.player.knowledge.widget.PolyvPlayerKnowledgeWordTypeView; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author suhongtao + */ +public class PolyvPlayerKnowledgeWordTypeAdapter extends RecyclerView.Adapter { + + private List wordTypeList = new ArrayList<>(); + + private PolyvPlayerKnowledgeVO.WordType selectedWordType; + + private OnItemClickListener onItemClickListener; + + @NonNull + @Override + public WordTypeViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { + return new WordTypeViewHolder(new PolyvPlayerKnowledgeWordTypeView(viewGroup.getContext())); + } + + @Override + public void onBindViewHolder(@NonNull WordTypeViewHolder wordTypeViewHolder, int i) { + final PolyvPlayerKnowledgeVO.WordType wordType = wordTypeList.get(i); + wordTypeViewHolder.bind(wordType); + wordTypeViewHolder.wordTypeView.setSelected(wordType.equals(selectedWordType)); + wordTypeViewHolder.wordTypeView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + selectedWordType = wordType; + if (onItemClickListener != null) { + onItemClickListener.onClick(wordType); + } + notifyDataSetChanged(); + } + }); + } + + @Override + public int getItemCount() { + return wordTypeList.size(); + } + + public void setWordTypeList(List wordTypes) { + this.wordTypeList.clear(); + if (wordTypes != null) { + wordTypeList.addAll(wordTypes); + } + notifyDataSetChanged(); + } + + public void setSelectedWordType(PolyvPlayerKnowledgeVO.WordType wordType) { + this.selectedWordType = wordType; + } + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.onItemClickListener = onItemClickListener; + } + + public static class WordTypeViewHolder extends RecyclerView.ViewHolder { + + private PolyvPlayerKnowledgeWordTypeView wordTypeView; + + public WordTypeViewHolder(PolyvPlayerKnowledgeWordTypeView itemView) { + super(itemView); + this.wordTypeView = itemView; + } + + public void bind(PolyvPlayerKnowledgeVO.WordType wordType) { + wordTypeView.setWordTypeName(wordType.getName()); + } + + } + + public interface OnItemClickListener { + void onClick(PolyvPlayerKnowledgeVO.WordType wordType); + } + +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/vo/PolyvPlayerKnowledgeVO.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/vo/PolyvPlayerKnowledgeVO.java new file mode 100644 index 0000000..94bf202 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/vo/PolyvPlayerKnowledgeVO.java @@ -0,0 +1,93 @@ +package com.easefun.polyvsdk.player.knowledge.vo; + +import java.util.List; + +/** + * @author suhongtao + */ +public class PolyvPlayerKnowledgeVO { + + private Boolean fullScreenStyle = false; + private List wordTypes; + + public Boolean getFullScreenStyle() { + return fullScreenStyle; + } + + public void setFullScreenStyle(Boolean fullScreenStyle) { + this.fullScreenStyle = fullScreenStyle; + } + + public List getWordTypes() { + return wordTypes; + } + + public void setWordTypes(List wordTypes) { + this.wordTypes = wordTypes; + } + + public static class WordType { + private String name; + private List wordKeys; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getWordKeys() { + return wordKeys; + } + + public void setWordKeys(List wordKeys) { + this.wordKeys = wordKeys; + } + + public static class WordKey { + private String name; + private List knowledgePoints; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getKnowledgePoints() { + return knowledgePoints; + } + + public void setKnowledgePoints(List knowledgePoints) { + this.knowledgePoints = knowledgePoints; + } + + public static class KnowledgePoint { + private String name; + private Integer time; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getTime() { + return time; + } + + public void setTime(Integer time) { + this.time = time; + } + } + } + + } + +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/widget/PolyvPlayerKnowledgePointView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/widget/PolyvPlayerKnowledgePointView.java new file mode 100644 index 0000000..dc58ce9 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/widget/PolyvPlayerKnowledgePointView.java @@ -0,0 +1,81 @@ +package com.easefun.polyvsdk.player.knowledge.widget; + +import android.content.Context; +import android.graphics.Color; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + +import com.easefun.polyvsdk.R; +import com.easefun.polyvsdk.util.PolyvTimeUtils; + +/** + * @author suhongtao + */ +public class PolyvPlayerKnowledgePointView extends FrameLayout { + + private View rootView; + private ImageView polyvPlayerKnowledgePointIv; + private TextView polyvPlayerKnowledgePointDescTv; + private TextView polyvPlayerKnowledgePointTimeTv; + + public PolyvPlayerKnowledgePointView(@NonNull Context context) { + super(context); + initView(); + } + + public PolyvPlayerKnowledgePointView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + initView(); + } + + public PolyvPlayerKnowledgePointView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(); + } + + private void initView() { + rootView = LayoutInflater.from(getContext()).inflate(R.layout.polyv_player_knowledge_point_item, this); + findView(); + } + + private void findView() { + polyvPlayerKnowledgePointIv = (ImageView) rootView.findViewById(R.id.polyv_player_knowledge_point_iv); + polyvPlayerKnowledgePointDescTv = (TextView) rootView.findViewById(R.id.polyv_player_knowledge_point_desc_tv); + polyvPlayerKnowledgePointTimeTv = (TextView) rootView.findViewById(R.id.polyv_player_knowledge_point_time_tv); + } + + @Override + public void setSelected(boolean selected) { + super.setSelected(selected); + if (selected) { + polyvPlayerKnowledgePointIv.setImageResource(R.drawable.polyv_player_knowledge_selected_icon); + polyvPlayerKnowledgePointDescTv.setTextColor(Color.parseColor("#3990FF")); + polyvPlayerKnowledgePointTimeTv.setTextColor(Color.parseColor("#3990FF")); + polyvPlayerKnowledgePointDescTv.setFocusable(true); + } else { + polyvPlayerKnowledgePointIv.setImageResource(R.drawable.polyv_player_knowledge_unselected_icon); + polyvPlayerKnowledgePointDescTv.setTextColor(Color.parseColor("#CCFFFFFF")); + polyvPlayerKnowledgePointTimeTv.setTextColor(Color.parseColor("#99FFFFFF")); + polyvPlayerKnowledgePointDescTv.setFocusable(false); + } + } + + public void setDescription(String name) { + polyvPlayerKnowledgePointDescTv.setText(name); + } + + public void setTime(int timeInSecond) { + final String timeText = PolyvTimeUtils.generateTime(timeInSecond * 1000L, true); + polyvPlayerKnowledgePointTimeTv.setText(timeText); + } + + public void showDescription(boolean show) { + polyvPlayerKnowledgePointDescTv.setVisibility(show ? VISIBLE : GONE); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/widget/PolyvPlayerKnowledgeWordKeyView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/widget/PolyvPlayerKnowledgeWordKeyView.java new file mode 100644 index 0000000..0a57237 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/widget/PolyvPlayerKnowledgeWordKeyView.java @@ -0,0 +1,79 @@ +package com.easefun.polyvsdk.player.knowledge.widget; + +import android.content.Context; +import android.graphics.Color; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.easefun.polyvsdk.R; + +/** + * @author suhongtao + */ +public class PolyvPlayerKnowledgeWordKeyView extends FrameLayout { + + private View rootView; + private LinearLayout polyvPlayerKnowledgeWordKeyLl; + private TextView polyvPlayerKnowledgeWordKeyTv; + private TextView polyvPlayerKnowledgePointCountTv; + private View polyvPlayerKnowledgeWordKeySeparatorView; + + public PolyvPlayerKnowledgeWordKeyView(@NonNull Context context) { + super(context); + initView(); + } + + public PolyvPlayerKnowledgeWordKeyView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + initView(); + } + + public PolyvPlayerKnowledgeWordKeyView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(); + } + + private void initView() { + rootView = LayoutInflater.from(getContext()).inflate(R.layout.polyv_player_knowledge_word_key_item, this); + findView(); + } + + private void findView() { + polyvPlayerKnowledgeWordKeyLl = (LinearLayout) rootView.findViewById(R.id.polyv_player_knowledge_word_key_ll); + polyvPlayerKnowledgeWordKeyTv = (TextView) rootView.findViewById(R.id.polyv_player_knowledge_word_key_tv); + polyvPlayerKnowledgePointCountTv = (TextView) rootView.findViewById(R.id.polyv_player_knowledge_point_count_tv); + polyvPlayerKnowledgeWordKeySeparatorView = (View) rootView.findViewById(R.id.polyv_player_knowledge_word_key_separator_view); + } + + public void setWordKey(String wordKey) { + polyvPlayerKnowledgeWordKeyTv.setText(wordKey); + } + + public void setKnowledgePointCount(int count) { + polyvPlayerKnowledgePointCountTv.setText("(" + count + ")"); + } + + @Override + public void setSelected(boolean selected) { + super.setSelected(selected); + if (selected) { + setBackgroundColor(Color.parseColor("#14FFFFFF")); + polyvPlayerKnowledgeWordKeySeparatorView.setVisibility(GONE); + polyvPlayerKnowledgeWordKeyTv.setAlpha(1F); + polyvPlayerKnowledgePointCountTv.setAlpha(1F); + polyvPlayerKnowledgeWordKeyTv.setFocusable(true); + } else { + setBackgroundColor(Color.TRANSPARENT); + polyvPlayerKnowledgeWordKeySeparatorView.setVisibility(VISIBLE); + polyvPlayerKnowledgeWordKeyTv.setAlpha(0.6F); + polyvPlayerKnowledgePointCountTv.setAlpha(0.6F); + polyvPlayerKnowledgeWordKeyTv.setFocusable(false); + } + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/widget/PolyvPlayerKnowledgeWordTypeView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/widget/PolyvPlayerKnowledgeWordTypeView.java new file mode 100644 index 0000000..c890127 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/player/knowledge/widget/PolyvPlayerKnowledgeWordTypeView.java @@ -0,0 +1,91 @@ +package com.easefun.polyvsdk.player.knowledge.widget; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import androidx.appcompat.widget.AppCompatTextView; +import android.util.AttributeSet; +import android.view.ViewGroup; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.easefun.polyvsdk.util.PolyvScreenUtils; + +/** + * @author suhongtao + */ +public class PolyvPlayerKnowledgeWordTypeView extends RelativeLayout { + + private TextView wordTypeTextView; + + private Paint selectedPaint; + + public PolyvPlayerKnowledgeWordTypeView(Context context) { + super(context); + initView(); + } + + public PolyvPlayerKnowledgeWordTypeView(Context context, AttributeSet attrs) { + super(context, attrs); + initView(); + } + + public PolyvPlayerKnowledgeWordTypeView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(); + } + + private void initView() { + setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)); + final int paddingHorizontal = PolyvScreenUtils.dip2px(getContext(), 20); + setPadding(paddingHorizontal, 0, paddingHorizontal, 0); + setWillNotDraw(false); + + addView(wordTypeTextView = new AppCompatTextView(getContext()) {{ + setTextColor(Color.WHITE); + setTextSize(16F); + }}, new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT) {{ + addRule(RelativeLayout.CENTER_IN_PARENT, 1); + }}); + + initSelectedPaint(); + } + + private void initSelectedPaint() { + selectedPaint = new Paint() {{ + setColor(Color.parseColor("#3990FF")); + setStyle(Style.FILL); + setAntiAlias(true); + }}; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (isSelected()) { + canvas.drawRect( + wordTypeTextView.getLeft(), + getBottom() - PolyvScreenUtils.dip2px(getContext(), 2), + wordTypeTextView.getRight(), + getBottom(), + selectedPaint); + } + } + + @Override + public void setSelected(boolean selected) { + super.setSelected(selected); + if (selected) { + wordTypeTextView.setAlpha(1F); + } else { + wordTypeTextView.setAlpha(0.6F); + } + } + + public void setWordTypeName(String wordTypeName) { + wordTypeTextView.setText(wordTypeName); + } + +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvPPTDirLayout.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvPPTDirLayout.java index b6f5c9a..80f19c0 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvPPTDirLayout.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvPPTDirLayout.java @@ -3,10 +3,10 @@ import android.content.Context; import android.content.res.Configuration; import android.graphics.Color; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -52,8 +52,8 @@ public PolyvPPTDirLayout(@NonNull Context context, @Nullable AttributeSet attrs, private void initView() { if (isLandLayout()) { - findViewById(R.id.title).setVisibility(View.INVISIBLE); - findViewById(R.id.line).setVisibility(View.INVISIBLE); + findViewById(R.id.title).setVisibility(View.GONE); + findViewById(R.id.line).setVisibility(View.GONE); FrameLayout frameLayout = new FrameLayout(getContext()); frameLayout.setBackgroundColor(Color.BLACK); frameLayout.setAlpha(0.7f); @@ -75,12 +75,16 @@ public void onItemClick(int position, PolyvPPTDirListAdapter.PPTViewHolder holde int seekPosition = Math.min(currentVideoView.getDuration(), Math.max(0, pptPageInfo.getSec()) * 1000); int dragSeekStrategy = PolyvSPUtils.getInstance(getContext(), "dragSeekStrategy").getInt("dragSeekStrategy"); boolean canDragSeek; - if (dragSeekStrategy == PolyvPlayerMediaController.DRAG_SEEK_BAN) { - canDragSeek = false; - } else if (dragSeekStrategy == PolyvPlayerMediaController.DRAG_SEEK_PLAYED) { - canDragSeek = seekPosition <= PolyvSPUtils.getInstance(getContext(), "videoProgress").getInt(currentVideoView.getCurrentVid()); + if (currentVideoView != null && currentVideoView.getMediaController() != null) { + canDragSeek = currentVideoView.getMediaController().canDragSeek(seekPosition); } else { - canDragSeek = true; + if (dragSeekStrategy == PolyvPlayerMediaController.DRAG_SEEK_BAN) { + canDragSeek = false; + } else if (dragSeekStrategy == PolyvPlayerMediaController.DRAG_SEEK_PLAYED) { + canDragSeek = seekPosition <= PolyvSPUtils.getInstance(getContext(), "videoProgress").getInt(currentVideoView.getCurrentVid()); + } else { + canDragSeek = true; + } } if (canDragSeek) { currentVideoView.seekTo(seekPosition); @@ -88,7 +92,7 @@ public void onItemClick(int position, PolyvPPTDirListAdapter.PPTViewHolder holde currentVideoView.start(); } if (isLandLayout()) { - setVisibility(View.INVISIBLE); + setVisibility(View.GONE); } } } @@ -129,19 +133,19 @@ public void acceptPPTCallback(PolyvVideoView videoView, String vid, boolean hasP pptIsError = true; if (!isLandLayout()) { pptErrorLayout.setVisibility(View.VISIBLE); - pptDirList.setVisibility(View.INVISIBLE); + pptDirList.setVisibility(View.GONE); } pptDirListAdapter.clear(); pptDirListAdapter.notifyDataSetChanged(); } else { pptIsError = false; - pptErrorLayout.setVisibility(View.INVISIBLE); + pptErrorLayout.setVisibility(View.GONE); pptDirList.setVisibility(View.VISIBLE); pptDirListAdapter.set(pptvo.getPages()); pptDirListAdapter.notifyDataSetChanged(); } } else { - setVisibility(View.INVISIBLE); + setVisibility(View.GONE); pptDirListAdapter.clear(); pptDirListAdapter.notifyDataSetChanged(); } @@ -156,7 +160,7 @@ private boolean isLandLayout() { protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT && isLandLayout()) { - setVisibility(View.INVISIBLE); + setVisibility(View.GONE); } } } diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvPPTErrorLayout.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvPPTErrorLayout.java index c340742..e8c65fa 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvPPTErrorLayout.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvPPTErrorLayout.java @@ -3,8 +3,8 @@ import android.content.Context; import android.content.res.Configuration; import android.graphics.Color; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -51,7 +51,7 @@ private void initView() { @Override public void onClick(View v) { if (isLandLayout()) { - setVisibility(View.INVISIBLE); + setVisibility(View.GONE); } if (currentVideoView == null) { Toast.makeText(getContext(), "videoView is empty, don't regain ppt.", Toast.LENGTH_SHORT).show(); @@ -95,7 +95,7 @@ public void onFail(String vid, String tips, int errorReason) { @Override public void onClick(View v) { if (isLandLayout()) { - setVisibility(View.INVISIBLE); + setVisibility(View.GONE); } } }); @@ -118,7 +118,7 @@ private boolean isLandLayout() { public void acceptPPTCallback(PolyvVideoView videoView, String vid, boolean hasPPT, PolyvPptInfo pptvo) { if (PolyvScreenUtils.isLandscape(getContext()) && isLandLayout()) { if (hasPPT) { - setVisibility(pptvo == null ? View.VISIBLE : View.INVISIBLE); + setVisibility(pptvo == null ? View.VISIBLE : View.GONE); } } this.currentVideoView = videoView; @@ -134,7 +134,7 @@ protected void onDetachedFromWindow() { protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT && isLandLayout()) { - setVisibility(View.INVISIBLE); + setVisibility(View.GONE); } } } diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvPPTView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvPPTView.java index a6f1682..08f567a 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvPPTView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvPPTView.java @@ -102,7 +102,7 @@ public void acceptProgress(int loadPPTProgress) { loadView.setmCurrent(loadPPTProgress); } if (textView != null) { - textView.setVisibility(View.INVISIBLE); + textView.setVisibility(View.GONE); } } @@ -110,13 +110,13 @@ public void acceptPPTCallback(final PolyvVideoView videoView, String vid, boolea handler.removeMessages(1); if (currentVid != null && !currentVid.equals(vid) || (hasPPT && pptvo == null)) { imageView.setImageDrawable(null); - loadView.setVisibility(View.INVISIBLE); + loadView.setVisibility(View.GONE); textView.setVisibility(View.VISIBLE); } currentVid = vid; if (videoView != null && hasPPT && pptvo != null) { - textView.setVisibility(View.INVISIBLE); - loadView.setVisibility(View.INVISIBLE); + textView.setVisibility(View.GONE); + loadView.setVisibility(View.GONE); currentVideoView = videoView; currentPPTVO = pptvo; diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvViceScreenLayout.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvViceScreenLayout.java index 603991b..b9b8be9 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvViceScreenLayout.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/ppt/PolyvViceScreenLayout.java @@ -4,8 +4,8 @@ import android.content.Context; import android.content.res.Configuration; import android.graphics.Color; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; @@ -162,7 +162,7 @@ public void switchLocation(boolean isPPTInMinScreen) { * 隐藏副屏 */ public void hide() { - setVisibility(View.INVISIBLE); + setVisibility(View.GONE); } /** diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/server/PolyvVodBusinessServer.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/server/PolyvVodBusinessServer.java index 6bb07a8..0bb9f02 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/server/PolyvVodBusinessServer.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/server/PolyvVodBusinessServer.java @@ -1,8 +1,8 @@ package com.easefun.polyvsdk.server; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.Log; import com.easefun.polyvsdk.server.request.PolyvGetByUploader; diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/server/request/PolyvGetByUploader.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/server/request/PolyvGetByUploader.java index b5b155b..64143e6 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/server/request/PolyvGetByUploader.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/server/request/PolyvGetByUploader.java @@ -1,8 +1,8 @@ package com.easefun.polyvsdk.server.request; -import android.support.annotation.IntDef; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.IntDef; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.text.TextUtils; import android.util.Log; @@ -45,7 +45,7 @@ public class PolyvGetByUploader { * 获取某分类下某子账号的视频列表,详细请看 * http://dev.polyv.net/2018/videoproduct/v-api/v-api-vmanage/v-api-vmanage-list/get-by-uploader/ */ - private static final String GET_BY_UPLOADER_URL = "http://api.polyv.net/v2/video/%s/get-by-uploader"; + private static final String GET_BY_UPLOADER_URL = "https://api.polyv.net/v2/video/%s/get-by-uploader"; /** * 获取某分类下某子账号的视频列表,接口文档 diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/server/request/PolyvPlayTimes.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/server/request/PolyvPlayTimes.java index 7995d8d..2b4a112 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/server/request/PolyvPlayTimes.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/server/request/PolyvPlayTimes.java @@ -1,6 +1,6 @@ package com.easefun.polyvsdk.server.request; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.text.TextUtils; import android.util.Log; @@ -26,7 +26,7 @@ public class PolyvPlayTimes { * 批量获取视频播放次数,详细请看 * http://dev.polyv.net/2017/videoproduct/v-api/v-api-vmanage/v-api-vmanage-info/getplaytimes/ */ - private static final String PLAY_TIMES_URL = "http://api.polyv.net/v2/data/%s/play-times"; + private static final String PLAY_TIMES_URL = "https://api.polyv.net/v2/data/%s/play-times"; public static PolyvPlayTimesResult requestPlayTimes(@NonNull String userId, @NonNull String secretKey, @NonNull ArrayList vids, @NonNull ArrayList exceptionList) { String vidsStr = TextUtils.join(",", vids); diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/service/PolyvBackgroundPlayService.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/service/PolyvBackgroundPlayService.java index 4c26911..7c0943d 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/service/PolyvBackgroundPlayService.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/service/PolyvBackgroundPlayService.java @@ -11,10 +11,9 @@ import android.os.Binder; import android.os.Build; import android.os.IBinder; -import android.support.annotation.Nullable; -import android.support.v4.app.NotificationCompat; +import androidx.annotation.Nullable; +import androidx.core.app.NotificationCompat; -import com.easefun.polyvsdk.R; import com.easefun.polyvsdk.activity.PolyvPlayerActivity; /** diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/service/PolyvPlayService.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/service/PolyvPlayService.java deleted file mode 100644 index e1d6b18..0000000 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/service/PolyvPlayService.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.easefun.polyvsdk.service; - -import android.content.Intent; -import android.util.Log; - -import com.easefun.polyvsdk.server.AndroidService; - -/** - * 播放视频已改版,不再需要service来播放视频 - */ -@Deprecated -public class PolyvPlayService extends AndroidService { - - private static final String TAG = PolyvPlayService.class.getSimpleName(); - - // 无参数构造函数,调用父类的super(String name) - public PolyvPlayService() { - super(); - // TODO Auto-generated constructor stub - } - - @Override - public void onStart(Intent intent, int startId) { - // TODO Auto-generated method stub - super.onStart(intent, startId); - // Log.i("TAG","service started"); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - // TODO Auto-generated method stub - // Log.i("TAG","service onStartCommand"); - return super.onStartCommand(intent, flags, startId); - } - - @Override - public void onCreate() { - // TODO Auto-generated method stub - super.onCreate(); - - } - - @Override - protected void onHandleIntent(Intent intent) { - super.onHandleIntent(intent); - } - - @Override - public void onDestroy() { - // TODO Auto-generated method stub - super.onDestroy(); - Log.i(TAG, "server destory"); - } -} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PLVCloseUtils.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PLVCloseUtils.java new file mode 100644 index 0000000..84bced6 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PLVCloseUtils.java @@ -0,0 +1,54 @@ +package com.easefun.polyvsdk.util; + +import java.io.Closeable; +import java.io.IOException; + +/** + *

+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2016/10/09
+ *     desc  : 关闭相关工具类
+ * 
+ */ +public final class PLVCloseUtils { + + private PLVCloseUtils() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + /** + * 关闭 IO + * + * @param closeables closeables + */ + public static void closeIO(final Closeable... closeables) { + if (closeables == null) return; + for (Closeable closeable : closeables) { + if (closeable != null) { + try { + closeable.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + /** + * 安静关闭 IO + * + * @param closeables closeables + */ + public static void closeIOQuietly(final Closeable... closeables) { + if (closeables == null) return; + for (Closeable closeable : closeables) { + if (closeable != null) { + try { + closeable.close(); + } catch (IOException ignored) { + } + } + } + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PLVFileIOUtils.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PLVFileIOUtils.java new file mode 100644 index 0000000..ca870b3 --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PLVFileIOUtils.java @@ -0,0 +1,676 @@ +package com.easefun.polyvsdk.util; + +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.util.ArrayList; +import java.util.List; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2017/06/22
+ *     desc  : 文件读写相关工具类
+ * 
+ */ +public final class PLVFileIOUtils { + + private PLVFileIOUtils() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + private static final String LINE_SEP = System.getProperty("line.separator"); + + private static int sBufferSize = 8192; + + /** + * 将输入流写入文件 + * + * @param filePath 路径 + * @param is 输入流 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromIS(final String filePath, final InputStream is) { + return writeFileFromIS(getFileByPath(filePath), is, false); + } + + /** + * 将输入流写入文件 + * + * @param filePath 路径 + * @param is 输入流 + * @param append 是否追加在文件末 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromIS(final String filePath, final InputStream is, final boolean append) { + return writeFileFromIS(getFileByPath(filePath), is, append); + } + + /** + * 将输入流写入文件 + * + * @param file 文件 + * @param is 输入流 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromIS(final File file, final InputStream is) { + return writeFileFromIS(file, is, false); + } + + /** + * 将输入流写入文件 + * + * @param file 文件 + * @param is 输入流 + * @param append 是否追加在文件末 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromIS(final File file, final InputStream is, final boolean append) { + if (!createOrExistsFile(file) || is == null) return false; + OutputStream os = null; + try { + os = new BufferedOutputStream(new FileOutputStream(file, append)); + byte data[] = new byte[sBufferSize]; + int len; + while ((len = is.read(data, 0, sBufferSize)) != -1) { + os.write(data, 0, len); + } + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } finally { + PLVCloseUtils.closeIO(is, os); + } + } + + /** + * 将字节数组写入文件 + * + * @param filePath 文件路径 + * @param bytes 字节数组 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromBytesByStream(final String filePath, final byte[] bytes) { + return writeFileFromBytesByStream(getFileByPath(filePath), bytes, false); + } + + /** + * 将字节数组写入文件 + * + * @param filePath 文件路径 + * @param bytes 字节数组 + * @param append 是否追加在文件末 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromBytesByStream(final String filePath, final byte[] bytes, final boolean append) { + return writeFileFromBytesByStream(getFileByPath(filePath), bytes, append); + } + + /** + * 将字节数组写入文件 + * + * @param file 文件 + * @param bytes 字节数组 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromBytesByStream(final File file, final byte[] bytes) { + return writeFileFromBytesByStream(file, bytes, false); + } + + /** + * 将字节数组写入文件 + * + * @param file 文件 + * @param bytes 字节数组 + * @param append 是否追加在文件末 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromBytesByStream(final File file, final byte[] bytes, final boolean append) { + if (bytes == null || !createOrExistsFile(file)) return false; + BufferedOutputStream bos = null; + try { + bos = new BufferedOutputStream(new FileOutputStream(file, append)); + bos.write(bytes); + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } finally { + PLVCloseUtils.closeIO(bos); + } + } + + /** + * 将字节数组写入文件 + * + * @param filePath 文件路径 + * @param bytes 字节数组 + * @param isForce 是否写入文件 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromBytesByChannel(final String filePath, final byte[] bytes, final boolean isForce) { + return writeFileFromBytesByChannel(getFileByPath(filePath), bytes, false, isForce); + } + + /** + * 将字节数组写入文件 + * + * @param filePath 文件路径 + * @param bytes 字节数组 + * @param append 是否追加在文件末 + * @param isForce 是否写入文件 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromBytesByChannel(final String filePath, final byte[] bytes, final boolean append, final boolean isForce) { + return writeFileFromBytesByChannel(getFileByPath(filePath), bytes, append, isForce); + } + + /** + * 将字节数组写入文件 + * + * @param file 文件 + * @param bytes 字节数组 + * @param isForce 是否写入文件 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromBytesByChannel(final File file, final byte[] bytes, final boolean isForce) { + return writeFileFromBytesByChannel(file, bytes, false, isForce); + } + + /** + * 将字节数组写入文件 + * + * @param file 文件 + * @param bytes 字节数组 + * @param append 是否追加在文件末 + * @param isForce 是否写入文件 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromBytesByChannel(final File file, final byte[] bytes, final boolean append, final boolean isForce) { + if (bytes == null) return false; + FileChannel fc = null; + try { + fc = new FileOutputStream(file, append).getChannel(); + fc.position(fc.size()); + fc.write(ByteBuffer.wrap(bytes)); + if (isForce) fc.force(true); + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } finally { + PLVCloseUtils.closeIO(fc); + } + } + + /** + * 将字节数组写入文件 + * + * @param filePath 文件路径 + * @param bytes 字节数组 + * @param isForce 是否写入文件 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromBytesByMap(final String filePath, final byte[] bytes, final boolean isForce) { + return writeFileFromBytesByMap(filePath, bytes, false, isForce); + } + + /** + * 将字节数组写入文件 + * + * @param filePath 文件路径 + * @param bytes 字节数组 + * @param append 是否追加在文件末 + * @param isForce 是否写入文件 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromBytesByMap(final String filePath, final byte[] bytes, final boolean append, final boolean isForce) { + return writeFileFromBytesByMap(getFileByPath(filePath), bytes, append, isForce); + } + + /** + * 将字节数组写入文件 + * + * @param file 文件 + * @param bytes 字节数组 + * @param isForce 是否写入文件 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromBytesByMap(final File file, final byte[] bytes, final boolean isForce) { + return writeFileFromBytesByMap(file, bytes, false, isForce); + } + + /** + * 将字节数组写入文件 + * + * @param file 文件 + * @param bytes 字节数组 + * @param append 是否追加在文件末 + * @param isForce 是否写入文件 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromBytesByMap(final File file, final byte[] bytes, final boolean append, final boolean isForce) { + if (bytes == null || !createOrExistsFile(file)) return false; + FileChannel fc = null; + try { + fc = new FileOutputStream(file, append).getChannel(); + MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_WRITE, fc.size(), bytes.length); + mbb.put(bytes); + if (isForce) mbb.force(); + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } finally { + PLVCloseUtils.closeIO(fc); + } + } + + /** + * 将字符串写入文件 + * + * @param filePath 文件路径 + * @param content 写入内容 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromString(final String filePath, final String content) { + return writeFileFromString(getFileByPath(filePath), content, false); + } + + /** + * 将字符串写入文件 + * + * @param filePath 文件路径 + * @param content 写入内容 + * @param append 是否追加在文件末 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromString(final String filePath, final String content, final boolean append) { + return writeFileFromString(getFileByPath(filePath), content, append); + } + + /** + * 将字符串写入文件 + * + * @param file 文件 + * @param content 写入内容 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromString(final File file, final String content) { + return writeFileFromString(file, content, false); + } + + /** + * 将字符串写入文件 + * + * @param file 文件 + * @param content 写入内容 + * @param append 是否追加在文件末 + * @return {@code true}: 写入成功
{@code false}: 写入失败 + */ + public static boolean writeFileFromString(final File file, final String content, final boolean append) { + if (file == null || content == null) return false; + if (!createOrExistsFile(file)) return false; + BufferedWriter bw = null; + try { + bw = new BufferedWriter(new FileWriter(file, append)); + bw.write(content); + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } finally { + PLVCloseUtils.closeIO(bw); + } + } + + /////////////////////////////////////////////////////////////////////////// + // the divide line of write and read + /////////////////////////////////////////////////////////////////////////// + + /** + * 读取文件到字符串链表中 + * + * @param filePath 文件路径 + * @return 字符串链表中 + */ + public static List readFile2List(final String filePath) { + return readFile2List(getFileByPath(filePath), null); + } + + /** + * 读取文件到字符串链表中 + * + * @param filePath 文件路径 + * @param charsetName 编码格式 + * @return 字符串链表中 + */ + public static List readFile2List(final String filePath, final String charsetName) { + return readFile2List(getFileByPath(filePath), charsetName); + } + + /** + * 读取文件到字符串链表中 + * + * @param file 文件 + * @return 字符串链表中 + */ + public static List readFile2List(final File file) { + return readFile2List(file, 0, 0x7FFFFFFF, null); + } + + /** + * 读取文件到字符串链表中 + * + * @param file 文件 + * @param charsetName 编码格式 + * @return 字符串链表中 + */ + public static List readFile2List(final File file, final String charsetName) { + return readFile2List(file, 0, 0x7FFFFFFF, charsetName); + } + + /** + * 读取文件到字符串链表中 + * + * @param filePath 文件路径 + * @param st 需要读取的开始行数 + * @param end 需要读取的结束行数 + * @return 字符串链表中 + */ + public static List readFile2List(final String filePath, final int st, final int end) { + return readFile2List(getFileByPath(filePath), st, end, null); + } + + /** + * 读取文件到字符串链表中 + * + * @param filePath 文件路径 + * @param st 需要读取的开始行数 + * @param end 需要读取的结束行数 + * @param charsetName 编码格式 + * @return 字符串链表中 + */ + public static List readFile2List(final String filePath, final int st, final int end, final String charsetName) { + return readFile2List(getFileByPath(filePath), st, end, charsetName); + } + + /** + * 读取文件到字符串链表中 + * + * @param file 文件 + * @param st 需要读取的开始行数 + * @param end 需要读取的结束行数 + * @return 字符串链表中 + */ + public static List readFile2List(final File file, final int st, final int end) { + return readFile2List(file, st, end, null); + } + + /** + * 读取文件到字符串链表中 + * + * @param file 文件 + * @param st 需要读取的开始行数 + * @param end 需要读取的结束行数 + * @param charsetName 编码格式 + * @return 字符串链表中 + */ + public static List readFile2List(final File file, final int st, final int end, final String charsetName) { + if (!isFileExists(file)) return null; + if (st > end) return null; + BufferedReader reader = null; + try { + String line; + int curLine = 1; + List list = new ArrayList<>(); + if (isSpace(charsetName)) { + reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); + } else { + reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charsetName)); + } + while ((line = reader.readLine()) != null) { + if (curLine > end) break; + if (st <= curLine && curLine <= end) list.add(line); + ++curLine; + } + return list; + } catch (IOException e) { + e.printStackTrace(); + return null; + } finally { + PLVCloseUtils.closeIO(reader); + } + } + + /** + * 读取文件到字符串中 + * + * @param filePath 文件路径 + * @return 字符串 + */ + public static String readFile2String(final String filePath) { + return readFile2String(getFileByPath(filePath), null); + } + + /** + * 读取文件到字符串中 + * + * @param filePath 文件路径 + * @param charsetName 编码格式 + * @return 字符串 + */ + public static String readFile2String(final String filePath, final String charsetName) { + return readFile2String(getFileByPath(filePath), charsetName); + } + + /** + * 读取文件到字符串中 + * + * @param file 文件 + * @return 字符串 + */ + public static String readFile2String(final File file) { + return readFile2String(file, null); + } + + /** + * 读取文件到字符串中 + * + * @param file 文件 + * @param charsetName 编码格式 + * @return 字符串 + */ + public static String readFile2String(final File file, final String charsetName) { + if (!isFileExists(file)) return null; + BufferedReader reader = null; + try { + StringBuilder sb = new StringBuilder(); + if (isSpace(charsetName)) { + reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); + } else { + reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charsetName)); + } + String line; + if ((line = reader.readLine()) != null) { + sb.append(line); + while ((line = reader.readLine()) != null) { + sb.append(LINE_SEP).append(line); + } + } + return sb.toString(); + } catch (IOException e) { + e.printStackTrace(); + return null; + } finally { + PLVCloseUtils.closeIO(reader); + } + } + + /** + * 读取文件到字节数组中 + * + * @param filePath 文件路径 + * @return 字符数组 + */ + public static byte[] readFile2BytesByStream(final String filePath) { + return readFile2BytesByStream(getFileByPath(filePath)); + } + + /** + * 读取文件到字节数组中 + * + * @param file 文件 + * @return 字符数组 + */ + public static byte[] readFile2BytesByStream(final File file) { + if (!isFileExists(file)) return null; + FileInputStream fis = null; + ByteArrayOutputStream os = null; + try { + fis = new FileInputStream(file); + os = new ByteArrayOutputStream(); + byte[] b = new byte[sBufferSize]; + int len; + while ((len = fis.read(b, 0, sBufferSize)) != -1) { + os.write(b, 0, len); + } + return os.toByteArray(); + } catch (IOException e) { + e.printStackTrace(); + return null; + } finally { + PLVCloseUtils.closeIO(fis, os); + } + } + + /** + * 读取文件到字节数组中 + * + * @param filePath 文件路径 + * @return 字符数组 + */ + public static byte[] readFile2BytesByChannel(final String filePath) { + return readFile2BytesByChannel(getFileByPath(filePath)); + } + + /** + * 读取文件到字节数组中 + * + * @param file 文件 + * @return 字符数组 + */ + public static byte[] readFile2BytesByChannel(final File file) { + if (!isFileExists(file)) return null; + FileChannel fc = null; + try { + fc = new RandomAccessFile(file, "r").getChannel(); + ByteBuffer byteBuffer = ByteBuffer.allocate((int) fc.size()); + while (true) { + if (!((fc.read(byteBuffer)) > 0)) break; + } + return byteBuffer.array(); + } catch (IOException e) { + e.printStackTrace(); + return null; + } finally { + PLVCloseUtils.closeIO(fc); + } + } + + /** + * 读取文件到字节数组中 + * + * @param filePath 文件路径 + * @return 字符数组 + */ + public static byte[] readFile2BytesByMap(final String filePath) { + return readFile2BytesByMap(getFileByPath(filePath)); + } + + /** + * 读取文件到字节数组中 + * + * @param file 文件 + * @return 字符数组 + */ + public static byte[] readFile2BytesByMap(final File file) { + if (!isFileExists(file)) return null; + FileChannel fc = null; + try { + fc = new RandomAccessFile(file, "r").getChannel(); + int size = (int) fc.size(); + MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, size).load(); + byte[] result = new byte[size]; + mbb.get(result, 0, size); + return result; + } catch (IOException e) { + e.printStackTrace(); + return null; + } finally { + PLVCloseUtils.closeIO(fc); + } + } + + /** + * 设置缓冲区尺寸 + * + * @param bufferSize 缓冲区大小 + */ + public static void setBufferSize(final int bufferSize) { + sBufferSize = bufferSize; + } + + private static File getFileByPath(final String filePath) { + return isSpace(filePath) ? null : new File(filePath); + } + + private static boolean createOrExistsFile(final String filePath) { + return createOrExistsFile(getFileByPath(filePath)); + } + + private static boolean createOrExistsFile(final File file) { + if (file == null) return false; + if (file.exists()) return file.isFile(); + if (!createOrExistsDir(file.getParentFile())) return false; + try { + return file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + + private static boolean createOrExistsDir(final File file) { + return file != null && (file.exists() ? file.isDirectory() : file.mkdirs()); + } + + private static boolean isFileExists(final File file) { + return file != null && file.exists(); + } + + private static boolean isSpace(final String s) { + if (s == null) return true; + for (int i = 0, len = s.length(); i < len; ++i) { + if (!Character.isWhitespace(s.charAt(i))) { + return false; + } + } + return true; + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PLVFileUtils.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PLVFileUtils.java new file mode 100644 index 0000000..7b5cbaa --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PLVFileUtils.java @@ -0,0 +1,1103 @@ +package com.easefun.polyvsdk.util; + +import android.annotation.SuppressLint; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.security.DigestInputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.List; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2016/05/03
+ *     desc  : 文件相关工具类
+ * 
+ */ +public final class PLVFileUtils { + + private PLVFileUtils() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + private static final String LINE_SEP = System.getProperty("line.separator"); + + /** + * 根据文件路径获取文件 + * + * @param filePath 文件路径 + * @return 文件 + */ + public static File getFileByPath(final String filePath) { + return isSpace(filePath) ? null : new File(filePath); + } + + /** + * 判断文件是否存在 + * + * @param filePath 文件路径 + * @return {@code true}: 存在
{@code false}: 不存在 + */ + public static boolean isFileExists(final String filePath) { + return isFileExists(getFileByPath(filePath)); + } + + /** + * 判断文件是否存在 + * + * @param file 文件 + * @return {@code true}: 存在
{@code false}: 不存在 + */ + public static boolean isFileExists(final File file) { + return file != null && file.exists(); + } + + /** + * 重命名文件 + * + * @param filePath 文件路径 + * @param newName 新名称 + * @return {@code true}: 重命名成功
{@code false}: 重命名失败 + */ + public static boolean rename(final String filePath, final String newName) { + return rename(getFileByPath(filePath), newName); + } + + /** + * 重命名文件 + * + * @param file 文件 + * @param newName 新名称 + * @return {@code true}: 重命名成功
{@code false}: 重命名失败 + */ + public static boolean rename(final File file, final String newName) { + // 文件为空返回 false + if (file == null) return false; + // 文件不存在返回 false + if (!file.exists()) return false; + // 新的文件名为空返回 false + if (isSpace(newName)) return false; + // 如果文件名没有改变返回 true + if (newName.equals(file.getName())) return true; + File newFile = new File(file.getParent() + File.separator + newName); + // 如果重命名的文件已存在返回 false + return !newFile.exists() + && file.renameTo(newFile); + } + + /** + * 判断是否是目录 + * + * @param dirPath 目录路径 + * @return {@code true}: 是
{@code false}: 否 + */ + public static boolean isDir(final String dirPath) { + return isDir(getFileByPath(dirPath)); + } + + /** + * 判断是否是目录 + * + * @param file 文件 + * @return {@code true}: 是
{@code false}: 否 + */ + public static boolean isDir(final File file) { + return file != null && file.exists() && file.isDirectory(); + } + + /** + * 判断是否是文件 + * + * @param filePath 文件路径 + * @return {@code true}: 是
{@code false}: 否 + */ + public static boolean isFile(final String filePath) { + return isFile(getFileByPath(filePath)); + } + + /** + * 判断是否是文件 + * + * @param file 文件 + * @return {@code true}: 是
{@code false}: 否 + */ + public static boolean isFile(final File file) { + return file != null && file.exists() && file.isFile(); + } + + /** + * 判断目录是否存在,不存在则判断是否创建成功 + * + * @param dirPath 目录路径 + * @return {@code true}: 存在或创建成功
{@code false}: 不存在或创建失败 + */ + public static boolean createOrExistsDir(final String dirPath) { + return createOrExistsDir(getFileByPath(dirPath)); + } + + /** + * 判断目录是否存在,不存在则判断是否创建成功 + * + * @param file 文件 + * @return {@code true}: 存在或创建成功
{@code false}: 不存在或创建失败 + */ + public static boolean createOrExistsDir(final File file) { + // 如果存在,是目录则返回 true,是文件则返回 false,不存在则返回是否创建成功 + return file != null && (file.exists() ? file.isDirectory() : file.mkdirs()); + } + + /** + * 判断文件是否存在,不存在则判断是否创建成功 + * + * @param filePath 文件路径 + * @return {@code true}: 存在或创建成功
{@code false}: 不存在或创建失败 + */ + public static boolean createOrExistsFile(final String filePath) { + return createOrExistsFile(getFileByPath(filePath)); + } + + /** + * 判断文件是否存在,不存在则判断是否创建成功 + * + * @param file 文件 + * @return {@code true}: 存在或创建成功
{@code false}: 不存在或创建失败 + */ + public static boolean createOrExistsFile(final File file) { + if (file == null) return false; + // 如果存在,是文件则返回 true,是目录则返回 false + if (file.exists()) return file.isFile(); + if (!createOrExistsDir(file.getParentFile())) return false; + try { + return file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + + /** + * 判断文件是否存在,存在则在创建之前删除 + * + * @param filePath 文件路径 + * @return {@code true}: 创建成功
{@code false}: 创建失败 + */ + public static boolean createFileByDeleteOldFile(final String filePath) { + return createFileByDeleteOldFile(getFileByPath(filePath)); + } + + /** + * 判断文件是否存在,存在则在创建之前删除 + * + * @param file 文件 + * @return {@code true}: 创建成功
{@code false}: 创建失败 + */ + public static boolean createFileByDeleteOldFile(final File file) { + if (file == null) return false; + // 文件存在并且删除失败返回 false + if (file.exists() && !file.delete()) return false; + // 创建目录失败返回 false + if (!createOrExistsDir(file.getParentFile())) return false; + try { + return file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + + /** + * 复制或移动目录 + * + * @param srcDirPath 源目录路径 + * @param destDirPath 目标目录路径 + * @param listener 是否覆盖监听器 + * @param isMove 是否移动 + * @return {@code true}: 复制或移动成功
{@code false}: 复制或移动失败 + */ + private static boolean copyOrMoveDir(final String srcDirPath, final String destDirPath, final OnReplaceListener listener, final boolean isMove) { + return copyOrMoveDir(getFileByPath(srcDirPath), getFileByPath(destDirPath), listener, isMove); + } + + /** + * 复制或移动目录 + * + * @param srcDir 源目录 + * @param destDir 目标目录 + * @param listener 是否覆盖监听器 + * @param isMove 是否移动 + * @return {@code true}: 复制或移动成功
{@code false}: 复制或移动失败 + */ + private static boolean copyOrMoveDir(final File srcDir, final File destDir, final OnReplaceListener listener, final boolean isMove) { + if (srcDir == null || destDir == null) return false; + // 如果目标目录在源目录中则返回 false,看不懂的话好好想想递归怎么结束 + // srcPath : F:\\MyGithub\\AndroidUtilCode\\utilcode\\src\\test\\res + // destPath: F:\\MyGithub\\AndroidUtilCode\\utilcode\\src\\test\\res1 + // 为防止以上这种情况出现出现误判,须分别在后面加个路径分隔符 + String srcPath = srcDir.getPath() + File.separator; + String destPath = destDir.getPath() + File.separator; + if (destPath.contains(srcPath)) return false; + // 源文件不存在或者不是目录则返回 false + if (!srcDir.exists() || !srcDir.isDirectory()) return false; + if (destDir.exists()) { + if (listener.onReplace()) {// 需要覆盖则删除旧目录 + if (!deleteAllInDir(destDir)) {// 删除文件失败的话返回 false + return false; + } + } else {// 不需要覆盖直接返回即可 true + return true; + } + } + // 目标目录不存在返回 false + if (!createOrExistsDir(destDir)) return false; + File[] files = srcDir.listFiles(); + for (File file : files) { + File oneDestFile = new File(destPath + file.getName()); + if (file.isFile()) { + // 如果操作失败返回 false + if (!copyOrMoveFile(file, oneDestFile, listener, isMove)) return false; + } else if (file.isDirectory()) { + // 如果操作失败返回 false + if (!copyOrMoveDir(file, oneDestFile, listener, isMove)) return false; + } + } + return !isMove || deleteDir(srcDir); + } + + /** + * 复制或移动文件 + * + * @param srcFilePath 源文件路径 + * @param destFilePath 目标文件路径 + * @param listener 是否覆盖监听器 + * @param isMove 是否移动 + * @return {@code true}: 复制或移动成功
{@code false}: 复制或移动失败 + */ + private static boolean copyOrMoveFile(final String srcFilePath, final String destFilePath, final OnReplaceListener listener, final boolean isMove) { + return copyOrMoveFile(getFileByPath(srcFilePath), getFileByPath(destFilePath), listener, isMove); + } + + /** + * 复制或移动文件 + * + * @param srcFile 源文件 + * @param destFile 目标文件 + * @param listener 是否覆盖监听器 + * @param isMove 是否移动 + * @return {@code true}: 复制或移动成功
{@code false}: 复制或移动失败 + */ + private static boolean copyOrMoveFile(final File srcFile, final File destFile, final OnReplaceListener listener, final boolean isMove) { + if (srcFile == null || destFile == null) return false; + // 如果源文件和目标文件相同则返回 false + if (srcFile.equals(destFile)) return false; + // 源文件不存在或者不是文件则返回 false + if (!srcFile.exists() || !srcFile.isFile()) return false; + if (destFile.exists()) {// 目标文件存在 + if (listener.onReplace()) {// 需要覆盖则删除旧文件 + if (!destFile.delete()) {// 删除文件失败的话返回 false + return false; + } + } else {// 不需要覆盖直接返回即可 true + return true; + } + } + // 目标目录不存在返回 false + if (!createOrExistsDir(destFile.getParentFile())) return false; + try { + return PLVFileIOUtils.writeFileFromIS(destFile, new FileInputStream(srcFile), false) + && !(isMove && !deleteFile(srcFile)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return false; + } + } + + /** + * 复制目录 + * + * @param srcDirPath 源目录路径 + * @param destDirPath 目标目录路径 + * @param listener 是否覆盖监听器 + * @return {@code true}: 复制成功
{@code false}: 复制失败 + */ + public static boolean copyDir(final String srcDirPath, final String destDirPath, final OnReplaceListener listener) { + return copyDir(getFileByPath(srcDirPath), getFileByPath(destDirPath), listener); + } + + /** + * 复制目录 + * + * @param srcDir 源目录 + * @param destDir 目标目录 + * @param listener 是否覆盖监听器 + * @return {@code true}: 复制成功
{@code false}: 复制失败 + */ + public static boolean copyDir(final File srcDir, final File destDir, final OnReplaceListener listener) { + return copyOrMoveDir(srcDir, destDir, listener, false); + } + + /** + * 复制文件 + * + * @param srcFilePath 源文件路径 + * @param destFilePath 目标文件路径 + * @param listener 是否覆盖监听器 + * @return {@code true}: 复制成功
{@code false}: 复制失败 + */ + public static boolean copyFile(final String srcFilePath, final String destFilePath, final OnReplaceListener listener) { + return copyFile(getFileByPath(srcFilePath), getFileByPath(destFilePath), listener); + } + + /** + * 复制文件 + * + * @param srcFile 源文件 + * @param destFile 目标文件 + * @param listener 是否覆盖监听器 + * @return {@code true}: 复制成功
{@code false}: 复制失败 + */ + public static boolean copyFile(final File srcFile, final File destFile, final OnReplaceListener listener) { + return copyOrMoveFile(srcFile, destFile, listener, false); + } + + /** + * 移动目录 + * + * @param srcDirPath 源目录路径 + * @param destDirPath 目标目录路径 + * @param listener 是否覆盖监听器 + * @return {@code true}: 移动成功
{@code false}: 移动失败 + */ + public static boolean moveDir(final String srcDirPath, final String destDirPath, final OnReplaceListener listener) { + return moveDir(getFileByPath(srcDirPath), getFileByPath(destDirPath), listener); + } + + /** + * 移动目录 + * + * @param srcDir 源目录 + * @param destDir 目标目录 + * @param listener 是否覆盖监听器 + * @return {@code true}: 移动成功
{@code false}: 移动失败 + */ + public static boolean moveDir(final File srcDir, final File destDir, final OnReplaceListener listener) { + return copyOrMoveDir(srcDir, destDir, listener, true); + } + + /** + * 移动文件 + * + * @param srcFilePath 源文件路径 + * @param destFilePath 目标文件路径 + * @param listener 是否覆盖监听器 + * @return {@code true}: 移动成功
{@code false}: 移动失败 + */ + public static boolean moveFile(final String srcFilePath, final String destFilePath, final OnReplaceListener listener) { + return moveFile(getFileByPath(srcFilePath), getFileByPath(destFilePath), listener); + } + + /** + * 移动文件 + * + * @param srcFile 源文件 + * @param destFile 目标文件 + * @param listener 是否覆盖监听器 + * @return {@code true}: 移动成功
{@code false}: 移动失败 + */ + public static boolean moveFile(final File srcFile, final File destFile, final OnReplaceListener listener) { + return copyOrMoveFile(srcFile, destFile, listener, true); + } + + /** + * 删除目录 + * + * @param dirPath 目录路径 + * @return {@code true}: 删除成功
{@code false}: 删除失败 + */ + public static boolean deleteDir(final String dirPath) { + return deleteDir(getFileByPath(dirPath)); + } + + /** + * 删除目录 + * + * @param dir 目录 + * @return {@code true}: 删除成功
{@code false}: 删除失败 + */ + public static boolean deleteDir(final File dir) { + if (dir == null) return false; + // 目录不存在返回 true + if (!dir.exists()) return true; + // 不是目录返回 false + if (!dir.isDirectory()) return false; + // 现在文件存在且是文件夹 + File[] files = dir.listFiles(); + if (files != null && files.length != 0) { + for (File file : files) { + if (file.isFile()) { + if (!file.delete()) return false; + } else if (file.isDirectory()) { + if (!deleteDir(file)) return false; + } + } + } + return dir.delete(); + } + + /** + * 删除文件 + * + * @param srcFilePath 文件路径 + * @return {@code true}: 删除成功
{@code false}: 删除失败 + */ + public static boolean deleteFile(final String srcFilePath) { + return deleteFile(getFileByPath(srcFilePath)); + } + + /** + * 删除文件 + * + * @param file 文件 + * @return {@code true}: 删除成功
{@code false}: 删除失败 + */ + public static boolean deleteFile(final File file) { + return file != null && (!file.exists() || file.isFile() && file.delete()); + } + + /** + * 删除目录下所有东西 + * + * @param dirPath 目录路径 + * @return {@code true}: 删除成功
{@code false}: 删除失败 + */ + public static boolean deleteAllInDir(final String dirPath) { + return deleteAllInDir(getFileByPath(dirPath)); + } + + /** + * 删除目录下所有东西 + * + * @param dir 目录 + * @return {@code true}: 删除成功
{@code false}: 删除失败 + */ + public static boolean deleteAllInDir(final File dir) { + return deleteFilesInDirWithFilter(dir, new FileFilter() { + @Override + public boolean accept(File pathname) { + return true; + } + }); + } + + /** + * 删除目录下所有文件 + * + * @param dirPath 目录路径 + * @return {@code true}: 删除成功
{@code false}: 删除失败 + */ + public static boolean deleteFilesInDir(final String dirPath) { + return deleteFilesInDir(getFileByPath(dirPath)); + } + + /** + * 删除目录下所有文件 + * + * @param dir 目录 + * @return {@code true}: 删除成功
{@code false}: 删除失败 + */ + public static boolean deleteFilesInDir(final File dir) { + return deleteFilesInDirWithFilter(dir, new FileFilter() { + @Override + public boolean accept(File pathname) { + return pathname.isFile(); + } + }); + } + + /** + * 删除目录下所有过滤的文件 + * + * @param dirPath 目录路径 + * @param filter 过滤器 + * @return {@code true}: 删除成功
{@code false}: 删除失败 + */ + public static boolean deleteFilesInDirWithFilter(final String dirPath, final FileFilter filter) { + return deleteFilesInDirWithFilter(getFileByPath(dirPath), filter); + } + + /** + * 删除目录下所有过滤的文件 + * + * @param dir 目录 + * @param filter 过滤器 + * @return {@code true}: 删除成功
{@code false}: 删除失败 + */ + public static boolean deleteFilesInDirWithFilter(final File dir, final FileFilter filter) { + if (dir == null) return false; + // 目录不存在返回 true + if (!dir.exists()) return true; + // 不是目录返回 false + if (!dir.isDirectory()) return false; + // 现在文件存在且是文件夹 + File[] files = dir.listFiles(); + if (files != null && files.length != 0) { + for (File file : files) { + if (filter.accept(file)) { + if (file.isFile()) { + if (!file.delete()) return false; + } else if (file.isDirectory()) { + if (!deleteDir(file)) return false; + } + } + } + } + return true; + } + + /** + * 获取目录下所有文件 + *

不递归进子目录

+ * + * @param dirPath 目录路径 + * @return 文件链表 + */ + public static List listFilesInDir(final String dirPath) { + return listFilesInDir(dirPath, false); + } + + /** + * 获取目录下所有文件 + *

不递归进子目录

+ * + * @param dir 目录 + * @return 文件链表 + */ + public static List listFilesInDir(final File dir) { + return listFilesInDir(dir, false); + } + + /** + * 获取目录下所有文件 + * + * @param dirPath 目录路径 + * @param isRecursive 是否递归进子目录 + * @return 文件链表 + */ + public static List listFilesInDir(final String dirPath, final boolean isRecursive) { + return listFilesInDir(getFileByPath(dirPath), isRecursive); + } + + /** + * 获取目录下所有文件 + * + * @param dir 目录 + * @param isRecursive 是否递归进子目录 + * @return 文件链表 + */ + public static List listFilesInDir(final File dir, final boolean isRecursive) { + return listFilesInDirWithFilter(dir, new FileFilter() { + @Override + public boolean accept(File pathname) { + return true; + } + }, isRecursive); + } + + /** + * 获取目录下所有过滤的文件 + *

不递归进子目录

+ * + * @param dirPath 目录路径 + * @param filter 过滤器 + * @return 文件链表 + */ + public static List listFilesInDirWithFilter(final String dirPath, + final FileFilter filter) { + return listFilesInDirWithFilter(getFileByPath(dirPath), filter, false); + } + + /** + * 获取目录下所有过滤的文件 + *

不递归进子目录

+ * + * @param dir 目录 + * @param filter 过滤器 + * @return 文件链表 + */ + public static List listFilesInDirWithFilter(final File dir, + final FileFilter filter) { + return listFilesInDirWithFilter(dir, filter, false); + } + + /** + * 获取目录下所有过滤的文件 + * + * @param dirPath 目录路径 + * @param filter 过滤器 + * @param isRecursive 是否递归进子目录 + * @return 文件链表 + */ + public static List listFilesInDirWithFilter(final String dirPath, + final FileFilter filter, + final boolean isRecursive) { + return listFilesInDirWithFilter(getFileByPath(dirPath), filter, isRecursive); + } + + /** + * 获取目录下所有过滤的文件 + * + * @param dir 目录 + * @param filter 过滤器 + * @param isRecursive 是否递归进子目录 + * @return 文件链表 + */ + public static List listFilesInDirWithFilter(final File dir, + final FileFilter filter, + final boolean isRecursive) { + if (!isDir(dir)) return null; + List list = new ArrayList<>(); + File[] files = dir.listFiles(); + if (files != null && files.length != 0) { + for (File file : files) { + if (filter.accept(file)) { + list.add(file); + } + if (isRecursive && file.isDirectory()) { + //noinspection ConstantConditions + list.addAll(listFilesInDirWithFilter(file, filter, true)); + } + } + } + return list; + } + + /** + * 获取文件最后修改的毫秒时间戳 + * + * @param filePath 文件路径 + * @return 文件最后修改的毫秒时间戳 + */ + + public static long getFileLastModified(final String filePath) { + return getFileLastModified(getFileByPath(filePath)); + } + + /** + * 获取文件最后修改的毫秒时间戳 + * + * @param file 文件 + * @return 文件最后修改的毫秒时间戳 + */ + public static long getFileLastModified(final File file) { + if (file == null) return -1; + return file.lastModified(); + } + + /** + * 简单获取文件编码格式 + * + * @param filePath 文件路径 + * @return 文件编码 + */ + public static String getFileCharsetSimple(final String filePath) { + return getFileCharsetSimple(getFileByPath(filePath)); + } + + /** + * 简单获取文件编码格式 + * + * @param file 文件 + * @return 文件编码 + */ + public static String getFileCharsetSimple(final File file) { + int p = 0; + InputStream is = null; + try { + is = new BufferedInputStream(new FileInputStream(file)); + p = (is.read() << 8) + is.read(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + PLVCloseUtils.closeIO(is); + } + switch (p) { + case 0xefbb: + return "UTF-8"; + case 0xfffe: + return "Unicode"; + case 0xfeff: + return "UTF-16BE"; + default: + return "GBK"; + } + } + + /** + * 获取文件行数 + * + * @param filePath 文件路径 + * @return 文件行数 + */ + public static int getFileLines(final String filePath) { + return getFileLines(getFileByPath(filePath)); + } + + /** + * 获取文件行数 + *

比 readLine 要快很多

+ * + * @param file 文件 + * @return 文件行数 + */ + public static int getFileLines(final File file) { + int count = 1; + InputStream is = null; + try { + is = new BufferedInputStream(new FileInputStream(file)); + byte[] buffer = new byte[1024]; + int readChars; + if (LINE_SEP.endsWith("\n")) { + while ((readChars = is.read(buffer, 0, 1024)) != -1) { + for (int i = 0; i < readChars; ++i) { + if (buffer[i] == '\n') ++count; + } + } + } else { + while ((readChars = is.read(buffer, 0, 1024)) != -1) { + for (int i = 0; i < readChars; ++i) { + if (buffer[i] == '\r') ++count; + } + } + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + PLVCloseUtils.closeIO(is); + } + return count; + } + + /** + * 获取目录大小 + * + * @param dirPath 目录路径 + * @return 文件大小 + */ + public static String getDirSize(final String dirPath) { + return getDirSize(getFileByPath(dirPath)); + } + + /** + * 获取目录大小 + * + * @param dir 目录 + * @return 文件大小 + */ + public static String getDirSize(final File dir) { + long len = getDirLength(dir); + return len == -1 ? "" : byte2FitMemorySize(len); + } + + /** + * 获取文件大小 + * + * @param filePath 文件路径 + * @return 文件大小 + */ + public static String getFileSize(final String filePath) { + return getFileSize(getFileByPath(filePath)); + } + + /** + * 获取文件大小 + * + * @param file 文件 + * @return 文件大小 + */ + public static String getFileSize(final File file) { + long len = getFileLength(file); + return len == -1 ? "" : byte2FitMemorySize(len); + } + + /** + * 获取目录长度 + * + * @param dirPath 目录路径 + * @return 目录长度 + */ + public static long getDirLength(final String dirPath) { + return getDirLength(getFileByPath(dirPath)); + } + + /** + * 获取目录长度 + * + * @param dir 目录 + * @return 目录长度 + */ + public static long getDirLength(final File dir) { + if (!isDir(dir)) return -1; + long len = 0; + File[] files = dir.listFiles(); + if (files != null && files.length != 0) { + for (File file : files) { + if (file.isDirectory()) { + len += getDirLength(file); + } else { + len += file.length(); + } + } + } + return len; + } + + /** + * 获取文件长度 + * + * @param filePath 文件路径 + * @return 文件长度 + */ + public static long getFileLength(final String filePath) { + return getFileLength(getFileByPath(filePath)); + } + + /** + * 获取文件长度 + * + * @param file 文件 + * @return 文件长度 + */ + public static long getFileLength(final File file) { + if (!isFile(file)) return -1; + return file.length(); + } + + /** + * 获取文件的 MD5 校验码 + * + * @param filePath 文件路径 + * @return 文件的 MD5 校验码 + */ + public static String getFileMD5ToString(final String filePath) { + File file = isSpace(filePath) ? null : new File(filePath); + return getFileMD5ToString(file); + } + + /** + * 获取文件的 MD5 校验码 + * + * @param file 文件 + * @return 文件的 MD5 校验码 + */ + public static String getFileMD5ToString(final File file) { + return bytes2HexString(getFileMD5(file)); + } + + /** + * 获取文件的 MD5 校验码 + * + * @param filePath 文件路径 + * @return 文件的 MD5 校验码 + */ + public static byte[] getFileMD5(final String filePath) { + return getFileMD5(getFileByPath(filePath)); + } + + /** + * 获取文件的 MD5 校验码 + * + * @param file 文件 + * @return 文件的 MD5 校验码 + */ + public static byte[] getFileMD5(final File file) { + if (file == null) return null; + DigestInputStream dis = null; + try { + FileInputStream fis = new FileInputStream(file); + MessageDigest md = MessageDigest.getInstance("MD5"); + dis = new DigestInputStream(fis, md); + byte[] buffer = new byte[1024 * 256]; + while (true) { + if (!(dis.read(buffer) > 0)) break; + } + md = dis.getMessageDigest(); + return md.digest(); + } catch (NoSuchAlgorithmException | IOException e) { + e.printStackTrace(); + } finally { + PLVCloseUtils.closeIO(dis); + } + return null; + } + + /** + * 获取全路径中的最长目录 + * + * @param file 文件 + * @return filePath 最长目录 + */ + public static String getDirName(final File file) { + if (file == null) return null; + return getDirName(file.getPath()); + } + + /** + * 获取全路径中的最长目录 + * + * @param filePath 文件路径 + * @return filePath 最长目录 + */ + public static String getDirName(final String filePath) { + if (isSpace(filePath)) return filePath; + int lastSep = filePath.lastIndexOf(File.separator); + return lastSep == -1 ? "" : filePath.substring(0, lastSep + 1); + } + + /** + * 获取全路径中的文件名 + * + * @param file 文件 + * @return 文件名 + */ + public static String getFileName(final File file) { + if (file == null) return null; + return getFileName(file.getPath()); + } + + /** + * 获取全路径中的文件名 + * + * @param filePath 文件路径 + * @return 文件名 + */ + public static String getFileName(final String filePath) { + if (isSpace(filePath)) return filePath; + int lastSep = filePath.lastIndexOf(File.separator); + return lastSep == -1 ? filePath : filePath.substring(lastSep + 1); + } + + /** + * 获取全路径中的不带拓展名的文件名 + * + * @param file 文件 + * @return 不带拓展名的文件名 + */ + public static String getFileNameNoExtension(final File file) { + if (file == null) return null; + return getFileNameNoExtension(file.getPath()); + } + + /** + * 获取全路径中的不带拓展名的文件名 + * + * @param filePath 文件路径 + * @return 不带拓展名的文件名 + */ + public static String getFileNameNoExtension(final String filePath) { + if (isSpace(filePath)) return filePath; + int lastPoi = filePath.lastIndexOf('.'); + int lastSep = filePath.lastIndexOf(File.separator); + if (lastSep == -1) { + return (lastPoi == -1 ? filePath : filePath.substring(0, lastPoi)); + } + if (lastPoi == -1 || lastSep > lastPoi) { + return filePath.substring(lastSep + 1); + } + return filePath.substring(lastSep + 1, lastPoi); + } + + /** + * 获取全路径中的文件拓展名 + * + * @param file 文件 + * @return 文件拓展名 + */ + public static String getFileExtension(final File file) { + if (file == null) return null; + return getFileExtension(file.getPath()); + } + + /** + * 获取全路径中的文件拓展名 + * + * @param filePath 文件路径 + * @return 文件拓展名 + */ + public static String getFileExtension(final String filePath) { + if (isSpace(filePath)) return filePath; + int lastPoi = filePath.lastIndexOf('.'); + int lastSep = filePath.lastIndexOf(File.separator); + if (lastPoi == -1 || lastSep >= lastPoi) return ""; + return filePath.substring(lastPoi + 1); + } + + /////////////////////////////////////////////////////////////////////////// + // copy from ConvertUtils + /////////////////////////////////////////////////////////////////////////// + + private static final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + + /** + * byteArr 转 hexString + *

例如:

+ * bytes2HexString(new byte[] { 0, (byte) 0xa8 }) returns 00A8 + * + * @param bytes 字节数组 + * @return 16 进制大写字符串 + */ + private static String bytes2HexString(final byte[] bytes) { + if (bytes == null) return null; + int len = bytes.length; + if (len <= 0) return null; + char[] ret = new char[len << 1]; + for (int i = 0, j = 0; i < len; i++) { + ret[j++] = hexDigits[bytes[i] >>> 4 & 0x0f]; + ret[j++] = hexDigits[bytes[i] & 0x0f]; + } + return new String(ret); + } + + /** + * 字节数转合适内存大小 + *

保留 3 位小数

+ * + * @param byteNum 字节数 + * @return 合适内存大小 + */ + @SuppressLint("DefaultLocale") + private static String byte2FitMemorySize(final long byteNum) { + if (byteNum < 0) { + return "shouldn't be less than zero!"; + } else if (byteNum < 1024) { + return String.format("%.3fB", (double) byteNum); + } else if (byteNum < 1048576) { + return String.format("%.3fKB", (double) byteNum / 1024); + } else if (byteNum < 1073741824) { + return String.format("%.3fMB", (double) byteNum / 1048576); + } else { + return String.format("%.3fGB", (double) byteNum / 1073741824); + } + } + + private static boolean isSpace(final String s) { + if (s == null) return true; + for (int i = 0, len = s.length(); i < len; ++i) { + if (!Character.isWhitespace(s.charAt(i))) { + return false; + } + } + return true; + } + + public interface OnReplaceListener { + boolean onReplace(); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvClipboardUtils.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvClipboardUtils.java index 7eb4a1c..8280fa7 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvClipboardUtils.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvClipboardUtils.java @@ -1,24 +1,24 @@ -package com.easefun.polyvsdk.util; - -import android.content.ClipData; -import android.content.ClipboardManager; -import android.content.Context; - -public class PolyvClipboardUtils { - - // 复制到剪贴板(相同的文字不会重复复制) - public static void copyToClipboard(Context context, CharSequence msg) { - ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clipData = ClipData.newPlainText("clip", msg); - clipboardManager.setPrimaryClip(clipData); - } - - // 从剪贴板获取最新的复制内容粘贴 - public static CharSequence pasteByClipboard(Context context) { - ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clipData = clipboardManager.getPrimaryClip(); - if (clipData == null) - return ""; - return clipData.getItemAt(0).getText(); - } -} +package com.easefun.polyvsdk.util; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; + +public class PolyvClipboardUtils { + + // 复制到剪贴板(相同的文字不会重复复制) + public static void copyToClipboard(Context context, CharSequence msg) { + ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clipData = ClipData.newPlainText("clip", msg); + clipboardManager.setPrimaryClip(clipData); + } + + // 从剪贴板获取最新的复制内容粘贴 + public static CharSequence pasteByClipboard(Context context) { + ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clipData = clipboardManager.getPrimaryClip(); + if (clipData == null) + return ""; + return clipData.getItemAt(0).getText(); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvCustomQuestionBuilder.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvCustomQuestionBuilder.java index fe643ac..9d633c0 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvCustomQuestionBuilder.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvCustomQuestionBuilder.java @@ -1,6 +1,6 @@ package com.easefun.polyvsdk.util; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.easefun.polyvsdk.player.PolyvPlayerAnswerView; import com.easefun.polyvsdk.vo.PolyvQuestionChoicesVO; diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvErrorMessageUtils.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvErrorMessageUtils.java index e87c454..2c0b975 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvErrorMessageUtils.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvErrorMessageUtils.java @@ -1,6 +1,6 @@ package com.easefun.polyvsdk.util; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.easefun.polyvsdk.PolyvDownloader; import com.easefun.polyvsdk.PolyvDownloaderErrorReason; @@ -229,7 +229,7 @@ public static String getPlayErrorMessage(@PolyvPlayErrorReason.PlayErrorReason i case PolyvPlayErrorReason.TIMEOUT_FLOW: return "账号过期,请向管理员反馈"; - case PolyvPlayErrorReason.LOCAL_VIEWO_ERROR: + case PolyvPlayErrorReason.LOCAL_VIDEO_ERROR: return "本地视频文件损坏,请重新下载"; case PolyvPlayErrorReason.START_ERROR: @@ -348,7 +348,10 @@ public static String getPlayErrorMessage(@PolyvPlayErrorReason.PlayErrorReason i case PolyvPlayErrorReason.QUESTION_SERVER_ERROR: return "视频加载失败,请联系管理员"; - + case PolyvPlayErrorReason.HLS_PRIVATE_VERSION_ERROR: + return "播放器不支持播放该视频,请升级播放器版本"; + case PolyvPlayErrorReason.HLS_KEY_VERSION_ERROR: + return "请升级播放器版本"; default: return "当前视频无法播放,请向管理员反馈"; } diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvImageLoader.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvImageLoader.java index 3ed172e..6147fb9 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvImageLoader.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvImageLoader.java @@ -2,7 +2,7 @@ import android.content.Context; import android.graphics.drawable.Drawable; -import android.support.annotation.DrawableRes; +import androidx.annotation.DrawableRes; import android.widget.ImageView; import com.bumptech.glide.Glide; diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvNetworkUtils.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvNetworkUtils.java index 8b1340a..32f2713 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvNetworkUtils.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvNetworkUtils.java @@ -241,6 +241,7 @@ public static String getWIFISSID(Context context) { WifiInfo wifiInfo = wifiManager.getConnectionInfo(); if (null != wifiInfo) { int networkId = wifiInfo.getNetworkId(); + ssid = "".equals(wifiInfo.getSSID()) ? "" : wifiInfo.getSSID(); List wifiConfigurations = wifiManager.getConfiguredNetworks(); if (null != wifiConfigurations) { for (WifiConfiguration wifiConfiguration : wifiConfigurations) { diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvSPUtils.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvSPUtils.java index 3f2da6f..a054803 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvSPUtils.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvSPUtils.java @@ -3,8 +3,8 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; -import android.support.annotation.NonNull; -import android.support.v4.util.SimpleArrayMap; +import androidx.annotation.NonNull; +import androidx.collection.SimpleArrayMap; import java.util.Collections; import java.util.Map; diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvScreenUtils.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvScreenUtils.java index 32a0b14..655699a 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvScreenUtils.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvScreenUtils.java @@ -81,26 +81,28 @@ public static void reSetStatusBar(Activity activity) { // 隐藏状态栏 public static void hideStatusBar(Activity activity) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { - activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN); - } else { + activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { View decorView = activity.getWindow().getDecorView(); - activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN); - int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_IMMERSIVE + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; decorView.setSystemUiVisibility(uiOptions); } } // 恢复为不全屏状态 public static void setDecorVisible(Activity activity) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { - activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - } else { + activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { View decorView = activity.getWindow().getDecorView(); - activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); int uiOptions = View.SYSTEM_UI_FLAG_VISIBLE; decorView.setSystemUiVisibility(uiOptions); } diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvSensorHelper.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvSensorHelper.java index 5df4786..3345f3b 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvSensorHelper.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvSensorHelper.java @@ -1,57 +1,57 @@ -package com.easefun.polyvsdk.util; - -import android.app.Activity; -import android.view.OrientationEventListener; - -import java.lang.ref.WeakReference; - -public class PolyvSensorHelper { - private OrientationEventListener eventListener; - private boolean switchFlag; - private boolean isLandscape; - - public PolyvSensorHelper(final Activity activity) { - final WeakReference wr_activity = new WeakReference(activity); - eventListener = new OrientationEventListener(activity.getApplicationContext()) { - @Override - public void onOrientationChanged(int orientation) { - Activity activity1 = wr_activity.get(); - if (activity1 != null) { - boolean isPortrait = PolyvScreenUtils.isPortrait(activity1); - if ((orientation > -1 && orientation <= 10) || orientation >= 350 || (orientation <= 190 && orientation >= 170)) { - if (!isPortrait && switchFlag && !isLandscape) - PolyvScreenUtils.setPortrait(activity1); - if (isPortrait && !isLandscape) - isLandscape = !isLandscape; - } else if ((orientation <= 100 && orientation >= 80) || (orientation <= 280 && orientation >= 260)) { - if (isPortrait && switchFlag && isLandscape) - PolyvScreenUtils.setLandscape(activity1); - if (!isPortrait && isLandscape) - isLandscape = !isLandscape; - } - } - } - }; - } - - // 开启监听 - public void enable() { - eventListener.enable(); - } - - // 关闭监听 - public void disable() { - eventListener.disable(); - } - - /** - * 屏幕方向切换之后,是否开启随手势自动切换屏幕方向 - * - * @param switchFlag 是否开启自动切换 - * @param isLandscape 屏幕切换之后的方向(非自动切换,屏幕方向需要和手动切换之后的方向一致之后,自动切换才会再次生效) - */ - public void toggle(boolean switchFlag, boolean isLandscape) { - this.switchFlag = switchFlag; - this.isLandscape = isLandscape; - } -} +package com.easefun.polyvsdk.util; + +import android.app.Activity; +import android.view.OrientationEventListener; + +import java.lang.ref.WeakReference; + +public class PolyvSensorHelper { + private OrientationEventListener eventListener; + private boolean switchFlag; + private boolean isLandscape; + + public PolyvSensorHelper(final Activity activity) { + final WeakReference wr_activity = new WeakReference(activity); + eventListener = new OrientationEventListener(activity.getApplicationContext()) { + @Override + public void onOrientationChanged(int orientation) { + Activity activity1 = wr_activity.get(); + if (activity1 != null) { + boolean isPortrait = PolyvScreenUtils.isPortrait(activity1); + if ((orientation > -1 && orientation <= 10) || orientation >= 350 || (orientation <= 190 && orientation >= 170)) { + if (!isPortrait && switchFlag && !isLandscape) + PolyvScreenUtils.setPortrait(activity1); + if (isPortrait && !isLandscape) + isLandscape = !isLandscape; + } else if ((orientation <= 100 && orientation >= 80) || (orientation <= 280 && orientation >= 260)) { + if (isPortrait && switchFlag && isLandscape) + PolyvScreenUtils.setLandscape(activity1); + if (!isPortrait && isLandscape) + isLandscape = !isLandscape; + } + } + } + }; + } + + // 开启监听 + public void enable() { + eventListener.enable(); + } + + // 关闭监听 + public void disable() { + eventListener.disable(); + } + + /** + * 屏幕方向切换之后,是否开启随手势自动切换屏幕方向 + * + * @param switchFlag 是否开启自动切换 + * @param isLandscape 屏幕切换之后的方向(非自动切换,屏幕方向需要和手动切换之后的方向一致之后,自动切换才会再次生效) + */ + public void toggle(boolean switchFlag, boolean isLandscape) { + this.switchFlag = switchFlag; + this.isLandscape = isLandscape; + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvStorageUtils.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvStorageUtils.java index 46e2062..3af6c26 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvStorageUtils.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvStorageUtils.java @@ -3,9 +3,8 @@ import android.content.Context; import android.os.Build; import android.os.Environment; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; -import android.util.Log; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; import java.io.File; import java.util.ArrayList; @@ -29,10 +28,6 @@ public class PolyvStorageUtils { */ @NonNull public static ArrayList getExternalFilesDirs(@NonNull Context context) { - if(context == null){ - Log.e("PolyvStorageUtils", "getExternalFilesDirs: context is null"); - return new ArrayList<>(); - } File[] files; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //列表中包含了可移除的存储介质(例如 SD 卡)的路径。 diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvTaskExecutorUtils.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvTaskExecutorUtils.java index a2e8137..03c686f 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvTaskExecutorUtils.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvTaskExecutorUtils.java @@ -1,6 +1,6 @@ package com.easefun.polyvsdk.util; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executor; diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvTextImageLoader.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvTextImageLoader.java index 04405ee..9c5c08a 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvTextImageLoader.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvTextImageLoader.java @@ -1,102 +1,102 @@ -package com.easefun.polyvsdk.util; - -import android.content.Context; -import android.text.SpannableStringBuilder; -import android.text.Spanned; -import android.text.style.ImageSpan; -import android.widget.TextView; - -import com.easefun.polyvsdk.sub.auxilliary.cache.image.ImageData; -import com.easefun.polyvsdk.sub.auxilliary.cache.image.ImageLoader; - -import java.lang.ref.WeakReference; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import pl.droidsonroids.gif.GifTextView; -import pl.droidsonroids.gif.RelativeImageSpan; - -public class PolyvTextImageLoader { - private final String DEFAULT_STRING = "[图片]"; - private Context context; - private ImageLoader imageLoader; - - public PolyvTextImageLoader(Context context) { - this.context = context; - this.imageLoader = ImageLoader.getInstance(context, 3, ImageLoader.Type.LIFO); - } - - public static class MyImageLoaderListener implements ImageLoader.ImageLoaderListener { - - private CharSequence charSequence; - private WeakReference wr_textView; - private SpannableStringBuilder span; - private int start; - private int end; - - public MyImageLoaderListener(TextView textView, CharSequence charSequence, SpannableStringBuilder span, int start, int end) { - this.wr_textView = new WeakReference(textView); - this.charSequence = charSequence; - this.span = span; - this.start = start; - this.end = end; - } - - @Override - public void fail(Throwable throwable) { - } - - @Override - public void success(ImageData imageData, String s) { - TextView textView = wr_textView.get(); - if (textView != null && textView.getTag() != null && textView.getTag().equals(charSequence)) { - ImageSpan imageSpan = ImageLoader.toImageSpan(imageData.getDrawable(), s, RelativeImageSpan.ALIGN_CENTER); - span.setSpan(imageSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - textView.clearComposingText(); - textView.setText(span); - } - } - } - - // 显示网络图片 - public void displayTextImage(CharSequence charSequence, GifTextView textView) { - textView.setTag(charSequence); - float size = textView.getTextSize(); - int reqWidth; - int reqHeight; - reqWidth = reqHeight = (int) size; - SpannableStringBuilder span = new SpannableStringBuilder(charSequence); - int start = 0; - int end = 0; - int oldLength = span.length(); - int newLength = 0; - Pattern pattern = Pattern.compile(""); - Matcher matcher = pattern.matcher(charSequence); - while (matcher.find()) { - start = matcher.start(); - end = matcher.end(); - String group = matcher.group(); - Pattern pattern_src = Pattern.compile("src\\S*"); - Matcher matcher_src = pattern_src.matcher(group); - if (matcher_src.find()) { - String group_src = matcher_src.group(); - // 图片的url - String url = group_src.substring(5, group_src.length() - 1); - newLength = span.length(); - if (newLength < oldLength) - span.replace(start = start - (oldLength - newLength), end - (oldLength - newLength), DEFAULT_STRING); - else - span.replace(start, end, DEFAULT_STRING); - ImageData imageData = imageLoader.start(context, new int[]{reqWidth, reqHeight}, url, new MyImageLoaderListener(textView, charSequence, span, start, start + DEFAULT_STRING.length())); - if (imageData != null) { - if (textView.getTag() != null && textView.getTag().equals(charSequence)) { - ImageSpan imageSpan = ImageLoader.toImageSpan(imageData.getDrawable(), url, RelativeImageSpan.ALIGN_CENTER); - span.setSpan(imageSpan, start, start + DEFAULT_STRING.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - textView.setText(span); - } - } - } - } - textView.setText(span); - } -} +package com.easefun.polyvsdk.util; + +import android.content.Context; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.style.ImageSpan; +import android.widget.TextView; + +import com.easefun.polyvsdk.sub.auxilliary.cache.image.ImageData; +import com.easefun.polyvsdk.sub.auxilliary.cache.image.ImageLoader; + +import java.lang.ref.WeakReference; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import pl.droidsonroids.gif.GifTextView; +import pl.droidsonroids.gif.RelativeImageSpan; + +public class PolyvTextImageLoader { + private final String DEFAULT_STRING = "[图片]"; + private Context context; + private ImageLoader imageLoader; + + public PolyvTextImageLoader(Context context) { + this.context = context; + this.imageLoader = ImageLoader.getInstance(context, 3, ImageLoader.Type.LIFO); + } + + public static class MyImageLoaderListener implements ImageLoader.ImageLoaderListener { + + private CharSequence charSequence; + private WeakReference wr_textView; + private SpannableStringBuilder span; + private int start; + private int end; + + public MyImageLoaderListener(TextView textView, CharSequence charSequence, SpannableStringBuilder span, int start, int end) { + this.wr_textView = new WeakReference(textView); + this.charSequence = charSequence; + this.span = span; + this.start = start; + this.end = end; + } + + @Override + public void fail(Throwable throwable) { + } + + @Override + public void success(ImageData imageData, String s) { + TextView textView = wr_textView.get(); + if (textView != null && textView.getTag() != null && textView.getTag().equals(charSequence)) { + ImageSpan imageSpan = ImageLoader.toImageSpan(imageData.getDrawable(), s, RelativeImageSpan.ALIGN_CENTER); + span.setSpan(imageSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + textView.clearComposingText(); + textView.setText(span); + } + } + } + + // 显示网络图片 + public void displayTextImage(CharSequence charSequence, GifTextView textView) { + textView.setTag(charSequence); + float size = textView.getTextSize(); + int reqWidth; + int reqHeight; + reqWidth = reqHeight = (int) size; + SpannableStringBuilder span = new SpannableStringBuilder(charSequence); + int start = 0; + int end = 0; + int oldLength = span.length(); + int newLength = 0; + Pattern pattern = Pattern.compile(""); + Matcher matcher = pattern.matcher(charSequence); + while (matcher.find()) { + start = matcher.start(); + end = matcher.end(); + String group = matcher.group(); + Pattern pattern_src = Pattern.compile("src\\S*"); + Matcher matcher_src = pattern_src.matcher(group); + if (matcher_src.find()) { + String group_src = matcher_src.group(); + // 图片的url + String url = group_src.substring(5, group_src.length() - 1); + newLength = span.length(); + if (newLength < oldLength) + span.replace(start = start - (oldLength - newLength), end - (oldLength - newLength), DEFAULT_STRING); + else + span.replace(start, end, DEFAULT_STRING); + ImageData imageData = imageLoader.start(context, new int[]{reqWidth, reqHeight}, url, new MyImageLoaderListener(textView, charSequence, span, start, start + DEFAULT_STRING.length())); + if (imageData != null) { + if (textView.getTag() != null && textView.getTag().equals(charSequence)) { + ImageSpan imageSpan = ImageLoader.toImageSpan(imageData.getDrawable(), url, RelativeImageSpan.ALIGN_CENTER); + span.setSpan(imageSpan, start, start + DEFAULT_STRING.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + textView.setText(span); + } + } + } + } + textView.setText(span); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvVlmsHelper.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvVlmsHelper.java index 7f05219..8191457 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvVlmsHelper.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/util/PolyvVlmsHelper.java @@ -1,616 +1,617 @@ -package com.easefun.polyvsdk.util; - -import android.text.SpannableStringBuilder; -import android.text.TextUtils; - -import com.easefun.polyvsdk.PolyvSDKUtil; -import com.easefun.polyvsdk.sub.auxilliary.IListener; -import com.easefun.polyvsdk.sub.vlms.auxiliary.PolyvVlmsTransfer; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvAccessTokenInfo; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvAddAnswerInfo; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvAddOrderInfo; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvAddQuestionInfo; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvAnswerInfo; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvCourseDetailInfo; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvCoursesInfo; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvCurriculumInfo; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvQuestionInfo; -import com.easefun.polyvsdk.sub.vlms.entity.PolyvUserInfo; -import com.easefun.polyvsdk.sub.vlms.listener.PolyvVlmsApiListener; -import com.easefun.polyvsdk.sub.vlms.main.PolyvVlmsManager; -import com.easefun.polyvsdk.sub.vlms.main.PolyvVlmsTestData; -import com.easefun.polyvsdk.vo.PolyvVideoVO; - -import org.json.JSONException; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -import retrofit2.Call; - -/** - * 对应demo需求的网校接口管理类 - */ -public class PolyvVlmsHelper { - private static final int accessToken_validTime = 1000 * 60 * 60 * 2; - private static String accessToken, user_id; - private static long getAccessTokenTime; - private PolyvVlmsManager vlmsManager; - private List callLists; - private List futureLists; - private boolean canCall; - - public PolyvVlmsHelper() { - canCall = true; - vlmsManager = new PolyvVlmsManager(null); - callLists = new ArrayList<>(); - futureLists = new ArrayList<>(); - } - - private boolean accessTokenIsInvalid() { - return accessToken == null || (getAccessTokenTime != 0 && (System.currentTimeMillis() - getAccessTokenTime) > accessToken_validTime); - } - - private void callFail(IListener listener, Throwable t) { - if (listener != null && canCall) - listener.fail(t); - } - - private void callSuccess(IListener listener, Object o) { - if (listener != null && canCall) - listener.success(o); - } - - /** - * 销毁所有请求 - */ - public void destroy() { - canCall = false; - for (Call call : callLists) { - if (call != null) { - call.cancel(); - } - } - callLists.clear(); - for (Future future : futureLists) { - if (future != null) { - future.cancel(true); - } - } - futureLists.clear(); - } - - private void getAccessToken(final IListener listener) { - if (accessTokenIsInvalid()) { - callLists.add(vlmsManager.getAccessToken(PolyvVlmsTestData.API_ID, PolyvVlmsTestData.SCHOOL_ID, PolyvVlmsTestData.APP_SECRET, new PolyvVlmsApiListener.GetAccessTokenListener() { - @Override - public void fail(Throwable t) { - callFail(listener, t); - } - - @Override - public void success(PolyvAccessTokenInfo polyvAccessTokenInfo) { - synchronized (vlmsManager) { - if (accessToken == null) { - accessToken = polyvAccessTokenInfo.data.access_token; - getAccessTokenTime = System.currentTimeMillis(); - } - callSuccess(listener, null); - } - } - })); - } else { - callSuccess(listener, null); - } - } - - // 获取课程信息 - public void getCoursesInfo(final int page_size, final String is_free, final PolyvVlmsApiListener.GetCoursesListener coursesListener) { - getAccessToken(new IListener() { - @Override - public void fail(Throwable t) { - callFail(coursesListener, t); - } - - @Override - public void success(Object o) { - callLists.add(vlmsManager.getCourses(PolyvVlmsTestData.SCHOOL_ID, null, is_free, null, 1, page_size, accessToken, coursesListener)); - } - }); - } - - // 获取课程详情 - public void getCourseDetailInfo(final String courseId, final PolyvVlmsApiListener.GetCourseDetailListener detailListener) { - getAccessToken(new IListener() { - @Override - public void fail(Throwable t) { - callFail(detailListener, t); - } - - @Override - public void success(Object o) { - callLists.add(vlmsManager.getCourseDetail(PolyvVlmsTestData.SCHOOL_ID, courseId, PolyvCourseDetailInfo.IS_DETAIL_YES, accessToken, detailListener)); - } - }); - } - - // 根据界面需求获取课程及老师的信息 - public void getCoursesDetail(int page_size, String is_free, final GetCoursesDetailListener coursesDetailListener) { - getCoursesInfo(page_size, is_free, new PolyvVlmsApiListener.GetCoursesListener() { - @Override - public void fail(Throwable t) { - callFail(coursesDetailListener, t); - } - - @Override - public void success(final PolyvCoursesInfo polyvCoursesInfo) { - final Map maps = new TreeMap(); - if (polyvCoursesInfo.data.courses.size() == 0) { - callSuccess(coursesDetailListener, new ArrayList(maps.values())); - } else { - int[] j = new int[]{1}; - int i = 0; - for (int k = 0; k < polyvCoursesInfo.data.courses.size(); k++) { - // 非点播的课程视频不添加 - if (!PolyvCoursesInfo.COURSE_TYPE_VOD.equals(polyvCoursesInfo.data.courses.get(k).course_type)) - polyvCoursesInfo.data.courses.remove(polyvCoursesInfo.data.courses.get(k)); - } - if (polyvCoursesInfo.data.courses.size() == 0) { - callSuccess(coursesDetailListener, new ArrayList(maps.values())); - return; - } - if (canCall) - for (PolyvCoursesInfo.Course course : polyvCoursesInfo.data.courses) { - getCourseDetailInfo(course.course_id, new MyGetCourseDetailListener(coursesDetailListener, course, maps, polyvCoursesInfo.data.courses.size(), j, i++)); - } - } - } - }); - } - - private boolean isLogin() { - return !TextUtils.isEmpty(user_id); - } - - // 登录,获取user_id - public void login(final IListener listener) { - getAccessToken(new IListener() { - @Override - public void fail(Throwable t) { - callFail(listener, t); - } - - @Override - public void success(Object o) { - if (!isLogin()) - callLists.add(vlmsManager.login(PolyvVlmsTestData.SCHOOL_ID, PolyvVlmsTestData.ACCOUNT, PolyvVlmsTestData.PASSWORD, accessToken, new PolyvVlmsApiListener.LoginListener() { - @Override - public void fail(Throwable t) { - callFail(listener, t); - } - - @Override - public void success(PolyvUserInfo polyvUserInfo) { - user_id = polyvUserInfo.data.user_id; - callSuccess(listener, null); - } - })); - else - callSuccess(listener, null); - } - }); - } - - // 为免费课程添加订单,注:已购买的课程,再次购买会回调失败。 - public void addOrder(final String course_id, final PolyvVlmsApiListener.AddOrderListener addOrderListener) { - login(new PolyvVlmsApiListener.LoginListener() { - @Override - public void fail(Throwable t) { - callFail(addOrderListener, t); - } - - @Override - public void success(PolyvUserInfo polyvUserInfo) { - callLists.add(vlmsManager.addOrder(PolyvVlmsTestData.SCHOOL_ID, user_id, course_id, PolyvAddOrderInfo.PAYMENT_TYPE_FREE, accessToken, addOrderListener)); - } - }); - } - - // 获取课时信息 - public void getCurriculum(final String course_id, final PolyvVlmsApiListener.GetCurriculumListener curriculumListener) { - login(new PolyvVlmsApiListener.LoginListener() { - @Override - public void fail(Throwable t) { - callFail(curriculumListener, t); - } - - @Override - public void success(PolyvUserInfo polyvUserInfo) { - callLists.add(vlmsManager.getCurriculum(PolyvVlmsTestData.SCHOOL_ID, course_id, user_id, accessToken, curriculumListener)); - } - }); - } - - // 根据界面需求获取课时信息 - public void getCurriculumDetail(String course_id, final MyCurriculumDetailListener curriculumDetailListener) { - getCurriculum(course_id, new PolyvVlmsApiListener.GetCurriculumListener() { - @Override - public void fail(Throwable t) { - callFail(curriculumDetailListener, t); - } - - @Override - public void success(PolyvCurriculumInfo polyvCurriculumInfo) { - List lists = new ArrayList(); - if (polyvCurriculumInfo.data.sections.size() == 0) { - callSuccess(curriculumDetailListener, lists); - } else { - if (canCall) - new LoadVideoVOTalk(curriculumDetailListener, polyvCurriculumInfo.data.sections, lists).getVideoVO(); - } - } - }); - } - - // 获取问题 - public void getQuestion(final String course_id, final PolyvVlmsApiListener.GetQuestionListener listener) { - getAccessToken(new IListener() { - @Override - public void fail(Throwable t) { - callFail(listener, t); - } - - @Override - public void success(Object o) { - callLists.add(vlmsManager.getQuestion(PolyvVlmsTestData.SCHOOL_ID, course_id, accessToken, listener)); - } - }); - } - - // 获取回复 - public void getAnswer(final String question_id, final PolyvVlmsApiListener.GetAnswerListener answerListener) { - getAccessToken(new IListener() { - @Override - public void fail(Throwable t) { - callFail(answerListener, t); - } - - @Override - public void success(Object o) { - callLists.add(vlmsManager.getAnswer(PolyvVlmsTestData.SCHOOL_ID, question_id, accessToken, answerListener)); - } - }); - } - - // 根据界面设计获取问题的详细 - public void getQuesionsDetail(String course_id, final MyQuestionDetailListener detailListener) { - getQuestion(course_id, new PolyvVlmsApiListener.GetQuestionListener() { - @Override - public void fail(Throwable t) { - callFail(detailListener, t); - } - - @Override - public void success(PolyvQuestionInfo polyvQuestionInfo) { - Map maps = new TreeMap(); - if (polyvQuestionInfo.data.questions.size() == 0) { - callSuccess(detailListener, new ArrayList<>(maps.values())); - } else { - int[] j = new int[]{1}; - int i = 0; - if (canCall) - for (PolyvQuestionInfo.Question questoin : polyvQuestionInfo.data.questions) { - getAnswer(questoin.question_id, new MyGetAnswerListener(detailListener, questoin, maps, polyvQuestionInfo.data.questions.size(), j, i++)); - } - } - } - }); - } - - // 添加新问题,注:已购买的课程才能添加问题/回复 - public void addNewQuestion(final String course_id, final String title, final String content, final PolyvVlmsApiListener.AddNewQuestionListener questionListener) { - getAccessToken(new IListener() { - @Override - public void fail(Throwable t) { - callFail(questionListener, t); - } - - @Override - public void success(Object o) { - callLists.add(vlmsManager.addNewQuestion(PolyvVlmsTestData.SCHOOL_ID, course_id, user_id, title, content, accessToken, questionListener)); - } - }); - } - - // 添加新回复 - public void addNewAnswer(final String course_id, final String question_id, final String content, final PolyvVlmsApiListener.AddNewAnswerListener addNewAnswerListener) { - getAccessToken(new IListener() { - @Override - public void fail(Throwable t) { - callFail(addNewAnswerListener, t); - } - - @Override - public void success(Object o) { - callLists.add(vlmsManager.addNewAnswer(PolyvVlmsTestData.SCHOOL_ID, course_id, question_id, user_id, content, accessToken, addNewAnswerListener)); - } - }); - } - - // 添加问题获取的信息转为问题的详细信息 - public QuestionsDetail addQuestionInfoToQuestionDetail(PolyvAddQuestionInfo polyvAddQuestionInfo) { - PolyvVlmsHelper.QuestionsDetail questionsDetail = new PolyvVlmsHelper.QuestionsDetail(); - PolyvQuestionInfo.Question question = new PolyvQuestionInfo.Question(); - question.nickname = polyvAddQuestionInfo.data.nickname; - question.avatar = polyvAddQuestionInfo.data.avatar; - // 转换为html字符 - question.content = PolyvVlmsTransfer.fromHtmlText(polyvAddQuestionInfo.data.content, false); - question.course_id = polyvAddQuestionInfo.data.course_id; - question.date_added = polyvAddQuestionInfo.data.date_added; - question.last_modified = polyvAddQuestionInfo.data.last_modified; - question.question_id = polyvAddQuestionInfo.data.question_id; - question.school_id = polyvAddQuestionInfo.data.school_id; - question.user_id = polyvAddQuestionInfo.data.user_id; - question.title = polyvAddQuestionInfo.data.title; - questionsDetail.question = question; - questionsDetail.answers = new LinkedList(); - questionsDetail.content_display = new SpannableStringBuilder(question.nickname + " : ").append(question.content); - return questionsDetail; - } - - // 添加回复获取的信息转为回复的详细信息 - public QuestionsDetail.AnswerDetail addAnswerInfoToAnswerDetail(PolyvAddAnswerInfo addAnswerInfo) { - QuestionsDetail.AnswerDetail answerDetail = new QuestionsDetail.AnswerDetail(); - PolyvAnswerInfo.Answer answer = new PolyvAnswerInfo.Answer(); - answer.nickname = addAnswerInfo.data.nickname; - answer.answer_id = addAnswerInfo.data.answer_id; - answer.avatar = addAnswerInfo.data.avatar; - // 转换为html字符 - answer.content = PolyvVlmsTransfer.fromHtmlText(addAnswerInfo.data.content, false); - answer.course_id = addAnswerInfo.data.course_id; - answer.date_added = addAnswerInfo.data.date_added; - answer.last_modified = addAnswerInfo.data.last_modified; - answer.question_id = addAnswerInfo.data.question_id; - answer.user_id = addAnswerInfo.data.user_id; - answerDetail.answer = answer; - answerDetail.content_display = new SpannableStringBuilder(answer.nickname + " : ").append(answer.content); - return answerDetail; - } - - public interface GetCoursesDetailListener extends IListener> { - } - - public interface MyCurriculumDetailListener extends IListener> { - } - - public interface MyQuestionDetailListener extends IListener> { - } - - // 结合界面的需求将课程所需的信息整合在一起 - public static class CoursesDetail { - public PolyvCoursesInfo.Course course; - public PolyvCourseDetailInfo.Teacher teacher; - - @Override - public String toString() { - return "CoursesDetail{" + - "course=" + course + - ", teacher=" + teacher + - '}'; - } - } - - // 结合demo界面的需求将课时所需的信息整合在一起 - public static class CurriculumsDetail { - // 章节名称 - public String section_name; - // 课时名称 - public String name; - // 封面图 - public String cover_image; - public PolyvVideoVO videoVO; - public PolyvCurriculumInfo.Lecture lecture; - - @Override - public String toString() { - return "CurriculumDetail{" + - "section_name='" + section_name + '\'' + - ", name='" + name + '\'' + - ", cover_image='" + cover_image + '\'' + - ", videoVO=" + videoVO + - ", lecture=" + lecture + - '}'; - } - } - - // 结合demo界面的需求将问题所需的信息整合在一起 - public static class QuestionsDetail { - public PolyvQuestionInfo.Question question; - public LinkedList answers; - // 需要设置到TextView中的内容 - public SpannableStringBuilder content_display; - - @Override - public String toString() { - return "QuestionsDetail{" + - "question=" + question + - ", answers=" + answers + - ", content_display=" + content_display + - '}'; - } - - public static class AnswerDetail { - public PolyvAnswerInfo.Answer answer; - public SpannableStringBuilder content_display; - - @Override - public String toString() { - return "AnswerDetail{" + - "answer=" + answer + - ", content_display=" + content_display + - '}'; - } - } - } - - public class LoadVideoVOTalk { - private ExecutorService executorService; - private MyCurriculumDetailListener curriculumDetailListener; - private List sections; - private List lists; - - public LoadVideoVOTalk(MyCurriculumDetailListener curriculumDetailListener, List sections, List lists) { - this.curriculumDetailListener = curriculumDetailListener; - this.sections = sections; - this.lists = lists; - executorService = Executors.newSingleThreadExecutor(); - } - - public void getVideoVO() { - futureLists.add(executorService.submit(new Runnable() { - @Override - public void run() { - for (int i = 0; i < sections.size(); i++) { - String section_name = "章节" + (i + 1); - List lectures = sections.get(i).lectures; - for (int j = 0; j < lectures.size(); j++) { - if (!canCall) { - executorService.shutdownNow(); - executorService = null; - return; - } - // 非点播课时不添加 - if (!PolyvCurriculumInfo.TYPE_VIDEO.equals(lectures.get(j).type)) - continue; - // vid为空不添加 - if (TextUtils.isEmpty(lectures.get(j).vid)) - continue; - try { - PolyvVideoVO videoVO = PolyvSDKUtil.loadVideoJSON2Video(lectures.get(j).vid); - if (videoVO == null) { - continue; - } - String name = "课时" + (j + 1); - String cover_image = videoVO.getFirstImage(); - CurriculumsDetail curriculumsDetail = new CurriculumsDetail(); - curriculumsDetail.videoVO = videoVO; - curriculumsDetail.section_name = section_name; - curriculumsDetail.name = name; - curriculumsDetail.cover_image = cover_image; - curriculumsDetail.lecture = lectures.get(j); - lists.add(curriculumsDetail); - } catch (JSONException e) { - // ignore 发生异常的不添加 - } - } - } - callSuccess(curriculumDetailListener, lists); - executorService.shutdownNow(); - executorService = null; - } - })); - } - } - - public class MyGetAnswerListener implements PolyvVlmsApiListener.GetAnswerListener { - private MyQuestionDetailListener questionDetailListener; - private PolyvQuestionInfo.Question question; - private Map maps; - private int coursesSize; - private int[] j; - private int index; - - public MyGetAnswerListener(MyQuestionDetailListener questionDetailListener, PolyvQuestionInfo.Question question, Map maps, int coursesSize, int[] j, int index) { - this.questionDetailListener = questionDetailListener; - this.question = question; - this.maps = maps; - this.coursesSize = coursesSize; - this.j = j; - this.index = index; - } - - @Override - public void fail(Throwable t) { - synchronized (PolyvVlmsHelper.class) { - if (questionDetailListener != null && j[0] == 1 && canCall) - questionDetailListener.fail(t); - j[0] = 0; - } - } - - @Override - public void success(PolyvAnswerInfo polyvAnswerInfo) { - synchronized (PolyvVlmsHelper.class) { - QuestionsDetail questionsDetail = new QuestionsDetail(); - questionsDetail.question = question; - // 换行为html文本 - questionsDetail.question.content = PolyvVlmsTransfer.fromHtmlText(questionsDetail.question.content, false); - LinkedList lists = new LinkedList<>(); - for (PolyvAnswerInfo.Answer answer : polyvAnswerInfo.data.answers) { - QuestionsDetail.AnswerDetail answerDetail = new QuestionsDetail.AnswerDetail(); - answerDetail.answer = answer; - // 换行为html文本 - answerDetail.answer.content = PolyvVlmsTransfer.fromHtmlText(answerDetail.answer.content, false); - answerDetail.content_display = new SpannableStringBuilder(answer.nickname + " : ").append(answer.content); - lists.add(answerDetail); - } - questionsDetail.answers = lists; - questionsDetail.content_display = new SpannableStringBuilder(question.nickname + " : ").append(question.content); - maps.put(index, questionsDetail); - if (questionDetailListener != null && maps.size() == coursesSize && canCall) - questionDetailListener.success(new ArrayList(maps.values())); - } - } - } - - public class MyGetCourseDetailListener implements PolyvVlmsApiListener.GetCourseDetailListener { - private GetCoursesDetailListener getCoursesDetailListener; - private PolyvCoursesInfo.Course course; - private Map maps; - private int coursesSize; - private int[] j; - private int index; - - public MyGetCourseDetailListener(GetCoursesDetailListener getCoursesDetailListener, PolyvCoursesInfo.Course course, Map maps, int coursesSize, int[] j, int index) { - this.getCoursesDetailListener = getCoursesDetailListener; - this.course = course; - this.maps = maps; - this.coursesSize = coursesSize; - this.j = j; - this.index = index; - } - - @Override - public void fail(Throwable t) { - synchronized (PolyvVlmsHelper.class) { - if (getCoursesDetailListener != null && j[0] == 1 && canCall) - getCoursesDetailListener.fail(t); - j[0] = 0; - } - } - - @Override - public void success(PolyvCourseDetailInfo polyvCourseDetailInfo) { - synchronized (PolyvVlmsHelper.class) { - CoursesDetail coursesDetail = new CoursesDetail(); - coursesDetail.course = course; - // 转换为html文本 - coursesDetail.course.summary = PolyvVlmsTransfer.fromHtmlText(coursesDetail.course.summary, true); - if (polyvCourseDetailInfo.data.teachers.size() == 0) { - coursesDetail.teacher = new PolyvCourseDetailInfo.Teacher(); - coursesDetail.teacher.teacher_name = "default"; - } else - coursesDetail.teacher = polyvCourseDetailInfo.data.teachers.get(0); - maps.put(index, coursesDetail); - if (getCoursesDetailListener != null && maps.size() == coursesSize && canCall) - getCoursesDetailListener.success(new ArrayList(maps.values())); - } - } - } -} +package com.easefun.polyvsdk.util; + +import android.text.SpannableStringBuilder; +import android.text.TextUtils; + +import com.easefun.polyvsdk.PolyvSDKUtil; +import com.easefun.polyvsdk.sub.auxilliary.IListener; +import com.easefun.polyvsdk.sub.vlms.auxiliary.PolyvVlmsTransfer; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvAccessTokenInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvAddAnswerInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvAddOrderInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvAddQuestionInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvAnswerInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvCourseDetailInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvCoursesInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvCurriculumInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvQuestionInfo; +import com.easefun.polyvsdk.sub.vlms.entity.PolyvUserInfo; +import com.easefun.polyvsdk.sub.vlms.listener.PolyvVlmsApiListener; +import com.easefun.polyvsdk.sub.vlms.main.PolyvVlmsManager; +import com.easefun.polyvsdk.sub.vlms.main.PolyvVlmsTestData; +import com.easefun.polyvsdk.vo.PolyvVideoVO; + +import org.json.JSONException; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import retrofit2.Call; + +/** + * 对应demo需求的网校接口管理类 + */ +@Deprecated +public class PolyvVlmsHelper { + private static final int accessToken_validTime = 1000 * 60 * 60 * 2; + private static String accessToken, user_id; + private static long getAccessTokenTime; + private PolyvVlmsManager vlmsManager; + private List callLists; + private List futureLists; + private boolean canCall; + + public PolyvVlmsHelper() { + canCall = true; + vlmsManager = new PolyvVlmsManager(null); + callLists = new ArrayList<>(); + futureLists = new ArrayList<>(); + } + + private boolean accessTokenIsInvalid() { + return accessToken == null || (getAccessTokenTime != 0 && (System.currentTimeMillis() - getAccessTokenTime) > accessToken_validTime); + } + + private void callFail(IListener listener, Throwable t) { + if (listener != null && canCall) + listener.fail(t); + } + + private void callSuccess(IListener listener, Object o) { + if (listener != null && canCall) + listener.success(o); + } + + /** + * 销毁所有请求 + */ + public void destroy() { + canCall = false; + for (Call call : callLists) { + if (call != null) { + call.cancel(); + } + } + callLists.clear(); + for (Future future : futureLists) { + if (future != null) { + future.cancel(true); + } + } + futureLists.clear(); + } + + private void getAccessToken(final IListener listener) { + if (accessTokenIsInvalid()) { + callLists.add(vlmsManager.getAccessToken(PolyvVlmsTestData.API_ID, PolyvVlmsTestData.SCHOOL_ID, PolyvVlmsTestData.APP_SECRET, new PolyvVlmsApiListener.GetAccessTokenListener() { + @Override + public void fail(Throwable t) { + callFail(listener, t); + } + + @Override + public void success(PolyvAccessTokenInfo polyvAccessTokenInfo) { + synchronized (vlmsManager) { + if (accessToken == null) { + accessToken = polyvAccessTokenInfo.data.access_token; + getAccessTokenTime = System.currentTimeMillis(); + } + callSuccess(listener, null); + } + } + })); + } else { + callSuccess(listener, null); + } + } + + // 获取课程信息 + public void getCoursesInfo(final int page_size, final String is_free, final PolyvVlmsApiListener.GetCoursesListener coursesListener) { + getAccessToken(new IListener() { + @Override + public void fail(Throwable t) { + callFail(coursesListener, t); + } + + @Override + public void success(Object o) { + callLists.add(vlmsManager.getCourses(PolyvVlmsTestData.SCHOOL_ID, null, is_free, null, 1, page_size, accessToken, coursesListener)); + } + }); + } + + // 获取课程详情 + public void getCourseDetailInfo(final String courseId, final PolyvVlmsApiListener.GetCourseDetailListener detailListener) { + getAccessToken(new IListener() { + @Override + public void fail(Throwable t) { + callFail(detailListener, t); + } + + @Override + public void success(Object o) { + callLists.add(vlmsManager.getCourseDetail(PolyvVlmsTestData.SCHOOL_ID, courseId, PolyvCourseDetailInfo.IS_DETAIL_YES, accessToken, detailListener)); + } + }); + } + + // 根据界面需求获取课程及老师的信息 + public void getCoursesDetail(int page_size, String is_free, final GetCoursesDetailListener coursesDetailListener) { + getCoursesInfo(page_size, is_free, new PolyvVlmsApiListener.GetCoursesListener() { + @Override + public void fail(Throwable t) { + callFail(coursesDetailListener, t); + } + + @Override + public void success(final PolyvCoursesInfo polyvCoursesInfo) { + final Map maps = new TreeMap(); + if (polyvCoursesInfo.data.courses.size() == 0) { + callSuccess(coursesDetailListener, new ArrayList(maps.values())); + } else { + int[] j = new int[]{1}; + int i = 0; + for (int k = 0; k < polyvCoursesInfo.data.courses.size(); k++) { + // 非点播的课程视频不添加 + if (!PolyvCoursesInfo.COURSE_TYPE_VOD.equals(polyvCoursesInfo.data.courses.get(k).course_type)) + polyvCoursesInfo.data.courses.remove(polyvCoursesInfo.data.courses.get(k)); + } + if (polyvCoursesInfo.data.courses.size() == 0) { + callSuccess(coursesDetailListener, new ArrayList(maps.values())); + return; + } + if (canCall) + for (PolyvCoursesInfo.Course course : polyvCoursesInfo.data.courses) { + getCourseDetailInfo(course.course_id, new MyGetCourseDetailListener(coursesDetailListener, course, maps, polyvCoursesInfo.data.courses.size(), j, i++)); + } + } + } + }); + } + + private boolean isLogin() { + return !TextUtils.isEmpty(user_id); + } + + // 登录,获取user_id + public void login(final IListener listener) { + getAccessToken(new IListener() { + @Override + public void fail(Throwable t) { + callFail(listener, t); + } + + @Override + public void success(Object o) { + if (!isLogin()) + callLists.add(vlmsManager.login(PolyvVlmsTestData.SCHOOL_ID, PolyvVlmsTestData.ACCOUNT, PolyvVlmsTestData.PASSWORD, accessToken, new PolyvVlmsApiListener.LoginListener() { + @Override + public void fail(Throwable t) { + callFail(listener, t); + } + + @Override + public void success(PolyvUserInfo polyvUserInfo) { + user_id = polyvUserInfo.data.user_id; + callSuccess(listener, null); + } + })); + else + callSuccess(listener, null); + } + }); + } + + // 为免费课程添加订单,注:已购买的课程,再次购买会回调失败。 + public void addOrder(final String course_id, final PolyvVlmsApiListener.AddOrderListener addOrderListener) { + login(new PolyvVlmsApiListener.LoginListener() { + @Override + public void fail(Throwable t) { + callFail(addOrderListener, t); + } + + @Override + public void success(PolyvUserInfo polyvUserInfo) { + callLists.add(vlmsManager.addOrder(PolyvVlmsTestData.SCHOOL_ID, user_id, course_id, PolyvAddOrderInfo.PAYMENT_TYPE_FREE, accessToken, addOrderListener)); + } + }); + } + + // 获取课时信息 + public void getCurriculum(final String course_id, final PolyvVlmsApiListener.GetCurriculumListener curriculumListener) { + login(new PolyvVlmsApiListener.LoginListener() { + @Override + public void fail(Throwable t) { + callFail(curriculumListener, t); + } + + @Override + public void success(PolyvUserInfo polyvUserInfo) { + callLists.add(vlmsManager.getCurriculum(PolyvVlmsTestData.SCHOOL_ID, course_id, user_id, accessToken, curriculumListener)); + } + }); + } + + // 根据界面需求获取课时信息 + public void getCurriculumDetail(String course_id, final MyCurriculumDetailListener curriculumDetailListener) { + getCurriculum(course_id, new PolyvVlmsApiListener.GetCurriculumListener() { + @Override + public void fail(Throwable t) { + callFail(curriculumDetailListener, t); + } + + @Override + public void success(PolyvCurriculumInfo polyvCurriculumInfo) { + List lists = new ArrayList(); + if (polyvCurriculumInfo.data.sections.size() == 0) { + callSuccess(curriculumDetailListener, lists); + } else { + if (canCall) + new LoadVideoVOTalk(curriculumDetailListener, polyvCurriculumInfo.data.sections, lists).getVideoVO(); + } + } + }); + } + + // 获取问题 + public void getQuestion(final String course_id, final PolyvVlmsApiListener.GetQuestionListener listener) { + getAccessToken(new IListener() { + @Override + public void fail(Throwable t) { + callFail(listener, t); + } + + @Override + public void success(Object o) { + callLists.add(vlmsManager.getQuestion(PolyvVlmsTestData.SCHOOL_ID, course_id, accessToken, listener)); + } + }); + } + + // 获取回复 + public void getAnswer(final String question_id, final PolyvVlmsApiListener.GetAnswerListener answerListener) { + getAccessToken(new IListener() { + @Override + public void fail(Throwable t) { + callFail(answerListener, t); + } + + @Override + public void success(Object o) { + callLists.add(vlmsManager.getAnswer(PolyvVlmsTestData.SCHOOL_ID, question_id, accessToken, answerListener)); + } + }); + } + + // 根据界面设计获取问题的详细 + public void getQuesionsDetail(String course_id, final MyQuestionDetailListener detailListener) { + getQuestion(course_id, new PolyvVlmsApiListener.GetQuestionListener() { + @Override + public void fail(Throwable t) { + callFail(detailListener, t); + } + + @Override + public void success(PolyvQuestionInfo polyvQuestionInfo) { + Map maps = new TreeMap(); + if (polyvQuestionInfo.data.questions.size() == 0) { + callSuccess(detailListener, new ArrayList<>(maps.values())); + } else { + int[] j = new int[]{1}; + int i = 0; + if (canCall) + for (PolyvQuestionInfo.Question questoin : polyvQuestionInfo.data.questions) { + getAnswer(questoin.question_id, new MyGetAnswerListener(detailListener, questoin, maps, polyvQuestionInfo.data.questions.size(), j, i++)); + } + } + } + }); + } + + // 添加新问题,注:已购买的课程才能添加问题/回复 + public void addNewQuestion(final String course_id, final String title, final String content, final PolyvVlmsApiListener.AddNewQuestionListener questionListener) { + getAccessToken(new IListener() { + @Override + public void fail(Throwable t) { + callFail(questionListener, t); + } + + @Override + public void success(Object o) { + callLists.add(vlmsManager.addNewQuestion(PolyvVlmsTestData.SCHOOL_ID, course_id, user_id, title, content, accessToken, questionListener)); + } + }); + } + + // 添加新回复 + public void addNewAnswer(final String course_id, final String question_id, final String content, final PolyvVlmsApiListener.AddNewAnswerListener addNewAnswerListener) { + getAccessToken(new IListener() { + @Override + public void fail(Throwable t) { + callFail(addNewAnswerListener, t); + } + + @Override + public void success(Object o) { + callLists.add(vlmsManager.addNewAnswer(PolyvVlmsTestData.SCHOOL_ID, course_id, question_id, user_id, content, accessToken, addNewAnswerListener)); + } + }); + } + + // 添加问题获取的信息转为问题的详细信息 + public QuestionsDetail addQuestionInfoToQuestionDetail(PolyvAddQuestionInfo polyvAddQuestionInfo) { + PolyvVlmsHelper.QuestionsDetail questionsDetail = new PolyvVlmsHelper.QuestionsDetail(); + PolyvQuestionInfo.Question question = new PolyvQuestionInfo.Question(); + question.nickname = polyvAddQuestionInfo.data.nickname; + question.avatar = polyvAddQuestionInfo.data.avatar; + // 转换为html字符 + question.content = PolyvVlmsTransfer.fromHtmlText(polyvAddQuestionInfo.data.content, false); + question.course_id = polyvAddQuestionInfo.data.course_id; + question.date_added = polyvAddQuestionInfo.data.date_added; + question.last_modified = polyvAddQuestionInfo.data.last_modified; + question.question_id = polyvAddQuestionInfo.data.question_id; + question.school_id = polyvAddQuestionInfo.data.school_id; + question.user_id = polyvAddQuestionInfo.data.user_id; + question.title = polyvAddQuestionInfo.data.title; + questionsDetail.question = question; + questionsDetail.answers = new LinkedList(); + questionsDetail.content_display = new SpannableStringBuilder(question.nickname + " : ").append(question.content); + return questionsDetail; + } + + // 添加回复获取的信息转为回复的详细信息 + public QuestionsDetail.AnswerDetail addAnswerInfoToAnswerDetail(PolyvAddAnswerInfo addAnswerInfo) { + QuestionsDetail.AnswerDetail answerDetail = new QuestionsDetail.AnswerDetail(); + PolyvAnswerInfo.Answer answer = new PolyvAnswerInfo.Answer(); + answer.nickname = addAnswerInfo.data.nickname; + answer.answer_id = addAnswerInfo.data.answer_id; + answer.avatar = addAnswerInfo.data.avatar; + // 转换为html字符 + answer.content = PolyvVlmsTransfer.fromHtmlText(addAnswerInfo.data.content, false); + answer.course_id = addAnswerInfo.data.course_id; + answer.date_added = addAnswerInfo.data.date_added; + answer.last_modified = addAnswerInfo.data.last_modified; + answer.question_id = addAnswerInfo.data.question_id; + answer.user_id = addAnswerInfo.data.user_id; + answerDetail.answer = answer; + answerDetail.content_display = new SpannableStringBuilder(answer.nickname + " : ").append(answer.content); + return answerDetail; + } + + public interface GetCoursesDetailListener extends IListener> { + } + + public interface MyCurriculumDetailListener extends IListener> { + } + + public interface MyQuestionDetailListener extends IListener> { + } + + // 结合界面的需求将课程所需的信息整合在一起 + public static class CoursesDetail { + public PolyvCoursesInfo.Course course; + public PolyvCourseDetailInfo.Teacher teacher; + + @Override + public String toString() { + return "CoursesDetail{" + + "course=" + course + + ", teacher=" + teacher + + '}'; + } + } + + // 结合demo界面的需求将课时所需的信息整合在一起 + public static class CurriculumsDetail { + // 章节名称 + public String section_name; + // 课时名称 + public String name; + // 封面图 + public String cover_image; + public PolyvVideoVO videoVO; + public PolyvCurriculumInfo.Lecture lecture; + + @Override + public String toString() { + return "CurriculumDetail{" + + "section_name='" + section_name + '\'' + + ", name='" + name + '\'' + + ", cover_image='" + cover_image + '\'' + + ", videoVO=" + videoVO + + ", lecture=" + lecture + + '}'; + } + } + + // 结合demo界面的需求将问题所需的信息整合在一起 + public static class QuestionsDetail { + public PolyvQuestionInfo.Question question; + public LinkedList answers; + // 需要设置到TextView中的内容 + public SpannableStringBuilder content_display; + + @Override + public String toString() { + return "QuestionsDetail{" + + "question=" + question + + ", answers=" + answers + + ", content_display=" + content_display + + '}'; + } + + public static class AnswerDetail { + public PolyvAnswerInfo.Answer answer; + public SpannableStringBuilder content_display; + + @Override + public String toString() { + return "AnswerDetail{" + + "answer=" + answer + + ", content_display=" + content_display + + '}'; + } + } + } + + public class LoadVideoVOTalk { + private ExecutorService executorService; + private MyCurriculumDetailListener curriculumDetailListener; + private List sections; + private List lists; + + public LoadVideoVOTalk(MyCurriculumDetailListener curriculumDetailListener, List sections, List lists) { + this.curriculumDetailListener = curriculumDetailListener; + this.sections = sections; + this.lists = lists; + executorService = Executors.newSingleThreadExecutor(); + } + + public void getVideoVO() { + futureLists.add(executorService.submit(new Runnable() { + @Override + public void run() { + for (int i = 0; i < sections.size(); i++) { + String section_name = "章节" + (i + 1); + List lectures = sections.get(i).lectures; + for (int j = 0; j < lectures.size(); j++) { + if (!canCall) { + executorService.shutdownNow(); + executorService = null; + return; + } + // 非点播课时不添加 + if (!PolyvCurriculumInfo.TYPE_VIDEO.equals(lectures.get(j).type)) + continue; + // vid为空不添加 + if (TextUtils.isEmpty(lectures.get(j).vid)) + continue; + try { + PolyvVideoVO videoVO = PolyvSDKUtil.loadVideoJSON2Video(lectures.get(j).vid); + if (videoVO == null) { + continue; + } + String name = "课时" + (j + 1); + String cover_image = videoVO.getFirstImage(); + CurriculumsDetail curriculumsDetail = new CurriculumsDetail(); + curriculumsDetail.videoVO = videoVO; + curriculumsDetail.section_name = section_name; + curriculumsDetail.name = name; + curriculumsDetail.cover_image = cover_image; + curriculumsDetail.lecture = lectures.get(j); + lists.add(curriculumsDetail); + } catch (JSONException e) { + // ignore 发生异常的不添加 + } + } + } + callSuccess(curriculumDetailListener, lists); + executorService.shutdownNow(); + executorService = null; + } + })); + } + } + + public class MyGetAnswerListener implements PolyvVlmsApiListener.GetAnswerListener { + private MyQuestionDetailListener questionDetailListener; + private PolyvQuestionInfo.Question question; + private Map maps; + private int coursesSize; + private int[] j; + private int index; + + public MyGetAnswerListener(MyQuestionDetailListener questionDetailListener, PolyvQuestionInfo.Question question, Map maps, int coursesSize, int[] j, int index) { + this.questionDetailListener = questionDetailListener; + this.question = question; + this.maps = maps; + this.coursesSize = coursesSize; + this.j = j; + this.index = index; + } + + @Override + public void fail(Throwable t) { + synchronized (PolyvVlmsHelper.class) { + if (questionDetailListener != null && j[0] == 1 && canCall) + questionDetailListener.fail(t); + j[0] = 0; + } + } + + @Override + public void success(PolyvAnswerInfo polyvAnswerInfo) { + synchronized (PolyvVlmsHelper.class) { + QuestionsDetail questionsDetail = new QuestionsDetail(); + questionsDetail.question = question; + // 换行为html文本 + questionsDetail.question.content = PolyvVlmsTransfer.fromHtmlText(questionsDetail.question.content, false); + LinkedList lists = new LinkedList<>(); + for (PolyvAnswerInfo.Answer answer : polyvAnswerInfo.data.answers) { + QuestionsDetail.AnswerDetail answerDetail = new QuestionsDetail.AnswerDetail(); + answerDetail.answer = answer; + // 换行为html文本 + answerDetail.answer.content = PolyvVlmsTransfer.fromHtmlText(answerDetail.answer.content, false); + answerDetail.content_display = new SpannableStringBuilder(answer.nickname + " : ").append(answer.content); + lists.add(answerDetail); + } + questionsDetail.answers = lists; + questionsDetail.content_display = new SpannableStringBuilder(question.nickname + " : ").append(question.content); + maps.put(index, questionsDetail); + if (questionDetailListener != null && maps.size() == coursesSize && canCall) + questionDetailListener.success(new ArrayList(maps.values())); + } + } + } + + public class MyGetCourseDetailListener implements PolyvVlmsApiListener.GetCourseDetailListener { + private GetCoursesDetailListener getCoursesDetailListener; + private PolyvCoursesInfo.Course course; + private Map maps; + private int coursesSize; + private int[] j; + private int index; + + public MyGetCourseDetailListener(GetCoursesDetailListener getCoursesDetailListener, PolyvCoursesInfo.Course course, Map maps, int coursesSize, int[] j, int index) { + this.getCoursesDetailListener = getCoursesDetailListener; + this.course = course; + this.maps = maps; + this.coursesSize = coursesSize; + this.j = j; + this.index = index; + } + + @Override + public void fail(Throwable t) { + synchronized (PolyvVlmsHelper.class) { + if (getCoursesDetailListener != null && j[0] == 1 && canCall) + getCoursesDetailListener.fail(t); + j[0] = 0; + } + } + + @Override + public void success(PolyvCourseDetailInfo polyvCourseDetailInfo) { + synchronized (PolyvVlmsHelper.class) { + CoursesDetail coursesDetail = new CoursesDetail(); + coursesDetail.course = course; + // 转换为html文本 + coursesDetail.course.summary = PolyvVlmsTransfer.fromHtmlText(coursesDetail.course.summary, true); + if (polyvCourseDetailInfo.data.teachers.size() == 0) { + coursesDetail.teacher = new PolyvCourseDetailInfo.Teacher(); + coursesDetail.teacher.teacher_name = "default"; + } else + coursesDetail.teacher = polyvCourseDetailInfo.data.teachers.get(0); + maps.put(index, coursesDetail); + if (getCoursesDetailListener != null && maps.size() == coursesSize && canCall) + getCoursesDetailListener.success(new ArrayList(maps.values())); + } + } + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/IcsLinearLayout.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/IcsLinearLayout.java index c366384..1c135e1 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/IcsLinearLayout.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/IcsLinearLayout.java @@ -360,7 +360,7 @@ private void useLargestChildHorizontal() { for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); - if (child == null || child.getVisibility() == View.INVISIBLE) { + if (child == null || child.getVisibility() == View.GONE) { continue; } @@ -402,7 +402,7 @@ private void useLargestChildVertical() { for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); - if (child == null || child.getVisibility() == View.INVISIBLE) { + if (child == null || child.getVisibility() == View.GONE) { continue; } diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/LinearListView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/LinearListView.java index 6dcd3d3..e96e609 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/LinearListView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/LinearListView.java @@ -228,7 +228,7 @@ private void updateEmptyStatus(boolean empty) { if (empty) { if (mEmptyView != null) { mEmptyView.setVisibility(View.VISIBLE); - setVisibility(View.INVISIBLE); + setVisibility(View.GONE); } else { // If the caller just removed our empty view, make sure the list // view is visible @@ -236,7 +236,7 @@ private void updateEmptyStatus(boolean empty) { } } else { if (mEmptyView != null) - mEmptyView.setVisibility(View.INVISIBLE); + mEmptyView.setVisibility(View.GONE); setVisibility(View.VISIBLE); } } diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvCircleProgressView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvCircleProgressView.java index 9e14fb3..d2b9014 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvCircleProgressView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvCircleProgressView.java @@ -6,7 +6,7 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.View; diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvGrayImageView.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvGrayImageView.java index d35cf8e..fafe056 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvGrayImageView.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvGrayImageView.java @@ -1,37 +1,37 @@ -package com.easefun.polyvsdk.view; - -import com.easefun.polyvsdk.R; - -import android.content.Context; -import android.graphics.Canvas; -import android.util.AttributeSet; -import android.widget.ImageView; - -public class PolyvGrayImageView extends ImageView { - - public PolyvGrayImageView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public PolyvGrayImageView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public PolyvGrayImageView(Context context) { - super(context); - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - if (isPressed()) - // canvas.drawColor(0x33000000); - canvas.drawColor(getResources().getColor(R.color.commom_click_color_gray_half)); - } - - @Override - protected void dispatchSetPressed(boolean pressed) { - super.dispatchSetPressed(pressed); - invalidate(); - } -} +package com.easefun.polyvsdk.view; + +import com.easefun.polyvsdk.R; + +import android.content.Context; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.widget.ImageView; + +public class PolyvGrayImageView extends ImageView { + + public PolyvGrayImageView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public PolyvGrayImageView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public PolyvGrayImageView(Context context) { + super(context); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (isPressed()) + // canvas.drawColor(0x33000000); + canvas.drawColor(getResources().getColor(R.color.commom_click_color_gray_half)); + } + + @Override + protected void dispatchSetPressed(boolean pressed) { + super.dispatchSetPressed(pressed); + invalidate(); + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvLoadingLayout.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvLoadingLayout.java index f39f5c9..0043246 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvLoadingLayout.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvLoadingLayout.java @@ -4,8 +4,8 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -19,8 +19,6 @@ import java.util.Locale; -import tv.danmaku.ijk.media.player.IjkMediaPlayer; - public class PolyvLoadingLayout extends FrameLayout { private ProgressBar loadingProgress; private TextView loadingSpeed; @@ -32,14 +30,10 @@ public class PolyvLoadingLayout extends FrameLayout { public void handleMessage(Message msg) { if (msg.what == 1) { if (videoView != null && !videoView.isLocalPlay()) { - IjkMediaPlayer mp = videoView.getIjkMediaPlayer(); - if (mp != null) { - long tcpSpeed = mp.getTcpSpeed(); - loadingSpeed.setVisibility(View.VISIBLE); - loadingSpeed.setText(formatedSpeed(tcpSpeed, 1000)); - - handler.sendEmptyMessageDelayed(1, 500); - } + loadingSpeed.setVisibility(View.VISIBLE); + loadingSpeed.setText(formatedSpeed(videoView.getTcpSpeed(), 1000)); + + handler.sendEmptyMessageDelayed(1, 500); } } } @@ -110,7 +104,7 @@ private void acceptVisibilityChange(int visibility) { if (visibility == View.VISIBLE) { handler.sendEmptyMessage(1); } else { - loadingSpeed.setVisibility(View.INVISIBLE); + loadingSpeed.setVisibility(View.GONE); } } diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvNetworkPoorIndicateLayout.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvNetworkPoorIndicateLayout.java new file mode 100644 index 0000000..f98662e --- /dev/null +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvNetworkPoorIndicateLayout.java @@ -0,0 +1,289 @@ +package com.easefun.polyvsdk.view; + +import android.content.Context; +import android.graphics.Color; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.style.ForegroundColorSpan; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.easefun.polyvsdk.PolyvBitRate; +import com.easefun.polyvsdk.R; + +import java.util.LinkedList; + +/** + * 弱网缓冲时,切换清晰度提示条 + * + * @author suhongtao + */ +public class PolyvNetworkPoorIndicateLayout extends FrameLayout { + + // + + // 计时:5秒卡顿进行一次提示 + private static final long INDICATE_BUFFERING_TIMEOUT = 5 * 1000; + // 计次:计算10秒内卡顿次数 + private static final long INDICATE_COUNT_BUFFERING_DURATION = 10 * 1000; + // 计次:2次卡顿进行一次提示 + private static final int INDICATE_BUFFERING_COUNT_TOO_MORE_THRESHOLD = 2; + // 一次提示显示时长 + private static final int SHOW_INDICATE_DURATION = 5 * 1000; + + // + + // + + private View rootView; + private LinearLayout plvPoorNetworkIndicateLayout; + private TextView plvPoorNetworkSwitchBitrateTv; + private TextView plvPoorNetworkIgnoreTv; + + private final LinkedList bufferingCacheList = new LinkedList<>(); + + private static final int MSG_WHAT_DROP_FIRST_BUFFERING = 1; + private static final int MSG_WHAT_CHECK_BUFFERING_TOO_LONG = 2; + private static final int MSG_WHAT_HIDE_LAYOUT = 3; + private final Handler handler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(@NonNull Message msg) { + switch (msg.what) { + case MSG_WHAT_DROP_FIRST_BUFFERING: + removeFirstBufferCache(); + break; + case MSG_WHAT_CHECK_BUFFERING_TOO_LONG: + checkBufferingTooLong(); + break; + case MSG_WHAT_HIDE_LAYOUT: + show(false); + break; + default: + } + } + }; + + private OnViewActionListener onViewActionListener; + + private long lastSeekTimestamp = 0; + private boolean ignoreNetworkPoor = false; + + // + + // + + public PolyvNetworkPoorIndicateLayout(@NonNull Context context) { + this(context, null); + } + + public PolyvNetworkPoorIndicateLayout(@NonNull Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public PolyvNetworkPoorIndicateLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(); + } + + // + + // + + private void initView() { + rootView = LayoutInflater.from(getContext()).inflate(R.layout.polyv_player_network_poor_indicate_layout, this); + findView(); + setIgnoreOnClick(); + } + + private void findView() { + plvPoorNetworkIndicateLayout = (LinearLayout) rootView.findViewById(R.id.plv_poor_network_indicate_layout); + plvPoorNetworkSwitchBitrateTv = (TextView) rootView.findViewById(R.id.plv_poor_network_switch_bitrate_tv); + plvPoorNetworkIgnoreTv = (TextView) rootView.findViewById(R.id.plv_poor_network_ignore_tv); + } + + private void setIgnoreOnClick() { + plvPoorNetworkIgnoreTv.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + ignoreNetworkPoor = true; + show(false); + } + }); + } + + // + + // + + public void notifyBufferingStart() { + if (ignoreNetworkPoor) { + return; + } + final boolean isBufferBySeek = System.currentTimeMillis() - lastSeekTimestamp < 500; + bufferingCacheList.add(new BufferingCacheVO(System.currentTimeMillis(), isBufferBySeek)); + handler.sendEmptyMessageDelayed(MSG_WHAT_CHECK_BUFFERING_TOO_LONG, INDICATE_BUFFERING_TIMEOUT); + handler.sendEmptyMessageDelayed(MSG_WHAT_DROP_FIRST_BUFFERING, INDICATE_COUNT_BUFFERING_DURATION); + checkBufferingCountTooMore(); + } + + public void notifyBufferingEnd() { + if (!bufferingCacheList.isEmpty()) { + bufferingCacheList.getLast().bufferingEnd = true; + } + } + + public void notifySeek() { + lastSeekTimestamp = System.currentTimeMillis(); + } + + public void reset() { + bufferingCacheList.clear(); + show(false); + } + + public void setOnViewActionListener(OnViewActionListener onViewActionListener) { + this.onViewActionListener = onViewActionListener; + } + + public void destroy() { + handler.removeMessages(MSG_WHAT_DROP_FIRST_BUFFERING); + handler.removeMessages(MSG_WHAT_CHECK_BUFFERING_TOO_LONG); + handler.removeMessages(MSG_WHAT_HIDE_LAYOUT); + } + + // + + // + + private void removeFirstBufferCache() { + if (!bufferingCacheList.isEmpty()) { + bufferingCacheList.removeFirst(); + } + } + + private void checkBufferingTooLong() { + if (ignoreNetworkPoor) { + return; + } + if (bufferingCacheList.isEmpty()) { + return; + } + if (bufferingCacheList.getLast().bufferingEnd) { + return; + } + if (System.currentTimeMillis() - bufferingCacheList.getLast().timestamp < INDICATE_BUFFERING_TIMEOUT) { + return; + } + + if (canUpdateBitrate()) { + show(true); + handler.removeMessages(MSG_WHAT_HIDE_LAYOUT); + handler.sendMessageDelayed(handler.obtainMessage(MSG_WHAT_HIDE_LAYOUT), SHOW_INDICATE_DURATION); + } + } + + private void checkBufferingCountTooMore() { + while (!bufferingCacheList.isEmpty()) { + if (System.currentTimeMillis() - bufferingCacheList.getFirst().timestamp > INDICATE_COUNT_BUFFERING_DURATION) { + bufferingCacheList.removeFirst(); + } else { + break; + } + } + if (bufferingCacheList.size() < INDICATE_BUFFERING_COUNT_TOO_MORE_THRESHOLD) { + return; + } + int countExceptSeekBuffer = 0; + for (BufferingCacheVO vo : bufferingCacheList) { + if (!vo.bySeek) { + countExceptSeekBuffer++; + } + } + if (countExceptSeekBuffer < INDICATE_BUFFERING_COUNT_TOO_MORE_THRESHOLD) { + return; + } + + if (canUpdateBitrate()) { + show(true); + handler.removeMessages(MSG_WHAT_HIDE_LAYOUT); + handler.sendMessageDelayed(handler.obtainMessage(MSG_WHAT_HIDE_LAYOUT), SHOW_INDICATE_DURATION); + } + } + + private void show(boolean toShow) { + if (toShow) { + setVisibility(VISIBLE); + } else { + setVisibility(GONE); + } + } + + private boolean canUpdateBitrate() { + if (onViewActionListener == null) { + return false; + } + final int lowerBitrate = onViewActionListener.getLowerBitrate(); + if (lowerBitrate < PolyvBitRate.liuChang.getNum()) { + return false; + } + final PolyvBitRate bitRate = PolyvBitRate.getBitRate(lowerBitrate); + plvPoorNetworkSwitchBitrateTv.setText("切换到" + bitRate.getName()); + plvPoorNetworkSwitchBitrateTv.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + show(false); + if (onViewActionListener != null) { + boolean success = onViewActionListener.changeBitrate(lowerBitrate); + if (success) { + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("已为您切换为" + bitRate.getName()); + spannableStringBuilder.setSpan(new ForegroundColorSpan(Color.parseColor("#31adfe")), 6, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + Toast.makeText(getContext(), spannableStringBuilder, Toast.LENGTH_SHORT).show(); + PolyvNetworkPoorIndicateLayout.this.reset(); + } else { + Toast.makeText(getContext(), "切换失败", Toast.LENGTH_SHORT).show(); + } + } + } + }); + return true; + } + + // + + // + + public interface OnViewActionListener { + int getLowerBitrate(); + + boolean changeBitrate(int bitrate); + } + + // + + // + + private class BufferingCacheVO { + private long timestamp; + private boolean bufferingEnd; + private boolean bySeek; + + public BufferingCacheVO(long timestamp, boolean bySeek) { + this.timestamp = timestamp; + this.bufferingEnd = false; + this.bySeek = bySeek; + } + } + + // + +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvScreencastSearchLayout.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvScreencastSearchLayout.java deleted file mode 100644 index 1951c39..0000000 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvScreencastSearchLayout.java +++ /dev/null @@ -1,628 +0,0 @@ -package com.easefun.polyvsdk.view; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.res.Configuration; -import android.net.ConnectivityManager; -import android.os.Handler; -import android.os.Message; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.adapter.PolyvScreencastDeviceListAdapter; -import com.easefun.polyvsdk.screencast.PolyvAllCast; -import com.easefun.polyvsdk.screencast.PolyvIUIUpdateListener; -import com.easefun.polyvsdk.screencast.PolyvScreencastHelper; -import com.easefun.polyvsdk.screencast.utils.PolyvLogger; -import com.easefun.polyvsdk.screencast.utils.PolyvToastUtil; -import com.easefun.polyvsdk.util.PolyvNetworkUtils; -import com.easefun.polyvsdk.video.PolyvVideoType; -import com.easefun.polyvsdk.vo.PolyvVideoVO; -import com.hpplay.common.utils.NetworkUtil; -import com.hpplay.sdk.source.api.IConnectListener; -import com.hpplay.sdk.source.browse.api.ILelinkServiceManager; -import com.hpplay.sdk.source.browse.api.LelinkServiceInfo; - -import java.lang.ref.WeakReference; -import java.util.List; -import java.util.concurrent.TimeUnit; - -public class PolyvScreencastSearchLayout extends FrameLayout implements View.OnClickListener { - private static final String TAG = PolyvScreencastSearchLayout.class.getSimpleName(); - private static final String WIFI_AP_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_AP_STATE_CHANGED"; - private OnVisibilityChangedListener onVisibilityChangedListener; - private LinearLayout ll_search; - private TextView tv_cancel, tv_wifi_name; - private ImageView iv_refresh, iv_wifi_icon; - private RecyclerView rv_devices; - private PolyvScreencastDeviceListAdapter screencastDeviceListAdapter; - private Runnable runnable; - //screencast - private PolyvScreencastHelper screencastHelper; - private NetworkReceiver networkReceiver; - private PolyvScreencastStatusLayout screencastStatusLayout; - private boolean isFirstBrowse; - private UIHandler delayHandler; - - private boolean isLandLayout; - - private static class UIHandler extends Handler { - private WeakReference reference; - - UIHandler(PolyvScreencastSearchLayout rf) { - reference = new WeakReference<>(rf); - } - - @Override - public void handleMessage(Message msg) { - PolyvScreencastSearchLayout searchLayout = reference.get(); - if (searchLayout == null) { - return; - } - switch (msg.what) { - case PolyvIUIUpdateListener.STATE_SEARCH_SUCCESS: - searchLayout.updateBrowseAdapter(); - break; - } - super.handleMessage(msg); - } - } - - public PolyvScreencastSearchLayout(@NonNull Context context) { - this(context, null); - } - - public PolyvScreencastSearchLayout(@NonNull Context context, @Nullable AttributeSet attrs) { - this(context, attrs, 0); - } - - public PolyvScreencastSearchLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - initView(); - registerNetworkReceiver(); - refreshWifiName(); - } - - public void setScreencastStatusLayout(PolyvScreencastStatusLayout screencastStatusLayout) { - this.screencastStatusLayout = screencastStatusLayout; - } - - private Context getApplicationContext() { - return getContext().getApplicationContext(); - } - - private void initView() { - isLandLayout = getAlpha() != 1; - LayoutInflater.from(getContext()).inflate(!isLandLayout ? R.layout.polyv_screencast_search_layout : R.layout.polyv_screencast_search_layout_land, this); - ll_search = (LinearLayout) findViewById(R.id.ll_search); - iv_wifi_icon = (ImageView) findViewById(R.id.iv_wifi_icon); - tv_wifi_name = (TextView) findViewById(R.id.tv_wifi_name); - iv_refresh = (ImageView) findViewById(R.id.iv_refresh); - iv_refresh.setOnClickListener(this); - tv_cancel = (TextView) findViewById(R.id.tv_cancel); - if (tv_cancel != null) { - tv_cancel.setOnClickListener(this); - } - rv_devices = (RecyclerView) findViewById(R.id.rv_devices); - screencastDeviceListAdapter = new PolyvScreencastDeviceListAdapter(rv_devices, !isLandLayout ? R.layout.polyv_recyclerview_device_item : R.layout.polyv_recyclerview_device_item_land); - rv_devices.setAdapter(screencastDeviceListAdapter); - screencastDeviceListAdapter.setOnItemClickListener(new PolyvScreencastDeviceListAdapter.OnItemClickListener() { - @Override - public void onClick(int position, LelinkServiceInfo info) { - //检测是否点击的相同的设备 - List connectInfos = null; - if (null != screencastHelper) { - connectInfos = screencastHelper.getConnectInfos(); - } - if (null != screencastHelper && null != connectInfos && !connectInfos.isEmpty()) { - for (LelinkServiceInfo lelinkServiceInfo : connectInfos) { - if (lelinkServiceInfo != null && lelinkServiceInfo.getUid() != null && lelinkServiceInfo.getUid().equals(info.getUid())) { - return; - } - } - } - - removeCallbacks(runnable); - - stop(); - disConnect(); - connect(info); - screencastDeviceListAdapter.setSelectInfo(info); - screencastDeviceListAdapter.notifyDataSetChanged(); - - screencastStatusLayout.show(info); - hide(true); - } - }); - delayHandler = new UIHandler(this); - } - - public void setScreencastHelper(PolyvScreencastHelper screencastHelper) { - this.screencastHelper = screencastHelper; - } - - private void registerNetworkReceiver() { - networkReceiver = new NetworkReceiver(this); - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(WIFI_AP_STATE_CHANGED_ACTION); - intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); - getContext().registerReceiver(networkReceiver, intentFilter); - } - - public void destroy() { - if (null != networkReceiver) { - getContext().unregisterReceiver(networkReceiver); - networkReceiver = null; - } - } - - public String getCurrentPlayPath() { - return screencastHelper.getCurrentPlayPath(); - } - - public void show() { - if (getVisibility() == View.VISIBLE) - return; - screencastHelper.setUIUpdateListener(iUIUpdateListener); - screencastHelper.setActivityConenctListener(iConnectListener); - setVisibility(View.VISIBLE); - if (onVisibilityChangedListener != null) { - onVisibilityChangedListener.onVisibilityChanged(this, View.VISIBLE); - } - //搜索设备 - browse(); - } - - public void hide(boolean isStopBrowse) { - if (getVisibility() != View.VISIBLE) - return; - setVisibility(View.INVISIBLE); - if (onVisibilityChangedListener != null) { - onVisibilityChangedListener.onVisibilityChanged(this, View.INVISIBLE); - } - if (isStopBrowse) { - stopBrowse(); - } - } - - public void stop() { - List connectInfos = null; - if (null != screencastHelper) { - connectInfos = screencastHelper.getConnectInfos(); - } - if (null != screencastHelper && null != connectInfos && !connectInfos.isEmpty()) { - PolyvLogger.test(TAG, "stop click"); - screencastHelper.stop(); - } -// else { -// PolyvToastUtil.show(getApplicationContext(), "请先连接设备"); -// } - } - - public void voulumeUp() { - List connectInfos = null; - if (null != screencastHelper) { - connectInfos = screencastHelper.getConnectInfos(); - } - if (null != screencastHelper && null != connectInfos && !connectInfos.isEmpty()) { - PolyvLogger.test(TAG, "volumeUp click"); - screencastHelper.voulumeUp(); - } else { - PolyvToastUtil.show(getApplicationContext(), "请先连接设备"); - } - } - - public void voulumeDown() { - List connectInfos = null; - if (null != screencastHelper) { - connectInfos = screencastHelper.getConnectInfos(); - } - if (null != screencastHelper && null != connectInfos && !connectInfos.isEmpty()) { - PolyvLogger.test(TAG, "volumeDown click"); - screencastHelper.voulumeDown(); - } else { - PolyvToastUtil.show(getApplicationContext(), "请先连接设备"); - } - } - - public void disConnect() { - disConnect(true); - } - - public void disConnect(boolean isSelectNull) { - LelinkServiceInfo selectInfo = screencastDeviceListAdapter.getSelectInfo(); - if (null != screencastHelper && null != selectInfo) { - PolyvLogger.test(TAG, "disConnect click:" + selectInfo.getName()); - screencastHelper.disConnect(selectInfo); - } - - if (isSelectNull) - selectNull(); - } - - public void selectNull() { - screencastDeviceListAdapter.setSelectInfo(null); - screencastDeviceListAdapter.notifyDataSetChanged(); - } - - public void refreshWifiName() { - String netWorkName = NetworkUtil.getNetWorkName(getApplicationContext()); - boolean isWifi = PolyvNetworkUtils.NETWORK_WIFI == PolyvNetworkUtils.getNetWorkType(getApplicationContext()); - if (isWifi) { - netWorkName = PolyvNetworkUtils.getWIFISSID(getApplicationContext()); - } - if ("网络错误".equals(netWorkName) - || "有线网络".equals(netWorkName)) { - iv_wifi_icon.setSelected(false); - tv_wifi_name.setText("当前是非 WIFI 环境,无法使用投屏功能"); - stopBrowse(); - - ll_search.setVisibility(View.INVISIBLE); - rv_devices.setVisibility(View.INVISIBLE); - } else { - iv_wifi_icon.setSelected(true); - tv_wifi_name.setText(netWorkName); - if (getVisibility() == View.VISIBLE) { - browse(); - } - - ll_search.setVisibility(View.VISIBLE); - rv_devices.setVisibility(View.VISIBLE); - } - } - - public void reconnectPlay() { - PolyvLogger.test(TAG, "reconnect click:" + screencastHelper.getLastServiceInfo()); - if (null != screencastHelper) { - PolyvLogger.test(TAG, "start connect:" + screencastHelper.getLastServiceInfo()); - disConnect(); - screencastHelper.connect(screencastHelper.getLastServiceInfo()); - screencastDeviceListAdapter.setSelectInfo(screencastHelper.getLastServiceInfo()); - screencastDeviceListAdapter.notifyDataSetChanged(); - } else { - PolyvToastUtil.show(getApplicationContext(), "未初始化或未选择设备"); - } - } - - private void connect(LelinkServiceInfo info) { - PolyvLogger.test(TAG, "connect click:" + info.getName()); - if (null != screencastHelper) { - PolyvLogger.test(TAG, "start connect:" + info.getName()); - screencastHelper.connect(info); - } else { - PolyvToastUtil.show(getApplicationContext(), "未初始化或未选择设备"); - } - } - - private void updateBrowseAdapter() { - if (null != screencastHelper) { - List connectInfos = screencastHelper.getConnectInfos(); - if (connectInfos != null) { - for (LelinkServiceInfo lelinkServiceInfo : connectInfos) { - if (lelinkServiceInfo != null) { - screencastDeviceListAdapter.setSelectInfo(lelinkServiceInfo); - } - } - } - - List infos = screencastHelper.getInfos(); - screencastDeviceListAdapter.updateDatas(infos); - - ll_search.setVisibility(View.INVISIBLE); - } - } - - private void browse() { - PolyvLogger.test(TAG, "btn_browse click"); - String netWorkName = NetworkUtil.getNetWorkName(getApplicationContext()); - boolean isWifi = PolyvNetworkUtils.NETWORK_WIFI == PolyvNetworkUtils.getNetWorkType(getApplicationContext()); - if (isWifi) { - netWorkName = PolyvNetworkUtils.getWIFISSID(getApplicationContext()); - } - if ("网络错误".equals(netWorkName) || "有线网络".equals(netWorkName)) { - return; - } - if (null != screencastHelper) { - int type; - String text; - text = "All"; - type = ILelinkServiceManager.TYPE_ALL; - PolyvLogger.test(TAG, "browse type:" + text); - PolyvLogger.d(TAG, "browse type:" + text); - if (!isFirstBrowse) { - isFirstBrowse = true; - } - screencastHelper.browse(type); - - ll_search.setVisibility(View.VISIBLE); - } - } - - private void stopBrowse() { - PolyvLogger.test(TAG, "btn_stop_browse click"); - if (null != screencastHelper) { - PolyvLogger.test(TAG, "stop browse"); - PolyvLogger.d(TAG, "stop browse"); - isFirstBrowse = false; - screencastHelper.stopBrowse(); - - ll_search.setVisibility(View.INVISIBLE); - } - } - - private PolyvIUIUpdateListener iUIUpdateListener = new PolyvIUIUpdateListener() { - - @Override - public void onUpdateState(int state, Object object) { - PolyvLogger.d(TAG, "IUIUpdateListener state:" + state + " text:" + object); - switch (state) { - case PolyvIUIUpdateListener.STATE_SEARCH_SUCCESS: - if (isFirstBrowse) { - isFirstBrowse = false; - if (getVisibility() == View.VISIBLE) - PolyvToastUtil.show(getApplicationContext(), "搜索成功"); - PolyvLogger.test(TAG, "搜索成功"); - } - if (null != delayHandler) { - delayHandler.removeCallbacksAndMessages(null); - delayHandler.sendEmptyMessageDelayed(PolyvIUIUpdateListener.STATE_SEARCH_SUCCESS, - TimeUnit.MILLISECONDS.toMillis(100)); - } - break; - case PolyvIUIUpdateListener.STATE_SEARCH_ERROR: - if (getVisibility() == View.VISIBLE) - PolyvToastUtil.show(getApplicationContext(), "Auth错误"); - break; - case PolyvIUIUpdateListener.STATE_SEARCH_NO_RESULT: - if (null != delayHandler) { - delayHandler.removeCallbacksAndMessages(null); - delayHandler.sendEmptyMessageDelayed(PolyvIUIUpdateListener.STATE_SEARCH_SUCCESS, - TimeUnit.MILLISECONDS.toMillis(100)); - } - break; - case PolyvIUIUpdateListener.STATE_CONNECT_SUCCESS: - break; - case PolyvIUIUpdateListener.STATE_DISCONNECT: - PolyvLogger.test(TAG, "disConnect success:" + object); - PolyvLogger.d(TAG, "PolyvToastUtil " + object); - PolyvToastUtil.show(getApplicationContext(), (String) object); - screencastDeviceListAdapter.setSelectInfo(null); - screencastDeviceListAdapter.notifyDataSetChanged(); - break; - case PolyvIUIUpdateListener.STATE_CONNECT_FAILURE: - if (object instanceof String && ((String) object).contains("等待")) - return; - PolyvLogger.test(TAG, "connect failure:" + object); - PolyvLogger.d(TAG, "PolyvToastUtil " + object); - PolyvToastUtil.show(getApplicationContext(), (String) object); - screencastDeviceListAdapter.setSelectInfo(null); - screencastDeviceListAdapter.notifyDataSetChanged(); - - disConnect(); - screencastStatusLayout.callPlayErrorStatus(); - break; - case PolyvIUIUpdateListener.STATE_PLAY: - PolyvLogger.test(TAG, "callback play"); - PolyvLogger.d(TAG, "PolyvToastUtil 开始播放"); - PolyvToastUtil.show(getApplicationContext(), "开始播放"); - - screencastStatusLayout.callOnStart(); - break; - case PolyvIUIUpdateListener.STATE_LOADING: - PolyvLogger.test(TAG, "callback loading"); - PolyvLogger.d(TAG, "PolyvToastUtil 开始加载"); - PolyvToastUtil.show(getApplicationContext(), "开始加载"); - break; - case PolyvIUIUpdateListener.STATE_PAUSE: - PolyvLogger.test(TAG, "callback pause"); - PolyvLogger.d(TAG, "PolyvToastUtil 暂停播放"); - PolyvToastUtil.show(getApplicationContext(), "暂停播放"); - - screencastStatusLayout.callOnPause(); - break; - case PolyvIUIUpdateListener.STATE_STOP: - PolyvLogger.test(TAG, "callback stop"); - PolyvLogger.d(TAG, "PolyvToastUtil 播放结束"); - PolyvToastUtil.show(getApplicationContext(), "播放结束"); - - screencastStatusLayout.hide(true); - disConnect(); - break; - case PolyvIUIUpdateListener.STATE_SEEK: - PolyvLogger.test(TAG, "callback seek:" + object); - PolyvLogger.d(TAG, "PolyvToastUtil seek完成:" + object); - PolyvToastUtil.show(getApplicationContext(), "seek完成" + object); - break; - case PolyvIUIUpdateListener.STATE_PLAY_ERROR: - if (object instanceof String && ((String) object).contains("无响应")) - return; - PolyvLogger.test(TAG, "callback error:" + object); - PolyvToastUtil.show(getApplicationContext(), "播放错误:" + object); - - screencastStatusLayout.callPlayErrorStatus(); - break; - case PolyvIUIUpdateListener.STATE_POSITION_UPDATE: - PolyvLogger.test(TAG, "callback position update:" + object); - long[] arr = (long[]) object; - long duration = arr[0]; - long position = arr[1]; - PolyvLogger.d(TAG, "PolyvToastUtil 总长度:" + duration + " 当前进度:" + position); - screencastStatusLayout.callPlayProgress(duration, position); - break; - case PolyvIUIUpdateListener.STATE_COMPLETION: - PolyvLogger.test(TAG, "callback completion"); - PolyvLogger.d(TAG, "PolyvToastUtil 播放完成"); - PolyvToastUtil.show(getApplicationContext(), "播放完成"); - - screencastStatusLayout.hide(true); - break; - } - } - - @Override - public void onUpdateText(String msg) { - PolyvLogger.d(TAG, "onUpdateText : " + msg + "\n\n"); - } - }; - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - removeCallbacks(runnable); - } - - /** - * 根据连接的设备 - */ - private IConnectListener iConnectListener = new IConnectListener() { - @Override - public void onConnect(final LelinkServiceInfo serviceInfo, int extra) { - if (TextUtils.isEmpty(serviceInfo.getName())) { - // pin码,则全部去掉 - return; - } - removeCallbacks(runnable); - postDelayed(runnable = new Runnable() { - @Override - public void run() { - if (screencastDeviceListAdapter.getSelectInfo() == null) - return; - PolyvLogger.test(TAG, "connect success:" + serviceInfo.getName() + "连接成功"); - PolyvLogger.d(TAG, "PolyvToastUtil " + serviceInfo.getName() + "连接成功"); - PolyvToastUtil.show(getApplicationContext(), serviceInfo.getName() + "连接成功"); - - int currentBitrate = screencastStatusLayout.getCurrentPlayBitrate(); - currentBitrate = Math.max(1, currentBitrate); - String playPath = screencastStatusLayout.getVideoView().getPlayPathWithBitRate(currentBitrate); - play(playPath, currentBitrate); - } - }, 3000);//由于内部还有连接,所以这里延迟3秒 - } - - @Override - public void onDisconnect(LelinkServiceInfo serviceInfo, int what, int extra) { - } - }; - - public void seekTo(int progress) { - screencastHelper.seekTo(progress); - } - - public void pause() { - List connectInfos = null; - if (null != screencastHelper) { - connectInfos = screencastHelper.getConnectInfos(); - } - if (null != screencastHelper && null != connectInfos && !connectInfos.isEmpty()) { - PolyvLogger.test(TAG, "pause click"); - screencastHelper.pause(); - } - } - - public void resume() { - List connectInfos = null; - if (null != screencastHelper) { - connectInfos = screencastHelper.getConnectInfos(); - } - if (null != screencastHelper && null != connectInfos && !connectInfos.isEmpty()) { - PolyvLogger.test(TAG, "resume click"); - // 暂停中 - screencastHelper.resume(); - } - } - - public void play(String playPath, int bitrate) { - PolyvLogger.test(TAG, "start play url:" + playPath + " type:" + PolyvAllCast.MEDIA_TYPE_VIDEO); - if (screencastStatusLayout.getVideoView().isDisableScreenCAP()) { - PolyvToastUtil.show(getApplicationContext(), "防录屏状态下不能投屏"); - screencastStatusLayout.callPlayErrorStatus(); - return; - } - if (TextUtils.isEmpty(playPath)) { - PolyvToastUtil.show(getApplicationContext(), "获取播放地址失败"); - screencastStatusLayout.callPlayErrorStatus(); - return; - } - if (null == screencastHelper) { - PolyvToastUtil.show(getApplicationContext(), "未初始化或未选择设备"); - screencastStatusLayout.callPlayErrorStatus(); - return; - } - List connectInfos = screencastHelper.getConnectInfos(); - if (null == connectInfos || connectInfos.isEmpty()) { - PolyvToastUtil.show(getApplicationContext(), "请先连接设备"); - screencastStatusLayout.callPlayErrorStatus(); - return; - } - screencastStatusLayout.callScreencastingStatus(bitrate); - PolyvVideoVO videoVO = screencastStatusLayout.getVideoView().getVideo(); - if (videoVO != null && videoVO.getVideoType() == PolyvVideoType.ENCRYPTION_M3U8) { - screencastHelper.playNetMedia(playPath, videoVO.getVid(), bitrate, videoVO.getSeedConst(), PolyvAllCast.MEDIA_TYPE_VIDEO, ""); - } else { - screencastHelper.playNetMedia(playPath, PolyvAllCast.MEDIA_TYPE_VIDEO, ""); - } - } - - private static class NetworkReceiver extends BroadcastReceiver { - private WeakReference reference; - - public NetworkReceiver(PolyvScreencastSearchLayout rf) { - reference = new WeakReference<>(rf); - } - - @Override - public void onReceive(Context context, Intent intent) { - if (null == reference || null == reference.get()) { - return; - } - PolyvScreencastSearchLayout searchLayout = reference.get(); - String action = intent.getAction(); - if (ConnectivityManager.CONNECTIVITY_ACTION.equalsIgnoreCase(action) || - PolyvScreencastSearchLayout.WIFI_AP_STATE_CHANGED_ACTION.equalsIgnoreCase(action)) { - searchLayout.refreshWifiName(); - } - } - } - - public void setOnVisibilityChangedListener(OnVisibilityChangedListener onVisibilityChangedListener) { - this.onVisibilityChangedListener = onVisibilityChangedListener; - } - - public interface OnVisibilityChangedListener { - void onVisibilityChanged(@NonNull View changedView, int visibility); - } - - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.tv_cancel) { - hide(true); - } else if (id == R.id.iv_refresh) { - browse(); - } - } - - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { - if (!isLandLayout) { - hide(true); - } - } else if (isLandLayout) { - hide(true); - } - } -} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvScreencastStatusLayout.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvScreencastStatusLayout.java deleted file mode 100644 index 56a7de2..0000000 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvScreencastStatusLayout.java +++ /dev/null @@ -1,377 +0,0 @@ -package com.easefun.polyvsdk.view; - -import android.content.Context; -import android.content.res.Configuration; -import android.graphics.Color; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; -import android.widget.SeekBar; -import android.widget.TextView; - -import com.easefun.polyvsdk.R; -import com.easefun.polyvsdk.player.PolyvPlayerMediaController; -import com.easefun.polyvsdk.util.PolyvScreenUtils; -import com.easefun.polyvsdk.util.PolyvTimeUtils; -import com.easefun.polyvsdk.video.PolyvVideoView; -import com.easefun.polyvsdk.vo.PolyvVideoVO; -import com.hpplay.sdk.source.browse.api.LelinkServiceInfo; - -public class PolyvScreencastStatusLayout extends FrameLayout implements View.OnClickListener { - //连接状态,设备名称 - private TextView tv_status, tv_device_name; - //重试等交互按钮 - private TextView tv_retry, tv_bit, tv_exit, tv_switch_device; - //清晰度布局 - private LinearLayout ll_bit_layout; - private TextView tv_sc, tv_hd, tv_flu; - //音量布局 - private LinearLayout ll_volume_layout; - private ImageView iv_volume_add, iv_volume_reduce; - //控制器布局 - private RelativeLayout rl_port; - private ImageView iv_play, iv_land; - private TextView tv_curtime, tv_tottime; - private SeekBar sb_play; - - private PolyvScreencastSearchLayout screencastSearchLayout, landScreencastSearchLayout; - private PolyvVideoView videoView; - private PolyvPlayerMediaController mediaController; - private LelinkServiceInfo serviceInfo; - - private int currentPlayBitrate = -1; - private long maxProgress; - - public PolyvScreencastStatusLayout(@NonNull Context context) { - this(context, null); - } - - public PolyvScreencastStatusLayout(@NonNull Context context, @Nullable AttributeSet attrs) { - this(context, attrs, 0); - } - - public PolyvScreencastStatusLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - initView(); - } - - public void setScreencastSearchLayout(PolyvScreencastSearchLayout screencastSearchLayout) { - this.screencastSearchLayout = screencastSearchLayout; - } - - public void setLandScreencastSearchLayout(PolyvScreencastSearchLayout screencastSearchLayout) { - this.landScreencastSearchLayout = screencastSearchLayout; - } - - private PolyvScreencastSearchLayout getScreencastSearchLayout() { - return PolyvScreenUtils.isLandscape(getContext()) ? landScreencastSearchLayout : screencastSearchLayout; - } - - public void setVideoView(PolyvVideoView videoView) { - this.videoView = videoView; - } - - public void setMediaController(PolyvPlayerMediaController mediaController) { - this.mediaController = mediaController; - } - - public int getCurrentPlayBitrate() { - return currentPlayBitrate == -1 ? videoView.getBitRate() : currentPlayBitrate; - } - - private void initView() { - LayoutInflater.from(getContext()).inflate(R.layout.polyv_screencast_status_layout, this); - tv_status = (TextView) findViewById(R.id.tv_status); - tv_device_name = (TextView) findViewById(R.id.tv_device_name); - - tv_retry = (TextView) findViewById(R.id.tv_retry); - tv_retry.setOnClickListener(this); - tv_bit = (TextView) findViewById(R.id.tv_bit); - tv_bit.setOnClickListener(this); - tv_exit = (TextView) findViewById(R.id.tv_exit); - tv_exit.setOnClickListener(this); - tv_switch_device = (TextView) findViewById(R.id.tv_switch_device); - tv_switch_device.setOnClickListener(this); - - ll_bit_layout = (LinearLayout) findViewById(R.id.ll_bit_layout); - ll_bit_layout.setOnClickListener(this); - tv_sc = (TextView) findViewById(R.id.tv_sc); - tv_sc.setOnClickListener(this); - tv_hd = (TextView) findViewById(R.id.tv_hd); - tv_hd.setOnClickListener(this); - tv_flu = (TextView) findViewById(R.id.tv_flu); - tv_flu.setOnClickListener(this); - - ll_volume_layout = (LinearLayout) findViewById(R.id.ll_volume_layout); - iv_volume_add = (ImageView) findViewById(R.id.iv_volume_add); - iv_volume_add.setOnClickListener(this); - iv_volume_reduce = (ImageView) findViewById(R.id.iv_volume_reduce); - iv_volume_reduce.setOnClickListener(this); - - rl_port = (RelativeLayout) findViewById(R.id.rl_port); - findViewById(R.id.iv_screencast_search).setVisibility(View.INVISIBLE); - findViewById(R.id.tv_route_portrait).setVisibility(View.INVISIBLE); - findViewById(R.id.tv_bit_portrait).setVisibility(View.INVISIBLE); - findViewById(R.id.tv_speed_portrait).setVisibility(View.INVISIBLE); - findViewById(R.id.iv_vice_status_portrait).setVisibility(View.INVISIBLE); - iv_play = (ImageView) findViewById(R.id.iv_play); - iv_play.setOnClickListener(this); - iv_land = (ImageView) findViewById(R.id.iv_land); - iv_land.setOnClickListener(this); - tv_curtime = (TextView) findViewById(R.id.tv_curtime); - tv_tottime = (TextView) findViewById(R.id.tv_tottime); - sb_play = (SeekBar) findViewById(R.id.sb_play); - sb_play.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - if (!fromUser) { - return; - } - int newPosition = (int) (maxProgress * (long) progress / seekBar.getMax()); - tv_curtime.setText(PolyvTimeUtils.generateTime(newPosition * 1000)); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - if (!seekBar.isSelected()) - seekBar.setSelected(true); - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - if (seekBar.isSelected()) - seekBar.setSelected(false); - int seekToPosition = (int) (maxProgress * (long) seekBar.getProgress() / seekBar.getMax()); - getScreencastSearchLayout().seekTo(seekToPosition); - } - }); - } - - public PolyvVideoView getVideoView() { - return videoView; - } - - public void callOnPause() { - iv_play.setSelected(true); - } - - public void callOnStart() { - iv_play.setSelected(false); - } - - public void callConnectStatus(String deviceName) { - tv_bit.setVisibility(View.INVISIBLE); - tv_retry.setVisibility(View.INVISIBLE); - tv_exit.setBackgroundDrawable(getResources().getDrawable(R.drawable.polyv_tv_lb_corners)); - ll_bit_layout.setVisibility(View.INVISIBLE); - ll_volume_layout.setVisibility(View.INVISIBLE); - tv_status.setTextColor(Color.WHITE); - - tv_curtime.setText("00:00"); - tv_tottime.setText("00:00"); - sb_play.setProgress(0); - sb_play.setEnabled(false); - maxProgress = 0; - - iv_play.setSelected(false); - iv_play.setEnabled(false); - - tv_status.setText("正在连接..."); - - tv_device_name.setText(deviceName); - } - - public void callPlayProgress(long max, long progress) { - if (max == 0) - return; - maxProgress = max; - tv_curtime.setText(PolyvTimeUtils.generateTime(progress * 1000)); - tv_tottime.setText(PolyvTimeUtils.generateTime(max * 1000)); - sb_play.setProgress((int) (sb_play.getMax() * 1L * progress / max)); - sb_play.setEnabled(true); - - iv_play.setEnabled(true); - } - - public void callScreencastingStatus(int bitrate) { - currentPlayBitrate = bitrate; - tv_status.setTextColor(Color.WHITE); - tv_status.setText("投屏中"); - tv_status.setTextColor(Color.parseColor("#31ADFE")); - - initBitRateView(bitrate); - initBitRateViewVisible(bitrate); - - tv_exit.setBackgroundDrawable(getResources().getDrawable(R.drawable.polyv_tv_no_corners)); - - ll_volume_layout.setVisibility(View.VISIBLE); - } - - public void callPlayErrorStatus() { - tv_status.setTextColor(Color.RED); - tv_status.setText("投屏失败"); - tv_status.setTextColor(Color.parseColor("#FF5B5B")); - - tv_bit.setVisibility(View.INVISIBLE); - tv_retry.setVisibility(View.VISIBLE); - - tv_exit.setBackgroundDrawable(getResources().getDrawable(R.drawable.polyv_tv_no_corners)); - - ll_volume_layout.setVisibility(View.INVISIBLE); - } - - public void show(LelinkServiceInfo info) { - serviceInfo = info; - callConnectStatus(info.getName()); - if (getVisibility() == View.VISIBLE) - return; - setVisibility(View.VISIBLE); - - videoView.pause(true); - } - - public void hide(boolean isStop) { - if (getVisibility() != View.VISIBLE) - return; - currentPlayBitrate = -1; - setVisibility(View.INVISIBLE); - if (isStop) { - getScreencastSearchLayout().stop(); -// screencastSearchLayout.disConnect(); -// landScreencastSearchLayout.disConnect(); - } - } - - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.iv_play) { - if (iv_play.isSelected()) { - getScreencastSearchLayout().resume(); - } else { - getScreencastSearchLayout().pause(); - } - iv_play.setSelected(!iv_play.isSelected()); - } else if (id == R.id.tv_retry) { - callConnectStatus(serviceInfo.getName()); - getScreencastSearchLayout().reconnectPlay(); - } else if (id == R.id.iv_volume_add) { - getScreencastSearchLayout().voulumeUp(); - } else if (id == R.id.iv_volume_reduce) { - getScreencastSearchLayout().voulumeDown(); - } else if (id == R.id.tv_sc) { - resetBitRateView(3); - } else if (id == R.id.tv_hd) { - resetBitRateView(2); - } else if (id == R.id.tv_flu) { - resetBitRateView(1); - } else if (id == R.id.ll_bit_layout) { - ll_bit_layout.setVisibility(View.INVISIBLE); - } else if (id == R.id.tv_bit) { - ll_bit_layout.setVisibility(View.VISIBLE); - } else if (id == R.id.tv_exit) { - hide(true); - } else if (id == R.id.tv_switch_device) { - getScreencastSearchLayout().show(); - } else if (id == R.id.iv_land) { - if (iv_land.isSelected()) { - iv_land.setImageResource(R.drawable.polyv_btn_fullscreen); - mediaController.changeToSmallScreen(); - } else { - iv_land.setImageResource(R.drawable.polyv_btn_exitfulls); - mediaController.changeToFullScreen(); - } - iv_land.setSelected(!iv_land.isSelected()); - } - } - - //初始化选择码率的控件 - private void initBitRateView(int bitRate) { - tv_sc.setSelected(false); - tv_hd.setSelected(false); - tv_flu.setSelected(false); - switch (bitRate) { - case 0: - case 1: - tv_bit.setText("流畅"); - tv_flu.setSelected(true); - break; - case 2: - tv_bit.setText("高清"); - tv_hd.setSelected(true); - break; - case 3: - tv_bit.setText("超清"); - tv_sc.setSelected(true); - break; - } - tv_bit.setVisibility(View.VISIBLE); - } - - //初始化选择码率控件的可见性 - private void initBitRateViewVisible(int currentBitRate) { - tv_sc.setVisibility(View.INVISIBLE); - tv_hd.setVisibility(View.INVISIBLE); - tv_flu.setVisibility(View.INVISIBLE); - PolyvVideoVO videoVO = videoView.getVideo(); - if (videoVO != null) { - switch (videoVO.getDfNum()) { - case 1: - tv_flu.setVisibility(View.VISIBLE); - break; - case 2: - tv_hd.setVisibility(View.VISIBLE); - tv_flu.setVisibility(View.VISIBLE); - break; - case 3: - tv_sc.setVisibility(View.VISIBLE); - tv_hd.setVisibility(View.VISIBLE); - tv_flu.setVisibility(View.VISIBLE); - break; - } - } else { - switch (currentBitRate) { - case 0: - case 1: - tv_flu.setVisibility(View.VISIBLE); - break; - case 2: - tv_hd.setVisibility(View.VISIBLE); - break; - case 3: - tv_sc.setVisibility(View.VISIBLE); - break; - } - } - } - - //重置选择码率的控件 - private void resetBitRateView(int bitRate) { - ll_bit_layout.setVisibility(View.INVISIBLE); - if (currentPlayBitrate == bitRate) - return; - currentPlayBitrate = bitRate; - initBitRateView(bitRate); - String playPath = videoView.getPlayPathWithBitRate(bitRate); - getScreencastSearchLayout().play(playPath, bitRate); - } - - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - if (iv_land != null) { - iv_land.setSelected(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE); - if (iv_land.isSelected()) { - iv_land.setImageResource(R.drawable.polyv_btn_exitfulls); - } else { - iv_land.setImageResource(R.drawable.polyv_btn_fullscreen); - } - } - } -} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvSimpleSwipeRefreshLayout.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvSimpleSwipeRefreshLayout.java index f057d0a..c44bb58 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvSimpleSwipeRefreshLayout.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvSimpleSwipeRefreshLayout.java @@ -1,41 +1,41 @@ -package com.easefun.polyvsdk.view; - -import android.content.Context; -import android.os.Build; -import android.support.v4.view.ViewCompat; -import android.support.v4.widget.SwipeRefreshLayout; -import android.util.AttributeSet; -import android.view.View; -import android.widget.AbsListView; - -public class PolyvSimpleSwipeRefreshLayout extends SwipeRefreshLayout { - // 包含的View - private View view; - - public PolyvSimpleSwipeRefreshLayout(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public PolyvSimpleSwipeRefreshLayout(Context context) { - super(context); - } - - public void setChildView(View view) { - this.view = view; - } - - @Override - public boolean canChildScrollUp() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - if (view instanceof AbsListView) { - final AbsListView absListView = (AbsListView) view; - return absListView.getChildCount() > 0 && (absListView.getFirstVisiblePosition() > 0 - || absListView.getChildAt(0).getTop() < absListView.getPaddingTop()); - } else { - return view.getScrollY() > 0; - } - } else { - return ViewCompat.canScrollVertically(view, -1); - } - } -} +package com.easefun.polyvsdk.view; + +import android.content.Context; +import android.os.Build; +import androidx.core.view.ViewCompat; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import android.util.AttributeSet; +import android.view.View; +import android.widget.AbsListView; + +public class PolyvSimpleSwipeRefreshLayout extends SwipeRefreshLayout { + // 包含的View + private View view; + + public PolyvSimpleSwipeRefreshLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public PolyvSimpleSwipeRefreshLayout(Context context) { + super(context); + } + + public void setChildView(View view) { + this.view = view; + } + + @Override + public boolean canChildScrollUp() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + if (view instanceof AbsListView) { + final AbsListView absListView = (AbsListView) view; + return absListView.getChildCount() > 0 && (absListView.getFirstVisiblePosition() > 0 + || absListView.getChildAt(0).getTop() < absListView.getPaddingTop()); + } else { + return view.getScrollY() > 0; + } + } else { + return ViewCompat.canScrollVertically(view, -1); + } + } +} diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvTickSeekBar.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvTickSeekBar.java index e9236ef..e932521 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvTickSeekBar.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvTickSeekBar.java @@ -3,7 +3,7 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; -import android.support.v7.widget.AppCompatSeekBar; +import androidx.appcompat.widget.AppCompatSeekBar; import android.util.AttributeSet; import android.view.MotionEvent; diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvTickTips.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvTickTips.java index ed35911..1195aa8 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvTickTips.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvTickTips.java @@ -1,8 +1,8 @@ package com.easefun.polyvsdk.view; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; diff --git a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvTouchSpeedLayout.java b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvTouchSpeedLayout.java index 061a54e..e7c6eef 100644 --- a/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvTouchSpeedLayout.java +++ b/android/polyvsdk/src/main/java/com/easefun/polyvsdk/view/PolyvTouchSpeedLayout.java @@ -2,8 +2,8 @@ import android.content.Context; import android.graphics.drawable.AnimationDrawable; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -42,7 +42,7 @@ public void show() { } public void hide() { - setVisibility(View.INVISIBLE); + setVisibility(View.GONE); } public void updateStatus(boolean isLoading) { diff --git a/android/polyvsdk/src/main/res/drawable-xxhdpi/polyv_player_knowledge_selected_icon.png b/android/polyvsdk/src/main/res/drawable-xxhdpi/polyv_player_knowledge_selected_icon.png new file mode 100644 index 0000000..089980d Binary files /dev/null and b/android/polyvsdk/src/main/res/drawable-xxhdpi/polyv_player_knowledge_selected_icon.png differ diff --git a/android/polyvsdk/src/main/res/drawable-xxhdpi/polyv_player_knowledge_unselected_icon.png b/android/polyvsdk/src/main/res/drawable-xxhdpi/polyv_player_knowledge_unselected_icon.png new file mode 100644 index 0000000..3b6944b Binary files /dev/null and b/android/polyvsdk/src/main/res/drawable-xxhdpi/polyv_player_knowledge_unselected_icon.png differ diff --git a/android/polyvsdk/src/main/res/layout/layout_fill_blank.xml b/android/polyvsdk/src/main/res/layout/layout_fill_blank.xml new file mode 100644 index 0000000..84c5efc --- /dev/null +++ b/android/polyvsdk/src/main/res/layout/layout_fill_blank.xml @@ -0,0 +1,24 @@ + + + + + + + + \ No newline at end of file diff --git a/android/polyvsdk/src/main/res/layout/layout_input.xml b/android/polyvsdk/src/main/res/layout/layout_input.xml new file mode 100644 index 0000000..e40333e --- /dev/null +++ b/android/polyvsdk/src/main/res/layout/layout_input.xml @@ -0,0 +1,26 @@ + + + + + + + + + - - - - - + + - - + + + + + + + + - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + @@ -149,18 +156,22 @@ - - - - + + + + + - - - - + + + + + + + @@ -175,30 +186,14 @@ - + - - - - - - - - - - - - - - - - - - + + @@ -211,6 +206,7 @@ + @@ -218,42 +214,52 @@ - - + + - + - - - + + + + + + - - - + + + + + + + + - - + @@ -279,6 +285,9 @@ - + + + + diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankQuestionView.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankQuestionView.h new file mode 100644 index 0000000..07d40ff --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankQuestionView.h @@ -0,0 +1,29 @@ +// +// PLVFillBlankQuestionView.h +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/1/28. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import +#import "PLVVodQuestion.h" + +NS_ASSUME_NONNULL_BEGIN + +/// 填空题 问题view +@interface PLVFillBlankQuestionView : UIView + +@property (nonatomic, strong) PLVVodQuestion *question; + +/// 填空题的提交回调 +@property (nonatomic, copy) void (^submitFillBlankTopicActionHandler)(NSArray *answerItems); + +/// 跳过回调 +@property (nonatomic, copy) void (^skipActionHandler)(void); + +- (void)scrollToTop; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankQuestionView.m b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankQuestionView.m new file mode 100644 index 0000000..9615583 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankQuestionView.m @@ -0,0 +1,347 @@ +// +// PLVFillBlankQuestionView.m +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/1/28. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import "PLVFillBlankQuestionView.h" +#import "PLVFillBlankView.h" +#import "UIColor+PLVVod.h" + +@interface PLVFillBlankQuestionView () +@property (nonatomic, strong) UIView *containerView; +@property (nonatomic, strong) UIScrollView *scrollView; +@property (nonatomic, strong) PLVFillBlankView *fillBlankView; +@property (nonatomic, strong) UIButton *btnSubmit; +@property (nonatomic, strong) UIButton *btnSkip; +@property (nonatomic, strong) UIView *lineH; +@property (nonatomic, strong) UIView *lineV; +@property (nonatomic, assign) BOOL isKeyBoradShow; +@property (nonatomic, assign) UITextField *editingTextField;//!< 正在编辑的输入框 +@property (nonatomic, assign) CGFloat fillBlankViewHeight; + + +@end + +@implementation PLVFillBlankQuestionView +#pragma mark - init & dealloc + +- (instancetype)initWithCoder:(NSCoder *)decoder { + if (self = [super initWithCoder:decoder]) { + [self commonInit]; + } + return self; +} +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + [self commonInit]; + } + return self; +} + +- (void)commonInit { + self.backgroundColor = [UIColor colorWithHex:0x000000 alpha:0.7]; + [self addSubview:self.containerView]; + [self.containerView addSubview:self.scrollView]; + [self.containerView addSubview:self.btnSkip]; + [self.containerView addSubview:self.lineV]; + [self.containerView addSubview:self.btnSubmit]; + [self.containerView addSubview:self.lineH]; + + [self.scrollView addSubview:self.fillBlankView]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interfaceOrientationDidChange:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; +} + +- (void)layoutSubviews{ + if (_question) { + [self updateUI]; + } +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + + +#pragma mark - NSNotification + +- (void)interfaceOrientationDidChange:(NSNotification *)notification { + if (self.question) { + [self updateUI]; + } +} + +-(void)keyboardDidShow:(NSNotification *)notification +{ + if (self.question) { + //键盘出现的时候,上移视图,并且在有遮挡的情况下移动scrollview + self.isKeyBoradShow = YES; + UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation; + CGFloat topPadding = interfaceOrientation == UIInterfaceOrientationPortrait ? 0 : 16; + self.containerView.frame = CGRectMake(self.containerView.frame.origin.x, topPadding, self.containerView.frame.size.width, self.containerView.frame.size.height); + + if (self.editingTextField) { + UIView *window = [UIApplication sharedApplication].delegate.window; + //相对于windows的frame + CGRect tempTextFieldFrame = [self.editingTextField.superview convertRect:self.editingTextField.frame toView:window]; + CGFloat textfieldMaxY = CGRectGetMaxY(tempTextFieldFrame); + + NSDictionary *userInfo = [notification userInfo]; + CGFloat keyboardHeight = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height; + CGFloat windowHeight = [UIScreen mainScreen].bounds.size.height; + + CGFloat offsetY = textfieldMaxY + keyboardHeight - windowHeight; + + if (offsetY > 0) { + //输入框跟键盘有重叠的时候,上移scrollView + CGFloat originalOffsetY = self.scrollView.contentOffset.y; + [self.scrollView setContentOffset:CGPointMake(0, originalOffsetY + offsetY + 50) animated:YES]; + } + } + } +} + +-(void)keyboardWillHide:(NSNotification *)notification +{ + if (self.question) { + //键盘退出的时候移回中间显示 + self.isKeyBoradShow = NO; + float height = self.superview.bounds.size.height; + CGFloat topPadding = 67 / 375.0 * height; + UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation; + CGFloat offsetY = interfaceOrientation == UIInterfaceOrientationPortrait ? 0 : topPadding; + self.containerView.frame = CGRectMake(self.containerView.frame.origin.x, offsetY, self.containerView.frame.size.width, self.containerView.frame.size.height); + } +} + +#pragma mark - UI +-(void)updateUI +{ + UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation; + float width = self.superview.bounds.size.width; + float height = self.superview.bounds.size.height; + CGFloat contanerWeidht = width; + CGFloat contanerHeight = height; + + CGFloat fillBlankViewHorzontalPadding = 0; + CGFloat fillBlankViewVerticalPadding = 0; + + if (interfaceOrientation == UIInterfaceOrientationPortrait) { + //竖屏 + if (width >= height) { + self.containerView.frame = CGRectMake(0, 0, contanerWeidht, contanerHeight); + }else{ + contanerHeight = contanerWeidht / (16.0 / 9.0); + CGFloat topBottomPadding = (height - contanerHeight) / 2.0; + self.containerView.frame = CGRectMake(0, topBottomPadding, contanerWeidht, contanerHeight); + } + + self.containerView.layer.cornerRadius = 0; + + fillBlankViewHorzontalPadding = 16; + fillBlankViewVerticalPadding = 20; + } + else { + //横屏 + CGFloat verticalPadding = 67; + CGFloat horzontalPadding; + + CGFloat scale = verticalPadding / 375.0; + verticalPadding = scale * height; + + contanerHeight = height - verticalPadding * 2; + contanerWeidht = contanerHeight / 9.0 * 16; + + horzontalPadding = (width - contanerWeidht) / 2.0 ; + + if (self.isKeyBoradShow) { + verticalPadding = 16; + } + + self.containerView.frame = CGRectMake(horzontalPadding, verticalPadding, contanerWeidht, contanerHeight); + self.containerView.layer.cornerRadius = 8; + + fillBlankViewHorzontalPadding = 24; + fillBlankViewVerticalPadding = 24; + } + + self.scrollView.frame = CGRectMake(0, 0, contanerWeidht, contanerHeight - 45); + self.fillBlankView.frame = CGRectMake(fillBlankViewHorzontalPadding, fillBlankViewVerticalPadding, contanerWeidht - fillBlankViewHorzontalPadding * 2, self.fillBlankViewHeight); + [self.fillBlankView setNeedsDisplay]; + + self.lineH.frame = CGRectMake(16, contanerHeight - 45, contanerWeidht - 32, 1); + self.btnSkip.frame = CGRectMake(0, contanerHeight - 45, contanerWeidht * 0.5, 45); + self.lineV.frame = CGRectMake(contanerWeidht * 0.5 - 1, contanerHeight - 45 + 11, 1, 45 - 22); + if (_question.skippable) { + self.btnSkip.hidden = NO; + self.btnSubmit.frame = CGRectMake(contanerWeidht * 0.5, contanerHeight - 45, contanerWeidht * 0.5, 45); + }else { + self.btnSkip.hidden = YES; + self.btnSubmit.frame = CGRectMake(0, contanerHeight - 45, contanerWeidht, 45); + } + + [self.scrollView setContentSize:CGSizeMake(self.scrollView.frame.size.width, self.scrollView.contentSize.height)]; +} + + +#pragma mark - Setter +-(void)setQuestion:(PLVVodQuestion *)question +{ + _question = question; + [self updateUI]; + self.fillBlankView.questionString = [NSString stringWithFormat:@"【填空题】%@", question.question]; +} + +#pragma mark - Action + +-(void)clickSkipButtonAction +{ + [self endEditing:YES]; + if (self.skipActionHandler) { + self.skipActionHandler(); + } +} + +-(void)clickSubmitButtonAction +{ + [self endEditing:YES]; + if (self.submitFillBlankTopicActionHandler) { + NSMutableArray *answerArray = [NSMutableArray arrayWithCapacity:1]; + for (UITextField *input in self.fillBlankView.textfieldArray) { + NSString *answer = @""; + if (input.text.length) { + answer = input.text; + } + [answerArray addObject:answer]; + } + self.submitFillBlankTopicActionHandler(answerArray); + } +} + +- (void)scrollToTop { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self.scrollView scrollsToTop]; + }); +} + +-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +{ + [self endEditing:YES]; +} + + +#pragma mark - PLVFillBlankViewDelegate + +/// 填空题view高度变化回调 +/// @param fillBlankView fillBlankView +/// @param height 变化后的高度 +-(void)fillBlankView:(PLVFillBlankView *)fillBlankView didChangeHeight:(CGFloat)height +{ + self.fillBlankViewHeight = height; + [self.scrollView setContentSize:CGSizeMake(self.scrollView.frame.size.width, height + 50)]; +} + +/// 将要编辑事件回调 +/// @param fillBlankView fillBlankView +/// @param tfEditing 将要编辑的输入框 +-(void)fillBlankView:(PLVFillBlankView *)fillBlankView textFieldShouldBeginEditingBlock:(UITextField *)tfEditing +{ + self.editingTextField = tfEditing; +} + + +#pragma mark - Loadlazy + +-(UIView *)containerView +{ + if (_containerView == nil) { + _containerView = [[UIView alloc]init]; + _containerView.backgroundColor = [UIColor whiteColor]; + _containerView.layer.masksToBounds = YES; + } + return _containerView; +} + +-(UIScrollView *)scrollView +{ + if (_scrollView == nil) { + _scrollView = [[UIScrollView alloc]init]; + _scrollView.showsVerticalScrollIndicator = YES; + } + return _scrollView; +} + +-(PLVFillBlankView *)fillBlankView +{ + if (_fillBlankView == nil) { + _fillBlankView = [[PLVFillBlankView alloc]init]; + _fillBlankView.delegate = self; + _fillBlankView.questionColor = [UIColor colorWithHex:0x333333]; + _fillBlankView.questionFontSize = 16; + _fillBlankView.fillColor = [UIColor colorWithHex:0x4A90E2]; + _fillBlankView.fillFontSize = 14; + } + return _fillBlankView; +} + +-(UIButton *)btnSkip +{ + if (_btnSkip == nil) { + _btnSkip = [UIButton buttonWithType:UIButtonTypeCustom]; + _btnSkip.titleLabel.font = [UIFont systemFontOfSize:16]; + [_btnSkip setTitleColor:[UIColor colorWithHex:0x333333] forState:0]; + [_btnSkip setTitle:@"跳过" forState:0]; + [_btnSkip addTarget:self action:@selector(clickSkipButtonAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _btnSkip; +} + +-(UIButton *)btnSubmit +{ + if (_btnSubmit == nil) { + _btnSubmit = [UIButton buttonWithType:UIButtonTypeCustom]; + _btnSubmit.backgroundColor = [UIColor whiteColor]; + _btnSubmit.titleLabel.font = [UIFont systemFontOfSize:16]; + [_btnSubmit setTitleColor:[UIColor colorWithHex:0x4A90E2] forState:0]; + [_btnSubmit setTitle:@"提交" forState:0]; + [_btnSubmit addTarget:self action:@selector(clickSubmitButtonAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _btnSubmit; +} + +-(UIView *)lineV +{ + if (_lineV == nil) { + _lineV = [[UIView alloc]init]; + _lineV.backgroundColor = [UIColor colorWithHex:0xC8C7CC]; + } + return _lineV; +} + +-(UIView *)lineH +{ + if (_lineH == nil) { + _lineH = [[UIView alloc]init]; + _lineH.backgroundColor = [UIColor colorWithHex:0xC8C7CC]; + } + return _lineH; +} + +#pragma mark - Override + +- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { + UIView *touchView = [super hitTest:point withEvent:event]; + if (touchView == self) { + return nil; + } else { + return touchView; + } +} + +@end diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankView.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankView.h new file mode 100644 index 0000000..05e2c47 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankView.h @@ -0,0 +1,43 @@ +// +// PLVFillBlankView.h +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/1/28. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class PLVFillBlankView; +@protocol PLVFillBlankViewDelegate + +/// 填空题view的高度变化 +/// @param height 变化后的高度 +-(void)fillBlankView:(PLVFillBlankView *)fillBlankView didChangeHeight:(CGFloat)height; + +-(void)fillBlankView:(PLVFillBlankView *)fillBlankView textFieldShouldBeginEditingBlock:(UITextField *)tfEditing; + +@end + +/// 填空题view +@interface PLVFillBlankView : UIView + +@property (nonatomic, weak) id delegate; + +/// 填空题内容,会触发绘制 +@property (nonatomic, strong) NSString *questionString; + +@property (nonatomic, strong) UIColor *questionColor; //!< 问题字体颜色(默认黑色) +@property (nonatomic, strong) UIColor *fillColor; //!< 填空字体颜色(默认黑色) + +@property (nonatomic, assign) CGFloat questionFontSize; //!< 问题字体大小(默认18) +@property (nonatomic, assign) CGFloat fillFontSize; //!< 填空字体大小(默认15) + +@property (nonatomic, strong, readonly) NSMutableArray *textfieldArray; //!< 生成的输入框数组 + + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankView.m b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankView.m new file mode 100644 index 0000000..6ebafe4 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVFillBlankView.m @@ -0,0 +1,469 @@ +// +// PLVFillBlankView.m +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/1/28. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import "PLVFillBlankView.h" +#import + +#define kFillString @"_" //!< 填空符 + +@interface PLVFillBlankView () + +@property (nonatomic, strong) NSMutableArray *fillRangeArray; //!< 填空符范围数组(可根据输入长度变化) +@property (nonatomic, strong) NSMutableArray *originalFillRangeArray; //!< 原来的填空符范围数组(不变) + +@property (nonatomic, strong) NSMutableArray *textfieldArray; //!< 生成的输入框数组 + +@end + +@implementation PLVFillBlankView +#pragma mark - Init + +-(instancetype)init +{ + if (self = [super init]) { + [self commonInit]; + } + return self; +} + +-(instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + [self commonInit]; + } + return self; +} + +-(void)commonInit +{ + self.backgroundColor = [UIColor whiteColor]; + self.questionColor = [UIColor blackColor]; + self.fillColor = [UIColor blackColor]; + self.questionFontSize = 18.0f; + self.fillFontSize = 15.0f; + self.fillRangeArray = [NSMutableArray arrayWithCapacity:1]; + self.originalFillRangeArray = [NSMutableArray arrayWithCapacity:1]; + self.textfieldArray = [NSMutableArray arrayWithCapacity:1]; +} + +-(void)layoutSubviews +{ + //自身的frame改变,就要重绘 + if (self.questionString) { + //处理填空符超出一行的情况 + _questionString = [self regularFillOverQuestionText:_questionString]; + //查找处理过后字符串的填空符范围 + self.fillRangeArray = [self searchFillRangeWithString:_questionString]; + //计算高度,并回调 + [self calculateFillBlankViewHeightCallback]; + } + + [self setNeedsDisplay]; +} + +#pragma mark - Action +/// 计算填空题view高度,并回调 +-(void)calculateFillBlankViewHeightCallback +{ + NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init]; + paragraphStyle.maximumLineHeight = 24; + paragraphStyle.minimumLineHeight = 24; + CGFloat fillHeight = [self.questionString boundingRectWithSize:CGSizeMake(self.bounds.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:self.questionFontSize], NSParagraphStyleAttributeName : paragraphStyle} context:nil].size.height; + self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, fillHeight); + + if (self.delegate && [self.delegate respondsToSelector:@selector(fillBlankView:didChangeHeight:)]) { + [self.delegate fillBlankView:self didChangeHeight:fillHeight]; + } +} + +#pragma mark - Setter + +-(void)setQuestionString:(NSString *)questionString +{ + //给填空符前后添加空格,当填空符前后有英文的时候系统会把填空符和英文看作一个单词,从而导致换行问题 + questionString = [self regularLineBreakQuestionText:questionString]; + //处理填空符超出一行的情况 + questionString = [self regularFillOverQuestionText:questionString]; + //处理填空符低于3个的情况 +// questionString = [self regularFillLowerQuestionText:questionString]; + //查找处理过后字符串的填空符范围 + self.fillRangeArray = [self searchFillRangeWithString:questionString]; + self.originalFillRangeArray = [self.fillRangeArray mutableCopy]; + + if (self.textfieldArray.count) { + for (UITextField *oldTextfield in self.textfieldArray) { + [oldTextfield removeFromSuperview]; + } + [self.textfieldArray removeAllObjects]; + } + + self.textfieldArray = [self createTextfieldWithCount:self.fillRangeArray.count]; + _questionString = questionString; + [self calculateFillBlankViewHeightCallback]; + [self setNeedsDisplay]; +} + +-(void)setQuestionColor:(UIColor *)questionColor +{ + _questionColor = questionColor; + [self setNeedsDisplay]; +} + +-(void)setFillColor:(UIColor *)fillColor +{ + _fillColor = fillColor; + if (self.textfieldArray.count) { + for (UITextField *input in self.textfieldArray) { + input.textColor = fillColor; + } + } +} + +-(void)setQuestionFontSize:(CGFloat)questionFontSize +{ + _questionFontSize = questionFontSize; + [self setNeedsDisplay]; +} + +-(void)setFillFontSize:(CGFloat)fillFontSize +{ + _fillFontSize = fillFontSize; + if (self.textfieldArray.count) { + for (UITextField *input in self.textfieldArray) { + input.font = [UIFont systemFontOfSize:fillFontSize]; + } + } +} + +#pragma mark - Draw + +-(void)drawRect:(CGRect)rect +{ + if (self.questionString + && self.questionString.length > 0) { + CGContextRef context = UIGraphicsGetCurrentContext(); + [self.backgroundColor setFill]; + CGContextFillRect(context, rect); + //翻转坐标系步骤 + //设置当前文本矩阵 + CGContextSetTextMatrix(context, CGAffineTransformIdentity); + //文本沿y轴移动 + CGContextTranslateCTM(context, 0, self.bounds.size.height); + //文本翻转成为CoreText坐标系 + CGContextScaleCTM(context, 1.0, -1.0); + + //获取NSMutableAttributedString + NSMutableAttributedString *attributedString = [self buildAttributedStringWithTag]; + //根据AttString生成CTFramesetterRef + CTFramesetterRef ctFramesetter = CTFramesetterCreateWithAttributedString((CFMutableAttributedStringRef)attributedString); + + //创建绘制区域 + CGMutablePathRef path = CGPathCreateMutable(); + CGRect bounds = CGRectMake(0.0, 0.0, self.bounds.size.width, self.bounds.size.height); + CGPathAddRect(path, NULL, bounds); + + //绘制文本 + CTFrameRef ctFrame = CTFramesetterCreateFrame(ctFramesetter,CFRangeMake(0, 0), path, NULL); + CTFrameDraw(ctFrame, context); + + //获取CTLine数组 + CFArrayRef lines = CTFrameGetLines(ctFrame); + CGPoint lineOrigins[CFArrayGetCount(lines)]; + CTFrameGetLineOrigins(ctFrame, CFRangeMake(0, 0), lineOrigins); + //遍历每一个CTline + for (int i = 0; i < CFArrayGetCount(lines); i++) { + CTLineRef line = CFArrayGetValueAtIndex(lines, i); + CGFloat lineAscent; + CGFloat lineDescent; + CGFloat lineLeading; + CTLineGetTypographicBounds(line, &lineAscent, &lineDescent, &lineLeading); + CFArrayRef runs = CTLineGetGlyphRuns(line); + + //遍历每一个CTRunRef + for (int j = 0; j < CFArrayGetCount(runs); j++) { + CGPoint lineOrigin = lineOrigins[i]; + CTRunRef run = CFArrayGetValueAtIndex(runs, j); + NSDictionary* attributes = (NSDictionary*)CTRunGetAttributes(run); + const CGPoint *point = CTRunGetPositionsPtr(run); + + //找到标记,添加自定义控件 + NSString *attributeName = [attributes objectForKey:@"PLVCoreTextDataName"]; + if ([attributeName containsString:@"input_"]) { + // 计算输入框frame + NSInteger rangeIndex = [[attributeName componentsSeparatedByString:@"_"][1] integerValue]; + + if (rangeIndex < self.textfieldArray.count) { + NSRange range = NSRangeFromString(self.fillRangeArray[rangeIndex]); + NSInteger count = range.length > 2 ? range.length - 2 : range.length; + CGFloat textfieldWidth = [self calculateWidthWithFillCount:count]; + CGRect textFieldFrame = CGRectMake(point[0].x + 5, self.frame.size.height - lineOrigin.y - self.questionFontSize, textfieldWidth, self.questionFontSize); + + UITextField *textfield = self.textfieldArray[rangeIndex]; + textfield.hidden = NO; + textfield.frame = textFieldFrame; + } + } + } + } + + CFRelease(ctFrame); + CFRelease(path); + CFRelease(ctFramesetter); + } + else { + [super drawRect:rect]; + } +} + + +#pragma mark - UITextField delagate + +-(void)textFieldDidChange:(UITextField *)textField +{ + NSInteger index = textField.tag - 100; + NSString *str = textField.text; + if (textField.text.length > 200) { + str = [textField.text substringWithRange:NSMakeRange(0, 200)]; + textField.text = str; + } + + CGFloat width = [str boundingRectWithSize:CGSizeMake(1000, self.fillFontSize) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:self.fillFontSize]} context:nil].size.width; + + //填满输入框文字,需要多少个填空符 + NSInteger needCount = [self calculateFillCountForfullWidth:width]; + //生成的填空符需要比输入框多两个单位长度 + NSInteger numTotal = needCount + 2; + //填满一行需要多少个填空符 + NSInteger fullCount = [self calculateFillCountForfullWidth:self.bounds.size.width]; + //填空符不能超出一行 + numTotal = numTotal > fullCount ? fullCount : numTotal; + //填空符不能低于3个 + numTotal = numTotal < 3 ? 3 : numTotal; + + NSRange fillRange = NSRangeFromString(self.fillRangeArray[index]); + NSRange oldFillRange = NSRangeFromString(self.originalFillRangeArray[index]); + + if (numTotal >= oldFillRange.length) { + NSString *fillStr = [self createFillStringWithCount:numTotal]; + _questionString = [self.questionString stringByReplacingCharactersInRange:fillRange withString:fillStr]; + self.fillRangeArray = [self searchFillRangeWithString:self.questionString]; + + //计算高度,并回调 + [self calculateFillBlankViewHeightCallback]; + + [self setNeedsDisplay]; + } +} + +-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField +{ + if (self.delegate && [self.delegate respondsToSelector:@selector(fillBlankView:textFieldShouldBeginEditingBlock:)]) { + [self.delegate fillBlankView:self textFieldShouldBeginEditingBlock:textField]; + } + return YES; +} + +#pragma mark - Tool Method + +/// 整理原来的字符串,给填空符前后添加空格,当填空符前后有英文的时候系统会把填空符和英文看作一个单词,从而导致换行问题 +/// @param questionText 原字符串 +-(NSString *)regularLineBreakQuestionText:(NSString *)questionText +{ + //原字符串填空符的范围 + NSMutableArray *rangeArray = [self searchFillRangeWithString:questionText]; + + for (NSInteger i = rangeArray.count - 1; i >= 0; i--) { + NSRange range = NSRangeFromString(rangeArray[i]); + NSString *rangeString = [questionText substringWithRange:range]; + NSString *dealString = [[NSString alloc]initWithFormat:@" %@ ",rangeString]; + questionText = [questionText stringByReplacingCharactersInRange:range withString:dealString]; + } + return questionText; +} + +/// 整理原来的字符串,需求是填空符长度不能超出一行 +/// @param questionText 原字符串 +-(NSString *)regularFillOverQuestionText:(NSString *)questionText +{ + //填满一行需要的填空符个数 + NSInteger fullIndex = [self calculateFillCountForfullWidth:self.bounds.size.width]; + + //原字符串填空符的范围 + NSMutableArray *rangeArray = [self searchFillRangeWithString:questionText]; + //填空符超出一行的范围 + NSMutableArray *overRange = [NSMutableArray arrayWithCapacity:1]; + + for (NSString *rangeStr in rangeArray) { + NSRange range = NSRangeFromString(rangeStr); + if (range.length > fullIndex) { + [overRange addObject:rangeStr]; + } + } + if (overRange.count > 0) { + //超出一行的填空符,用一行代替 + //填满一行的填空符 + NSString *fullFillStr = [self createFillStringWithCount:fullIndex]; + for (NSInteger i = overRange.count - 1; i >= 0; i--) { + NSRange range = NSRangeFromString(overRange[i]); + questionText = [questionText stringByReplacingCharactersInRange:range withString:fullFillStr]; + } + } + return questionText; +} + +/// 整理原来的字符串,需求是填空符长度不能低于3个 +/// @param questionText 原字符串 +-(NSString *)regularFillLowerQuestionText:(NSString *)questionText +{ + //原字符串填空符的范围 + NSMutableArray *rangeArray = [self searchFillRangeWithString:questionText]; + //填空符低于3个的范围 + NSMutableArray *lowerRange = [NSMutableArray arrayWithCapacity:1]; + + for (NSString *rangeStr in rangeArray) { + NSRange range = NSRangeFromString(rangeStr); + if (range.length < 3) { + [lowerRange addObject:rangeStr]; + } + } + if (lowerRange.count > 0) { + //低于3个的填空符,用3个填空符代替 + NSString *threeFillStr = [self createFillStringWithCount:3]; + for (NSInteger i = lowerRange.count - 1; i >= 0; i--) { + NSRange range = NSRangeFromString(lowerRange[i]); + questionText = [questionText stringByReplacingCharactersInRange:range withString:threeFillStr]; + } + } + return questionText; +} + +/// 生成富文本,给富文本插入标记 +-(NSMutableAttributedString *)buildAttributedStringWithTag{ + NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:self.questionString]; + + NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init]; + paragraphStyle.maximumLineHeight = 24; + paragraphStyle.minimumLineHeight = 24; + [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, self.questionString.length)]; + + [attributedString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:self.questionFontSize] range:NSMakeRange(0, self.questionString.length)]; + [attributedString addAttribute:NSForegroundColorAttributeName value:self.questionColor range:NSMakeRange(0, self.questionString.length)]; + + for (NSInteger i = 0; i < self.fillRangeArray.count; i++) { + NSString *rangeStr = self.fillRangeArray[i]; + NSString *indexValue = [NSString stringWithFormat:@"input_%ld", (long)i]; + NSRange fillRange = NSRangeFromString(rangeStr); + [attributedString addAttribute:(id)@"PLVCoreTextDataName" value:(id)indexValue range:fillRange]; + } + return attributedString; +} + +/// 计算填满某宽度需要多少个填空符 +/// @param fullWidth 宽度 +-(NSInteger)calculateFillCountForfullWidth:(CGFloat)fullWidth +{ + if (fullWidth <= 0) { + return 0; + } + + NSInteger index = 0; + CGFloat width = 0; + + while (width < fullWidth) { + index ++; + width = [self calculateWidthWithFillCount:index]; + } + return index > 0 ? index - 1 : 0; +} + +/// 计算count数量填空符的长度 +/// @param count 填空符数量 +-(CGFloat)calculateWidthWithFillCount:(NSInteger)count +{ + NSString *fillStr = [self createFillStringWithCount:count]; + CGFloat fillWidth = [fillStr boundingRectWithSize:CGSizeMake(1000, self.questionFontSize) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:self.questionFontSize]} context:nil].size.width; + return fillWidth; +} + +/// 在字符串中搜索填空符的范围(需求只要前5处填空符为可输入,其余为普通字符串) +/// @param string 要搜索的字符串 +-(NSMutableArray *)searchFillRangeWithString:(NSString *)string +{ + NSMutableArray *rangeArray = [NSMutableArray arrayWithCapacity:3]; + NSInteger location = -1; + NSInteger length = 0; + for (NSInteger i = 0; i < string.length; i++) { + NSString *temp = [string substringWithRange:NSMakeRange(i,1)]; + + if ([temp isEqualToString:kFillString]) { + if (location == -1) { + location = i; + length = 1; + }else { + length++; + } + if (i == string.length - 1 + && length >= 3 + && rangeArray.count < 5) { + NSRange range = NSMakeRange(location, length); + [rangeArray addObject:NSStringFromRange(range)]; + location = -1; + length = 0; + } + }else { + if (location != -1) { + if (length >= 3 + && rangeArray.count < 5) { + NSRange range = NSMakeRange(location, length); + [rangeArray addObject:NSStringFromRange(range)]; + location = -1; + length = 0; + } + else { + location = -1; + length = 0; + } + } + } + } + return rangeArray; +} + +/// 生成count数量的填空符 +/// @param count 数量 +-(NSString *)createFillStringWithCount:(NSInteger)count +{ + NSString *fillStr = kFillString; + for (NSInteger i = 0; i < count; i++) { + fillStr = [fillStr stringByAppendingString:kFillString]; + } + return fillStr; +} + +/// 生成count数量的输入框 +/// @param count 数量 +-(NSMutableArray *)createTextfieldWithCount:(NSInteger)count +{ + NSMutableArray *array = [NSMutableArray arrayWithCapacity:1]; + for (NSInteger i = 0; i < count; i++) { + UITextField *textField = [[UITextField alloc] init]; + [textField setBorderStyle:UITextBorderStyleNone]; + textField.textAlignment = NSTextAlignmentLeft; + textField.font = [UIFont systemFontOfSize:self.fillFontSize]; + textField.textColor = self.fillColor; + textField.tag = 100 + i; + textField.hidden = YES; + textField.delegate = self; + [textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; + [self addSubview:textField]; + [array addObject:textField]; + } + return array; +} + +@end diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVOptionView.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVOptionView.h new file mode 100644 index 0000000..39d6293 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVOptionView.h @@ -0,0 +1,25 @@ +// +// PLVOptionView.h +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/2/1. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// 选择题选项view +@interface PLVOptionView : UIView + +@property (nonatomic, strong) NSString *optionString; + +@property (nonatomic, assign) BOOL multipleChoiceType; // 是否多选样式 + +@property (nonatomic, assign) BOOL isSelect; +@property (nonatomic, copy) void (^selectActionHandler)(BOOL isSelect); + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVOptionView.m b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVOptionView.m new file mode 100644 index 0000000..46b7ea7 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVOptionView.m @@ -0,0 +1,128 @@ +// +// PLVOptionView.m +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/2/1. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import "PLVOptionView.h" +#import "UIColor+PLVVod.h" + +@interface PLVOptionView () + +@property (nonatomic, strong) UIButton *btnCheckbox; + +@property (nonatomic, strong) UILabel *lblOption; + +@end + + +@implementation PLVOptionView + +#pragma mark - Init & UI +-(instancetype)init +{ + if (self = [super init]) { + [self setupUI]; + } + return self; +} + +-(void)setupUI +{ + self.translatesAutoresizingMaskIntoConstraints = NO; + [self addSubview:self.btnCheckbox]; + [self addSubview:self.lblOption]; + + NSMutableArray *constrainsArray = [NSMutableArray array]; + + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:self.btnCheckbox attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0]]; + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:self.btnCheckbox attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:2.0]]; + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:self.btnCheckbox attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeWidth multiplier:1.0 constant:32]]; + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:self.btnCheckbox attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0 constant:18]]; + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:self.lblOption attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.btnCheckbox attribute:NSLayoutAttributeRight multiplier:1.0 constant:0]]; + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:self.lblOption attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]]; + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:self.lblOption attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeRight multiplier:1.0 constant:0]]; + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:self.lblOption attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0 constant:20]]; + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:self.lblOption attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0]]; + + + [self addConstraints:constrainsArray]; + +} + + +#pragma mark - Setter +-(void)setOptionString:(NSString *)optionString +{ + self.lblOption.text = optionString; + _optionString = optionString; +} + +-(void)setIsSelect:(BOOL)isSelect +{ + self.btnCheckbox.selected = isSelect; + _isSelect = isSelect; +} + +- (void)setMultipleChoiceType:(BOOL)multipleChoiceType{ + if (multipleChoiceType) { + [self.btnCheckbox setImage:[UIImage imageNamed:@"Checkbox-Default"] forState:UIControlStateNormal]; + [self.btnCheckbox setImage:[UIImage imageNamed:@"Checkbox-Selected-Default"] forState:UIControlStateSelected]; + }else{ + [self.btnCheckbox setImage:[UIImage imageNamed:@"Checkbox-Default"] forState:UIControlStateNormal]; + [self.btnCheckbox setImage:[UIImage imageNamed:@"RadioBox-Selected-Default"] forState:UIControlStateSelected]; + } + _multipleChoiceType = multipleChoiceType; +} + + +#pragma mark - Action + +-(void)clickCheckBoxAction:(UIButton *)sender +{ +// sender.selected = !sender.selected; +// _isSelect = sender.selected; + if (self.selectActionHandler) { + self.selectActionHandler(sender.selected); + } +} + + +#pragma mark - Loadlazy + +-(UIButton *)btnCheckbox +{ + if (_btnCheckbox == nil) { + _btnCheckbox = [UIButton buttonWithType:UIButtonTypeCustom]; + _btnCheckbox.translatesAutoresizingMaskIntoConstraints = NO; + [_btnCheckbox setImage:[UIImage imageNamed:@"Checkbox-Default"] forState:UIControlStateNormal]; + [_btnCheckbox setImage:[UIImage imageNamed:@"Checkbox-Selected-Default"] forState:UIControlStateSelected]; + [_btnCheckbox addTarget:self action:@selector(clickCheckBoxAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _btnCheckbox; +} + +-(UILabel *)lblOption +{ + if (_lblOption == nil) { + _lblOption = [[UILabel alloc]init]; + _lblOption.translatesAutoresizingMaskIntoConstraints = NO; + _lblOption.textColor = [UIColor colorWithHex:0x333333]; + _lblOption.font = [UIFont systemFontOfSize:14]; + _lblOption.numberOfLines = 0; + } + return _lblOption; +} + + +/* +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. +- (void)drawRect:(CGRect)rect { + // Drawing code +} +*/ + +@end diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestion.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestion.h index daeed1f..60a9b27 100644 --- a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestion.h +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestion.h @@ -14,6 +14,7 @@ @property (nonatomic, strong) NSArray *options; @property (nonatomic, assign) BOOL skippable; @property (nonatomic, assign) BOOL isMultipleChoice; // 是否多选题 +@property (nonatomic, assign) BOOL isFillBlankTopic; //!< 是否填空题 @property (nonatomic, copy) NSString *illustration; @end diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestionView.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestionView.h index 77d369a..18f3fb0 100644 --- a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestionView.h +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestionView.h @@ -9,9 +9,13 @@ #import #import "PLVVodQuestion.h" +/// 选择题问题view @interface PLVVodQuestionView : UIView -@property (nonatomic, copy) void (^submitActionHandler)(NSArray *indexPathsForSelectedItems); +/// 选择题的提交回调 +@property (nonatomic, copy) void (^submitActionHandler)(NSArray *indexForSelectedItems); + +/// 跳过回调 @property (nonatomic, copy) void (^skipActionHandler)(void); @property (nonatomic, strong) PLVVodQuestion *question; diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestionView.m b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestionView.m index 94bc25e..52b2be8 100644 --- a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestionView.m +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Exam/QuestionView/PLVVodQuestionView.m @@ -7,32 +7,36 @@ // #import "PLVVodQuestionView.h" -#import "PLVVodOptionCell.h" #import +#import "PLVOptionView.h" -@interface PLVVodQuestionView () +@interface PLVVodQuestionView () +//容器约束 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *outerContainerLeadingConstraint; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *outerContainerBottomConstraint; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *outerContainerTailingConstraint; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *outerContainerTopConstraint; @property CGFloat outerContanerWeidht; - -//@property (weak, nonatomic) IBOutlet UILabel *questionLabel; -@property (weak, nonatomic) IBOutlet UITextView *questionLabel; - -@property (weak, nonatomic) IBOutlet UILabel *questionTypeLb; - +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *paddingTopConstraint; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *paddingLeftConstraint; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *paddingRightConstraint; + +//UI控件 +@property (weak, nonatomic) IBOutlet UIView *containerView; +@property (weak, nonatomic) IBOutlet UIScrollView *scrollView; +@property (weak, nonatomic) IBOutlet UILabel *questionLabel; @property (weak, nonatomic) IBOutlet UIImageView *illustrationImageView; +@property (weak, nonatomic) IBOutlet UIView *optionsContainerView; +@property (weak, nonatomic) IBOutlet UIButton *skipButton; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *submitBtnWidthConstraint; + +//插图约束 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *illustrationContainerWidthConstraint; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *illustrationContainerRightConstraint; -@property (weak, nonatomic) IBOutlet UICollectionView *optionCollectionView; -@property (weak, nonatomic) IBOutlet UICollectionViewFlowLayout *collectionLayout; -@property CGFloat cellwidth; -@property CGFloat *cellHeights; -@property (weak, nonatomic) IBOutlet UIBarButtonItem *skipButton; -@property (weak, nonatomic) IBOutlet UIBarButtonItem *submitButton; +@property (nonatomic, strong) NSMutableArray *optionViewArray; @end @@ -41,10 +45,6 @@ @implementation PLVVodQuestionView #pragma mark - init & dealloc - (void)dealloc { - if (self.cellHeights != NULL){ - free(self.cellHeights); - self.cellHeights = NULL; - } [[NSNotificationCenter defaultCenter] removeObserver:self]; } @@ -62,6 +62,8 @@ - (instancetype)initWithFrame:(CGRect)frame { } - (void)commonInit { + self.optionViewArray = [NSMutableArray arrayWithCapacity:4]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interfaceOrientationDidChange:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; } @@ -73,156 +75,127 @@ - (void)interfaceOrientationDidChange:(NSNotification *)notification { - (void)awakeFromNib { [super awakeFromNib]; - [self.optionCollectionView registerNib:[UINib nibWithNibName:[PLVVodOptionCell identifier] bundle:nil] forCellWithReuseIdentifier:[PLVVodOptionCell identifier]]; - self.optionCollectionView.allowsMultipleSelection = YES; - self.optionCollectionView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); - self.questionLabel.textContainerInset = UIEdgeInsetsMake(5, 0, 0, 0); - self.questionLabel.editable = NO; self.illustrationImageView.clipsToBounds = YES; self.illustrationImageView.contentMode = UIViewContentModeScaleAspectFill; + self.containerView.layer.masksToBounds = YES; } -- (void)layoutSubviews{ - [self updateOuterContainerSize]; + +/// 生成选项,设置问卷 +-(void)createOptionsView +{ + // 设置问题 + NSString *questionType = _question.isMultipleChoice ? @"【多选题】" : @"【单选题】"; + + self.questionLabel.text = [NSString stringWithFormat:@"%@%@", questionType, _question.question]; + + // 设置插图 + if (_question.illustration.length > 0) { + [self.illustrationImageView yy_setImageWithURL:[NSURL URLWithString:_question.illustration] placeholder:nil]; + } + + //设置选项 + [self.optionViewArray removeAllObjects]; + [[self.optionsContainerView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; + + __weak typeof(self) weakSelf = self; + for (NSInteger i = 0; i < _question.options.count; i++) { + NSString *question = _question.options[i]; + PLVOptionView *optionView = [[PLVOptionView alloc]init]; + optionView.optionString = [NSString stringWithFormat:@"%@%@", [self optionOrderWithIndex:i], question]; + optionView.multipleChoiceType = _question.isMultipleChoice; + optionView.isSelect = NO; + [optionView setSelectActionHandler:^(BOOL isSelect) { + [weakSelf selectAnswerWithIndex:i andSelect:isSelect]; + }]; + [self.optionsContainerView addSubview:optionView]; + [self.optionViewArray addObject:optionView]; + + + NSMutableArray *constrainsArray = [NSMutableArray array]; + + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:optionView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.optionsContainerView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0]]; + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:optionView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.optionsContainerView attribute:NSLayoutAttributeRight multiplier:1.0 constant:0]]; + + if (i > 0) { + PLVOptionView *lastView = self.optionViewArray[i - 1]; + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:optionView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:lastView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:16]]; + if (i == _question.options.count - 1) { + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:optionView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.optionsContainerView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0]]; + } + } + else { + [constrainsArray addObject:[NSLayoutConstraint constraintWithItem:optionView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.optionsContainerView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]]; + } + + [self.optionsContainerView addConstraints:constrainsArray]; + } } -- (void)clear { - self.question = nil; - self.cellwidth = 0; - self.cellHeights = NULL; - self.outerContanerWeidht = 0; +- (void)layoutSubviews{ + if (self.question) { + [self updateOuterContainerSize]; + } } -#pragma mark - property + +#pragma mark - Setter - (void)setQuestion:(PLVVodQuestion *)question { _question = question; - self.optionCollectionView.allowsMultipleSelection = _question.isMultipleChoice; + dispatch_async(dispatch_get_main_queue(), ^{ + [self createOptionsView]; [self updateOuterContainerSize]; }); } -#pragma mark - action -- (IBAction)skipButtonAction:(UIBarButtonItem *)sender { - if (self.skipActionHandler) self.skipActionHandler(); -} -- (IBAction)submitButtonAction:(UIBarButtonItem *)sender { - if (self.submitActionHandler) self.submitActionHandler(self.optionCollectionView.indexPathsForSelectedItems); -} - -#pragma mark - UICollectionView -- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { - return 1; -} +#pragma mark - Action -- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - return self.question.options.count; -} - -- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { - PLVVodOptionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:[PLVVodOptionCell identifier] forIndexPath:indexPath]; -// cell.text = self.question.options[indexPath.item]; - NSString *optionText = [NSString stringWithFormat:@"%@ %@", [self optionOrderWithIndex:indexPath.row], self.question.options[indexPath.item]]; - cell.text = optionText; - cell.multipleChoiceType = self.question.isMultipleChoice; - return cell; -} - -- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath { - return YES; +-(void)selectAnswerWithIndex:(NSInteger)index andSelect:(BOOL)select +{ + if (_question.isMultipleChoice) { + if (index < self.optionViewArray.count) { + PLVOptionView *optionView = self.optionViewArray[index]; + optionView.isSelect = !optionView.isSelect; + } + }else { + for (NSInteger i = 0; i < self.optionViewArray.count; i++) { + PLVOptionView *optionView = self.optionViewArray[i]; + optionView.isSelect = index == i; + } + } } -- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath { - return YES; +- (IBAction)skipButtonAction:(UIButton *)sender { + if (self.skipActionHandler) { + self.skipActionHandler(); + } } -- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { - +- (IBAction)submitButtonAction:(UIButton *)sender { + if (self.submitActionHandler) { + NSMutableArray *array = [NSMutableArray arrayWithCapacity:1]; + for (NSInteger i = 0; i < self.optionViewArray.count; i++) { + PLVOptionView *optionView = self.optionViewArray[i]; + if (optionView.isSelect) { + [array addObject:@(i)]; + } + } + self.submitActionHandler(array); + } } -#pragma mark - UICollectionViewDelegateFlowLayout -- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { - CGFloat w = self.cellwidth; - CGFloat h = self.cellHeights[indexPath.row]; - return CGSizeMake(w, h); -} #pragma mark - public method - (void)scrollToTop { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self.optionCollectionView setContentOffset:CGPointZero animated:YES]; + [self.scrollView scrollsToTop]; }); } #pragma mark - private method -- (void)updateUI { - CGFloat padding = 16; - - // 是否有插图 - BOOL hasIllustration = _question.illustration.length > 0; - - // 设置插图 - if (hasIllustration) { - self.illustrationContainerWidthConstraint.constant = self.outerContanerWeidht / 2 - padding; - [self.illustrationImageView yy_setImageWithURL:[NSURL URLWithString:_question.illustration] placeholder:nil]; - } else { - self.illustrationContainerWidthConstraint.constant = 0; - } - - // 计算cell的宽度 - CGFloat cellW = self.outerContanerWeidht / 2 - padding - 10; - if ([self isLandscape] && !hasIllustration){ - // 无图且处于横屏状态,显示一行,重新计算cell 宽度, - cellW = self.outerContanerWeidht - 2*padding -10; - } - - if (cellW <= 0) { cellW = 1; } - self.cellwidth = cellW; - - // 计算cell的高度 - int count = (int)_question.options.count; - if (self.cellHeights != NULL){ - free(self.cellHeights); - self.cellHeights = NULL; - } - self.cellHeights = malloc(sizeof(CGFloat) * count); - for (int i=0; i self.cellHeights[rightCellIndex]) { - self.cellHeights[rightCellIndex] = self.cellHeights[leftCellIndex]; - } else { - self.cellHeights[leftCellIndex] = self.cellHeights[rightCellIndex]; - } - } - } - - [self.optionCollectionView reloadData]; - - // 设置问题 - self.questionLabel.text = _question.question; - - // 设置题型 - self.questionTypeLb.text = _question.isMultipleChoice ? @"【多选题】" : @"【单选题】"; - - // 设置跳过按钮 - self.skipButton.enabled = _question.skippable; - - if ([self isLandscape]){ - self.questionLabel.textAlignment = NSTextAlignmentCenter; - }else{ - self.questionLabel.textAlignment = NSTextAlignmentLeft; - } - - [self layoutIfNeeded]; -} +/// 更新视图 - (void)updateOuterContainerSize { UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation; @@ -230,7 +203,6 @@ - (void)updateOuterContainerSize { float height = self.superview.bounds.size.height; if (interfaceOrientation == UIInterfaceOrientationPortrait) { // 竖屏 - if (width >= height) { self.outerContainerTopConstraint.constant = 0; self.outerContainerBottomConstraint.constant = 0; @@ -245,9 +217,22 @@ - (void)updateOuterContainerSize { self.outerContainerLeadingConstraint.constant = 0; self.outerContainerTailingConstraint.constant = 0; self.outerContanerWeidht = [UIScreen mainScreen].bounds.size.width; - + self.paddingTopConstraint.constant = 20; + self.paddingLeftConstraint.constant = 16; + self.paddingRightConstraint.constant = 16; + + // 设置插图 + if (_question.illustration.length > 0) { + self.illustrationContainerRightConstraint.constant = 8; + self.illustrationContainerWidthConstraint.constant = 150; + }else { + self.illustrationContainerRightConstraint.constant = 0; + self.illustrationContainerWidthConstraint.constant = 0; + } + + self.containerView.layer.cornerRadius = 0; } else { // 横屏 - CGFloat verticalPadding = 60; + CGFloat verticalPadding = 67; CGFloat horzontalPadding; CGFloat scale = verticalPadding / 375.0; @@ -258,22 +243,43 @@ - (void)updateOuterContainerSize { horzontalPadding = (width - self.outerContanerWeidht) / 2.0 ; - // NSLog(@"outerContanerHeight = %f", outerContanerHeight); - self.outerContainerLeadingConstraint.constant = horzontalPadding; self.outerContainerTailingConstraint.constant = horzontalPadding; self.outerContainerTopConstraint.constant = verticalPadding; self.outerContainerBottomConstraint.constant = verticalPadding; + + self.paddingTopConstraint.constant = 24; + self.paddingLeftConstraint.constant = 24; + self.paddingRightConstraint.constant = 24; + + // 设置插图 + if (_question.illustration.length > 0) { + self.illustrationContainerRightConstraint.constant = 8; + self.illustrationContainerWidthConstraint.constant = 160; + }else { + self.illustrationContainerRightConstraint.constant = 0; + self.illustrationContainerWidthConstraint.constant = 0; + } + + self.containerView.layer.cornerRadius = 8; } - [self updateUI]; + [self.containerView layoutIfNeeded]; + [self.scrollView setContentSize:CGSizeMake(self.containerView.frame.size.width, self.scrollView.contentSize.height)]; + + // 设置跳过按钮 + if (_question.skippable) { + self.skipButton.hidden = NO; + self.submitBtnWidthConstraint.constant = 0; + }else { + self.skipButton.hidden = YES; + self.submitBtnWidthConstraint.constant = self.outerContanerWeidht * 0.5; + } } -- (BOOL)isLandscape{ - UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation; - return UIDeviceOrientationIsLandscape((UIDeviceOrientation)interfaceOrientation); -} +/// 获取答案序号 +/// @param index 第几个答案 - (NSString *)optionOrderWithIndex:(NSInteger )index{ NSDictionary *dict = @{@"0":@"A.", @"1":@"B.", @@ -283,9 +289,19 @@ - (NSString *)optionOrderWithIndex:(NSInteger )index{ }; NSString *keyStr = [NSString stringWithFormat:@"%d", (int)index]; - return dict[keyStr]; } +#pragma mark - Override + +- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { + UIView *touchView = [super hitTest:point withEvent:event]; + if (touchView == self) { + return nil; + } else { + return touchView; + } +} + @end diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/Model/PLVKnowledgeModel.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/Model/PLVKnowledgeModel.h new file mode 100644 index 0000000..d10f7a3 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/Model/PLVKnowledgeModel.h @@ -0,0 +1,69 @@ +// +// PLVKnowledgeModel.h +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/8/9. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import +NS_ASSUME_NONNULL_BEGIN + +#pragma mark - 知识清单model + +@class PLVKnowledgeWorkType; +@interface PLVKnowledgeModel : NSObject + +/// 按钮名称 +@property (nonatomic, copy) NSString *buttonName; + +/// 是否全屏展示, 默认NO +@property (nonatomic, assign) BOOL fullScreenStyle; + +/// 一级分类list +@property (nonatomic, copy) NSArray *knowledgeWorkTypes; + +@end + + +#pragma mark - 一级分类model + +@class PLVKnowledgeWorkKey; +@interface PLVKnowledgeWorkType : NSObject + +/// 一级分类名 +@property (nonatomic, copy) NSString *name; + +/// 二级分类list,此项为空则不显示该WorkType一级分类 +@property (nonatomic, copy) NSArray *knowledgeWorkKeys; + +@end + + +#pragma mark - 二级分类model + +@class PLVKnowledgePoint; +@interface PLVKnowledgeWorkKey : NSObject + +/// 二级分类名 +@property (nonatomic, copy) NSString *name; + +/// 知识点list +@property (nonatomic, copy) NSArray *knowledgePoints; + +@end + + +#pragma mark - 知识点Model + +@interface PLVKnowledgePoint : NSObject + +/// 描述 +@property (nonatomic, copy) NSString *name; + +/// 时间点 +@property (nonatomic, assign) NSTimeInterval time; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/Model/PLVKnowledgeModel.m b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/Model/PLVKnowledgeModel.m new file mode 100644 index 0000000..81202e5 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/Model/PLVKnowledgeModel.m @@ -0,0 +1,76 @@ +// +// PLVKnowledgeModel.m +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/8/9. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import "PLVKnowledgeModel.h" + +@implementation PLVKnowledgeModel + +- (instancetype)init { + if (self = [super init]) { + self.buttonName = @"知识点"; + self.fullScreenStyle = NO; + self.knowledgeWorkTypes = [NSMutableArray arrayWithCapacity:1]; + } + return self; +} + +- (void)setButtonName:(NSString *)buttonName { + if (buttonName.length > 3) { + NSLog(@"知识清单按钮限制3个字符"); + buttonName = [buttonName substringWithRange:NSMakeRange(0, 3)]; + } + _buttonName = buttonName; +} + +@end + + +@implementation PLVKnowledgeWorkType + +- (instancetype)init { + if (self = [super init]) { + self.name = @"知识点"; + self.knowledgeWorkKeys = [NSMutableArray arrayWithCapacity:1]; + } + return self; +} + +- (void)setName:(NSString *)name { + if (name.length > 5) { + NSLog(@"知识点一级分类限制5个字符"); + name = [name substringWithRange:NSMakeRange(0, 5)]; + } + _name = name; +} + +@end + + +@implementation PLVKnowledgeWorkKey + +- (instancetype)init { + if (self = [super init]) { + self.knowledgePoints = [NSMutableArray arrayWithCapacity:1]; + } + return self; +} + +@end + + +@implementation PLVKnowledgePoint + +- (void)setName:(NSString *)name { + if (name.length > 16) { + NSLog(@"知识点描述限制16个字符"); + name = [name substringWithRange:NSMakeRange(0, 16)]; + } + _name = name; +} + +@end diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/PLVKnowledgeListViewController.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/PLVKnowledgeListViewController.h new file mode 100644 index 0000000..112d0ad --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/PLVKnowledgeListViewController.h @@ -0,0 +1,32 @@ +// +// PLVKnowledgeListViewController.h +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/8/9. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import +#import "PLVKnowledgeModel.h" + +NS_ASSUME_NONNULL_BEGIN + +/// 知识清单控制器 +@interface PLVKnowledgeListViewController : UIViewController + +@property (nonatomic, strong) PLVKnowledgeModel *knowledgeModel; + +@property (nonatomic, assign, readonly) BOOL showing; + +/// 选中知识点回调 +@property (nonatomic, copy) void (^selectKnowledgePointBlock)(PLVKnowledgePoint *point); + +/// 展示知识清单 +- (void)showKnowledgeListView; + +/// 隐藏知识清单 +- (void)hideKnowledgeListView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/PLVKnowledgeListViewController.m b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/PLVKnowledgeListViewController.m new file mode 100644 index 0000000..575805c --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/PLVKnowledgeListViewController.m @@ -0,0 +1,305 @@ +// +// PLVKnowledgeListViewController.m +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/8/9. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import "PLVKnowledgeListViewController.h" +#import "UIColor+PLVVod.h" +#import +#import "PLVSlideTabbarView.h" +#import "PLVKnowledgeCategoryTableViewCell.h" +#import "PLVKnowledgePointTableViewCell.h" +#import + +@interface PLVKnowledgeListViewController () + +@property (nonatomic, strong) PLVSlideTabbarView *slideTabbarView; +@property (nonatomic, strong) UITableView *leftTableView; +@property (nonatomic, strong) UITableView *rightTableView; + +/// 当前一级分类 +@property (nonatomic, strong) PLVKnowledgeWorkType *currentWorkType; +/// 当前二级分类 +@property (nonatomic, strong) PLVKnowledgeWorkKey *currentWorkKey; +/// 当前一级分类索引 +@property (nonatomic, assign) NSInteger currentWoryTypeIndex; +/// 当前二级分类索引 +@property (nonatomic, assign) NSInteger currentWoryKeyIndex; +/// 当前point索引: currentWoryTypeIndex_currentWoryKeyIndex_pointIndex +@property (nonatomic, copy) NSString *currentPointIndex; + +/// 是否正在展示 +@property (nonatomic, assign) BOOL showing; + +/// 用于自动隐藏的计时器 +@property (nonatomic, strong) NSTimer *hideTimer; + +/// 无操作的时间统计 +@property (nonatomic, assign) NSInteger noOperationTime; + +@end + +@implementation PLVKnowledgeListViewController + +#pragma mark - Lifecycle + +- (void)viewDidLoad { + [super viewDidLoad]; + self.view.backgroundColor = [UIColor clearColor]; + + [self.view addSubview:self.slideTabbarView]; + [self.slideTabbarView plv_makeConstraints:^(PLVMASConstraintMaker *make) { + make.left.right.top.equalTo(self.view); + make.height.plv_equalTo(48); + }]; + + [self.view addSubview:self.leftTableView]; + [self.leftTableView plv_makeConstraints:^(PLVMASConstraintMaker *make) { + make.left.bottom.equalTo(self.view); + make.width.plv_equalTo(240); + make.top.equalTo(self.slideTabbarView.plv_bottom); + }]; + + [self.view addSubview:self.rightTableView]; + [self.rightTableView plv_makeConstraints:^(PLVMASConstraintMaker *make) { + make.left.equalTo(self.leftTableView.plv_right); + make.right.bottom.equalTo(self.view); + make.top.equalTo(self.leftTableView); + }]; + + self.view.alpha = 0; +} + +-(void)dealloc { + if (self.hideTimer) { + [self.hideTimer invalidate]; + self.hideTimer = nil; + } +} + +#pragma mark - Setter + +- (void)setKnowledgeModel:(PLVKnowledgeModel *)knowledgeModel { + + NSMutableArray *categoryList = [NSMutableArray arrayWithCapacity:1]; + for (PLVKnowledgeWorkType *workTypeModel in knowledgeModel.knowledgeWorkTypes) { + [categoryList addObject:workTypeModel.name]; + } + + _knowledgeModel = knowledgeModel; + + self.slideTabbarView.tabbarItemArray = categoryList; + + [self dealKnowledgeDataWithIndex]; +} + + +#pragma mark - Action + +/// 展示知识清单 +- (void)showKnowledgeListView { + if (self.showing) { + return; + } + + [UIView animateWithDuration:PLVVodAnimationDuration animations:^{ + self.view.alpha = 1; + self.showing = YES; + } completion:^(BOOL finished) { + + }]; + + [self startTimerForAutoHiden]; +} + +/// 隐藏知识清单 +- (void)hideKnowledgeListView { + [UIView animateWithDuration:0.15 animations:^{ + self.view.alpha = 0; + self.showing = NO; + if (self.hideTimer) { + [self.hideTimer invalidate]; + self.hideTimer = nil; + } + }]; +} + +/// 根据索引,筛选数据用于显示 +- (void)dealKnowledgeDataWithIndex { + if (self.currentWoryTypeIndex >= self.knowledgeModel.knowledgeWorkTypes.count) { + return; + } + self.currentWorkType = self.knowledgeModel.knowledgeWorkTypes[self.currentWoryTypeIndex]; + + if (!self.currentWorkType || + self.currentWoryKeyIndex >= self.currentWorkType.knowledgeWorkKeys.count) { + return; + } + self.currentWorkKey = self.currentWorkType.knowledgeWorkKeys[self.currentWoryKeyIndex]; + + if (!self.currentWorkKey) { + return; + } + [self.leftTableView reloadData]; + [self.rightTableView reloadData]; +} + +- (NSString *)createPointIndexStringWithPointIndex:(NSInteger)index { + return [NSString stringWithFormat:@"%ld_%ld_%ld", (long)self.currentWoryTypeIndex, (long)self.currentWoryKeyIndex, (long)index]; +} + +/// 开始计时器 +- (void)startTimerForAutoHiden { + if (self.hideTimer) { + [self.hideTimer invalidate]; + self.hideTimer = nil; + } + self.noOperationTime = 0; + self.hideTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeEvent) userInfo:nil repeats:YES]; +} + +/// 计时操作 +- (void)timeEvent { + self.noOperationTime ++; + // 无操作10s 关闭清单 + if (self.noOperationTime >= 10) { + [self hideKnowledgeListView]; + if (self.hideTimer) { + [self.hideTimer invalidate]; + self.hideTimer = nil; + } + } +} + +#pragma mark - PLVSlideTabbarViewDelegate + +/// 选中一级分类回调 +/// @param slideTabbarView tabbar +/// @param index 一级分类序号 +- (void)plvSlideTabbarView:(PLVSlideTabbarView *)slideTabbarView selectItemAtIndex:(NSInteger)index { + self.noOperationTime = 0; + self.currentWoryTypeIndex = index; + self.currentWoryKeyIndex = 0; + [self dealKnowledgeDataWithIndex]; +} + +/// 点击关闭按钮 +- (void)plvSlideTabbarViewCloseButtonAction:(PLVSlideTabbarView *)slideTabbarView { + [self hideKnowledgeListView]; +} + + +#pragma mark - UITableViewDataSource + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + if (tableView == self.leftTableView) { + return self.currentWorkType.knowledgeWorkKeys.count; + } + return self.currentWorkKey.knowledgePoints.count; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + if (tableView == self.leftTableView) { + PLVKnowledgeCategoryTableViewCell *cell = [PLVKnowledgeCategoryTableViewCell cellWithTableView:tableView]; + cell.workKeyModel = self.currentWorkType.knowledgeWorkKeys[indexPath.row]; + cell.isSelectCell = indexPath.row == self.currentWoryKeyIndex; + return cell; + } + PLVKnowledgePointTableViewCell *cell = [PLVKnowledgePointTableViewCell cellWithTableView:tableView]; + cell.isShowDesc = self.knowledgeModel.fullScreenStyle; + cell.pointModel = self.currentWorkKey.knowledgePoints[indexPath.row]; + NSString *pointString = [self createPointIndexStringWithPointIndex:indexPath.row]; + cell.isSelectCell = [pointString isEqualToString:self.currentPointIndex]; + return cell; +} + +#pragma mark - UITableViewDelegate + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + self.noOperationTime = 0; + if (tableView == self.leftTableView) { + self.currentWoryKeyIndex = indexPath.row; + [self dealKnowledgeDataWithIndex]; + }else { + self.currentPointIndex = [self createPointIndexStringWithPointIndex:indexPath.row]; + [self.rightTableView reloadData]; + PLVKnowledgePoint *pointModel = self.currentWorkKey.knowledgePoints[indexPath.row]; + if (self.selectKnowledgePointBlock) { + self.selectKnowledgePointBlock(pointModel); + } + } +} + +-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath +{ + return 48; +} + +-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath +{ + if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { + [cell setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)]; + } + if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { + [cell setLayoutMargins:UIEdgeInsetsMake(0, 0, 0, 0)]; + } +} + + +#pragma mark - Loadlazy + +-(PLVSlideTabbarView *)slideTabbarView { + if (_slideTabbarView == nil) { + _slideTabbarView = [[PLVSlideTabbarView alloc]init]; + _slideTabbarView.delegate = self; + } + return _slideTabbarView; +} + +- (UITableView *)leftTableView { + if (_leftTableView == nil) { + _leftTableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain]; + _leftTableView.backgroundColor = [UIColor colorWithHex:0x222326]; + _leftTableView.delegate = self; + _leftTableView.dataSource = self; + _leftTableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; + _leftTableView.showsVerticalScrollIndicator = NO; + _leftTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; + _leftTableView.separatorColor = [UIColor colorWithRed:51/255.0 green:52/255.0 blue:55/255.0 alpha:1]; + if (@available(iOS 11.0, *)) { + _leftTableView.estimatedRowHeight = 0; + _leftTableView.estimatedSectionHeaderHeight = 0; + _leftTableView.estimatedSectionFooterHeight = 0; + _leftTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; + _leftTableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); + _leftTableView.scrollIndicatorInsets = _leftTableView.contentInset; + } + } + return _leftTableView; +} + +- (UITableView *)rightTableView { + if (_rightTableView == nil) { + _rightTableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain]; + _rightTableView.backgroundColor = [UIColor colorWithRed:51/255.0 green:52/255.0 blue:55/255.0 alpha:1]; + _rightTableView.delegate = self; + _rightTableView.dataSource = self; + _rightTableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; + _rightTableView.showsVerticalScrollIndicator = NO; + _rightTableView.separatorStyle = UITableViewCellSeparatorStyleNone; + if (@available(iOS 11.0, *)) { + _rightTableView.estimatedRowHeight = 0; + _rightTableView.estimatedSectionHeaderHeight = 0; + _rightTableView.estimatedSectionFooterHeight = 0; + _rightTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; + _rightTableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); + _rightTableView.scrollIndicatorInsets = _rightTableView.contentInset; + } + } + return _rightTableView; +} + +@end diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/PLVSlideTabbarView/PLVSlideTabbarView.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/PLVSlideTabbarView/PLVSlideTabbarView.h new file mode 100644 index 0000000..e6541ba --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/PLVSlideTabbarView/PLVSlideTabbarView.h @@ -0,0 +1,35 @@ +// +// PLVSlideTabbarView.h +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/8/9. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class PLVSlideTabbarView; + +@protocol PLVSlideTabbarViewDelegate +/// 选中一级分类的回调 +- (void)plvSlideTabbarView:(PLVSlideTabbarView *)slideTabbarView selectItemAtIndex:(NSInteger)index; +/// 点击关闭按钮回调 +- (void)plvSlideTabbarViewCloseButtonAction:(PLVSlideTabbarView *)slideTabbarView; +@end + +/// 带有关闭按钮的分类tabbar视图 +@interface PLVSlideTabbarView : UIView + +/// 一级分类数组 +@property (nonatomic, strong) NSArray *tabbarItemArray; + +/// 当前选中序号 +@property (nonatomic, assign) NSInteger currentIndex; + +@property(nonatomic, weak) iddelegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/PLVSlideTabbarView/PLVSlideTabbarView.m b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/PLVSlideTabbarView/PLVSlideTabbarView.m new file mode 100644 index 0000000..9b788ca --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/PLVSlideTabbarView/PLVSlideTabbarView.m @@ -0,0 +1,219 @@ +// +// PLVSlideTabbarView.m +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/8/9. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import "PLVSlideTabbarView.h" +#import +#import "UIColor+PLVVod.h" + +@interface PLVSlideTabbarView () + +@property (nonatomic, strong) UIScrollView *scrollView; +@property (nonatomic, strong) UIView *scrollContentView; +@property (nonatomic, strong) UIView *indexView; +@property (nonatomic, strong) UIButton *closeButton; + +@property (nonatomic, copy) NSMutableArray *itemButtonArray; +@property (nonatomic, copy) NSMutableArray *itemTitleWidthArray; + +@end + + +@implementation PLVSlideTabbarView + +#pragma mark - Init & UI + +- (instancetype)init +{ + if (self = [super init]) { + [self initUI]; + } + return self; +} + +- (void)initUI { + self.backgroundColor = [UIColor colorWithHex:0x222326]; + [self addSubview:self.closeButton]; + [self addSubview:self.scrollView]; + [self.scrollView addSubview:self.scrollContentView]; + [self.scrollContentView addSubview:self.indexView]; + + [self.closeButton plv_makeConstraints:^(PLVMASConstraintMaker *make) { + make.top.bottom.right.equalTo(self); + make.width.plv_equalTo(55); + }]; + + [self.scrollView plv_makeConstraints:^(PLVMASConstraintMaker *make) { + make.left.top.bottom.equalTo(self); + make.right.equalTo(self).offset(-55); + }]; + + [self.scrollContentView plv_makeConstraints:^(PLVMASConstraintMaker *make) { + make.edges.equalTo(self.scrollView); + make.height.equalTo(self.scrollView); + }]; + + [self.indexView plv_makeConstraints:^(PLVMASConstraintMaker *make) { + make.height.plv_equalTo(2); + make.width.plv_equalTo(46); + make.bottom.equalTo(self.scrollContentView); + make.centerX.equalTo(self.scrollContentView); + }]; +} + +/// 重新设置Tabbar +- (void)rebuildTabbar { + for (UIButton *itemButton in self.itemButtonArray) { + [itemButton removeFromSuperview]; + } + [self.itemButtonArray removeAllObjects]; + [self.itemTitleWidthArray removeAllObjects]; + + CGFloat itemPadding = 20; + CGFloat itemMarginLeft = 12; + for (NSInteger i = 0; i < self.tabbarItemArray.count; i++) { + NSString *title = self.tabbarItemArray[i]; + UIButton *itemButton = [self createButtonWithTitle:title]; + itemButton.tag = 100 + i; + itemButton.selected = self.currentIndex == i; + + CGFloat titleWidth = [title boundingRectWithSize:CGSizeMake(1000, 16) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:16]} context:nil].size.width; + CGFloat itemWidth = titleWidth + 2 * itemPadding; + + [self.scrollContentView addSubview:itemButton]; + [itemButton plv_makeConstraints:^(PLVMASConstraintMaker *make) { + make.width.plv_equalTo(itemWidth); + make.top.bottom.equalTo(self.scrollContentView); + make.left.equalTo(self.scrollContentView).offset(itemMarginLeft); + if (i == self.tabbarItemArray.count - 1) { + make.right.equalTo(self.scrollContentView); + } + }]; + + [itemButton addTarget:self action:@selector(clickItemAction:) forControlEvents:UIControlEventTouchUpInside]; + + [self.itemButtonArray addObject:itemButton]; + [self.itemTitleWidthArray addObject:[NSNumber numberWithFloat:titleWidth]]; + itemMarginLeft += itemWidth; + } + [self updateIndexView]; +} + +/// 更新indexView位置 +- (void)updateIndexView { + self.indexView.hidden = self.currentIndex >= self.itemButtonArray.count; + if (self.currentIndex < self.itemButtonArray.count) { + UIButton *item = self.itemButtonArray[self.currentIndex]; + CGFloat width = [self.itemTitleWidthArray[self.currentIndex] floatValue]; + + [self.indexView plv_remakeConstraints:^(PLVMASConstraintMaker *make) { + make.height.plv_equalTo(2); + make.width.plv_equalTo(width); + make.bottom.equalTo(self.scrollContentView); + make.centerX.equalTo(item); + }]; + } +} + +/// 生成itemButton +/// @param title title +- (UIButton *)createButtonWithTitle:(NSString *)title { + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button setTitle:title forState:0]; + UIColor *normalColor = [[UIColor whiteColor] colorWithAlphaComponent:0.6]; + [button setTitleColor:normalColor forState:0]; + [button setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected]; + button.titleLabel.font = [UIFont systemFontOfSize:16]; + return button; +} + +#pragma mark - Setter + +-(void)setTabbarItemArray:(NSArray *)tabbarItemArray { + _tabbarItemArray = tabbarItemArray; + [self rebuildTabbar]; +} + +-(void)setCurrentIndex:(NSInteger)currentIndex +{ + _currentIndex = currentIndex; + [self updateIndexView]; +} + +#pragma mark - Action + +/// 点击关闭按钮 +- (void)clickCloseButtonAction { + if (self.delegate && [self.delegate respondsToSelector:@selector(plvSlideTabbarViewCloseButtonAction:)]) { + [self.delegate plvSlideTabbarViewCloseButtonAction:self]; + } +} + +/// 点击item +/// @param button item +- (void)clickItemAction:(UIButton *)button { + NSInteger index = button.tag - 100; + for (NSInteger i = 0; i < self.itemButtonArray.count; i++) { + UIButton *itemButton = self.itemButtonArray[i]; + itemButton.selected = i == index; + } + self.currentIndex = index; + if (self.delegate && [self.delegate respondsToSelector:@selector(plvSlideTabbarView:selectItemAtIndex:)]) { + [self.delegate plvSlideTabbarView:self selectItemAtIndex:index]; + } +} + +#pragma mark - Loadlazy + +- (UIScrollView *)scrollView { + if (_scrollView == nil) { + _scrollView = [[UIScrollView alloc]init]; + _scrollView.showsVerticalScrollIndicator = NO; + _scrollView.showsHorizontalScrollIndicator = NO; + } + return _scrollView; +} + +- (UIView *)scrollContentView { + if (_scrollContentView == nil) { + _scrollContentView = [[UIView alloc]init]; + } + return _scrollContentView; +} + +- (UIView *)indexView { + if (_indexView == nil) { + _indexView = [[UIView alloc]init]; + _indexView.backgroundColor = [UIColor colorWithHex:0x3990FF]; + } + return _indexView; +} + +- (UIButton *)closeButton { + if (_closeButton == nil) { + _closeButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_closeButton setImage:[UIImage imageNamed:@"plv_white_close"] forState:0]; + [_closeButton addTarget:self action:@selector(clickCloseButtonAction) forControlEvents:UIControlEventTouchUpInside]; + } + return _closeButton; +} + +- (NSMutableArray *)itemButtonArray { + if (_itemButtonArray == nil) { + _itemButtonArray = [NSMutableArray arrayWithCapacity:3]; + } + return _itemButtonArray; +} + +- (NSMutableArray *)itemTitleWidthArray { + if (_itemTitleWidthArray == nil) { + _itemTitleWidthArray = [NSMutableArray arrayWithCapacity:3]; + } + return _itemTitleWidthArray; +} + +@end diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/View/PLVKnowledgeCategoryTableViewCell.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/View/PLVKnowledgeCategoryTableViewCell.h new file mode 100644 index 0000000..a60e2a4 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/View/PLVKnowledgeCategoryTableViewCell.h @@ -0,0 +1,24 @@ +// +// PLVKnowledgeCategoryTableViewCell.h +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/8/9. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import +#import "PLVKnowledgeModel.h" + +NS_ASSUME_NONNULL_BEGIN + +/// 二级分类cell +@interface PLVKnowledgeCategoryTableViewCell : UITableViewCell + ++ (PLVKnowledgeCategoryTableViewCell *)cellWithTableView:(UITableView *)tableView; + +@property (nonatomic, copy) PLVKnowledgeWorkKey *workKeyModel; +@property (nonatomic, assign) BOOL isSelectCell; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/View/PLVKnowledgeCategoryTableViewCell.m b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/View/PLVKnowledgeCategoryTableViewCell.m new file mode 100644 index 0000000..7d68482 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/View/PLVKnowledgeCategoryTableViewCell.m @@ -0,0 +1,142 @@ +// +// PLVKnowledgeCategoryTableViewCell.m +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/8/9. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import "PLVKnowledgeCategoryTableViewCell.h" +#import "UIColor+PLVVod.h" +#import +#import "PLVMarqueeLabel.h" + +@interface PLVKnowledgeCategoryTableViewCell () + +@property (nonatomic, strong) PLVMarqueeLabel *categoryLabel; +@property (nonatomic, strong) UILabel *numberLabel; + +@end + +@implementation PLVKnowledgeCategoryTableViewCell + +#pragma mark - Init & UI + ++ (PLVKnowledgeCategoryTableViewCell *)cellWithTableView:(UITableView *)tableView +{ + static NSString *cellId = @"PLVKnowledgeCategoryTableViewCell"; + PLVKnowledgeCategoryTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; + if (cell == nil) + { + cell = [[PLVKnowledgeCategoryTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId]; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + cell.backgroundColor = [UIColor colorWithHex:0x222326]; + cell.contentView.backgroundColor = [UIColor colorWithHex:0x222326]; + } + return cell; +} + +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier +{ + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) + { + [self initUI]; + } + return self; +} + +- (void)initUI { + [self.contentView addSubview:self.categoryLabel]; +// [self.categoryLabel plv_makeConstraints:^(PLVMASConstraintMaker *make) { +// make.left.equalTo(self.contentView).offset(32); +// make.centerY.equalTo(self.contentView); +// make.right.equalTo(self.contentView).offset(-10); +// make.height.plv_greaterThanOrEqualTo(10); +// }]; + + [self.categoryLabel plv_makeConstraints:^(PLVMASConstraintMaker *make) { + make.left.equalTo(self.contentView).offset(32); + make.centerY.equalTo(self.contentView); + make.height.plv_greaterThanOrEqualTo(10); + make.width.plv_lessThanOrEqualTo(120); + }]; + + [self.contentView addSubview:self.numberLabel]; + [self.numberLabel plv_makeConstraints:^(PLVMASConstraintMaker *make) { + make.left.equalTo(self.categoryLabel.plv_right); + make.centerY.equalTo(self.contentView); + make.width.height.plv_greaterThanOrEqualTo(10); + }]; +} + +#pragma mark - Setter +- (void)setWorkKeyModel:(PLVKnowledgeWorkKey *)workKeyModel { + _workKeyModel = workKeyModel; + self.categoryLabel.text = workKeyModel.name; + self.numberLabel.text = [NSString stringWithFormat:@"(%lu)", (unsigned long)workKeyModel.knowledgePoints.count]; +} + +- (void)setIsSelectCell:(BOOL)isSelectCell { + if (isSelectCell) { + self.backgroundColor = [UIColor colorWithRed:51/255.0 green:52/255.0 blue:55/255.0 alpha:1]; + self.contentView.backgroundColor = [UIColor colorWithRed:51/255.0 green:52/255.0 blue:55/255.0 alpha:1]; + // 滚动 + self.categoryLabel.scrollDuration = 10; + [self.categoryLabel restartLabel]; + }else { + self.backgroundColor = [UIColor colorWithHex:0x222326]; + self.contentView.backgroundColor = [UIColor colorWithHex:0x222326]; + //暂停滚动 + self.categoryLabel.scrollDuration = -1; + [self.categoryLabel shutdownLabel]; + } +} + + +#pragma mark - Pravite Method + +- (void)beginAnimation { + [self.categoryLabel restartLabel]; + + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(animationFinish) object:nil]; + [self performSelector:@selector(animationFinish) withObject:nil afterDelay:10*3]; +} + +- (void)animationFinish { + [self.categoryLabel shutdownLabel]; + self.hidden = YES; +} + + +#pragma mark - Loadlazy + +- (UILabel *)numberLabel { + if (_numberLabel == nil) { + _numberLabel = [[UILabel alloc]init]; + _numberLabel.textColor = [[UIColor whiteColor]colorWithAlphaComponent:0.6]; + _numberLabel.font = [UIFont systemFontOfSize:14]; + } + return _numberLabel; +} + +- (PLVMarqueeLabel *)categoryLabel { + if (_categoryLabel == nil) { + _categoryLabel = [[PLVMarqueeLabel alloc] initWithFrame:self.contentView.bounds duration:10.0 andFadeLength:0]; + _categoryLabel.scrollDuration = -1; +// _categoryLabel.holdScrolling = YES; + _categoryLabel.textColor = [[UIColor whiteColor]colorWithAlphaComponent:0.6]; + _categoryLabel.font = [UIFont systemFontOfSize:14]; + } + return _categoryLabel; +} + +- (void)awakeFromNib { + [super awakeFromNib]; + // Initialization code +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + [super setSelected:selected animated:animated]; +} + +@end diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/View/PLVKnowledgePointTableViewCell.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/View/PLVKnowledgePointTableViewCell.h new file mode 100644 index 0000000..0446a81 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/View/PLVKnowledgePointTableViewCell.h @@ -0,0 +1,25 @@ +// +// PLVKnowledgePointTableViewCell.h +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/8/9. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import +#import "PLVKnowledgeModel.h" + +NS_ASSUME_NONNULL_BEGIN + +/// 知识点cell +@interface PLVKnowledgePointTableViewCell : UITableViewCell + ++ (PLVKnowledgePointTableViewCell *)cellWithTableView:(UITableView *)tableView; + +@property (nonatomic, strong) PLVKnowledgePoint *pointModel; +@property (nonatomic, assign) BOOL isSelectCell; +@property (nonatomic, assign) BOOL isShowDesc; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/View/PLVKnowledgePointTableViewCell.m b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/View/PLVKnowledgePointTableViewCell.m new file mode 100644 index 0000000..9a8c4c7 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/KnowledgeList/View/PLVKnowledgePointTableViewCell.m @@ -0,0 +1,171 @@ +// +// PLVKnowledgePointTableViewCell.m +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/8/9. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import "PLVKnowledgePointTableViewCell.h" +#import "UIColor+PLVVod.h" +#import + +@interface PLVKnowledgePointTableViewCell () + +@property (nonatomic, strong) UIImageView *statusImageView; +@property (nonatomic, strong) UILabel *descLabel; +@property (nonatomic, strong) UILabel *timeLabel; + +@end + +@implementation PLVKnowledgePointTableViewCell + +#pragma mark - Init & UI + ++ (PLVKnowledgePointTableViewCell *)cellWithTableView:(UITableView *)tableView +{ + static NSString *cellId = @"PLVKnowledgePointTableViewCell"; + PLVKnowledgePointTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; + if (cell == nil) + { + cell = [[PLVKnowledgePointTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId]; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + cell.backgroundColor = [UIColor colorWithRed:51/255.0 green:52/255.0 blue:55/255.0 alpha:1]; + cell.contentView.backgroundColor = [UIColor colorWithRed:51/255.0 green:52/255.0 blue:55/255.0 alpha:1]; + } + return cell; +} + +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier +{ + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) + { + [self initUI]; + } + return self; +} + +- (void)initUI { + [self.contentView addSubview:self.statusImageView]; + [self.contentView addSubview:self.descLabel]; + [self.contentView addSubview:self.timeLabel]; + + [self.statusImageView plv_makeConstraints:^(PLVMASConstraintMaker *make) { + make.size.plv_equalTo(CGSizeMake(24, 24)); + make.left.equalTo(self.contentView).offset(23); + make.centerY.equalTo(self.contentView); + }]; + + [self.timeLabel plv_makeConstraints:^(PLVMASConstraintMaker *make) { + make.width.height.plv_greaterThanOrEqualTo(10); + make.right.equalTo(self.contentView).offset(-32); + make.centerY.equalTo(self.contentView); + }]; + + [self.descLabel plv_makeConstraints:^(PLVMASConstraintMaker *make) { + make.width.height.plv_greaterThanOrEqualTo(1); + make.left.equalTo(self.statusImageView.plv_right).offset(15); + make.centerY.equalTo(self.contentView); + }]; +} + + +#pragma mark - Setter + +- (void)setPointModel:(PLVKnowledgePoint *)pointModel { + _pointModel = pointModel; + if (self.isShowDesc) { + self.descLabel.hidden = NO; + self.descLabel.text = pointModel.name; + }else { + self.descLabel.hidden = YES; + self.descLabel.text = @""; + } + self.timeLabel.text = [self timeStringWithSeconds:pointModel.time]; +} + +- (void)setIsSelectCell:(BOOL)isSelectCell { + _isSelectCell = isSelectCell; + if (isSelectCell) { + [self.statusImageView setImage:[UIImage imageNamed:@"plv_playing_btn"]]; + self.descLabel.textColor = [UIColor colorWithHex:0x3990FF]; + }else { + [self.statusImageView setImage:[UIImage imageNamed:@"plv_play_btn"]]; + self.descLabel.textColor = [[UIColor whiteColor] colorWithAlphaComponent:0.8]; + } +} + +- (void)setIsShowDesc:(BOOL)isShowDesc { + _isShowDesc = isShowDesc; + if (isShowDesc) { + self.descLabel.hidden = NO; + [self.timeLabel plv_remakeConstraints:^(PLVMASConstraintMaker *make) { + make.width.height.plv_greaterThanOrEqualTo(10); + make.right.equalTo(self.contentView).offset(-32); + make.centerY.equalTo(self.contentView); + }]; + }else { + self.descLabel.hidden = YES; + [self.timeLabel plv_remakeConstraints:^(PLVMASConstraintMaker *make) { + make.width.height.plv_greaterThanOrEqualTo(10); + make.left.equalTo(self.statusImageView.plv_right).offset(15); + make.centerY.equalTo(self.contentView); + }]; + } + +} + +/// 时间转字符串 +- (NSString *)timeStringWithSeconds:(NSTimeInterval)seconds { + NSInteger time = seconds; + NSInteger _hours = time / 60 / 60; + NSInteger _minutes = (time / 60) % 60; + NSInteger _seconds = time % 60; + NSString *timeString = _hours > 0 ? [NSString stringWithFormat:@"%02zd:", _hours] : @"00:"; + timeString = [timeString stringByAppendingString:[NSString stringWithFormat:@"%02zd:%02zd", _minutes, _seconds]]; + return timeString; +} + + +#pragma mark - Loadlazy + +- (UIImageView *)statusImageView { + if (_statusImageView == nil) { + _statusImageView = [[UIImageView alloc]init]; + [_statusImageView setImage:[UIImage imageNamed:@"plv_play_btn"]]; + } + return _statusImageView; +} + +- (UILabel *)descLabel { + if (_descLabel == nil) { + _descLabel = [[UILabel alloc]init]; + _descLabel.textColor = [[UIColor whiteColor] colorWithAlphaComponent:0.8]; + _descLabel.font = [UIFont systemFontOfSize:14]; + _descLabel.numberOfLines = 0; + } + return _descLabel; +} + +- (UILabel *)timeLabel { + if (_timeLabel == nil) { + _timeLabel = [[UILabel alloc]init]; + _timeLabel.textColor = [[UIColor whiteColor] colorWithAlphaComponent:0.6]; + _timeLabel.font = [UIFont systemFontOfSize:14]; + _timeLabel.numberOfLines = 0; + } + return _timeLabel; +} + +- (void)awakeFromNib { + [super awakeFromNib]; + // Initialization code +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + +@end diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeAnimationManager.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeAnimationManager.h new file mode 100644 index 0000000..0745f0e --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeAnimationManager.h @@ -0,0 +1,56 @@ +// +// PLVMarqueeAnimation.h +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/3/3. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import +#import +#import "PLVMarqueeModel.h" + +NS_ASSUME_NONNULL_BEGIN + +/// 负责给跑马灯提供动画 +@interface PLVMarqueeAnimationManager : NSObject + +/// 给layer添加动画 +/// @param layer 要添加动画的layer +/// @param bounds 随机位置的范围 +/// @param model 描述动画细节的model +/// @param delegate 动画代理 ++(void)addAnimationForLayer:(CALayer *)layer + randomOriginInBounds:(CGRect)bounds + withModel:(PLVMarqueeModel *)model + animationDelegate:(id)delegate; + +/// 给闪烁双跑马灯中第二个跑马灯添加动画 +/// @param layer 要添加动画的layer +/// @param bounds 随机位置的范围 +/// @param model 描述动画细节的model +/// @param delegate 动画代理 ++ (void)addDoubleFlashAnimationForSecondLayer:(CALayer *)layer + randomOriginInBounds:(CGRect)bounds + withModel:(PLVMarqueeModel *)model + animationDelegate:(id)delegate; + + +#pragma mark - 检查layer是否包含跑马灯动画 +/// 检查layer是否包含跑马灯动画 +/// @param layer layer ++(BOOL)checkLayerHaveMarqueeAnimation:(CALayer *)layer; + +#pragma mark - 开启跑马灯动画 +/// 开启跑马灯动画 +/// @param layer 要开启动画的layer ++(void)startMarqueeAnimation:(CALayer *)layer; + +#pragma mark - 暂停跑马灯动画 +/// 暂停跑马灯动画 +/// @param layer 要暂停动画的layer ++(void)pauseMarqueeAnimation:(CALayer *)layer; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeAnimationManager.m b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeAnimationManager.m new file mode 100644 index 0000000..e2833fc --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeAnimationManager.m @@ -0,0 +1,411 @@ +// +// PLVMarqueeAnimation.m +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/3/3. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import "PLVMarqueeAnimationManager.h" + +static NSString * const PLVMarqueeAnimationKey = @"PLVMarqueeAnimationKey"; + +@implementation PLVMarqueeAnimationManager + +#pragma mark - Public + +/// 给layer添加动画 +/// @param layer 要添加动画的layer +/// @param bounds 随机位置的范围 +/// @param model 描述动画细节的model +/// @param delegate 动画代理 ++(void)addAnimationForLayer:(CALayer *)layer + randomOriginInBounds:(CGRect)bounds + withModel:(PLVMarqueeModel *)model + animationDelegate:(id)delegate +{ + switch (model.style) { + case PLVMarqueeModelStyleRoll: + { + [PLVMarqueeAnimationManager addRollAnimation:layer randomOriginInBounds:bounds withModel:model animationDelegate:delegate]; + break; + } + case PLVMarqueeModelStyleFlash: + { + [PLVMarqueeAnimationManager addFlashAnimation:layer randomOriginInBounds:bounds withModel:model animationDelegate:delegate isSecondLayer:NO]; + break; + } + case PLVMarqueeModelStyleRollFade: + { + [PLVMarqueeAnimationManager addRollFadeAnimation:layer randomOriginInBounds:bounds withModel:model animationDelegate:delegate]; + break; + } + case PLVMarqueeModelStylePartRoll: + { + [PLVMarqueeAnimationManager addPartRollAnimation:layer randomOriginInBounds:bounds withModel:model animationDelegate:delegate]; + break; + } + case PLVMarqueeModelStylePartFlash: + { + [PLVMarqueeAnimationManager addPartFlashAnimation:layer randomOriginInBounds:bounds withModel:model animationDelegate:delegate]; + break; + } + case PLVMarqueeModelStyleDoubleRoll: + { + [PLVMarqueeAnimationManager addRollAnimation:layer randomOriginInBounds:bounds withModel:model animationDelegate:delegate]; + break; + } + case PLVMarqueeModelStyleDoubleFlash: + { + [PLVMarqueeAnimationManager addFlashAnimation:layer randomOriginInBounds:bounds withModel:model animationDelegate:delegate isSecondLayer:NO]; + break; + } + default: + break; + } +} + +/// 给闪烁双跑马灯中第二个跑马灯添加动画 +/// @param layer 要添加动画的layer +/// @param bounds 随机位置的范围 +/// @param model 描述动画细节的model +/// @param delegate 动画代理 ++ (void)addDoubleFlashAnimationForSecondLayer:(CALayer *)layer + randomOriginInBounds:(CGRect)bounds + withModel:(PLVMarqueeModel *)model + animationDelegate:(id)delegate { + [PLVMarqueeAnimationManager addFlashAnimation:layer randomOriginInBounds:bounds withModel:model animationDelegate:delegate isSecondLayer:YES]; +} + +#pragma mark - 检查layer是否包含跑马灯动画 +/// 检查layer是否包含跑马灯动画 +/// @param layer layer ++(BOOL)checkLayerHaveMarqueeAnimation:(CALayer *)layer +{ + if ([layer animationForKey:PLVMarqueeAnimationKey]) { + return YES; + } + return NO; +} + +#pragma mark - 开启跑马灯动画 +/// 开启跑马灯动画 +/// @param layer 要开启动画的layer ++(void)startMarqueeAnimation:(CALayer *)layer +{ + if (layer.speed) { + //动画正在执行,不作处理 + }else { + //动画为暂停状态,让动画执行 + layer.speed = 1; + CFTimeInterval pauseTime = layer.timeOffset; + layer.timeOffset = 0; + layer.beginTime = 0; + layer.beginTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pauseTime; + } +} + +#pragma mark - 暂停跑马灯动画 +/// 暂停跑马灯动画 +/// @param layer 要暂停动画的layer ++(void)pauseMarqueeAnimation:(CALayer *)layer +{ + if (layer.speed) { + //动画正在执行,暂停动画 + layer.timeOffset = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; + layer.speed = 0; + } +} + + +#pragma mark - Privates + +#pragma mark - 闪烁 +/// 给layer添加随机位置闪烁的动画 +/// @param layer 要添加动画的layer +/// @param bounds 随机位置的范围 +/// @param model 描述闪烁细节的model +/// @param delegate 动画代理 ++(void)addFlashAnimation:(CALayer *)layer + randomOriginInBounds:(CGRect)bounds + withModel:(PLVMarqueeModel *)model + animationDelegate:(id)delegate + isSecondLayer:(BOOL)isSecondLayer { + //获取随机位置 + CGFloat displayWidth = CGRectGetWidth(bounds); + CGFloat displayHeight = CGRectGetHeight(bounds); + CGFloat displayMaxX = displayWidth - layer.frame.size.width; + CGFloat displayMaxY = displayHeight - layer.frame.size.height; + CGFloat randomX = displayMaxX < 0.0 ? 0.0 : [PLVMarqueeAnimationManager randomDoubleFrom:0.0 to:displayMaxX accuracy:2]; + CGFloat randomY = displayMaxY < 0.0 ? 0.0 : [PLVMarqueeAnimationManager randomDoubleFrom:20.0 to:displayMaxY accuracy:2]; + + //给layer设置随机位置 + [CATransaction begin]; + [CATransaction setDisableActions:YES]; + layer.frame = CGRectMake(randomX, randomY, layer.frame.size.width, layer.frame.size.height); + [CATransaction commit]; + + //给layer添加闪烁动画 + CAKeyframeAnimation *opacityAnimation; + if (isSecondLayer) { + opacityAnimation = [PLVMarqueeAnimationManager createFlashAnimationForSecondMarqueeWithModel:model]; + }else { + opacityAnimation = [PLVMarqueeAnimationManager createFlashAnimationWithModel:model]; + } + if (opacityAnimation) { + layer.opacity = 0; + opacityAnimation.delegate = delegate; + [layer addAnimation:opacityAnimation forKey:PLVMarqueeAnimationKey]; + } +} + +#pragma mark - 滚动 +/// 给layer添加随机Y坐标的滚动动画 +/// @param layer 要添加动画的layer +/// @param bounds 随机位置的范围 +/// @param model 描述滚动细节的model +/// @param delegate 动画代理 ++(void)addRollAnimation:(CALayer *)layer + randomOriginInBounds:(CGRect)bounds + withModel:(PLVMarqueeModel *)model + animationDelegate:(id)delegate +{ + //获取随机坐标 + CGFloat displayWidth = CGRectGetWidth(bounds); + CGFloat displayHeight = CGRectGetHeight(bounds); + CGFloat displayMinY = 20.0; + CGFloat displayMaxY = displayHeight - layer.frame.size.height * 0.5; + CGFloat randomY = [PLVMarqueeAnimationManager randomDoubleFrom:displayMinY to:displayMaxY accuracy:2]; + if (displayHeight < layer.frame.size.height) { + randomY = 0.0; + } + CGFloat rollFromPsitionX = displayWidth + layer.frame.size.width * 0.5; + CGFloat rollToPsitionX = -layer.frame.size.width * 0.5; + if (model.isAlwaysShowWhenRun) { + rollFromPsitionX = displayWidth - layer.frame.size.width * 0.5; + rollToPsitionX = layer.frame.size.width * 0.5; + } + + //给layer添加滚动动画 + CGPoint startPoint = CGPointMake(rollFromPsitionX, randomY); + CGPoint endPoint = CGPointMake(rollToPsitionX, randomY); + + CAKeyframeAnimation *positionAnimation = [PLVMarqueeAnimationManager createRollAnimationWithModel:model startPoint:startPoint endPoint:endPoint]; + if (positionAnimation) { + positionAnimation.delegate = delegate; + [layer addAnimation:positionAnimation forKey:PLVMarqueeAnimationKey]; + } +} + +#pragma mark - 闪烁 + 滚动 +/// 给layer添加滚动 + 闪烁动画 +/// @param layer 要添加动画的layer +/// @param bounds 随机位置的范围 +/// @param model 描述滚动细节的model +/// @param delegate 动画代理 ++(void)addRollFadeAnimation:(CALayer *)layer + randomOriginInBounds:(CGRect)bounds + withModel:(PLVMarqueeModel *)model + animationDelegate:(id)delegate +{ + [PLVMarqueeAnimationManager addRollAnimation:layer randomOriginInBounds:bounds withModel:model animationDelegate:delegate]; + + NSUInteger interval = model.isAlwaysShowWhenRun ? 0 : model.interval; + NSTimeInterval duration = model.tweenTime * 2 + model.lifeTime + interval; + if (duration <= 0) { + return; + } + + CAKeyframeAnimation *opacityAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"]; + opacityAnimation.values = @[@0 + ,@(model.alpha) + ,@(model.alpha) + ,@0 + ,@0]; + opacityAnimation.keyTimes = @[@0 + ,@(model.tweenTime / duration) + ,@((model.tweenTime + model.lifeTime) / duration) + ,@((model.tweenTime * 2 + model.lifeTime) / duration) + ,@1]; + opacityAnimation.duration = duration; + opacityAnimation.repeatCount = MAXFLOAT; + [layer addAnimation:opacityAnimation forKey:@"fade"]; +} + +#pragma mark - 局部滚动 +/// 给layer添加局部滚动动画 +/// @param layer 要添加动画的layer +/// @param bounds 随机位置的范围 +/// @param model 描述滚动细节的model +/// @param delegate 动画代理 ++(void)addPartRollAnimation:(CALayer *)layer + randomOriginInBounds:(CGRect)bounds + withModel:(PLVMarqueeModel *)model + animationDelegate:(id)delegate +{ + //获取随机坐标 + CGFloat displayWidth = CGRectGetWidth(bounds); + CGFloat displayHeight = CGRectGetHeight(bounds); + CGFloat displayMinY = layer.frame.size.height * 0.5; + CGFloat displayMaxY = displayHeight - layer.frame.size.height * 0.5; + CGFloat randomY = [PLVMarqueeAnimationManager randomDoubleFrom:displayMinY to:displayHeight * 0.15 accuracy:2]; + if (arc4random()%2) { + randomY = [PLVMarqueeAnimationManager randomDoubleFrom:displayHeight * 0.85 to:displayMaxY accuracy:2]; + } + + CGFloat rollFromPsitionX = displayWidth + layer.frame.size.width * 0.5; + CGFloat rollToPsitionX = -layer.frame.size.width * 0.5; + if (model.isAlwaysShowWhenRun) { + rollFromPsitionX = displayWidth - layer.frame.size.width * 0.5; + rollToPsitionX = layer.frame.size.width * 0.5; + } + + //给layer添加滚动动画 + CGPoint startPoint = CGPointMake(rollFromPsitionX, randomY); + CGPoint endPoint = CGPointMake(rollToPsitionX, randomY); + + CAKeyframeAnimation *positionAnimation = [PLVMarqueeAnimationManager createRollAnimationWithModel:model startPoint:startPoint endPoint:endPoint]; + if (positionAnimation) { + positionAnimation.delegate = delegate; + [layer addAnimation:positionAnimation forKey:PLVMarqueeAnimationKey]; + } +} + +#pragma mark - 局部闪烁 +/// 给layer添加局部闪烁动画 +/// @param layer 要添加动画的layer +/// @param bounds 随机位置的范围 +/// @param model 描述闪烁细节的model +/// @param delegate 动画代理 ++(void)addPartFlashAnimation:(CALayer *)layer + randomOriginInBounds:(CGRect)bounds + withModel:(PLVMarqueeModel *)model + animationDelegate:(id)delegate +{ + //获取随机位置 + CGFloat displayWidth = CGRectGetWidth(bounds); + CGFloat displayHeight = CGRectGetHeight(bounds); + CGFloat displayMaxX = displayWidth - layer.frame.size.width; + CGFloat displayMaxY = displayHeight - layer.frame.size.height; + CGFloat randomX = [PLVMarqueeAnimationManager randomDoubleFrom:0.0 to:displayMaxX accuracy:2]; + CGFloat randomY = [PLVMarqueeAnimationManager randomDoubleFrom:0.0 to:displayHeight * 0.15 accuracy:2]; + if (arc4random()%2) { + randomY = [PLVMarqueeAnimationManager randomDoubleFrom:displayHeight * 0.85 to:displayMaxY accuracy:2]; + } + + //给layer设置随机位置 + [CATransaction begin]; + [CATransaction setDisableActions:YES]; + layer.frame = CGRectMake(randomX, randomY, layer.frame.size.width, layer.frame.size.height); + [CATransaction commit]; + + //给layer添加闪烁动画 + CAKeyframeAnimation *opacityAnimation = [PLVMarqueeAnimationManager createFlashAnimationWithModel:model]; + if (opacityAnimation) { + layer.opacity = 0; + opacityAnimation.delegate = delegate; + [layer addAnimation:opacityAnimation forKey:PLVMarqueeAnimationKey]; + } +} + + +#pragma mark - Tool + +/// 按照model参数生成闪烁动画 +/// @param model model ++(CAKeyframeAnimation *)createFlashAnimationWithModel:(PLVMarqueeModel *)model +{ + NSUInteger interval = model.isAlwaysShowWhenRun ? 0 : model.interval; + NSTimeInterval duration = model.tweenTime * 2 + model.lifeTime + interval; + if (duration <= 0) { + return nil; + } + + CAKeyframeAnimation *opacityAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"]; + opacityAnimation.values = @[@0 + ,@(model.alpha) + ,@(model.alpha) + ,@0 + ,@0]; + opacityAnimation.keyTimes = @[@0 + ,@(model.tweenTime / duration) + ,@((model.tweenTime + model.lifeTime) / duration) + ,@((model.tweenTime * 2 + model.lifeTime) / duration) + ,@1]; + opacityAnimation.duration = duration; + opacityAnimation.fillMode = kCAFillModeForwards; + opacityAnimation.removedOnCompletion = YES; + + return opacityAnimation; +} + +/// 为双跑马灯中第二个跑马灯按照model参数生成闪烁动画 +/// @param model model ++ (CAKeyframeAnimation *)createFlashAnimationForSecondMarqueeWithModel:(PLVMarqueeModel *)model { + NSUInteger interval = model.isAlwaysShowWhenRun ? 0 : model.interval; + NSTimeInterval duration = model.tweenTime * 2 + model.lifeTime + interval; + if (duration <= 0) { + return nil; + } + + CAKeyframeAnimation *opacityAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"]; + opacityAnimation.values = @[@0 + ,@(model.secondMarqueeAlpha) + ,@(model.secondMarqueeAlpha) + ,@0 + ,@0]; + opacityAnimation.keyTimes = @[@0 + ,@(model.tweenTime / duration) + ,@((model.tweenTime + model.lifeTime) / duration) + ,@((model.tweenTime * 2 + model.lifeTime) / duration) + ,@1]; + opacityAnimation.duration = duration; + opacityAnimation.fillMode = kCAFillModeForwards; + opacityAnimation.removedOnCompletion = YES; + + return opacityAnimation; +} + +/// 生成滚动动画 +/// @param model model +/// @param startPoint 起点 +/// @param endPoint 终点 ++(CAKeyframeAnimation *)createRollAnimationWithModel:(PLVMarqueeModel *)model startPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint +{ + NSUInteger interval = model.isAlwaysShowWhenRun ? 0 : model.interval; + NSTimeInterval duration = model.speed + interval; + if (duration <= 0) { + return nil; + } + + CAKeyframeAnimation *positionAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; + NSValue *value1 = [NSValue valueWithCGPoint:startPoint]; + NSValue *value2 = [NSValue valueWithCGPoint:endPoint]; + NSValue *value3 = [NSValue valueWithCGPoint:endPoint]; + positionAnimation.values = @[value1, + value2, + value3]; + positionAnimation.keyTimes = @[@0, + @(model.speed / duration), + @1]; + positionAnimation.duration = duration; + positionAnimation.fillMode = kCAFillModeForwards; + positionAnimation.removedOnCompletion = YES; + + return positionAnimation; +} + +/// 获取随机数 +/// @param fromValue 随机数范围起点 +/// @param toValue 随机数范围终点 +/// @param accuracy 精确位数 ++(double)randomDoubleFrom:(double)fromValue to:(double)toValue accuracy:(NSInteger)accuracy +{ + accuracy = (NSInteger)pow(10, accuracy); + fromValue = fromValue * accuracy; + toValue = toValue * accuracy; + double randomValue = 1.0 * (arc4random() % (NSInteger)(toValue - fromValue + 1) + fromValue) / accuracy; + return randomValue; +} + +@end diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeModel.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeModel.h new file mode 100644 index 0000000..4bc7404 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeModel.h @@ -0,0 +1,114 @@ +// +// PLVMarqueeModel.h +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/3/3. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSUInteger, PLVMarqueeModelStyle) { + /// 滚动(自屏幕右方至左方一直滚动) + PLVMarqueeModelStyleRoll = 1, + /// 闪烁(屏幕内随机位置闪烁) + PLVMarqueeModelStyleFlash, + /// 滚动+闪烁(自屏幕右方至左方一直滚动,渐隐渐现) + PLVMarqueeModelStyleRollFade, + /// 局部滚动(上下15%的视频区域之间滚动) + PLVMarqueeModelStylePartRoll, + /// 局部闪烁(上下15%的视频区域随机闪烁文字) + PLVMarqueeModelStylePartFlash, + /// 滚动(自屏幕右方至左方一直滚动)双跑马灯 + PLVMarqueeModelStyleDoubleRoll, + /// 闪烁(屏幕内随机位置闪烁))双跑马灯 + PLVMarqueeModelStyleDoubleFlash, +}; + +/// 负责定义跑马灯样式和动画 +@interface PLVMarqueeModel : NSObject + +/// 跑马灯样式 +@property (nonatomic, assign) PLVMarqueeModelStyle style; + +#pragma mark - 内容属性 + +/// 跑马灯内容,默认”Polyv跑马灯“ +@property (nonatomic, strong) NSString *content; +/// 字体大小,默认30 +@property (nonatomic, assign) NSUInteger fontSize; +/// 字体颜色,默认#000000 +@property (nonatomic, strong) NSString *fontColor; +/// 自定义播放错误提示信息(跑马灯校验失败) +@property (nonatomic, strong) NSString *errorMessage; + + +#pragma mark - 描边属性 + +/// 是否描边,默认NO +@property (nonatomic, assign) BOOL outline; +/// 描边颜色,默认#000000 +@property (nonatomic, strong) NSString *outlineColor; +/// 阴影透明度,(范围:0~1),默认1 +@property (nonatomic, assign) float shadowAlpha; +/// 阴影半径,默认4 +@property (nonatomic, assign) NSUInteger shadowBlurRadius; +/// 阴影水平偏移量,默认2 +@property (nonatomic, assign) NSUInteger shadowOffsetX; +/// 描边垂直偏移量.默认2 +@property (nonatomic, assign) NSUInteger shadowOffsetY; + + +#pragma mark - 动画相关属性 + +/// 文本透明度(范围:0~1),默认1 +@property (nonatomic, assign) float alpha; +/// 双跑马灯中,第二个跑马灯的文本透明度(范围:0~1),默认0.02 +@property (nonatomic, assign) float secondMarqueeAlpha; +/// 文本渐隐渐现时间 (单位:秒),默认1,有效样式:Flash、PartFlash、DoubleFlash、RollFade +@property (nonatomic, assign) NSUInteger tweenTime; +/// 文本隐藏间隔时间 (单位:秒),默认5,有效样式:Flash、PartFlash、DoubleFlash +@property (nonatomic, assign) NSUInteger interval; +/// 文本显示时间 (单位:秒),默认3,有效样式:Flash、PartFlash、DoubleFlash +@property (nonatomic, assign) NSUInteger lifeTime; +/// 文字移动指定像素所需时间/显示时间(单位:秒),默认20,有效样式:Roll、RollFade、PartRoll、DoubleRoll +@property (nonatomic, assign) NSUInteger speed; + + +/// 暂停跑马灯的时候,是否隐藏。默认为YES +@property (nonatomic, assign) BOOL isHiddenWhenPause; +/// 跑马灯运行的时候,是否一直完整显示跑马灯。为YES时interval不生效。默认为NO +@property (nonatomic, assign) BOOL isAlwaysShowWhenRun; + + + +/// 初始化最简单的跑马灯样式model +/// @param content 跑马灯内容 +/// @param fontSize 字体大小 +/// @param fontColor 字体颜色(0x000000) +/// @param alpha 文本透明度(范围:0~1) ++(instancetype)createMarqueeModelWithContent:(NSString *)content + fontSize:(NSUInteger)fontSize + fontColor:(NSString *)fontColor + alpha:(float)alpha; + +/// 初始化跑马灯样式model(适用于自定义url方式获取的跑马灯数据转换为model) +/// @param marqueeDict 跑马灯数据 ++(instancetype)createMarqueeModelWithMarqueeDict:(NSDictionary *)marqueeDict; + + +#pragma mark - 生成跑马灯描述 + +/// 根据模型内容生成描述跑马灯的富文本 +-(NSAttributedString *)createMarqueeAttributedContent; + +/// 根据富文本内容计算size +-(CGSize)marqueeAttributedContentSize; + + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeModel.m b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeModel.m new file mode 100644 index 0000000..be941af --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeModel.m @@ -0,0 +1,186 @@ +// +// PLVMarqueeModel.m +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/3/3. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import "PLVMarqueeModel.h" + +@interface PLVMarqueeModel () + +/// 富文本字符串属性 +@property (nonatomic, strong) NSMutableDictionary *attributes; + +@end + +static NSString *StringValueWithJsonValue(id obj) { + if (obj && ![obj isKindOfClass:[NSNull class]]) { + return [NSString stringWithFormat:@"%@",obj]; + } else { + return nil; + } +} + +static NSInteger IntegerValueWithJsonValue(id obj) { + if (obj && [obj isKindOfClass:[NSObject class]]) { + return [[NSString stringWithFormat:@"%@",obj] integerValue]; + } else { + return 0; + } +} + +static float FloatValueWithJsonValue(id obj) { + if (obj && [obj isKindOfClass:[NSObject class]]) { + return [[NSString stringWithFormat:@"%@",obj] floatValue]; + } else { + return 0.0; + } +} + +@implementation PLVMarqueeModel +-(instancetype)init +{ + if (self = [super init]) { + _style = PLVMarqueeModelStyleRoll; + _content = @"Polyv跑马灯"; + _fontSize = 30; + _fontColor = @"#000000"; + _outline = NO; + _outlineColor = @"#000000"; + _shadowAlpha = 1; + _shadowBlurRadius = 4; + _shadowOffsetX = 2; + _shadowOffsetY = 2; + + _alpha = 1; + _secondMarqueeAlpha = 0.02; + _tweenTime = 1; + _interval = 5; + _lifeTime = 3; + _speed = 20; + _isHiddenWhenPause = YES; + _isAlwaysShowWhenRun = NO; + } + return self; +} + +/// 初始化最简单的跑马灯样式model +/// @param content 跑马灯内容 +/// @param fontSize 字体大小 +/// @param fontColor 字体颜色(0x000000) +/// @param alpha 文本透明度(范围:0~1) ++(instancetype)createMarqueeModelWithContent:(NSString *)content + fontSize:(NSUInteger)fontSize + fontColor:(NSString *)fontColor + alpha:(float)alpha +{ + PLVMarqueeModel *model = [[PLVMarqueeModel alloc]init]; + model.content = content; + model.fontSize = fontSize; + model.fontColor = [fontColor stringByReplacingOccurrencesOfString:@"0x" withString:@"#"]; + model.alpha = alpha <= 0 ? 0.0 : alpha; + //default + model.style = PLVMarqueeModelStyleRoll; + model.speed = 10; + model.outline = YES; + model.outlineColor = @"#FFFFFF"; + return model; +} + +/// 初始化跑马灯样式model(适用于自定义url方式获取的跑马灯数据转换为model) +/// @param marqueeDict 跑马灯数据 ++(instancetype)createMarqueeModelWithMarqueeDict:(NSDictionary *)marqueeDict +{ + if (!marqueeDict || ![StringValueWithJsonValue(marqueeDict[@"show"]) isEqualToString:@"on"]) { + return nil; + } + PLVMarqueeModel *model = [[PLVMarqueeModel alloc]init]; + model.errorMessage = StringValueWithJsonValue(marqueeDict[@"msg"]); + model.style = IntegerValueWithJsonValue(marqueeDict[@"setting"]); + model.content = StringValueWithJsonValue(marqueeDict[@"username"]); + model.fontSize = IntegerValueWithJsonValue(marqueeDict[@"fontSize"]); + model.fontColor = [StringValueWithJsonValue(marqueeDict[@"fontColor"]) stringByReplacingOccurrencesOfString:@"0x" withString:@"#"]; + + model.outline = [StringValueWithJsonValue(marqueeDict[@"filter"]) isEqualToString:@"on"]; + model.shadowAlpha = FloatValueWithJsonValue(marqueeDict[@"filterAlpha"]); + model.outlineColor = [StringValueWithJsonValue(marqueeDict[@"filterColor"]) stringByReplacingOccurrencesOfString:@"0x" withString:@"#"]; + model.shadowBlurRadius = IntegerValueWithJsonValue(marqueeDict[@"strength"]); + model.shadowOffsetX = IntegerValueWithJsonValue(marqueeDict[@"blurX"]); + model.shadowOffsetY = IntegerValueWithJsonValue(marqueeDict[@"blurY"]); + + model.alpha = FloatValueWithJsonValue(marqueeDict[@"alpha"]); + if (model.alpha <= 0) { + model.alpha = 0.0; + } + model.speed = IntegerValueWithJsonValue(marqueeDict[@"speed"]) / 10; + model.interval = IntegerValueWithJsonValue(marqueeDict[@"interval"]); + model.lifeTime = IntegerValueWithJsonValue(marqueeDict[@"lifeTime"]); + model.tweenTime = IntegerValueWithJsonValue(marqueeDict[@"tweenTime"]); + + return model; +} + + +#pragma mark - 生成跑马灯描述 + +/// 根据模型内容生成描述跑马灯的富文本 +-(NSAttributedString *)createMarqueeAttributedContent +{ + if (self.content.length) { + NSMutableAttributedString *mAttributedStr = [[NSMutableAttributedString alloc] initWithString:self.content attributes:self.attributes]; + return mAttributedStr; + } + return nil; +} + +/// 根据富文本内容计算size +-(CGSize)marqueeAttributedContentSize +{ + if (self.content.length) { + return [self.content sizeWithAttributes:self.attributes]; + } + return CGSizeZero; +} + +#pragma mark - Loadlazy + +-(NSMutableDictionary *)attributes +{ + if (!_attributes) { + _attributes = [NSMutableDictionary dictionaryWithObject:[UIFont systemFontOfSize:self.fontSize] forKey:NSFontAttributeName]; + [_attributes setObject:[self colorFromHexString:self.fontColor] forKey:NSForegroundColorAttributeName]; + if (self.outline) { + [_attributes setObject:@(-2.0) forKey:NSStrokeWidthAttributeName]; + [_attributes setObject:[self colorFromHexString:self.outlineColor] forKey:NSStrokeColorAttributeName]; + + NSShadow *shadow = [[NSShadow alloc] init]; + shadow.shadowBlurRadius = self.shadowBlurRadius; + shadow.shadowColor = [UIColor colorWithWhite:0.0 alpha:self.shadowAlpha]; + shadow.shadowOffset = CGSizeMake(self.shadowOffsetX, self.shadowOffsetY); + [_attributes setObject:shadow forKey:NSShadowAttributeName]; + } + } + return _attributes; +} + + +#pragma mark - Privates + +/// 生成颜色UIColor +/// @param hexString 颜色值 +- (UIColor *)colorFromHexString:(NSString *)hexString { + if (!hexString) { + return [UIColor whiteColor]; + } + unsigned rgbValue = 0; + NSScanner *scanner = [NSScanner scannerWithString:hexString]; + if ([hexString rangeOfString:@"#"].location == 0) { + [scanner setScanLocation:1]; + } + [scanner scanHexInt:&rgbValue]; + return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0]; +} + +@end diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeView.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeView.h new file mode 100644 index 0000000..6fb513f --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeView.h @@ -0,0 +1,32 @@ +// +// PLVMarqueeView.h +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/3/3. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import +#import "PLVMarqueeModel.h" + +NS_ASSUME_NONNULL_BEGIN + +/// 跑马灯,适用于防录屏功能使用 +@interface PLVMarqueeView : UIView + +/// 设置跑马灯样式(需要手动启动跑马灯动画) +/// @param marqueeModel model +-(void)setPLVMarqueeModel:(PLVMarqueeModel *)marqueeModel; + +/// 启动跑马灯 +-(void)start; + +/// 暂停跑马灯 +-(void)pause; + +/// 停止跑马灯 +-(void)stop; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeView.m b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeView.m new file mode 100644 index 0000000..a51b24f --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVMarquee/PLVMarqueeView.m @@ -0,0 +1,202 @@ +// +// PLVMarqueeView.m +// PolyvVodSDKDemo +// +// Created by POLYV-UX on 2021/3/3. +// Copyright © 2021 POLYV. All rights reserved. +// + +#import "PLVMarqueeView.h" +#import "PLVMarqueeAnimationManager.h" + +@interface PLVMarqueeView () + +@property (nonatomic, strong) PLVMarqueeModel *marqueeModel; +@property (nonatomic, strong) CALayer *mainMarqueeLayer; +@property (nonatomic, strong) CALayer *secondMarqueeLayer; + +@property (nonatomic, assign) BOOL isRunning; //!< 是否正在运行跑马灯 + +@end + + +@implementation PLVMarqueeView + +#pragma mark - Init & Dealloc + +-(instancetype)init +{ + if (self = [super init]) { + self.backgroundColor = [UIColor clearColor]; + self.userInteractionEnabled = NO; + self.layer.masksToBounds = YES; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil]; + } + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + + +#pragma mark - Setter + +-(void)setPLVMarqueeModel:(PLVMarqueeModel *)marqueeModel +{ + if (!marqueeModel) { + [self removeMarquee]; + return; + } + + NSAttributedString *attributedString = [marqueeModel createMarqueeAttributedContent]; + CGSize marqueeSize = [marqueeModel marqueeAttributedContentSize]; + CGRect layerFrame = CGRectMake(-marqueeSize.width, 0, marqueeSize.width, marqueeSize.height); + + if (attributedString) { + self.marqueeModel = marqueeModel; + [self removeMarquee]; + + CATextLayer *mainLayer = [CATextLayer layer]; + mainLayer.string = attributedString; + mainLayer.opacity = marqueeModel.alpha; + mainLayer.contentsScale = [UIScreen mainScreen].scale; + mainLayer.frame = layerFrame; + self.mainMarqueeLayer = mainLayer; + [self.layer addSublayer:self.mainMarqueeLayer]; + + //双跑马灯,开启第二个跑马灯layer + if (marqueeModel.style == PLVMarqueeModelStyleDoubleRoll + || marqueeModel.style == PLVMarqueeModelStyleDoubleFlash) { + + CATextLayer *secondLayer = [CATextLayer layer]; + secondLayer.string = attributedString; + secondLayer.opacity = marqueeModel.secondMarqueeAlpha; + secondLayer.contentsScale = [UIScreen mainScreen].scale; + secondLayer.frame = layerFrame; + self.secondMarqueeLayer = secondLayer; + [self.layer addSublayer:self.secondMarqueeLayer]; + } + } +} + + + +#pragma mark - Action + +/// 启动跑马灯 +-(void)start +{ + if (!self.marqueeModel) { + [self removeMarquee]; + return; + } + + if (self.mainMarqueeLayer) { + self.isRunning = YES; + self.mainMarqueeLayer.hidden = NO; + if ([PLVMarqueeAnimationManager checkLayerHaveMarqueeAnimation:self.mainMarqueeLayer]) { + //当前已经添加动画,启动动画 + [PLVMarqueeAnimationManager startMarqueeAnimation:self.mainMarqueeLayer]; + }else { + //没有添加动画,则添加 + [PLVMarqueeAnimationManager addAnimationForLayer:self.mainMarqueeLayer randomOriginInBounds:self.bounds withModel:self.marqueeModel animationDelegate:self]; + return; + } + } + + if (self.secondMarqueeLayer) { + self.secondMarqueeLayer.hidden = NO; + if ([PLVMarqueeAnimationManager checkLayerHaveMarqueeAnimation:self.secondMarqueeLayer]) { + //当前已经添加动画,启动动画 + [PLVMarqueeAnimationManager startMarqueeAnimation:self.secondMarqueeLayer]; + }else { + //没有添加动画,则添加 + [PLVMarqueeAnimationManager addDoubleFlashAnimationForSecondLayer:self.secondMarqueeLayer randomOriginInBounds:self.bounds withModel:self.marqueeModel animationDelegate:self]; + } + } +} + +/// 暂停 +-(void)pause +{ + if (!self.marqueeModel) { + [self removeMarquee]; + return; + } + + if (self.mainMarqueeLayer) { + self.isRunning = NO; + self.mainMarqueeLayer.hidden = self.marqueeModel.isHiddenWhenPause; + if ([PLVMarqueeAnimationManager checkLayerHaveMarqueeAnimation:self.mainMarqueeLayer]) { + //当前已经添加动画,暂停动画 + [PLVMarqueeAnimationManager pauseMarqueeAnimation:self.mainMarqueeLayer]; + } + } + + if (self.secondMarqueeLayer) { + self.secondMarqueeLayer.hidden = self.marqueeModel.isHiddenWhenPause; + if ([PLVMarqueeAnimationManager checkLayerHaveMarqueeAnimation:self.secondMarqueeLayer]) { + //当前已经添加动画,暂停动画 + [PLVMarqueeAnimationManager pauseMarqueeAnimation:self.secondMarqueeLayer]; + } + } + +} + +/// 停止跑马灯 +-(void)stop +{ + if (!self.marqueeModel) { + [self removeMarquee]; + return; + } + + if (self.mainMarqueeLayer) { + self.isRunning = NO; + [self.mainMarqueeLayer removeAllAnimations]; + } + + if (self.secondMarqueeLayer) { + [self.secondMarqueeLayer removeAllAnimations]; + } + +} + +/// 移除跑马灯 +-(void)removeMarquee +{ + if (self.mainMarqueeLayer) { + [self.mainMarqueeLayer removeAllAnimations]; + [self.mainMarqueeLayer removeFromSuperlayer]; + self.mainMarqueeLayer = nil; + } + + if (self.secondMarqueeLayer) { + [self.secondMarqueeLayer removeAllAnimations]; + [self.secondMarqueeLayer removeFromSuperlayer]; + self.secondMarqueeLayer = nil; + } +} + + +#pragma mark - CAAnimationDelegate + +-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag +{ + // This flag is NO when the application enters background. + if (flag && self.isRunning) { + [self start]; + } +} + + +#pragma mark - Notifications + +- (void)applicationDidBecomeActive { + if (self.isRunning) { + [self start]; + } +} + +@end diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/Contents.json b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/Contents.json index da4a164..73c0059 100644 --- a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/Contents.json +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/Contents.json @@ -1,6 +1,6 @@ { "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Default.imageset/Checkbox-Default@2x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Default.imageset/Checkbox-Default@2x.png index c13e369..4c43005 100644 Binary files a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Default.imageset/Checkbox-Default@2x.png and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Default.imageset/Checkbox-Default@2x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Default.imageset/Contents.json b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Default.imageset/Contents.json index 670682a..444a15d 100644 --- a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Default.imageset/Contents.json +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Default.imageset/Contents.json @@ -10,7 +10,6 @@ "scale" : "2x" }, { - "filename" : "Checkbox-Default@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Selected-Default.imageset/Checkbox-Selected-Default@2x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Selected-Default.imageset/Checkbox-Selected-Default@2x.png index 650da2f..6ba19b2 100644 Binary files a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Selected-Default.imageset/Checkbox-Selected-Default@2x.png and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Selected-Default.imageset/Checkbox-Selected-Default@2x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Selected-Default.imageset/Contents.json b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Selected-Default.imageset/Contents.json index cdf6aae..41329b8 100644 --- a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Selected-Default.imageset/Contents.json +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Checkbox-Selected-Default.imageset/Contents.json @@ -10,7 +10,6 @@ "scale" : "2x" }, { - "filename" : "Checkbox-Selected-Default@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Contents.json b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Contents.json index da4a164..73c0059 100644 --- a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Contents.json +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/Contents.json @@ -1,6 +1,6 @@ { "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/RadioBox-Selected-Default.imageset/Contents.json b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/RadioBox-Selected-Default.imageset/Contents.json index eca5f66..e8ba476 100644 --- a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/RadioBox-Selected-Default.imageset/Contents.json +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/RadioBox-Selected-Default.imageset/Contents.json @@ -10,7 +10,6 @@ "scale" : "2x" }, { - "filename" : "RadioBox-Selected-Default@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/RadioBox-Selected-Default.imageset/RadioBox-Selected-Default@2x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/RadioBox-Selected-Default.imageset/RadioBox-Selected-Default@2x.png index 66afd6c..41d66de 100644 Binary files a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/RadioBox-Selected-Default.imageset/RadioBox-Selected-Default@2x.png and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/exam/RadioBox-Selected-Default.imageset/RadioBox-Selected-Default@2x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/Contents.json b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_play_btn.imageset/Contents.json b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_play_btn.imageset/Contents.json new file mode 100644 index 0000000..60be800 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_play_btn.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "plv_play_btn@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "plv_play_btn@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_play_btn.imageset/plv_play_btn@2x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_play_btn.imageset/plv_play_btn@2x.png new file mode 100644 index 0000000..ead0a85 Binary files /dev/null and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_play_btn.imageset/plv_play_btn@2x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_play_btn.imageset/plv_play_btn@3x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_play_btn.imageset/plv_play_btn@3x.png new file mode 100644 index 0000000..3b6944b Binary files /dev/null and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_play_btn.imageset/plv_play_btn@3x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_playing_btn.imageset/Contents.json b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_playing_btn.imageset/Contents.json new file mode 100644 index 0000000..9dee116 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_playing_btn.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "plv_playing_btn@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "plv_playing_btn@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_playing_btn.imageset/plv_playing_btn@2x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_playing_btn.imageset/plv_playing_btn@2x.png new file mode 100644 index 0000000..7a74123 Binary files /dev/null and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_playing_btn.imageset/plv_playing_btn@2x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_playing_btn.imageset/plv_playing_btn@3x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_playing_btn.imageset/plv_playing_btn@3x.png new file mode 100644 index 0000000..089980d Binary files /dev/null and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_playing_btn.imageset/plv_playing_btn@3x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_white_close.imageset/Contents.json b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_white_close.imageset/Contents.json new file mode 100644 index 0000000..a334ac6 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_white_close.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "plv_white_close@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "plv_white_close@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_white_close.imageset/plv_white_close@2x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_white_close.imageset/plv_white_close@2x.png new file mode 100644 index 0000000..18b611a Binary files /dev/null and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_white_close.imageset/plv_white_close@2x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_white_close.imageset/plv_white_close@3x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_white_close.imageset/plv_white_close@3x.png new file mode 100644 index 0000000..4ea034a Binary files /dev/null and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/knowledgeList/plv_white_close.imageset/plv_white_close@3x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_pictureInPicture_holder.imageset/Contents.json b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_pictureInPicture_holder.imageset/Contents.json new file mode 100644 index 0000000..be6c319 --- /dev/null +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_pictureInPicture_holder.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "plv_pictureInPicture_holder@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "plv_pictureInPicture_holder@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_pictureInPicture_holder.imageset/plv_pictureInPicture_holder@2x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_pictureInPicture_holder.imageset/plv_pictureInPicture_holder@2x.png new file mode 100644 index 0000000..5a284e4 Binary files /dev/null and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_pictureInPicture_holder.imageset/plv_pictureInPicture_holder@2x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_pictureInPicture_holder.imageset/plv_pictureInPicture_holder@3x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_pictureInPicture_holder.imageset/plv_pictureInPicture_holder@3x.png new file mode 100644 index 0000000..827957c Binary files /dev/null and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_pictureInPicture_holder.imageset/plv_pictureInPicture_holder@3x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/Contents.json b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/Contents.json index ac33952..22ddc7a 100644 --- a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/Contents.json +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/Contents.json @@ -1,6 +1,7 @@ { "images" : [ { + "filename" : "plv_vod_ic_answer_right.png", "idiom" : "universal", "scale" : "1x" }, diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/plv_vod_ic_answer_right.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/plv_vod_ic_answer_right.png index 0f9db29..532e3ef 100644 Binary files a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/plv_vod_ic_answer_right.png and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/plv_vod_ic_answer_right.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/plv_vod_ic_answer_right@2x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/plv_vod_ic_answer_right@2x.png index e79b03b..0952ec9 100644 Binary files a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/plv_vod_ic_answer_right@2x.png and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/plv_vod_ic_answer_right@2x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/plv_vod_ic_answer_right@3x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/plv_vod_ic_answer_right@3x.png index d6fb69f..bfdb1c4 100644 Binary files a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/plv_vod_ic_answer_right@3x.png and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_right.imageset/plv_vod_ic_answer_right@3x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/Contents.json b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/Contents.json index a566080..86c00d8 100644 --- a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/Contents.json +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/Contents.json @@ -1,6 +1,7 @@ { "images" : [ { + "filename" : "plv_vod_ic_answer_wrong.png", "idiom" : "universal", "scale" : "1x" }, diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/plv_vod_ic_answer_wrong.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/plv_vod_ic_answer_wrong.png index 7fc1f09..608383e 100644 Binary files a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/plv_vod_ic_answer_wrong.png and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/plv_vod_ic_answer_wrong.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/plv_vod_ic_answer_wrong@2x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/plv_vod_ic_answer_wrong@2x.png index 64ad735..7d702bf 100644 Binary files a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/plv_vod_ic_answer_wrong@2x.png and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/plv_vod_ic_answer_wrong@2x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/plv_vod_ic_answer_wrong@3x.png b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/plv_vod_ic_answer_wrong@3x.png index d695af2..ab4e3e3 100644 Binary files a/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/plv_vod_ic_answer_wrong@3x.png and b/ios/PolyvVodRnModule/PolyvOpenSourceModule/PLVVodResources.xcassets/plv_vod_ic_answer_wrong.imageset/plv_vod_ic_answer_wrong@3x.png differ diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.h b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.h index ad13ed8..d32232f 100644 --- a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.h +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.h @@ -14,6 +14,7 @@ #import "PLVVodFastForwardView.h" #import "PLVVodSkinPlayerController.h" #import "PolyvVodPlayerWrapperView.h" +#import "PLVVodDefinitionTipsView.h" @class PLVVodAudioCoverPanelView; @class PLVVodCoverView; @@ -56,6 +57,9 @@ /// 是否播放本地视频 @property (nonatomic, assign) BOOL localPlayback; +/// 设备旋转的时候不影响全/半屏状态 (设备旋转是否与全/半屏状态无关),默认NO +@property (nonatomic, assign) BOOL deviceOrientationChangedNotSwitchFullscreen; + #pragma mark 控件 /// 播放/暂停按钮 @@ -94,6 +98,15 @@ /// "悬浮窗"按钮点击事件 @property (nonatomic, strong) void (^floatingButtonTouchHandler)(void); +/// 是否开启知识点功能,默认为 NO +@property (nonatomic, assign) BOOL enableKnowledge; + +/// 知识点按钮的title +@property (nonatomic, copy) NSString *knowledgeButtonTitle; + +/// "知识点"按钮点击事件 +@property (nonatomic, strong) void (^knowledgeButtonTouchHandler)(void); + #pragma mark - 额外 /// 字幕标签 @@ -125,6 +138,9 @@ /// 手势快进提示视图 @property (nonatomic, strong, readonly) PLVVodFastForwardView *fastForwardView; +/// 切换清晰度的提示视图 +@property (nonatomic, strong, readonly) PLVVodDefinitionTipsView *definitionTipsView; + /// 是否是锁屏状态 @property (nonatomic, assign, readonly) BOOL isLockScreen; @@ -133,6 +149,9 @@ @property (nonatomic, copy) void (^enableDanmuChangeHandler)(PLVVodPlayerSkin *skin, BOOL enableDanmu); @property (nonatomic, strong) PolyvVodPlayerWrapperView *wrapperView; +// 皮肤上是否显示硬解 +@property (nonatomic, assign) BOOL isVideoToolBox; +@property (nonatomic, copy) void (^videoToolBoxDidChangeBlock)(BOOL isVideoToolBox); /// 视频打点,点击播放回调 @property (nonatomic, copy) void(^plvVideoTipsPlayerBlock)(NSUInteger playIndex); diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.m b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.m index 7a9d0a1..0939a72 100644 --- a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.m +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.m @@ -16,6 +16,7 @@ #import "PLVVodDanmuSendView.h" #import "PLVVodDanmu+PLVVod.h" #import "PLVVodDefinitionPanelView.h" +#import "PLVVodVideoToolBoxPanelView.h" #import "PLVVodPlaybackRatePanelView.h" #import "PLVVodLockScreenView.h" #import "PLVVodCoverView.h" @@ -38,6 +39,9 @@ @interface PLVVodPlayerSkin () /// 清晰度选择面板 @property (strong, nonatomic) IBOutlet PLVVodDefinitionPanelView *definitionPanelView; +/// 软硬解选择面板 +@property (strong, nonatomic) IBOutlet PLVVodVideoToolBoxPanelView *videoToolBoxPanelView; + /// 速率选择面板 @property (strong, nonatomic) IBOutlet PLVVodPlaybackRatePanelView *playbackRatePanelView; @@ -87,6 +91,9 @@ @interface PLVVodPlayerSkin () /// 手势快进提示视图 @property (nonatomic, strong) PLVVodFastForwardView *fastForwardView; +/// 切换清晰度的提示视图 +@property (nonatomic, strong) PLVVodDefinitionTipsView *definitionTipsView; + @end @implementation PLVVodPlayerSkin @@ -113,8 +120,8 @@ - (void)setMainControl:(UIView *)mainControl { self.playbackSlider = playbackControl.playbackSlider; self.fullShrinkscreenButton = playbackControl.switchScreenButton; } - - [self.playPauseButton setEnlargeEdgeWithTop:15 right:15 bottom:15 left:15]; + + [self.playPauseButton setEnlargeEdgeWithTop:15 right:15 bottom:15 left:15]; } - (void)setTopView:(UIView *)topView { @@ -142,10 +149,31 @@ - (void)setDelegatePlayer:(PLVVodSkinPlayerController *)delegatePlayer { // 根据 video 的 hasPPT 属性和 player.enablePPT 确定是否要显示【关闭副屏】【显示课件目录】按钮 [weakSelf enablePPTMode:delegatePlayer.video.hasPPT && delegatePlayer.enablePPT]; }); - + _delegatePlayer.didFullScreenSwitch = ^(BOOL fullScreen) { - weakSelf.shrinkscreenView.switchScreenButton.selected = fullScreen; - [weakSelf updateUIForOrientation]; + dispatch_async(dispatch_get_main_queue(), ^{ + weakSelf.shrinkscreenView.switchScreenButton.selected = fullScreen; + [weakSelf updateUIForOrientation]; + }); + }; + + // 切换清晰度成功回调 + _delegatePlayer.switchQualitySuccessHandler = ^(PLVVodQuality quality) { + if (self->_delegatePlayer.fullscreen) { + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf.definitionTipsView showSwitchSuccess:quality]; + }); + } + }; + + //差网络回调 + _delegatePlayer.poorNetWorkHandler = ^{ + if (self->_delegatePlayer.quality > PLVVodQualityStandard && + self->_delegatePlayer.fullscreen) { + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf.definitionTipsView showSwitchQuality:self->_delegatePlayer.quality - 1]; + }); + } }; } @@ -160,14 +188,22 @@ - (void)setLocalPlayback:(BOOL)localPlayback { } else { definitionButton.selected = YES; definitionButton.enabled = YES; + + if (self.delegatePlayer.video.keepSource){ + definitionButton.enabled = NO; + } } - + UIButton *shrinkDefiBtn = self.shrinkscreenView.definitionButton; if (localPlayback) { [shrinkDefiBtn setTitle:@"本地" forState:UIControlStateNormal]; shrinkDefiBtn.enabled = NO; } else { shrinkDefiBtn.enabled = YES; + + if (self.delegatePlayer.video.keepSource){ + shrinkDefiBtn.enabled = NO; + } } }); } @@ -221,7 +257,7 @@ - (void)setQuality:(PLVVodQuality)quality { dispatch_async(dispatch_get_main_queue(), ^{ UIButton *definitionButton = self.fullscreenView.definitionButton; [definitionButton setTitle:definition forState:UIControlStateNormal]; - + UIButton *shrinkDefinitionBtn = self.shrinkscreenView.definitionButton; if (shrinkDefinitionBtn){ [shrinkDefinitionBtn setTitle:definition forState:UIControlStateNormal]; @@ -244,6 +280,29 @@ - (void)setEnableQualityBtn:(BOOL)enable{ [self.fullscreenView setEnableQualityBtn:enable]; } +#pragma mark 软硬解 + +- (void)setIsVideoToolBox:(BOOL)isVideoToolBox { + self.videoToolBoxPanelView.isVideoToolBox = isVideoToolBox; + dispatch_async(dispatch_get_main_queue(), ^{ + NSString *title = isVideoToolBox ? @"硬解" : @"软解"; + UIButton *videoToolBoxButton = self.fullscreenView.videoToolBoxButton; + [videoToolBoxButton setTitle:title forState:UIControlStateNormal]; + }); +} + +- (BOOL)isVideoToolBox { + return self.videoToolBoxPanelView.isVideoToolBox; +} + +- (void)setVideoToolBoxDidChangeBlock:(void (^)(BOOL))videoToolBoxDidChangeBlock { + self.videoToolBoxPanelView.videoToolBoxDidChangeBlock = videoToolBoxDidChangeBlock; +} + +- (void (^)(BOOL))videoToolBoxDidChangeBlock { + return self.videoToolBoxPanelView.videoToolBoxDidChangeBlock; +} + #pragma mark 拉伸方式 - (void)setScalingMode:(NSInteger)scalingMode { @@ -266,7 +325,7 @@ - (void)setPlaybackRate:(double)playbackRate { dispatch_async(dispatch_get_main_queue(), ^{ [self.fullscreenView.playbackRateButton setTitle:title forState:UIControlStateNormal]; [self.playbackRatePanelView setCurRate:playbackRate]; - + if (self.shrinkscreenView.playbackRateButton){ [self.shrinkscreenView.playbackRateButton setTitle:title forState:UIControlStateNormal]; } @@ -303,18 +362,18 @@ - (void)setUpPlaybackMode:(PLVVodVideo *)video { BOOL canSwithPlaybackMode = [video canSwithPlaybackMode]; self.shrinkscreenView.playModeContainerView.hidden = !canSwithPlaybackMode; self.fullscreenView.playModeContainerView.hidden = !canSwithPlaybackMode; - + [self.audioCoverPanelView setCoverUrl:video.snapshot]; if ([self.audioCoverPanelView superview] == nil) { [self.view addSubview:self.audioCoverPanelView]; [self constrainSubview:self.audioCoverPanelView toMatchWithSuperview:self.view]; [self.view sendSubviewToBack:self.audioCoverPanelView]; } - + if (![video canSwithPlaybackMode]) { [self.audioCoverPanelView hiddenContainerView:YES]; } - + [self updatePlayModeContainView:video]; } @@ -325,7 +384,7 @@ - (void)updatePlayModeContainView:(PLVVodVideo *)video { [self.fullscreenView switchToPlayMode:playbackMode]; [self.audioCoverPanelView switchToPlayMode:playbackMode]; } - + // 根据 video 的 hasPPT 属性和 player.enablePPT 确定是否要显示【关闭副屏】【显示课件目录】按钮 [self enablePPTMode:video.hasPPT && self.delegatePlayer.enablePPT]; } @@ -342,6 +401,19 @@ - (void)enableFloating:(BOOL)enable { [self.fullscreenView enableFloating:enable]; } +- (void)setEnableKnowledge:(BOOL)enableKnowledge { + _enableKnowledge = enableKnowledge; + [self.fullscreenView enableKnowledge:enableKnowledge]; +} + +- (void)setKnowledgeButtonTitle:(NSString *)knowledgeButtonTitle { + [self.fullscreenView.knowledgeButton setTitle:knowledgeButtonTitle forState:0]; +} + +- (NSString *)knowledgeButtonTitle { + return self.fullscreenView.knowledgeButton.titleLabel.text; +} + - (void)updateAudioCoverAnimation:(BOOL)isPlaying { if (isPlaying) { [self.audioCoverPanelView startRotate]; @@ -357,39 +429,37 @@ - (void)updateCoverView:(PLVVodVideo *)video{ if ([video isKindOfClass: [PLVVodLocalVideo class]]){ // 是本地文件 PLVVodDownloadInfo * info = [[PLVVodDownloadManager sharedManager]requestDownloadInfoWithVid:video.vid]; - + video.snapshot = info.snapshot; - + PLVVodLocalVideo * localVideoModel = (PLVVodLocalVideo *)video; fileUrl = localVideoModel.path; }else{ // 非本地文件 if (video.keepSource == NO) { // 非源文件 - fileUrl = video.hlsIndex; + fileUrl = video.isHls302 ? video.hlsIndex2 : video.hlsIndex; }else{ // 源文件 fileUrl = video.play_source_url; } } - + // 判断链接是否存在 if (fileUrl && [fileUrl isKindOfClass:[NSString class]] && fileUrl.length != 0) { - //todo-update 这里需要隐藏? // 判断是否为音频 if ([fileUrl hasSuffix:@".mp3"]) { self.isVideoCover = NO; }else{ self.isVideoCover = YES; } - + self.coverView.hidden = NO; -// [self.coverView setCoverImageWithUrl:video.snapshot]; -// [self.view addSubview:self.coverView]; -// [self constrainSubview:self.coverView toMatchWithSuperview:self.view]; -// [self.view sendSubviewToBack:self.coverView]; + [self.coverView setCoverImageWithUrl:video.snapshot]; + [self.view addSubview:self.coverView]; + [self constrainSubview:self.coverView toMatchWithSuperview:self.view]; + [self.view sendSubviewToBack:self.coverView]; } - //todo-end } - (void)removeCoverView{ @@ -431,7 +501,7 @@ - (PLVVodNetworkTipsView *)showPlayErrorWithTips:(NSString *)errorTips isLocal:( if (isShowing) { [self hideOrShowPlaybackControl]; } - + return self.playErrorTipsView; } @@ -461,7 +531,7 @@ - (PLVVodNetworkTipsView *)playErrorTipsView{ [self constrainSubview:_playErrorTipsView toMatchWithSuperview:self.view]; [self.view bringSubviewToFront:_playErrorTipsView]; } - + return _playErrorTipsView; } @@ -475,6 +545,24 @@ - (PLVVodFastForwardView *)fastForwardView { return _fastForwardView; } +-(PLVVodDefinitionTipsView *)definitionTipsView { + if (!_definitionTipsView) { + _definitionTipsView = [[PLVVodDefinitionTipsView alloc] init]; + __weak typeof(self) weakSelf = self; + [_definitionTipsView setClickSwitchQualityBlock:^(PLVVodQuality quality) { + weakSelf.quality = quality; + if (weakSelf.definitionPanelView.qualityDidChangeBlock) { + weakSelf.definitionPanelView.qualityDidChangeBlock(quality); + } + }]; + [self.view addSubview:_definitionTipsView]; + [self constrainSubview:_definitionTipsView toMatchWithSuperview:self.view]; + [self.view bringSubviewToFront:_definitionTipsView]; + } + return _definitionTipsView; +} + + #pragma mark - view controller - (void)dealloc { @@ -485,41 +573,44 @@ - (void)dealloc { - (void)viewDidLoad { [super viewDidLoad]; - + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interfaceOrientationDidChange:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; - + [self setupUI]; } - (void)setupUI { [self updateUIForOrientation]; - + self.topView = self.mainControl; [self.controlContainerView addSubview:self.mainControl]; self.priorConstraints = [self constrainSubview:self.mainControl toMatchWithSuperview:self.controlContainerView]; - + [self.view addSubview:self.gestureIndicatorView]; [self constrainSubview:self.gestureIndicatorView toMatchWithSuperview:self.view]; self.gestureIndicatorView.alpha = 0; - + // 配置控件细节 self.subtitleLabel.text = @""; self.subtitleTopLabel.text = @""; UIImage *playbackThumb = [UIImage imageNamed:@"plv_vod_btn_slider_player"]; [self.fullscreenView.playbackSlider setThumbImage:playbackThumb forState:UIControlStateNormal]; [self.shrinkscreenView.playbackSlider setThumbImage:playbackThumb forState:UIControlStateNormal]; - + UIImage *settingThumb = [UIImage imageNamed:@"plv_vod_btn_slider_settings"]; [self.settingsPanelView.volumeSlider setThumbImage:settingThumb forState:UIControlStateNormal]; [self.settingsPanelView.brightnessSlider setThumbImage:settingThumb forState:UIControlStateNormal]; - + __weak typeof(self) weakSelf = self; self.definitionPanelView.qualityButtonDidClick = ^(UIButton *sender) { [weakSelf backMainControl:sender]; }; + self.videoToolBoxPanelView.videoToolBoxButtonDidClick = ^(UIButton * _Nonnull sender) { + [weakSelf backMainControl:sender]; + }; self.playbackRatePanelView.playbackRateButtonDidClick = ^(UIButton *sender) { [weakSelf backMainControl:sender]; }; @@ -531,32 +622,32 @@ - (void)setupUI { weakSelf.routeLineDidChangeBlock(routeIndex); } }; - + // 链接属性 self.brightnessSlider = self.settingsPanelView.brightnessSlider; self.volumeSlider = self.settingsPanelView.volumeSlider; - + // 在线视频网络加载速度 self.loadSpeed.hidden = YES; - + // 视频打点信息,点击播放回调,UI层触发 self.fullscreenView.plvVideoTipsSelectedBlock = ^(NSUInteger selIndex) { if (weakSelf.plvVideoTipsPlayerBlock){ weakSelf.plvVideoTipsPlayerBlock(selIndex); } }; - + // 自动隐藏控件 [self fadeoutPlaybackControl]; - + // 皮肤控件覆盖层,现实弹幕 self.skinMaskView = [[UIView alloc] init]; self.skinMaskView.backgroundColor = [UIColor clearColor]; - + [self.view addSubview:self.skinMaskView]; [self constrainSubview:self.skinMaskView toMatchWithSuperview:self.view]; [self.view sendSubviewToBack:self.skinMaskView]; - + [self enableFloating:self.enableFloating]; } @@ -568,12 +659,7 @@ - (void)interfaceOrientationDidChange:(NSNotification *)notification { } - (void)updateUIForOrientation { - UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; - if (!UIInterfaceOrientationIsPortrait(orientation)) { - self.mainControl = self.fullscreenView; - self.shouldHideStatusBar = YES; - self.shouldHideNavigationBar = YES; - } else { + if (self.deviceOrientationChangedNotSwitchFullscreen) { if (self.delegatePlayer.fullscreen) { self.mainControl = self.fullscreenView; self.shouldHideStatusBar = YES; @@ -583,8 +669,25 @@ - (void)updateUIForOrientation { self.shouldHideStatusBar = NO; self.shouldHideNavigationBar = NO; } + }else { + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; + if (!UIInterfaceOrientationIsPortrait(orientation)) { + self.mainControl = self.fullscreenView; + self.shouldHideStatusBar = YES; + self.shouldHideNavigationBar = YES; + } else { + if (self.delegatePlayer.fullscreen) { + self.mainControl = self.fullscreenView; + self.shouldHideStatusBar = YES; + self.shouldHideNavigationBar = YES; + } else { + self.mainControl = self.shrinkscreenView; + self.shouldHideStatusBar = NO; + self.shouldHideNavigationBar = NO; + } + } } - + self.statusBarStyle = self.delegatePlayer.fullscreen ? UIStatusBarStyleLightContent : UIStatusBarStyleDefault; } @@ -603,7 +706,7 @@ - (IBAction)switchScreenAction:(UIButton *)sender { [self.delegatePlayer playInFullscreen:NO]; return; } - + [self.delegatePlayer playInFullscreen:!self.delegatePlayer.fullscreen]; } @@ -619,6 +722,10 @@ - (IBAction)definitionAction:(UIButton *)sender { [self transitToView:self.definitionPanelView]; } +- (IBAction)videotoolboxAction:(UIButton *)sender { + [self transitToView:self.videoToolBoxPanelView]; +} + // 播放速率设置 - (IBAction)playbackRateAction:(UIButton *)sender { [self transitToView:self.playbackRatePanelView]; @@ -638,6 +745,7 @@ - (IBAction)shareAction:(UIButton *)sender { - (IBAction)settingAction:(UIButton *)sender { [self transitToView:self.settingsPanelView]; [self.settingsPanelView switchToPlayMode:self.delegatePlayer.playbackMode]; + self.settingsPanelView.volumeSlider.value = self.delegatePlayer.playbackVolume; } // 截图按钮 @@ -646,21 +754,21 @@ - (IBAction)snapshotAction:(UIButton *)sender { if (self.pptVideoDelegate && [self.pptVideoDelegate respondsToSelector:@selector(tapSnapshotButton:)]) { snapshot = [self.pptVideoDelegate tapSnapshotButton:self]; } - + if (snapshot == nil) { snapshot = [self.delegatePlayer snapshot]; } - + NSLog(@"snapshot: %@", snapshot); // 请求图库权限 __weak typeof(self) weakSelf = self; - + void (^authorizedHandler)(void) = ^() { dispatch_async(dispatch_get_main_queue(), ^{ UIImageWriteToSavedPhotosAlbum(snapshot, weakSelf, @selector(image:didFinishSavingWithError:contextInfo:), nil); }); }; - + PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus]; switch (status) { case PHAuthorizationStatusNotDetermined:{ @@ -713,7 +821,7 @@ - (IBAction)danmuAction:(UIButton *)sender { // 视频模式按钮 - (IBAction)videoPlaybackModeAction:(id)sender { self.delegatePlayer.playbackMode = PLVVodPlaybackModeVideo; - + self.delegatePlayer.allowShowToast = NO; // add by libl [更新线路面板] 2019-02-14 start [self setRouteLineCount:self.delegatePlayer.video.availableRouteLines.count]; // add end @@ -722,7 +830,7 @@ - (IBAction)videoPlaybackModeAction:(id)sender { // 音频模式按钮 - (IBAction)audioPlaybackModeAction:(id)sender { self.delegatePlayer.playbackMode = PLVVodPlaybackModeAudio; - + self.delegatePlayer.allowShowToast = NO; // add by libl [更新线路面板] 2019-02-14 start [self setRouteLineCount:self.delegatePlayer.video.availableAudioRouteLines.count]; // add end @@ -743,7 +851,7 @@ - (IBAction)unlockScreenAction:(UIButton *)sender{ } // 投屏按钮 -- (IBAction)castAction:(UIButton *)sender { +- (IBAction)castAction:(UIButton *)sender { sender.selected = !sender.selected; if (self.castButtonTouchHandler) self.castButtonTouchHandler(sender); } @@ -762,13 +870,20 @@ - (IBAction)pptCatalogButtonnAction:(id)sender { // 【悬浮窗播放】按钮点击事件 - (IBAction)floatingButtonAction:(id)sender { - + // 接着,执行对应的 block if (self.floatingButtonTouchHandler) { self.floatingButtonTouchHandler(); } } +// 【知识点】按钮点击事件 +- (IBAction)knowledgeButtonAction:(id)sender { + if (self.knowledgeButtonTouchHandler) { + self.knowledgeButtonTouchHandler(); + } +} + #pragma mark - UITextFieldDelegate - (BOOL)textFieldShouldReturn:(UITextField *)textField { PLVVodDanmu *danmu = [[PLVVodDanmu alloc] init]; @@ -796,7 +911,7 @@ - (void)hideOrShowPlaybackControl { [NSObject cancelPreviousPerformRequestsWithTarget:self]; if (self.topView != self.mainControl) return; [self backMainControl:nil]; - + BOOL isShowing = self.controlContainerView.alpha > 0.0; [UIView animateWithDuration:PLVVodAnimationDuration animations:^{ self.controlContainerView.alpha = isShowing ? 0 : 1; @@ -822,7 +937,7 @@ - (void)fadeoutPlaybackControl { - (NSArray *)constrainSubview:(UIView *)subview toMatchWithSuperview:(UIView *)superview { subview.translatesAutoresizingMaskIntoConstraints = NO; NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(subview); - + NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[subview]|" options:0 metrics:nil @@ -832,7 +947,7 @@ - (NSArray *)constrainSubview:(UIView *)subview toMatchWithSuperview:(UIView *)s metrics:nil views:viewsDictionary]]; [superview addConstraints:constraints]; - + return constraints; } diff --git a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.xib b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.xib index a266fcf..f795919 100644 --- a/ios/PolyvVodRnModule/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.xib +++ b/ios/PolyvVodRnModule/PolyvOpenSourceModule/Skin/PLVVodPlayerSkin.xib @@ -1,9 +1,9 @@ - + - + @@ -31,6 +31,7 @@ + @@ -83,6 +84,7 @@ + @@ -98,7 +100,6 @@ - @@ -184,7 +185,7 @@ - - - + @@ -324,7 +326,6 @@ - @@ -420,7 +421,7 @@ - + - + - - + - + - + + + + + + + + + + + + + + @@ -1000,6 +1064,7 @@ + @@ -1007,7 +1072,6 @@ - @@ -1073,12 +1137,12 @@ + - @@ -1095,7 +1159,7 @@ + @@ -1351,7 +1416,6 @@ - @@ -1404,6 +1468,7 @@ + @@ -1411,7 +1476,6 @@ - @@ -1425,7 +1489,7 @@ - + - @@ -1464,7 +1528,8 @@ - + + @@ -1474,7 +1539,6 @@ - @@ -1494,7 +1558,7 @@ - - - - + + + + ); } diff --git a/polyv/demo/onlineList/PolyvOnlineVideoListPage.js b/polyv/demo/onlineList/PolyvOnlineVideoListPage.js index 79b4f2f..5420432 100644 --- a/polyv/demo/onlineList/PolyvOnlineVideoListPage.js +++ b/polyv/demo/onlineList/PolyvOnlineVideoListPage.js @@ -1,39 +1,31 @@ -import React, { Component } from "react"; +/** + * Sample React Native App + * https://github.com/facebook/react-native + * + * @format + * @flow + * @lint-ignore-every XPLATJSCOPYRIGHT1 + */ +import React, { Component } from "react"; import { + Text, View, + TextInput, Dimensions, - Button, StyleSheet, } from "react-native"; import { setAxios } from "../common/PolyvNet"; -import PolyvVodConfig from "../../sdk/PolyvVodConfigModule"; import PolyvVideoListView from "./view/PolyvVideoOnlineList"; +import PolyvVodConfig from "../../sdk/PolyvVodConfigModule"; import PolyvUserConfig from '../PolyvUserConfig' - const { width, height } = Dimensions.get("window"); -type Props = {}; -export default class PolyvOnlineVideoListPage extends Component { - static navigationOptions = ( - { navigation }) => { - return { - headerTitle: '在线视频', - headerRight: ( -