diff --git a/Example/Example.js b/Example/Example.js
index 8470596..89f2117 100644
--- a/Example/Example.js
+++ b/Example/Example.js
@@ -1,11 +1,5 @@
import React from 'react';
-import {
- Image,
- StatusBar,
- StyleSheet,
- TouchableOpacity,
- View,
-} from 'react-native';
+import { Image, StatusBar, StyleSheet, TouchableOpacity, View } from 'react-native';
import Camera from 'react-native-camera';
const styles = StyleSheet.create({
@@ -68,37 +62,39 @@ export default class Example extends React.Component {
orientation: Camera.constants.Orientation.auto,
flashMode: Camera.constants.FlashMode.auto,
},
- isRecording: false
+ isRecording: false,
};
}
takePicture = () => {
if (this.camera) {
- this.camera.capture()
- .then((data) => console.log(data))
+ this.camera
+ .capture()
+ .then(data => console.log(data))
.catch(err => console.error(err));
}
- }
+ };
startRecording = () => {
if (this.camera) {
- this.camera.capture({mode: Camera.constants.CaptureMode.video})
- .then((data) => console.log(data))
- .catch(err => console.error(err));
+ this.camera
+ .capture({ mode: Camera.constants.CaptureMode.video })
+ .then(data => console.log(data))
+ .catch(err => console.error(err));
this.setState({
- isRecording: true
+ isRecording: true,
});
}
- }
+ };
stopRecording = () => {
if (this.camera) {
this.camera.stopCapture();
this.setState({
- isRecording: false
+ isRecording: false,
});
}
- }
+ };
switchType = () => {
let newType;
@@ -116,7 +112,7 @@ export default class Example extends React.Component {
type: newType,
},
});
- }
+ };
get typeIcon() {
let icon;
@@ -149,7 +145,7 @@ export default class Example extends React.Component {
flashMode: newFlashMode,
},
});
- }
+ };
get flashIcon() {
let icon;
@@ -169,12 +165,9 @@ export default class Example extends React.Component {
render() {
return (
-
+
{
+ ref={cam => {
this.camera = cam;
}}
style={styles.preview}
@@ -190,60 +183,30 @@ export default class Example extends React.Component {
permissionDialogMessage="Sample dialog message"
/>
-
-
+
+
-
-
+
+
- {
- !this.state.isRecording
- &&
-
-
+ {(!this.state.isRecording && (
+
+
- ||
- null
- }
+ )) ||
+ null}
- {
- !this.state.isRecording
- &&
-
-
-
- ||
-
-
-
- }
+ {(!this.state.isRecording && (
+
+
+
+ )) || (
+
+
+
+ )}
);
diff --git a/README.md b/README.md
index 40d34f0..46724a9 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,14 @@
-
# React Native Camera [](#backers) [](#sponsors) [](http://badge.fury.io/js/react-native-camera) [](https://gitter.im/lwansbrough/react-native-camera)
The comprehensive camera module for React Native. Including photographs, videos, and barcode scanning!
+### Experimental
+RNCamera and FaceDetector module for Android based on Expo camera module (https://docs.expo.io/versions/latest/sdk/camera.html)
+
+You can test and use this from master like this:
+
+`import { RNCamera, FaceDetector } from 'react-native-camera';`
+
### Contributing
- Pull Requests are welcome, if you open a pull request we will do our best to get to it in a timely manner
- Pull Request Reviews and even more welcome! we need help testing, reviewing, and updating open PRs
diff --git a/RNCameraExample/.babelrc b/RNCameraExample/.babelrc
new file mode 100644
index 0000000..03b115e
--- /dev/null
+++ b/RNCameraExample/.babelrc
@@ -0,0 +1,8 @@
+{
+ "plugins": [
+ "transform-export-extensions"
+ ],
+ "presets": [
+ "react-native"
+ ]
+}
diff --git a/RNCameraExample/.buckconfig b/RNCameraExample/.buckconfig
new file mode 100644
index 0000000..934256c
--- /dev/null
+++ b/RNCameraExample/.buckconfig
@@ -0,0 +1,6 @@
+
+[android]
+ target = Google Inc.:Google APIs:23
+
+[maven_repositories]
+ central = https://repo1.maven.org/maven2
diff --git a/RNCameraExample/.flowconfig b/RNCameraExample/.flowconfig
new file mode 100644
index 0000000..2f13324
--- /dev/null
+++ b/RNCameraExample/.flowconfig
@@ -0,0 +1,48 @@
+[ignore]
+; We fork some components by platform
+.*/*[.]android.js
+
+; Ignore "BUCK" generated dirs
+/\.buckd/
+
+; Ignore unexpected extra "@providesModule"
+.*/node_modules/.*/node_modules/fbjs/.*
+
+; Ignore duplicate module providers
+; For RN Apps installed via npm, "Libraries" folder is inside
+; "node_modules/react-native" but in the source repo it is in the root
+.*/Libraries/react-native/React.js
+
+; Ignore polyfills
+.*/Libraries/polyfills/.*
+
+[include]
+
+[libs]
+node_modules/react-native/Libraries/react-native/react-native-interface.js
+node_modules/react-native/flow/
+
+[options]
+emoji=true
+
+module.system=haste
+
+munge_underscores=true
+
+module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'
+
+suppress_type=$FlowIssue
+suppress_type=$FlowFixMe
+suppress_type=$FlowFixMeProps
+suppress_type=$FlowFixMeState
+suppress_type=$FixMe
+
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(5[0-7]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
+suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(5[0-7]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
+suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
+suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
+
+unsafe.enable_getters_and_setters=true
+
+[version]
+^0.57.0
diff --git a/RNCameraExample/.gitattributes b/RNCameraExample/.gitattributes
new file mode 100644
index 0000000..d42ff18
--- /dev/null
+++ b/RNCameraExample/.gitattributes
@@ -0,0 +1 @@
+*.pbxproj -text
diff --git a/RNCameraExample/.gitignore b/RNCameraExample/.gitignore
new file mode 100644
index 0000000..0826423
--- /dev/null
+++ b/RNCameraExample/.gitignore
@@ -0,0 +1,53 @@
+# 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
diff --git a/RNCameraExample/.watchmanconfig b/RNCameraExample/.watchmanconfig
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/RNCameraExample/.watchmanconfig
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/RNCameraExample/App.js b/RNCameraExample/App.js
new file mode 100644
index 0000000..0f835f7
--- /dev/null
+++ b/RNCameraExample/App.js
@@ -0,0 +1,361 @@
+import React from 'react';
+import { StyleSheet, Text, View, TouchableOpacity, Slider } from 'react-native';
+import { RNCamera } from 'react-native-camera';
+
+const landmarkSize = 2;
+
+const flashModeOrder = {
+ off: 'on',
+ on: 'auto',
+ auto: 'torch',
+ torch: 'off',
+};
+
+const wbOrder = {
+ auto: 'sunny',
+ sunny: 'cloudy',
+ cloudy: 'shadow',
+ shadow: 'fluorescent',
+ fluorescent: 'incandescent',
+ incandescent: 'auto',
+};
+
+export default class CameraScreen extends React.Component {
+ state = {
+ flash: 'off',
+ zoom: 0,
+ autoFocus: 'on',
+ depth: 0,
+ type: 'back',
+ whiteBalance: 'auto',
+ ratio: '16:9',
+ ratios: [],
+ photoId: 1,
+ showGallery: false,
+ photos: [],
+ faces: [],
+ };
+
+ getRatios = async function() {
+ const ratios = await this.camera.getSupportedRatios();
+ return ratios;
+ };
+
+ toggleView() {
+ this.setState({
+ showGallery: !this.state.showGallery,
+ });
+ }
+
+ toggleFacing() {
+ this.setState({
+ type: this.state.type === 'back' ? 'front' : 'back',
+ });
+ }
+
+ toggleFlash() {
+ this.setState({
+ flash: flashModeOrder[this.state.flash],
+ });
+ }
+
+ setRatio(ratio) {
+ this.setState({
+ ratio,
+ });
+ }
+
+ toggleWB() {
+ this.setState({
+ whiteBalance: wbOrder[this.state.whiteBalance],
+ });
+ }
+
+ toggleFocus() {
+ this.setState({
+ autoFocus: this.state.autoFocus === 'on' ? 'off' : 'on',
+ });
+ }
+
+ zoomOut() {
+ this.setState({
+ zoom: this.state.zoom - 0.1 < 0 ? 0 : this.state.zoom - 0.1,
+ });
+ }
+
+ zoomIn() {
+ this.setState({
+ zoom: this.state.zoom + 0.1 > 1 ? 1 : this.state.zoom + 0.1,
+ });
+ }
+
+ setFocusDepth(depth) {
+ this.setState({
+ depth,
+ });
+ }
+
+ takePicture = async function() {
+ if (this.camera) {
+ this.camera.takePictureAsync().then(data => {
+ console.log('data: ', data);
+ });
+ }
+ };
+
+ onFacesDetected = ({ faces }) => this.setState({ faces });
+ onFaceDetectionError = state => console.warn('Faces detection error:', state);
+
+ renderFace({ bounds, faceID, rollAngle, yawAngle }) {
+ return (
+
+ ID: {faceID}
+ rollAngle: {rollAngle.toFixed(0)}
+ yawAngle: {yawAngle.toFixed(0)}
+
+ );
+ }
+
+ renderLandmarksOfFace(face) {
+ const renderLandmark = position =>
+ position && (
+
+ );
+ return (
+
+ {renderLandmark(face.leftEyePosition)}
+ {renderLandmark(face.rightEyePosition)}
+ {renderLandmark(face.leftEarPosition)}
+ {renderLandmark(face.rightEarPosition)}
+ {renderLandmark(face.leftCheekPosition)}
+ {renderLandmark(face.rightCheekPosition)}
+ {renderLandmark(face.leftMouthPosition)}
+ {renderLandmark(face.mouthPosition)}
+ {renderLandmark(face.rightMouthPosition)}
+ {renderLandmark(face.noseBasePosition)}
+ {renderLandmark(face.bottomMouthPosition)}
+
+ );
+ }
+
+ renderFaces() {
+ return (
+
+ {this.state.faces.map(this.renderFace)}
+
+ );
+ }
+
+ renderLandmarks() {
+ return (
+
+ {this.state.faces.map(this.renderLandmarksOfFace)}
+
+ );
+ }
+
+ renderCamera() {
+ return (
+ {
+ this.camera = ref;
+ }}
+ style={{
+ flex: 1,
+ }}
+ type={this.state.type}
+ flashMode={this.state.flash}
+ autoFocus={this.state.autoFocus}
+ zoom={this.state.zoom}
+ whiteBalance={this.state.whiteBalance}
+ ratio={this.state.ratio}
+ faceDetectionLandmarks={RNCamera.Constants.FaceDetection.Landmarks.all}
+ onFacesDetected={this.onFacesDetected}
+ onFaceDetectionError={this.onFaceDetectionError}
+ focusDepth={this.state.depth}
+ >
+
+
+ FLIP
+
+
+ FLASH: {this.state.flash}
+
+
+ WB: {this.state.whiteBalance}
+
+
+
+
+
+
+
+ +
+
+
+ -
+
+
+ AF : {this.state.autoFocus}
+
+
+ SNAP
+
+
+ Gallery
+
+
+ {this.renderFaces()}
+ {this.renderLandmarks()}
+
+ );
+ }
+
+ render() {
+ return {this.renderCamera()};
+ }
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ paddingTop: 10,
+ backgroundColor: '#000',
+ },
+ navigation: {
+ flex: 1,
+ },
+ gallery: {
+ flex: 1,
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ },
+ flipButton: {
+ flex: 0.3,
+ height: 40,
+ marginHorizontal: 2,
+ marginBottom: 10,
+ marginTop: 20,
+ borderRadius: 8,
+ borderColor: 'white',
+ borderWidth: 1,
+ padding: 5,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ flipText: {
+ color: 'white',
+ fontSize: 15,
+ },
+ item: {
+ margin: 4,
+ backgroundColor: 'indianred',
+ height: 35,
+ width: 80,
+ borderRadius: 5,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ picButton: {
+ backgroundColor: 'darkseagreen',
+ },
+ galleryButton: {
+ backgroundColor: 'indianred',
+ },
+ facesContainer: {
+ position: 'absolute',
+ bottom: 0,
+ right: 0,
+ left: 0,
+ top: 0,
+ },
+ face: {
+ padding: 10,
+ borderWidth: 2,
+ borderRadius: 2,
+ position: 'absolute',
+ borderColor: '#FFD700',
+ justifyContent: 'center',
+ backgroundColor: 'rgba(0, 0, 0, 0.5)',
+ },
+ landmark: {
+ width: landmarkSize,
+ height: landmarkSize,
+ position: 'absolute',
+ backgroundColor: 'red',
+ },
+ faceText: {
+ color: '#FFD700',
+ fontWeight: 'bold',
+ textAlign: 'center',
+ margin: 10,
+ backgroundColor: 'transparent',
+ },
+ row: {
+ flexDirection: 'row',
+ },
+});
diff --git a/RNCameraExample/__tests__/App.js b/RNCameraExample/__tests__/App.js
new file mode 100644
index 0000000..5ead013
--- /dev/null
+++ b/RNCameraExample/__tests__/App.js
@@ -0,0 +1,10 @@
+import 'react-native';
+import React from 'react';
+import App from '../App';
+
+// Note: test renderer must be required after react-native.
+import renderer from 'react-test-renderer';
+
+it('renders correctly', () => {
+ const tree = renderer.create();
+});
diff --git a/RNCameraExample/android/app/BUCK b/RNCameraExample/android/app/BUCK
new file mode 100644
index 0000000..e104f85
--- /dev/null
+++ b/RNCameraExample/android/app/BUCK
@@ -0,0 +1,65 @@
+# 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
+#
+
+lib_deps = []
+
+for jarfile in glob(['libs/*.jar']):
+ name = 'jars__' + jarfile[jarfile.rindex('/') + 1: jarfile.rindex('.jar')]
+ lib_deps.append(':' + name)
+ prebuilt_jar(
+ name = name,
+ binary_jar = jarfile,
+ )
+
+for aarfile in glob(['libs/*.aar']):
+ name = 'aars__' + aarfile[aarfile.rindex('/') + 1: aarfile.rindex('.aar')]
+ lib_deps.append(':' + name)
+ android_prebuilt_aar(
+ name = name,
+ aar = aarfile,
+ )
+
+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.rncameraexample",
+)
+
+android_resource(
+ name = "res",
+ package = "com.rncameraexample",
+ 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/RNCameraExample/android/app/build.gradle b/RNCameraExample/android/app/build.gradle
new file mode 100644
index 0000000..3a8839a
--- /dev/null
+++ b/RNCameraExample/android/app/build.gradle
@@ -0,0 +1,151 @@
+apply plugin: "com.android.application"
+
+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: []
+ * ]
+ */
+
+project.ext.react = [
+ entryFile: "index.js"
+]
+
+apply from: "../../node_modules/react-native/react.gradle"
+
+/**
+ * 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.
+ */
+def enableSeparateBuildPerCPUArchitecture = false
+
+/**
+ * Run Proguard to shrink the Java bytecode in release builds.
+ */
+def enableProguardInReleaseBuilds = false
+
+android {
+ compileSdkVersion 23
+ buildToolsVersion "23.0.1"
+
+ defaultConfig {
+ applicationId "com.rncameraexample"
+ minSdkVersion 16
+ targetSdkVersion 22
+ versionCode 1
+ versionName "1.0"
+ ndk {
+ abiFilters "armeabi-v7a", "x86"
+ }
+ }
+ splits {
+ abi {
+ reset()
+ enable enableSeparateBuildPerCPUArchitecture
+ universalApk false // If true, also generate a universal APK
+ include "armeabi-v7a", "x86"
+ }
+ }
+ buildTypes {
+ release {
+ minifyEnabled enableProguardInReleaseBuilds
+ proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
+ }
+ }
+ // 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]
+ 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
+ }
+ }
+ }
+}
+
+dependencies {
+ compile project(':react-native-camera')
+ compile fileTree(dir: "libs", include: ["*.jar"])
+ compile "com.android.support:appcompat-v7:23.0.1"
+ compile "com.facebook.react:react-native:+" // From node_modules
+}
+
+// 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'
+}
diff --git a/RNCameraExample/android/app/proguard-rules.pro b/RNCameraExample/android/app/proguard-rules.pro
new file mode 100644
index 0000000..6e8516c
--- /dev/null
+++ b/RNCameraExample/android/app/proguard-rules.pro
@@ -0,0 +1,70 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# 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 *;
+#}
+
+# Disabling obfuscation is useful if you collect stack traces from production crashes
+# (unless you are using a system that supports de-obfuscate the stack traces).
+-dontobfuscate
+
+# React Native
+
+# Keep our interfaces so they can be used by other ProGuard rules.
+# See http://sourceforge.net/p/proguard/bugs/466/
+-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip
+-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters
+-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip
+
+# Do not strip any method/class that is annotated with @DoNotStrip
+-keep @com.facebook.proguard.annotations.DoNotStrip class *
+-keep @com.facebook.common.internal.DoNotStrip class *
+-keepclassmembers class * {
+ @com.facebook.proguard.annotations.DoNotStrip *;
+ @com.facebook.common.internal.DoNotStrip *;
+}
+
+-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {
+ void set*(***);
+ *** get*();
+}
+
+-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; }
+-keep class * extends com.facebook.react.bridge.NativeModule { *; }
+-keepclassmembers,includedescriptorclasses class * { native ; }
+-keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; }
+-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; }
+-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; }
+
+-dontwarn com.facebook.react.**
+
+# TextLayoutBuilder uses a non-public Android constructor within StaticLayout.
+# See libs/proxy/src/main/java/com/facebook/fbui/textlayoutbuilder/proxy for details.
+-dontwarn android.text.StaticLayout
+
+# okhttp
+
+-keepattributes Signature
+-keepattributes *Annotation*
+-keep class okhttp3.** { *; }
+-keep interface okhttp3.** { *; }
+-dontwarn okhttp3.**
+
+# okio
+
+-keep class sun.misc.Unsafe { *; }
+-dontwarn java.nio.file.*
+-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
+-dontwarn okio.**
diff --git a/RNCameraExample/android/app/src/main/AndroidManifest.xml b/RNCameraExample/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..dfad802
--- /dev/null
+++ b/RNCameraExample/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/RNCameraExample/android/app/src/main/java/com/rncameraexample/MainActivity.java b/RNCameraExample/android/app/src/main/java/com/rncameraexample/MainActivity.java
new file mode 100644
index 0000000..91061ea
--- /dev/null
+++ b/RNCameraExample/android/app/src/main/java/com/rncameraexample/MainActivity.java
@@ -0,0 +1,15 @@
+package com.rncameraexample;
+
+import com.facebook.react.ReactActivity;
+
+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 "RNCameraExample";
+ }
+}
diff --git a/RNCameraExample/android/app/src/main/java/com/rncameraexample/MainApplication.java b/RNCameraExample/android/app/src/main/java/com/rncameraexample/MainApplication.java
new file mode 100644
index 0000000..0496b9f
--- /dev/null
+++ b/RNCameraExample/android/app/src/main/java/com/rncameraexample/MainApplication.java
@@ -0,0 +1,47 @@
+package com.rncameraexample;
+
+import android.app.Application;
+
+import com.facebook.react.ReactApplication;
+import com.lwansbrough.RCTCamera.RCTCameraPackage;
+import com.facebook.react.ReactNativeHost;
+import com.facebook.react.ReactPackage;
+import com.facebook.react.shell.MainReactPackage;
+import com.facebook.soloader.SoLoader;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class MainApplication extends Application implements ReactApplication {
+
+ private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
+ @Override
+ public boolean getUseDeveloperSupport() {
+ return BuildConfig.DEBUG;
+ }
+
+ @Override
+ protected List getPackages() {
+ return Arrays.asList(
+ new MainReactPackage(),
+ new RCTCameraPackage()
+ );
+ }
+
+ @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/RNCameraExample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/RNCameraExample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
Binary files /dev/null and b/RNCameraExample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/RNCameraExample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/RNCameraExample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
Binary files /dev/null and b/RNCameraExample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/RNCameraExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/RNCameraExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
Binary files /dev/null and b/RNCameraExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/RNCameraExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/RNCameraExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
Binary files /dev/null and b/RNCameraExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/RNCameraExample/android/app/src/main/res/values/strings.xml b/RNCameraExample/android/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..cf09a9c
--- /dev/null
+++ b/RNCameraExample/android/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ RNCameraExample
+
diff --git a/RNCameraExample/android/app/src/main/res/values/styles.xml b/RNCameraExample/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..319eb0c
--- /dev/null
+++ b/RNCameraExample/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
diff --git a/RNCameraExample/android/build.gradle b/RNCameraExample/android/build.gradle
new file mode 100644
index 0000000..ad935ac
--- /dev/null
+++ b/RNCameraExample/android/build.gradle
@@ -0,0 +1,45 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ jcenter()
+ maven { url 'https://maven.google.com' }
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.0.1'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ mavenLocal()
+ jcenter()
+ maven {
+ // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
+ url "$rootDir/../node_modules/react-native/android"
+ }
+ maven {
+ url "https://maven.google.com" // Google's Maven repository
+ }
+ maven { url "https://jitpack.io" }
+ }
+}
+
+ext {
+ compileSdkVersion = 26
+ buildToolsVersion = '26.0.2'
+}
+
+subprojects { subproject ->
+ afterEvaluate{
+ if((subproject.plugins.hasPlugin('android') || subproject.plugins.hasPlugin('android-library'))) {
+ android {
+ compileSdkVersion rootProject.ext.compileSdkVersion
+ buildToolsVersion rootProject.ext.buildToolsVersion
+ }
+ }
+ }
+}
diff --git a/RNCameraExample/android/gradle.properties b/RNCameraExample/android/gradle.properties
new file mode 100644
index 0000000..1fd964e
--- /dev/null
+++ b/RNCameraExample/android/gradle.properties
@@ -0,0 +1,20 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+
+# 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
+
+android.useDeprecatedNdk=true
diff --git a/RNCameraExample/android/gradle/wrapper/gradle-wrapper.jar b/RNCameraExample/android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..b5166da
Binary files /dev/null and b/RNCameraExample/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/RNCameraExample/android/gradle/wrapper/gradle-wrapper.properties b/RNCameraExample/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..ab6147a
--- /dev/null
+++ b/RNCameraExample/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Sun Jan 07 08:54:18 PST 2018
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
diff --git a/RNCameraExample/android/gradlew b/RNCameraExample/android/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/RNCameraExample/android/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# 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
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ 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
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "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
+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
+
+# 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"`
+
+ # 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\""
+ fi
+ i=$((i+1))
+ 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
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/RNCameraExample/android/gradlew.bat b/RNCameraExample/android/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/RNCameraExample/android/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@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 DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@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
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_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=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+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%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/RNCameraExample/android/keystores/BUCK b/RNCameraExample/android/keystores/BUCK
new file mode 100644
index 0000000..88e4c31
--- /dev/null
+++ b/RNCameraExample/android/keystores/BUCK
@@ -0,0 +1,8 @@
+keystore(
+ name = "debug",
+ properties = "debug.keystore.properties",
+ store = "debug.keystore",
+ visibility = [
+ "PUBLIC",
+ ],
+)
diff --git a/RNCameraExample/android/keystores/debug.keystore.properties b/RNCameraExample/android/keystores/debug.keystore.properties
new file mode 100644
index 0000000..121bfb4
--- /dev/null
+++ b/RNCameraExample/android/keystores/debug.keystore.properties
@@ -0,0 +1,4 @@
+key.store=debug.keystore
+key.alias=androiddebugkey
+key.store.password=android
+key.alias.password=android
diff --git a/RNCameraExample/android/settings.gradle b/RNCameraExample/android/settings.gradle
new file mode 100644
index 0000000..542b787
--- /dev/null
+++ b/RNCameraExample/android/settings.gradle
@@ -0,0 +1,5 @@
+rootProject.name = 'RNCameraExample'
+include ':react-native-camera'
+project(':react-native-camera').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-camera/android')
+
+include ':app'
diff --git a/RNCameraExample/app.json b/RNCameraExample/app.json
new file mode 100644
index 0000000..5b9bcbe
--- /dev/null
+++ b/RNCameraExample/app.json
@@ -0,0 +1,4 @@
+{
+ "name": "RNCameraExample",
+ "displayName": "RNCameraExample"
+}
\ No newline at end of file
diff --git a/RNCameraExample/index.js b/RNCameraExample/index.js
new file mode 100644
index 0000000..550bf6d
--- /dev/null
+++ b/RNCameraExample/index.js
@@ -0,0 +1,4 @@
+import { AppRegistry } from 'react-native';
+import App from './App';
+
+AppRegistry.registerComponent('RNCameraExample', () => App);
diff --git a/RNCameraExample/ios/RNCameraExample-tvOS/Info.plist b/RNCameraExample/ios/RNCameraExample-tvOS/Info.plist
new file mode 100644
index 0000000..2fb6a11
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExample-tvOS/Info.plist
@@ -0,0 +1,54 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+ NSLocationWhenInUseUsageDescription
+
+ NSAppTransportSecurity
+
+
+ NSExceptionDomains
+
+ localhost
+
+ NSExceptionAllowsInsecureHTTPLoads
+
+
+
+
+
+
diff --git a/RNCameraExample/ios/RNCameraExample-tvOSTests/Info.plist b/RNCameraExample/ios/RNCameraExample-tvOSTests/Info.plist
new file mode 100644
index 0000000..886825c
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExample-tvOSTests/Info.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ BNDL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1
+
+
diff --git a/RNCameraExample/ios/RNCameraExample.xcodeproj/project.pbxproj b/RNCameraExample/ios/RNCameraExample.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..f1e2538
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExample.xcodeproj/project.pbxproj
@@ -0,0 +1,1336 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+/* Begin PBXBuildFile section */
+ 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
+ 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
+ 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };
+ 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
+ 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
+ 00E356F31AD99517003FC87E /* RNCameraExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* RNCameraExampleTests.m */; };
+ 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
+ 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
+ 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };
+ 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
+ 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
+ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
+ 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
+ 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
+ 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
+ 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
+ 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
+ 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
+ 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */; };
+ 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; };
+ 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; };
+ 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; };
+ 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; };
+ 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; };
+ 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; };
+ 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; };
+ 2DCD954D1E0B4F2C00145EB5 /* RNCameraExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* RNCameraExampleTests.m */; };
+ 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; };
+ 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
+ ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };
+ 2F7AD0E9F1894506B436995A /* libRCTCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 55BDBA068A754C65A4EA4913 /* libRCTCamera.a */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 134814201AA4EA6300B7C361;
+ remoteInfo = RCTActionSheet;
+ };
+ 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 134814201AA4EA6300B7C361;
+ remoteInfo = RCTGeolocation;
+ };
+ 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 58B5115D1A9E6B3D00147676;
+ remoteInfo = RCTImage;
+ };
+ 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 58B511DB1A9E6C8500147676;
+ remoteInfo = RCTNetwork;
+ };
+ 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 832C81801AAF6DEF007FA2F7;
+ remoteInfo = RCTVibration;
+ };
+ 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
+ remoteInfo = RNCameraExample;
+ };
+ 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 134814201AA4EA6300B7C361;
+ remoteInfo = RCTSettings;
+ };
+ 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 3C86DF461ADF2C930047B81A;
+ remoteInfo = RCTWebSocket;
+ };
+ 146834031AC3E56700842450 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;
+ remoteInfo = React;
+ };
+ 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7;
+ remoteInfo = "RNCameraExample-tvOS";
+ };
+ 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 2D2A283A1D9B042B00D4039D;
+ remoteInfo = "RCTImage-tvOS";
+ };
+ 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 2D2A28471D9B043800D4039D;
+ remoteInfo = "RCTLinking-tvOS";
+ };
+ 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 2D2A28541D9B044C00D4039D;
+ remoteInfo = "RCTNetwork-tvOS";
+ };
+ 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 2D2A28611D9B046600D4039D;
+ remoteInfo = "RCTSettings-tvOS";
+ };
+ 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 2D2A287B1D9B048500D4039D;
+ remoteInfo = "RCTText-tvOS";
+ };
+ 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 2D2A28881D9B049200D4039D;
+ remoteInfo = "RCTWebSocket-tvOS";
+ };
+ 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 2D2A28131D9B038B00D4039D;
+ remoteInfo = "React-tvOS";
+ };
+ 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 3D3C059A1DE3340900C268FA;
+ remoteInfo = yoga;
+ };
+ 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 3D3C06751DE3340C00C268FA;
+ remoteInfo = "yoga-tvOS";
+ };
+ 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4;
+ remoteInfo = cxxreact;
+ };
+ 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4;
+ remoteInfo = "cxxreact-tvOS";
+ };
+ 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4;
+ remoteInfo = jschelpers;
+ };
+ 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4;
+ remoteInfo = "jschelpers-tvOS";
+ };
+ 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 134814201AA4EA6300B7C361;
+ remoteInfo = RCTAnimation;
+ };
+ 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 2D2A28201D9B03D100D4039D;
+ remoteInfo = "RCTAnimation-tvOS";
+ };
+ 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 134814201AA4EA6300B7C361;
+ remoteInfo = RCTLinking;
+ };
+ 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 58B5119B1A9E6C1200147676;
+ remoteInfo = RCTText;
+ };
+ ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 358F4ED71D1E81A9004DF814;
+ remoteInfo = RCTBlob;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; };
+ 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; };
+ 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; };
+ 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; };
+ 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; };
+ 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; };
+ 00E356EE1AD99517003FC87E /* RNCameraExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RNCameraExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 00E356F21AD99517003FC87E /* RNCameraExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNCameraExampleTests.m; sourceTree = ""; };
+ 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; };
+ 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; };
+ 13B07F961A680F5B00A75B9A /* RNCameraExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RNCameraExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = RNCameraExample/AppDelegate.h; sourceTree = ""; };
+ 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = RNCameraExample/AppDelegate.m; sourceTree = ""; };
+ 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; };
+ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RNCameraExample/Images.xcassets; sourceTree = ""; };
+ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RNCameraExample/Info.plist; sourceTree = ""; };
+ 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = RNCameraExample/main.m; sourceTree = ""; };
+ 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; };
+ 2D02E47B1E0B4A5D006451C7 /* RNCameraExample-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "RNCameraExample-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 2D02E4901E0B4A5D006451C7 /* RNCameraExample-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "RNCameraExample-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; };
+ 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; };
+ 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; };
+ ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = ""; };
+ 6C604AAAAD1345538912C5D9 /* RCTCamera.xcodeproj */ = {isa = PBXFileReference; name = "RCTCamera.xcodeproj"; path = "../node_modules/react-native-camera/ios/RCTCamera.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; };
+ 55BDBA068A754C65A4EA4913 /* libRCTCamera.a */ = {isa = PBXFileReference; name = "libRCTCamera.a"; path = "libRCTCamera.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 00E356EB1AD99517003FC87E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */,
+ 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */,
+ 146834051AC3E58100842450 /* libReact.a in Frameworks */,
+ 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */,
+ 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,
+ 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,
+ 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,
+ 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,
+ 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,
+ 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,
+ 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
+ 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
+ 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
+ 2F7AD0E9F1894506B436995A /* libRCTCamera.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 2D02E4781E0B4A5D006451C7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */,
+ 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation-tvOS.a in Frameworks */,
+ 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */,
+ 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */,
+ 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */,
+ 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */,
+ 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */,
+ 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 00C302A81ABCB8CE00DB3ED1 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 00C302B61ABCB90400DB3ED1 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 00C302BC1ABCB91800DB3ED1 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,
+ 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 00C302D41ABCB9D200DB3ED1 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,
+ 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 00C302E01ABCB9EE00DB3ED1 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 00E356EF1AD99517003FC87E /* RNCameraExampleTests */ = {
+ isa = PBXGroup;
+ children = (
+ 00E356F21AD99517003FC87E /* RNCameraExampleTests.m */,
+ 00E356F01AD99517003FC87E /* Supporting Files */,
+ );
+ path = RNCameraExampleTests;
+ sourceTree = "";
+ };
+ 00E356F01AD99517003FC87E /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 00E356F11AD99517003FC87E /* Info.plist */,
+ );
+ name = "Supporting Files";
+ sourceTree = "";
+ };
+ 139105B71AF99BAD00B5F7CC /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,
+ 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 139FDEE71B06529A00C62182 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,
+ 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 13B07FAE1A68108700A75B9A /* RNCameraExample */ = {
+ isa = PBXGroup;
+ children = (
+ 008F07F21AC5B25A0029DE68 /* main.jsbundle */,
+ 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
+ 13B07FB01A68108700A75B9A /* AppDelegate.m */,
+ 13B07FB51A68108700A75B9A /* Images.xcassets */,
+ 13B07FB61A68108700A75B9A /* Info.plist */,
+ 13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
+ 13B07FB71A68108700A75B9A /* main.m */,
+ );
+ name = RNCameraExample;
+ sourceTree = "";
+ };
+ 146834001AC3E56700842450 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 146834041AC3E56700842450 /* libReact.a */,
+ 3DAD3EA31DF850E9000B6D8A /* libReact.a */,
+ 3DAD3EA51DF850E9000B6D8A /* libyoga.a */,
+ 3DAD3EA71DF850E9000B6D8A /* libyoga.a */,
+ 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */,
+ 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */,
+ 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */,
+ 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */,
+ 3DAD3EA31DF850E9000B6D8A /* libReact-tvOS.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 5E91572E1DD0AC6500FF2AA8 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */,
+ 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 78C398B11ACF4ADC00677621 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 78C398B91ACF4ADC00677621 /* libRCTLinking.a */,
+ 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */,
+ 146833FF1AC3E56700842450 /* React.xcodeproj */,
+ 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
+ ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */,
+ 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,
+ 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,
+ 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,
+ 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,
+ 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,
+ 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
+ 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
+ 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
+ 6C604AAAAD1345538912C5D9 /* RCTCamera.xcodeproj */,
+ );
+ name = Libraries;
+ sourceTree = "";
+ };
+ 832341B11AAA6A8300B99B32 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 832341B51AAA6A8300B99B32 /* libRCTText.a */,
+ 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 83CBB9F61A601CBA00E9B192 = {
+ isa = PBXGroup;
+ children = (
+ 13B07FAE1A68108700A75B9A /* RNCameraExample */,
+ 832341AE1AAA6A7D00B99B32 /* Libraries */,
+ 00E356EF1AD99517003FC87E /* RNCameraExampleTests */,
+ 83CBBA001A601CBA00E9B192 /* Products */,
+ );
+ indentWidth = 2;
+ sourceTree = "";
+ tabWidth = 2;
+ usesTabs = 0;
+ };
+ 83CBBA001A601CBA00E9B192 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 13B07F961A680F5B00A75B9A /* RNCameraExample.app */,
+ 00E356EE1AD99517003FC87E /* RNCameraExampleTests.xctest */,
+ 2D02E47B1E0B4A5D006451C7 /* RNCameraExample-tvOS.app */,
+ 2D02E4901E0B4A5D006451C7 /* RNCameraExample-tvOSTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ ADBDB9201DFEBF0600ED6528 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 00E356ED1AD99517003FC87E /* RNCameraExampleTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "RNCameraExampleTests" */;
+ buildPhases = (
+ 00E356EA1AD99517003FC87E /* Sources */,
+ 00E356EB1AD99517003FC87E /* Frameworks */,
+ 00E356EC1AD99517003FC87E /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 00E356F51AD99517003FC87E /* PBXTargetDependency */,
+ );
+ name = RNCameraExampleTests;
+ productName = RNCameraExampleTests;
+ productReference = 00E356EE1AD99517003FC87E /* RNCameraExampleTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 13B07F861A680F5B00A75B9A /* RNCameraExample */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "RNCameraExample" */;
+ buildPhases = (
+ 13B07F871A680F5B00A75B9A /* Sources */,
+ 13B07F8C1A680F5B00A75B9A /* Frameworks */,
+ 13B07F8E1A680F5B00A75B9A /* Resources */,
+ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = RNCameraExample;
+ productName = "Hello World";
+ productReference = 13B07F961A680F5B00A75B9A /* RNCameraExample.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 2D02E47A1E0B4A5D006451C7 /* RNCameraExample-tvOS */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "RNCameraExample-tvOS" */;
+ buildPhases = (
+ 2D02E4771E0B4A5D006451C7 /* Sources */,
+ 2D02E4781E0B4A5D006451C7 /* Frameworks */,
+ 2D02E4791E0B4A5D006451C7 /* Resources */,
+ 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "RNCameraExample-tvOS";
+ productName = "RNCameraExample-tvOS";
+ productReference = 2D02E47B1E0B4A5D006451C7 /* RNCameraExample-tvOS.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 2D02E48F1E0B4A5D006451C7 /* RNCameraExample-tvOSTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "RNCameraExample-tvOSTests" */;
+ buildPhases = (
+ 2D02E48C1E0B4A5D006451C7 /* Sources */,
+ 2D02E48D1E0B4A5D006451C7 /* Frameworks */,
+ 2D02E48E1E0B4A5D006451C7 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */,
+ );
+ name = "RNCameraExample-tvOSTests";
+ productName = "RNCameraExample-tvOSTests";
+ productReference = 2D02E4901E0B4A5D006451C7 /* RNCameraExample-tvOSTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 83CBB9F71A601CBA00E9B192 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 610;
+ ORGANIZATIONNAME = Facebook;
+ TargetAttributes = {
+ 00E356ED1AD99517003FC87E = {
+ CreatedOnToolsVersion = 6.2;
+ TestTargetID = 13B07F861A680F5B00A75B9A;
+ };
+ 2D02E47A1E0B4A5D006451C7 = {
+ CreatedOnToolsVersion = 8.2.1;
+ ProvisioningStyle = Automatic;
+ };
+ 2D02E48F1E0B4A5D006451C7 = {
+ CreatedOnToolsVersion = 8.2.1;
+ ProvisioningStyle = Automatic;
+ TestTargetID = 2D02E47A1E0B4A5D006451C7;
+ };
+ };
+ };
+ buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "RNCameraExample" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 83CBB9F61A601CBA00E9B192;
+ productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
+ projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;
+ ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
+ },
+ {
+ ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */;
+ ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;
+ },
+ {
+ ProductGroup = ADBDB9201DFEBF0600ED6528 /* Products */;
+ ProjectRef = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;
+ },
+ {
+ ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;
+ ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
+ },
+ {
+ ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;
+ ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
+ },
+ {
+ ProductGroup = 78C398B11ACF4ADC00677621 /* Products */;
+ ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
+ },
+ {
+ ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;
+ ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
+ },
+ {
+ ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;
+ ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
+ },
+ {
+ ProductGroup = 832341B11AAA6A8300B99B32 /* Products */;
+ ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
+ },
+ {
+ ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;
+ ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
+ },
+ {
+ ProductGroup = 139FDEE71B06529A00C62182 /* Products */;
+ ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
+ },
+ {
+ ProductGroup = 146834001AC3E56700842450 /* Products */;
+ ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
+ },
+ );
+ projectRoot = "";
+ targets = (
+ 13B07F861A680F5B00A75B9A /* RNCameraExample */,
+ 00E356ED1AD99517003FC87E /* RNCameraExampleTests */,
+ 2D02E47A1E0B4A5D006451C7 /* RNCameraExample-tvOS */,
+ 2D02E48F1E0B4A5D006451C7 /* RNCameraExample-tvOSTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+ 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libRCTActionSheet.a;
+ remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libRCTGeolocation.a;
+ remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libRCTImage.a;
+ remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libRCTNetwork.a;
+ remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libRCTVibration.a;
+ remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libRCTSettings.a;
+ remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libRCTWebSocket.a;
+ remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 146834041AC3E56700842450 /* libReact.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libReact.a;
+ remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = "libRCTImage-tvOS.a";
+ remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = "libRCTLinking-tvOS.a";
+ remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = "libRCTNetwork-tvOS.a";
+ remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = "libRCTSettings-tvOS.a";
+ remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = "libRCTText-tvOS.a";
+ remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = "libRCTWebSocket-tvOS.a";
+ remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3DAD3EA31DF850E9000B6D8A /* libReact-tvOS.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = "libReact-tvOS.a";
+ remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libyoga.a;
+ remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libyoga.a;
+ remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libcxxreact.a;
+ remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libcxxreact.a;
+ remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libjschelpers.a;
+ remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libjschelpers.a;
+ remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libRCTAnimation.a;
+ remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = "libRCTAnimation-tvOS.a";
+ remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libRCTLinking.a;
+ remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 832341B51AAA6A8300B99B32 /* libRCTText.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libRCTText.a;
+ remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libRCTBlob.a;
+ remoteRef = ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 00E356EC1AD99517003FC87E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 13B07F8E1A680F5B00A75B9A /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
+ 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 2D02E4791E0B4A5D006451C7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 2D02E48E1E0B4A5D006451C7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Bundle React Native code and images";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh";
+ };
+ 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Bundle React Native Code And Images";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 00E356EA1AD99517003FC87E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 00E356F31AD99517003FC87E /* RNCameraExampleTests.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 13B07F871A680F5B00A75B9A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
+ 13B07FC11A68108700A75B9A /* main.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 2D02E4771E0B4A5D006451C7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */,
+ 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 2D02E48C1E0B4A5D006451C7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2DCD954D1E0B4F2C00145EB5 /* RNCameraExampleTests.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 13B07F861A680F5B00A75B9A /* RNCameraExample */;
+ targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
+ };
+ 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 2D02E47A1E0B4A5D006451C7 /* RNCameraExample-tvOS */;
+ targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 13B07FB21A68108700A75B9A /* Base */,
+ );
+ name = LaunchScreen.xib;
+ path = RNCameraExample;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 00E356F61AD99517003FC87E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ INFOPLIST_FILE = RNCameraExampleTests/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ OTHER_LDFLAGS = (
+ "-ObjC",
+ "-lc++",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RNCameraExample.app/RNCameraExample";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/$(TARGET_NAME)\"",
+ );
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../node_modules/react-native-camera/ios/**",
+ );
+ };
+ name = Debug;
+ };
+ 00E356F71AD99517003FC87E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ COPY_PHASE_STRIP = NO;
+ INFOPLIST_FILE = RNCameraExampleTests/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ OTHER_LDFLAGS = (
+ "-ObjC",
+ "-lc++",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RNCameraExample.app/RNCameraExample";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/$(TARGET_NAME)\"",
+ );
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../node_modules/react-native-camera/ios/**",
+ );
+ };
+ name = Release;
+ };
+ 13B07F941A680F5B00A75B9A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CURRENT_PROJECT_VERSION = 1;
+ DEAD_CODE_STRIPPING = NO;
+ INFOPLIST_FILE = RNCameraExample/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ "-ObjC",
+ "-lc++",
+ );
+ PRODUCT_NAME = RNCameraExample;
+ VERSIONING_SYSTEM = "apple-generic";
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../node_modules/react-native-camera/ios/**",
+ );
+ };
+ name = Debug;
+ };
+ 13B07F951A680F5B00A75B9A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CURRENT_PROJECT_VERSION = 1;
+ INFOPLIST_FILE = RNCameraExample/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ "-ObjC",
+ "-lc++",
+ );
+ PRODUCT_NAME = RNCameraExample;
+ VERSIONING_SYSTEM = "apple-generic";
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../node_modules/react-native-camera/ios/**",
+ );
+ };
+ name = Release;
+ };
+ 2D02E4971E0B4A5E006451C7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_TESTABILITY = YES;
+ GCC_NO_COMMON_BLOCKS = YES;
+ INFOPLIST_FILE = "RNCameraExample-tvOS/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ OTHER_LDFLAGS = (
+ "-ObjC",
+ "-lc++",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.RNCameraExample-tvOS";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = appletvos;
+ TARGETED_DEVICE_FAMILY = 3;
+ TVOS_DEPLOYMENT_TARGET = 9.2;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/$(TARGET_NAME)\"",
+ );
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../node_modules/react-native-camera/ios/**",
+ );
+ };
+ name = Debug;
+ };
+ 2D02E4981E0B4A5E006451C7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
+ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_NO_COMMON_BLOCKS = YES;
+ INFOPLIST_FILE = "RNCameraExample-tvOS/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ OTHER_LDFLAGS = (
+ "-ObjC",
+ "-lc++",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.RNCameraExample-tvOS";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = appletvos;
+ TARGETED_DEVICE_FAMILY = 3;
+ TVOS_DEPLOYMENT_TARGET = 9.2;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/$(TARGET_NAME)\"",
+ );
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(SRCROOT)/../node_modules/react-native-camera/ios/**",
+ );
+ };
+ name = Release;
+ };
+ 2D02E4991E0B4A5E006451C7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_TESTABILITY = YES;
+ GCC_NO_COMMON_BLOCKS = YES;
+ INFOPLIST_FILE = "RNCameraExample-tvOSTests/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.RNCameraExample-tvOSTests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = appletvos;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RNCameraExample-tvOS.app/RNCameraExample-tvOS";
+ TVOS_DEPLOYMENT_TARGET = 10.1;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/$(TARGET_NAME)\"",
+ );
+ };
+ name = Debug;
+ };
+ 2D02E49A1E0B4A5E006451C7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_NO_COMMON_BLOCKS = YES;
+ INFOPLIST_FILE = "RNCameraExample-tvOSTests/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.RNCameraExample-tvOSTests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = appletvos;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RNCameraExample-tvOS.app/RNCameraExample-tvOS";
+ TVOS_DEPLOYMENT_TARGET = 10.1;
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/$(TARGET_NAME)\"",
+ );
+ };
+ name = Release;
+ };
+ 83CBBA201A601CBA00E9B192 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ 83CBBA211A601CBA00E9B192 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = YES;
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "RNCameraExampleTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 00E356F61AD99517003FC87E /* Debug */,
+ 00E356F71AD99517003FC87E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "RNCameraExample" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 13B07F941A680F5B00A75B9A /* Debug */,
+ 13B07F951A680F5B00A75B9A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "RNCameraExample-tvOS" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 2D02E4971E0B4A5E006451C7 /* Debug */,
+ 2D02E4981E0B4A5E006451C7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "RNCameraExample-tvOSTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 2D02E4991E0B4A5E006451C7 /* Debug */,
+ 2D02E49A1E0B4A5E006451C7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "RNCameraExample" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 83CBBA201A601CBA00E9B192 /* Debug */,
+ 83CBBA211A601CBA00E9B192 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
+}
diff --git a/RNCameraExample/ios/RNCameraExample.xcodeproj/xcshareddata/xcschemes/RNCameraExample-tvOS.xcscheme b/RNCameraExample/ios/RNCameraExample.xcodeproj/xcshareddata/xcschemes/RNCameraExample-tvOS.xcscheme
new file mode 100644
index 0000000..94ceb8e
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExample.xcodeproj/xcshareddata/xcschemes/RNCameraExample-tvOS.xcscheme
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/RNCameraExample/ios/RNCameraExample.xcodeproj/xcshareddata/xcschemes/RNCameraExample.xcscheme b/RNCameraExample/ios/RNCameraExample.xcodeproj/xcshareddata/xcschemes/RNCameraExample.xcscheme
new file mode 100644
index 0000000..ce9c5e1
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExample.xcodeproj/xcshareddata/xcschemes/RNCameraExample.xcscheme
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/RNCameraExample/ios/RNCameraExample/AppDelegate.h b/RNCameraExample/ios/RNCameraExample/AppDelegate.h
new file mode 100644
index 0000000..a9654d5
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExample/AppDelegate.h
@@ -0,0 +1,16 @@
+/**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ */
+
+#import
+
+@interface AppDelegate : UIResponder
+
+@property (nonatomic, strong) UIWindow *window;
+
+@end
diff --git a/RNCameraExample/ios/RNCameraExample/AppDelegate.m b/RNCameraExample/ios/RNCameraExample/AppDelegate.m
new file mode 100644
index 0000000..8adfacf
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExample/AppDelegate.m
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ */
+
+#import "AppDelegate.h"
+
+#import
+#import
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ NSURL *jsCodeLocation;
+
+ jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
+
+ RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
+ moduleName:@"RNCameraExample"
+ initialProperties:nil
+ launchOptions:launchOptions];
+ rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
+
+ self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
+ UIViewController *rootViewController = [UIViewController new];
+ rootViewController.view = rootView;
+ self.window.rootViewController = rootViewController;
+ [self.window makeKeyAndVisible];
+ return YES;
+}
+
+@end
diff --git a/RNCameraExample/ios/RNCameraExample/Base.lproj/LaunchScreen.xib b/RNCameraExample/ios/RNCameraExample/Base.lproj/LaunchScreen.xib
new file mode 100644
index 0000000..9a9fe8e
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExample/Base.lproj/LaunchScreen.xib
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/RNCameraExample/ios/RNCameraExample/Images.xcassets/AppIcon.appiconset/Contents.json b/RNCameraExample/ios/RNCameraExample/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..118c98f
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExample/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "images" : [
+ {
+ "idiom" : "iphone",
+ "size" : "29x29",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "29x29",
+ "scale" : "3x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "40x40",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "40x40",
+ "scale" : "3x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "60x60",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "60x60",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/RNCameraExample/ios/RNCameraExample/Images.xcassets/Contents.json b/RNCameraExample/ios/RNCameraExample/Images.xcassets/Contents.json
new file mode 100644
index 0000000..2d92bd5
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExample/Images.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/RNCameraExample/ios/RNCameraExample/Info.plist b/RNCameraExample/ios/RNCameraExample/Info.plist
new file mode 100644
index 0000000..9cec112
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExample/Info.plist
@@ -0,0 +1,56 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleDisplayName
+ RNCameraExample
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+ NSLocationWhenInUseUsageDescription
+
+ NSAppTransportSecurity
+
+
+ NSExceptionDomains
+
+ localhost
+
+ NSExceptionAllowsInsecureHTTPLoads
+
+
+
+
+
+
diff --git a/RNCameraExample/ios/RNCameraExample/main.m b/RNCameraExample/ios/RNCameraExample/main.m
new file mode 100644
index 0000000..3d767fc
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExample/main.m
@@ -0,0 +1,18 @@
+/**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ */
+
+#import
+
+#import "AppDelegate.h"
+
+int main(int argc, char * argv[]) {
+ @autoreleasepool {
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+ }
+}
diff --git a/RNCameraExample/ios/RNCameraExampleTests/Info.plist b/RNCameraExample/ios/RNCameraExampleTests/Info.plist
new file mode 100644
index 0000000..886825c
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExampleTests/Info.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ BNDL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1
+
+
diff --git a/RNCameraExample/ios/RNCameraExampleTests/RNCameraExampleTests.m b/RNCameraExample/ios/RNCameraExampleTests/RNCameraExampleTests.m
new file mode 100644
index 0000000..da2107c
--- /dev/null
+++ b/RNCameraExample/ios/RNCameraExampleTests/RNCameraExampleTests.m
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ */
+
+#import
+#import
+
+#import
+#import
+
+#define TIMEOUT_SECONDS 600
+#define TEXT_TO_LOOK_FOR @"Welcome to React Native!"
+
+@interface RNCameraExampleTests : XCTestCase
+
+@end
+
+@implementation RNCameraExampleTests
+
+- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test
+{
+ if (test(view)) {
+ return YES;
+ }
+ for (UIView *subview in [view subviews]) {
+ if ([self findSubviewInView:subview matching:test]) {
+ return YES;
+ }
+ }
+ return NO;
+}
+
+- (void)testRendersWelcomeScreen
+{
+ UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController];
+ NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];
+ BOOL foundElement = NO;
+
+ __block NSString *redboxError = nil;
+ RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {
+ if (level >= RCTLogLevelError) {
+ redboxError = message;
+ }
+ });
+
+ while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {
+ [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
+ [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
+
+ foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) {
+ if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {
+ return YES;
+ }
+ return NO;
+ }];
+ }
+
+ RCTSetLogFunction(RCTDefaultLogFunction);
+
+ XCTAssertNil(redboxError, @"RedBox error: %@", redboxError);
+ XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);
+}
+
+
+@end
diff --git a/RNCameraExample/package.json b/RNCameraExample/package.json
new file mode 100644
index 0000000..f5adc5c
--- /dev/null
+++ b/RNCameraExample/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "RNCameraExample",
+ "version": "0.0.1",
+ "dependencies": {
+ "react": "16.0.0",
+ "react-native": "0.51.0",
+ "react-native-camera": "file:../"
+ },
+ "devDependencies": {
+ "babel-jest": "22.0.4",
+ "babel-plugin-transform-export-extensions": "^6.22.0",
+ "babel-preset-react-native": "4.0.0",
+ "jest": "22.0.4",
+ "react-test-renderer": "16.0.0"
+ },
+ "jest": {
+ "preset": "react-native"
+ },
+ "private": true,
+ "scripts": {
+ "clear": "node node_modules/react-native/local-cli/cli.js start --reset-cache",
+ "start": "node node_modules/react-native/local-cli/cli.js start",
+ "test": "jest"
+ }
+}
diff --git a/RNCameraExample/yarn.lock b/RNCameraExample/yarn.lock
new file mode 100644
index 0000000..cd0d853
--- /dev/null
+++ b/RNCameraExample/yarn.lock
@@ -0,0 +1,4640 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0-beta.35":
+ version "7.0.0-beta.36"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.36.tgz#2349d7ec04b3a06945ae173280ef8579b63728e4"
+ dependencies:
+ chalk "^2.0.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+"@types/node@*":
+ version "8.5.7"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.7.tgz#9c498c35af354dcfbca3790fb2e81129e93cf0e2"
+
+abab@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+absolute-path@^0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7"
+
+accepts@~1.2.12, accepts@~1.2.13:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.2.13.tgz#e5f1f3928c6d95fd96558c36ec3d9d0de4a6ecea"
+ dependencies:
+ mime-types "~2.1.6"
+ negotiator "0.5.3"
+
+accepts@~1.3.0:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f"
+ dependencies:
+ mime-types "~2.1.16"
+ negotiator "0.6.1"
+
+acorn-globals@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
+ dependencies:
+ acorn "^5.0.0"
+
+acorn@^5.0.0, acorn@^5.1.2:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822"
+
+ajv@^4.9.1:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+ dependencies:
+ co "^4.6.0"
+ json-stable-stringify "^1.0.1"
+
+ajv@^5.1.0:
+ version "5.5.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+ dependencies:
+ co "^4.6.0"
+ fast-deep-equal "^1.0.0"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.3.0"
+
+align-text@^0.1.1, align-text@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+ansi-escapes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92"
+
+ansi-gray@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
+ dependencies:
+ ansi-wrap "0.1.0"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.1.0, ansi-styles@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88"
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-wrap@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
+
+ansi@^0.3.0, ansi@~0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21"
+
+anymatch@^1.3.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
+ dependencies:
+ micromatch "^2.1.5"
+ normalize-path "^2.0.0"
+
+append-transform@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
+ dependencies:
+ default-require-extensions "^1.0.0"
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+array-differ@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
+
+array-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+
+array-filter@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+
+array-map@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+
+array-reduce@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+
+array-uniq@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+arrify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+art@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/art/-/art-0.10.1.tgz#38541883e399225c5e193ff246e8f157cf7b2146"
+
+asap@~2.0.3:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+
+asn1@~0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+astral-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+
+async@^1.4.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.1.4, async@^2.4.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4"
+ dependencies:
+ lodash "^4.14.0"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+aws-sign2@~0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+
+aws4@^1.2.1, aws4@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.0.0, babel-core@^6.24.1, babel-core@^6.26.0, babel-core@^6.7.2:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-generator "^6.26.0"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.26.0"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ convert-source-map "^1.5.0"
+ debug "^2.6.8"
+ json5 "^0.5.1"
+ lodash "^4.17.4"
+ minimatch "^3.0.4"
+ path-is-absolute "^1.0.1"
+ private "^0.1.7"
+ slash "^1.0.0"
+ source-map "^0.5.6"
+
+babel-generator@^6.18.0, babel-generator@^6.24.1, babel-generator@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5"
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.17.4"
+ source-map "^0.5.6"
+ trim-right "^1.0.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-builder-react-jsx@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ esutils "^2.0.2"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ dependencies:
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.16.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ dependencies:
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-jest@22.0.4, babel-jest@^22.0.4:
+ version "22.0.4"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.0.4.tgz#533c46de37d7c9d7612f408c76314be9277e0c26"
+ dependencies:
+ babel-plugin-istanbul "^4.1.5"
+ babel-preset-jest "^22.0.3"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.5.0, babel-plugin-check-es2015-constants@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-external-helpers@^6.18.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz#2285f48b02bd5dede85175caf8c62e86adccefa1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-istanbul@^4.1.5:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e"
+ dependencies:
+ find-up "^2.1.0"
+ istanbul-lib-instrument "^1.7.5"
+ test-exclude "^4.1.1"
+
+babel-plugin-jest-hoist@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.0.3.tgz#62cde5fe962fd41ae89c119f481ca5cd7dd48bb4"
+
+babel-plugin-react-transform@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-react-transform/-/babel-plugin-react-transform-3.0.0.tgz#402f25137b7bb66e9b54ead75557dfbc7ecaaa74"
+ dependencies:
+ lodash "^4.6.1"
+
+babel-plugin-syntax-async-functions@^6.5.0, babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-class-properties@^6.5.0, babel-plugin-syntax-class-properties@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
+
+babel-plugin-syntax-dynamic-import@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+
+babel-plugin-syntax-export-extensions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
+
+babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.5.0, babel-plugin-syntax-flow@^6.8.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
+
+babel-plugin-syntax-jsx@^6.5.0, babel-plugin-syntax-jsx@^6.8.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
+
+babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+
+babel-plugin-syntax-trailing-function-commas@^6.20.0, babel-plugin-syntax-trailing-function-commas@^6.5.0, babel-plugin-syntax-trailing-function-commas@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-to-generator@6.16.0:
+ version "6.16.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz#19ec36cb1486b59f9f468adfa42ce13908ca2999"
+ dependencies:
+ babel-helper-remap-async-to-generator "^6.16.0"
+ babel-plugin-syntax-async-functions "^6.8.0"
+ babel-runtime "^6.0.0"
+
+babel-plugin-transform-class-properties@^6.18.0, babel-plugin-transform-class-properties@^6.5.0, babel-plugin-transform-class-properties@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-plugin-syntax-class-properties "^6.8.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-arrow-functions@^6.5.0, babel-plugin-transform-es2015-arrow-functions@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.5.0, babel-plugin-transform-es2015-block-scoping@^6.8.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-plugin-transform-es2015-classes@^6.5.0, babel-plugin-transform-es2015-classes@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ dependencies:
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.5.0, babel-plugin-transform-es2015-computed-properties@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@6.x, babel-plugin-transform-es2015-destructuring@^6.5.0, babel-plugin-transform-es2015-destructuring@^6.8.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-for-of@^6.5.0, babel-plugin-transform-es2015-for-of@^6.8.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@6.x, babel-plugin-transform-es2015-function-name@^6.5.0, babel-plugin-transform-es2015-function-name@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.5.0, babel-plugin-transform-es2015-literals@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-commonjs@6.x, babel-plugin-transform-es2015-modules-commonjs@^6.5.0, babel-plugin-transform-es2015-modules-commonjs@^6.8.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a"
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-types "^6.26.0"
+
+babel-plugin-transform-es2015-object-super@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@6.x, babel-plugin-transform-es2015-parameters@^6.5.0, babel-plugin-transform-es2015-parameters@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ dependencies:
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@6.x, babel-plugin-transform-es2015-shorthand-properties@^6.5.0, babel-plugin-transform-es2015-shorthand-properties@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@6.x, babel-plugin-transform-es2015-spread@^6.5.0, babel-plugin-transform-es2015-spread@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@6.x:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.5.0, babel-plugin-transform-es2015-template-literals@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@6.x:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-es3-member-expression-literals@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz#733d3444f3ecc41bef8ed1a6a4e09657b8969ebb"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es3-property-literals@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz#b2078d5842e22abf40f73e8cde9cd3711abd5758"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-exponentiation-operator@^6.5.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ dependencies:
+ babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+ babel-plugin-syntax-exponentiation-operator "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-export-extensions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653"
+ dependencies:
+ babel-plugin-syntax-export-extensions "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-flow-strip-types@^6.21.0, babel-plugin-transform-flow-strip-types@^6.5.0, babel-plugin-transform-flow-strip-types@^6.8.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
+ dependencies:
+ babel-plugin-syntax-flow "^6.18.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-object-assign@^6.5.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz#f99d2f66f1a0b0d498e346c5359684740caa20ba"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-object-rest-spread@^6.20.2, babel-plugin-transform-object-rest-spread@^6.5.0, babel-plugin-transform-object-rest-spread@^6.8.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
+ dependencies:
+ babel-plugin-syntax-object-rest-spread "^6.8.0"
+ babel-runtime "^6.26.0"
+
+babel-plugin-transform-react-display-name@^6.5.0, babel-plugin-transform-react-display-name@^6.8.0:
+ version "6.25.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-source@^6.5.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6"
+ dependencies:
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx@^6.5.0, babel-plugin-transform-react-jsx@^6.8.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
+ dependencies:
+ babel-helper-builder-react-jsx "^6.24.1"
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.5.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-preset-es2015-node@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-es2015-node/-/babel-preset-es2015-node-6.1.1.tgz#60b23157024b0cfebf3a63554cb05ee035b4e55f"
+ dependencies:
+ babel-plugin-transform-es2015-destructuring "6.x"
+ babel-plugin-transform-es2015-function-name "6.x"
+ babel-plugin-transform-es2015-modules-commonjs "6.x"
+ babel-plugin-transform-es2015-parameters "6.x"
+ babel-plugin-transform-es2015-shorthand-properties "6.x"
+ babel-plugin-transform-es2015-spread "6.x"
+ babel-plugin-transform-es2015-sticky-regex "6.x"
+ babel-plugin-transform-es2015-unicode-regex "6.x"
+ semver "5.x"
+
+babel-preset-fbjs@^2.1.2, babel-preset-fbjs@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-2.1.4.tgz#22f358e6654073acf61e47a052a777d7bccf03af"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.8.0"
+ babel-plugin-syntax-class-properties "^6.8.0"
+ babel-plugin-syntax-flow "^6.8.0"
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-plugin-syntax-object-rest-spread "^6.8.0"
+ babel-plugin-syntax-trailing-function-commas "^6.8.0"
+ babel-plugin-transform-class-properties "^6.8.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.8.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.8.0"
+ babel-plugin-transform-es2015-block-scoping "^6.8.0"
+ babel-plugin-transform-es2015-classes "^6.8.0"
+ babel-plugin-transform-es2015-computed-properties "^6.8.0"
+ babel-plugin-transform-es2015-destructuring "^6.8.0"
+ babel-plugin-transform-es2015-for-of "^6.8.0"
+ babel-plugin-transform-es2015-function-name "^6.8.0"
+ babel-plugin-transform-es2015-literals "^6.8.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.8.0"
+ babel-plugin-transform-es2015-object-super "^6.8.0"
+ babel-plugin-transform-es2015-parameters "^6.8.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.8.0"
+ babel-plugin-transform-es2015-spread "^6.8.0"
+ babel-plugin-transform-es2015-template-literals "^6.8.0"
+ babel-plugin-transform-es3-member-expression-literals "^6.8.0"
+ babel-plugin-transform-es3-property-literals "^6.8.0"
+ babel-plugin-transform-flow-strip-types "^6.8.0"
+ babel-plugin-transform-object-rest-spread "^6.8.0"
+ babel-plugin-transform-react-display-name "^6.8.0"
+ babel-plugin-transform-react-jsx "^6.8.0"
+
+babel-preset-jest@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.0.3.tgz#e2bb6f6b4a509d3ea0931f013db78c5a84856693"
+ dependencies:
+ babel-plugin-jest-hoist "^22.0.3"
+ babel-plugin-syntax-object-rest-spread "^6.13.0"
+
+babel-preset-react-native@4.0.0, babel-preset-react-native@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-react-native/-/babel-preset-react-native-4.0.0.tgz#3df80dd33a453888cdd33bdb87224d17a5d73959"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.5.0"
+ babel-plugin-react-transform "^3.0.0"
+ babel-plugin-syntax-async-functions "^6.5.0"
+ babel-plugin-syntax-class-properties "^6.5.0"
+ babel-plugin-syntax-dynamic-import "^6.18.0"
+ babel-plugin-syntax-flow "^6.5.0"
+ babel-plugin-syntax-jsx "^6.5.0"
+ babel-plugin-syntax-trailing-function-commas "^6.5.0"
+ babel-plugin-transform-class-properties "^6.5.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.5.0"
+ babel-plugin-transform-es2015-block-scoping "^6.5.0"
+ babel-plugin-transform-es2015-classes "^6.5.0"
+ babel-plugin-transform-es2015-computed-properties "^6.5.0"
+ babel-plugin-transform-es2015-destructuring "^6.5.0"
+ babel-plugin-transform-es2015-for-of "^6.5.0"
+ babel-plugin-transform-es2015-function-name "^6.5.0"
+ babel-plugin-transform-es2015-literals "^6.5.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.5.0"
+ babel-plugin-transform-es2015-parameters "^6.5.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.5.0"
+ babel-plugin-transform-es2015-spread "^6.5.0"
+ babel-plugin-transform-es2015-template-literals "^6.5.0"
+ babel-plugin-transform-flow-strip-types "^6.5.0"
+ babel-plugin-transform-object-assign "^6.5.0"
+ babel-plugin-transform-object-rest-spread "^6.5.0"
+ babel-plugin-transform-react-display-name "^6.5.0"
+ babel-plugin-transform-react-jsx "^6.5.0"
+ babel-plugin-transform-react-jsx-source "^6.5.0"
+ babel-plugin-transform-regenerator "^6.5.0"
+ babel-template "^6.24.1"
+ react-transform-hmr "^1.0.4"
+
+babel-register@^6.24.1, babel-register@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ dependencies:
+ babel-core "^6.26.0"
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.17.4"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.15"
+
+babel-runtime@^6.0.0, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ lodash "^4.17.4"
+
+babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ debug "^2.6.8"
+ globals "^9.18.0"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
+babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
+
+base64-js@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.1.2.tgz#d6400cac1c4c660976d90d07a04351d89395f5e8"
+
+base64-js@^1.1.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886"
+
+base64-url@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/base64-url/-/base64-url-1.2.1.tgz#199fd661702a0e7b7dcae6e0698bb089c52f6d78"
+
+basic-auth-connect@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122"
+
+basic-auth@~1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.0.4.tgz#030935b01de7c9b94a824b29f3fccb750d3a5290"
+
+batch@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+ dependencies:
+ tweetnacl "^0.14.3"
+
+beeper@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
+
+big-integer@^1.6.7:
+ version "1.6.26"
+ resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.26.tgz#3af1672fa62daf2d5ecafacf6e5aa0d25e02c1c8"
+
+bindings@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7"
+
+block-stream@*:
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+ dependencies:
+ inherits "~2.0.0"
+
+body-parser@~1.13.3:
+ version "1.13.3"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.13.3.tgz#c08cf330c3358e151016a05746f13f029c97fa97"
+ dependencies:
+ bytes "2.1.0"
+ content-type "~1.0.1"
+ debug "~2.2.0"
+ depd "~1.0.1"
+ http-errors "~1.3.1"
+ iconv-lite "0.4.11"
+ on-finished "~2.3.0"
+ qs "4.0.0"
+ raw-body "~2.1.2"
+ type-is "~1.6.6"
+
+boom@2.x.x:
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+ dependencies:
+ hoek "2.x.x"
+
+boom@4.x.x:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
+ dependencies:
+ hoek "4.x.x"
+
+boom@5.x.x:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
+ dependencies:
+ hoek "4.x.x"
+
+bplist-creator@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.7.tgz#37df1536092824b87c42f957b01344117372ae45"
+ dependencies:
+ stream-buffers "~2.2.0"
+
+bplist-parser@0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.1.1.tgz#d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6"
+ dependencies:
+ big-integer "^1.6.7"
+
+brace-expansion@^1.1.7:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+browser-process-hrtime@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
+
+browser-resolve@^1.11.2:
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+ dependencies:
+ resolve "1.1.7"
+
+bser@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
+ dependencies:
+ node-int64 "^0.4.0"
+
+builtin-modules@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+bytes@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.1.0.tgz#ac93c410e2ffc9cc7cf4b464b38289067f5e47b4"
+
+bytes@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339"
+
+callsites@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+center-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.0.1:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba"
+ dependencies:
+ ansi-styles "^3.1.0"
+ escape-string-regexp "^1.0.5"
+ supports-color "^4.0.0"
+
+chardet@^0.4.0:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
+
+ci-info@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4"
+
+cli-cursor@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+ dependencies:
+ restore-cursor "^2.0.0"
+
+cli-width@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
+
+cliui@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+ dependencies:
+ center-align "^0.1.1"
+ right-align "^0.1.1"
+ wordwrap "0.0.2"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+clone-stats@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
+
+clone@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+color-convert@^1.9.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed"
+ dependencies:
+ color-name "^1.1.1"
+
+color-name@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+
+color-support@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@^2.9.0, commander@~2.12.1:
+ version "2.12.2"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555"
+
+compressible@~2.0.5:
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66"
+ dependencies:
+ mime-db ">= 1.30.0 < 2"
+
+compression@~1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/compression/-/compression-1.5.2.tgz#b03b8d86e6f8ad29683cba8df91ddc6ffc77b395"
+ dependencies:
+ accepts "~1.2.12"
+ bytes "2.1.0"
+ compressible "~2.0.5"
+ debug "~2.2.0"
+ on-headers "~1.0.0"
+ vary "~1.0.1"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+connect-timeout@~1.6.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/connect-timeout/-/connect-timeout-1.6.2.tgz#de9a5ec61e33a12b6edaab7b5f062e98c599b88e"
+ dependencies:
+ debug "~2.2.0"
+ http-errors "~1.3.1"
+ ms "0.7.1"
+ on-headers "~1.0.0"
+
+connect@^2.8.3:
+ version "2.30.2"
+ resolved "https://registry.yarnpkg.com/connect/-/connect-2.30.2.tgz#8da9bcbe8a054d3d318d74dfec903b5c39a1b609"
+ dependencies:
+ basic-auth-connect "1.0.0"
+ body-parser "~1.13.3"
+ bytes "2.1.0"
+ compression "~1.5.2"
+ connect-timeout "~1.6.2"
+ content-type "~1.0.1"
+ cookie "0.1.3"
+ cookie-parser "~1.3.5"
+ cookie-signature "1.0.6"
+ csurf "~1.8.3"
+ debug "~2.2.0"
+ depd "~1.0.1"
+ errorhandler "~1.4.2"
+ express-session "~1.11.3"
+ finalhandler "0.4.0"
+ fresh "0.3.0"
+ http-errors "~1.3.1"
+ method-override "~2.3.5"
+ morgan "~1.6.1"
+ multiparty "3.3.2"
+ on-headers "~1.0.0"
+ parseurl "~1.3.0"
+ pause "0.1.0"
+ qs "4.0.0"
+ response-time "~2.3.1"
+ serve-favicon "~2.3.0"
+ serve-index "~1.7.2"
+ serve-static "~1.10.0"
+ type-is "~1.6.6"
+ utils-merge "1.0.0"
+ vhost "~3.0.1"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+content-type-parser@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7"
+
+content-type@~1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+
+convert-source-map@^1.4.0, convert-source-map@^1.5.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+cookie-parser@~1.3.5:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.3.5.tgz#9d755570fb5d17890771227a02314d9be7cf8356"
+ dependencies:
+ cookie "0.1.3"
+ cookie-signature "1.0.6"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+
+cookie@0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.1.3.tgz#e734a5c1417fce472d5aef82c381cabb64d1a435"
+
+copy-paste@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/copy-paste/-/copy-paste-1.3.0.tgz#a7e6c4a1c28fdedf2b081e72b97df2ef95f471ed"
+ dependencies:
+ iconv-lite "^0.4.8"
+ optionalDependencies:
+ sync-exec "~0.6.x"
+
+core-js@^1.0.0:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
+
+core-js@^2.2.2, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0:
+ version "2.5.3"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+crc@3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/crc/-/crc-3.3.0.tgz#fa622e1bc388bf257309082d6b65200ce67090ba"
+
+create-react-class@^15.5.2:
+ version "15.6.2"
+ resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.2.tgz#cf1ed15f12aad7f14ef5f2dfe05e6c42f91ef02a"
+ dependencies:
+ fbjs "^0.8.9"
+ loose-envify "^1.3.1"
+ object-assign "^4.1.1"
+
+cross-spawn@^5.0.1, cross-spawn@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cryptiles@2.x.x:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+ dependencies:
+ boom "2.x.x"
+
+cryptiles@3.x.x:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
+ dependencies:
+ boom "5.x.x"
+
+csrf@~3.0.0:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/csrf/-/csrf-3.0.6.tgz#b61120ddceeafc91e76ed5313bb5c0b2667b710a"
+ dependencies:
+ rndm "1.2.0"
+ tsscmp "1.0.5"
+ uid-safe "2.1.4"
+
+cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
+
+"cssstyle@>= 0.2.37 < 0.3.0":
+ version "0.2.37"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
+ dependencies:
+ cssom "0.3.x"
+
+csurf@~1.8.3:
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/csurf/-/csurf-1.8.3.tgz#23f2a13bf1d8fce1d0c996588394442cba86a56a"
+ dependencies:
+ cookie "0.1.3"
+ cookie-signature "1.0.6"
+ csrf "~3.0.0"
+ http-errors "~1.3.1"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ dependencies:
+ assert-plus "^1.0.0"
+
+dateformat@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062"
+
+debug@2.6.9, debug@^2.2.0, debug@^2.6.8:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ dependencies:
+ ms "2.0.0"
+
+debug@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+ dependencies:
+ ms "0.7.1"
+
+decamelize@^1.0.0, decamelize@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+deep-extend@~0.4.0:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+default-require-extensions@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
+ dependencies:
+ strip-bom "^2.0.0"
+
+define-properties@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+ dependencies:
+ foreach "^2.0.5"
+ object-keys "^1.0.8"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+denodeify@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631"
+
+depd@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.0.1.tgz#80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa"
+
+depd@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ dependencies:
+ repeating "^2.0.0"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+detect-newline@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
+
+diff@^3.2.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
+
+dom-walk@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
+
+domexception@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.0.tgz#81fe5df81b3f057052cde3a9fa9bf536a85b9ab0"
+
+duplexer2@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
+ dependencies:
+ readable-stream "~1.1.9"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+ dependencies:
+ jsbn "~0.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+encoding@^0.1.11:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+ dependencies:
+ iconv-lite "~0.4.13"
+
+envinfo@^3.0.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-3.10.0.tgz#24b52a5c19af379dc32465d1909e37344dc41c20"
+ dependencies:
+ copy-paste "^1.3.0"
+ glob "^7.1.2"
+ minimist "^1.2.0"
+ os-name "^2.0.1"
+ which "^1.2.14"
+
+errno@^0.1.4:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026"
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+errorhandler@~1.4.2:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.4.3.tgz#b7b70ed8f359e9db88092f2d20c0f831420ad83f"
+ dependencies:
+ accepts "~1.3.0"
+ escape-html "~1.0.3"
+
+es-abstract@^1.5.1:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864"
+ dependencies:
+ es-to-primitive "^1.1.1"
+ function-bind "^1.1.1"
+ has "^1.0.1"
+ is-callable "^1.1.3"
+ is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+ dependencies:
+ is-callable "^1.1.1"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.1"
+
+escape-html@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.2.tgz#d77d32fa98e38c2f41ae85e9278e0e0e6ba1022c"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@^1.9.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852"
+ dependencies:
+ esprima "^3.1.3"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.5.6"
+
+esprima@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esprima@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+
+estraverse@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+etag@~1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8"
+
+event-target-shim@^1.0.5:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-1.1.1.tgz#a86e5ee6bdaa16054475da797ccddf0c55698491"
+
+exec-sh@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38"
+ dependencies:
+ merge "^1.1.3"
+
+execa@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ dependencies:
+ fill-range "^2.1.0"
+
+expect@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-22.0.3.tgz#bb486de7d41bf3eb60d3b16dfd1c158a4d91ddfa"
+ dependencies:
+ ansi-styles "^3.2.0"
+ jest-diff "^22.0.3"
+ jest-get-type "^22.0.3"
+ jest-matcher-utils "^22.0.3"
+ jest-message-util "^22.0.3"
+ jest-regex-util "^22.0.3"
+
+express-session@~1.11.3:
+ version "1.11.3"
+ resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.11.3.tgz#5cc98f3f5ff84ed835f91cbf0aabd0c7107400af"
+ dependencies:
+ cookie "0.1.3"
+ cookie-signature "1.0.6"
+ crc "3.3.0"
+ debug "~2.2.0"
+ depd "~1.0.1"
+ on-headers "~1.0.0"
+ parseurl "~1.3.0"
+ uid-safe "~2.0.0"
+ utils-merge "1.0.0"
+
+extend@~3.0.0, extend@~3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+external-editor@^2.0.4:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48"
+ dependencies:
+ chardet "^0.4.0"
+ iconv-lite "^0.4.17"
+ tmp "^0.0.33"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ dependencies:
+ is-extglob "^1.0.0"
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+
+fancy-log@^1.1.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1"
+ dependencies:
+ ansi-gray "^0.1.1"
+ color-support "^1.1.3"
+ time-stamp "^1.0.0"
+
+fast-deep-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+fb-watchman@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58"
+ dependencies:
+ bser "^2.0.0"
+
+fbjs-scripts@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-0.8.1.tgz#c1c6efbecb7f008478468976b783880c2f669765"
+ dependencies:
+ babel-core "^6.7.2"
+ babel-preset-fbjs "^2.1.2"
+ core-js "^2.4.1"
+ cross-spawn "^5.1.0"
+ gulp-util "^3.0.4"
+ object-assign "^4.0.1"
+ semver "^5.1.0"
+ through2 "^2.0.0"
+
+fbjs@^0.8.14, fbjs@^0.8.16, fbjs@^0.8.9:
+ version "0.8.16"
+ resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db"
+ dependencies:
+ core-js "^1.0.0"
+ isomorphic-fetch "^2.1.1"
+ loose-envify "^1.0.0"
+ object-assign "^4.1.0"
+ promise "^7.1.1"
+ setimmediate "^1.0.5"
+ ua-parser-js "^0.7.9"
+
+figures@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+filename-regex@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fileset@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
+ dependencies:
+ glob "^7.0.3"
+ minimatch "^3.0.3"
+
+fill-range@^2.1.0:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^1.1.3"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+finalhandler@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.4.0.tgz#965a52d9e8d05d2b857548541fb89b53a2497d9b"
+ dependencies:
+ debug "~2.2.0"
+ escape-html "1.0.2"
+ on-finished "~2.3.0"
+ unpipe "~1.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+for-in@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+ dependencies:
+ for-in "^1.0.1"
+
+foreach@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.1.1:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.5"
+ mime-types "^2.1.12"
+
+form-data@~2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf"
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.5"
+ mime-types "^2.1.12"
+
+fresh@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f"
+
+fs-extra@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
+ dependencies:
+ nan "^2.3.0"
+ node-pre-gyp "^0.6.39"
+
+fstream-ignore@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+ dependencies:
+ fstream "^1.0.0"
+ inherits "2"
+ minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+ dependencies:
+ graceful-fs "^4.1.2"
+ inherits "~2.0.0"
+ mkdirp ">=0.5 0"
+ rimraf "2"
+
+function-bind@^1.0.2, function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+gauge@~1.2.5:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93"
+ dependencies:
+ ansi "^0.3.0"
+ has-unicode "^2.0.0"
+ lodash.pad "^4.1.0"
+ lodash.padend "^4.1.0"
+ lodash.padstart "^4.1.0"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+get-caller-file@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ dependencies:
+ is-glob "^2.0.0"
+
+glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+global@^4.3.0:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
+ dependencies:
+ min-document "^2.19.0"
+ process "~0.5.1"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+glogg@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5"
+ dependencies:
+ sparkles "^1.0.0"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+growly@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
+
+gulp-util@^3.0.4:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
+ dependencies:
+ array-differ "^1.0.0"
+ array-uniq "^1.0.2"
+ beeper "^1.0.0"
+ chalk "^1.0.0"
+ dateformat "^2.0.0"
+ fancy-log "^1.1.0"
+ gulplog "^1.0.0"
+ has-gulplog "^0.1.0"
+ lodash._reescape "^3.0.0"
+ lodash._reevaluate "^3.0.0"
+ lodash._reinterpolate "^3.0.0"
+ lodash.template "^3.0.0"
+ minimist "^1.1.0"
+ multipipe "^0.1.2"
+ object-assign "^3.0.0"
+ replace-ext "0.0.1"
+ through2 "^2.0.0"
+ vinyl "^0.5.0"
+
+gulplog@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
+ dependencies:
+ glogg "^1.0.0"
+
+handlebars@^4.0.3:
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc"
+ dependencies:
+ async "^1.4.0"
+ optimist "^0.6.1"
+ source-map "^0.4.4"
+ optionalDependencies:
+ uglify-js "^2.6"
+
+har-schema@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+
+har-validator@~4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+ dependencies:
+ ajv "^4.9.1"
+ har-schema "^1.0.5"
+
+har-validator@~5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
+ dependencies:
+ ajv "^5.1.0"
+ har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-flag@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-gulplog@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
+ dependencies:
+ sparkles "^1.0.0"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+ dependencies:
+ function-bind "^1.0.2"
+
+hawk@3.1.3, hawk@~3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+ dependencies:
+ boom "2.x.x"
+ cryptiles "2.x.x"
+ hoek "2.x.x"
+ sntp "1.x.x"
+
+hawk@~6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
+ dependencies:
+ boom "4.x.x"
+ cryptiles "3.x.x"
+ hoek "4.x.x"
+ sntp "2.x.x"
+
+hoek@2.x.x:
+ version "2.16.3"
+ resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+hoek@4.x.x:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
+
+html-encoding-sniffer@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
+ dependencies:
+ whatwg-encoding "^1.0.1"
+
+http-errors@~1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942"
+ dependencies:
+ inherits "~2.0.1"
+ statuses "1"
+
+http-signature@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+ dependencies:
+ assert-plus "^0.2.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+iconv-lite@0.4.11:
+ version "0.4.11"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.11.tgz#2ecb42fd294744922209a2e7c404dac8793d8ade"
+
+iconv-lite@0.4.13:
+ version "0.4.13"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
+
+iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@^0.4.8, iconv-lite@~0.4.13:
+ version "0.4.19"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+
+image-size@^0.6.0:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.2.tgz#8ee316d4298b028b965091b673d5f1537adee5b4"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+ini@~1.3.0:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+inquirer@^3.0.6:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
+ dependencies:
+ ansi-escapes "^3.0.0"
+ chalk "^2.0.0"
+ cli-cursor "^2.1.0"
+ cli-width "^2.0.0"
+ external-editor "^2.0.4"
+ figures "^2.0.0"
+ lodash "^4.3.0"
+ mute-stream "0.0.7"
+ run-async "^2.2.0"
+ rx-lite "^4.0.8"
+ rx-lite-aggregates "^4.0.8"
+ string-width "^2.1.0"
+ strip-ansi "^4.0.0"
+ through "^2.3.6"
+
+invariant@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+ dependencies:
+ builtin-modules "^1.0.0"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+
+is-ci@^1.0.10:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5"
+ dependencies:
+ ci-info "^1.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-dotfile@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-regex@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+ dependencies:
+ has "^1.0.1"
+
+is-stream@^1.0.1, is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-symbol@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isomorphic-fetch@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
+ dependencies:
+ node-fetch "^1.0.1"
+ whatwg-fetch ">=0.10.0"
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istanbul-api@^1.1.14:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620"
+ dependencies:
+ async "^2.1.4"
+ fileset "^2.0.2"
+ istanbul-lib-coverage "^1.1.1"
+ istanbul-lib-hook "^1.1.0"
+ istanbul-lib-instrument "^1.9.1"
+ istanbul-lib-report "^1.1.2"
+ istanbul-lib-source-maps "^1.2.2"
+ istanbul-reports "^1.1.3"
+ js-yaml "^3.7.0"
+ mkdirp "^0.5.1"
+ once "^1.4.0"
+
+istanbul-lib-coverage@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
+
+istanbul-lib-hook@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b"
+ dependencies:
+ append-transform "^0.4.0"
+
+istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.8.0, istanbul-lib-instrument@^1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e"
+ dependencies:
+ babel-generator "^6.18.0"
+ babel-template "^6.16.0"
+ babel-traverse "^6.18.0"
+ babel-types "^6.18.0"
+ babylon "^6.18.0"
+ istanbul-lib-coverage "^1.1.1"
+ semver "^5.3.0"
+
+istanbul-lib-report@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425"
+ dependencies:
+ istanbul-lib-coverage "^1.1.1"
+ mkdirp "^0.5.1"
+ path-parse "^1.0.5"
+ supports-color "^3.1.2"
+
+istanbul-lib-source-maps@^1.2.1, istanbul-lib-source-maps@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c"
+ dependencies:
+ debug "^3.1.0"
+ istanbul-lib-coverage "^1.1.1"
+ mkdirp "^0.5.1"
+ rimraf "^2.6.1"
+ source-map "^0.5.3"
+
+istanbul-reports@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10"
+ dependencies:
+ handlebars "^4.0.3"
+
+jest-changed-files@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.0.3.tgz#3771315acfa24a0ed7e6c545de620db6f1b2d164"
+ dependencies:
+ throat "^4.0.0"
+
+jest-cli@^22.0.4:
+ version "22.0.4"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.0.4.tgz#0052abaad45c57861c05da8ab5d27bad13ad224d"
+ dependencies:
+ ansi-escapes "^3.0.0"
+ chalk "^2.0.1"
+ glob "^7.1.2"
+ graceful-fs "^4.1.11"
+ is-ci "^1.0.10"
+ istanbul-api "^1.1.14"
+ istanbul-lib-coverage "^1.1.1"
+ istanbul-lib-instrument "^1.8.0"
+ istanbul-lib-source-maps "^1.2.1"
+ jest-changed-files "^22.0.3"
+ jest-config "^22.0.4"
+ jest-environment-jsdom "^22.0.4"
+ jest-get-type "^22.0.3"
+ jest-haste-map "^22.0.3"
+ jest-message-util "^22.0.3"
+ jest-regex-util "^22.0.3"
+ jest-resolve-dependencies "^22.0.3"
+ jest-runner "^22.0.4"
+ jest-runtime "^22.0.4"
+ jest-snapshot "^22.0.3"
+ jest-util "^22.0.4"
+ jest-worker "^22.0.3"
+ micromatch "^2.3.11"
+ node-notifier "^5.1.2"
+ realpath-native "^1.0.0"
+ rimraf "^2.5.4"
+ slash "^1.0.0"
+ string-length "^2.0.0"
+ strip-ansi "^4.0.0"
+ which "^1.2.12"
+ yargs "^10.0.3"
+
+jest-config@^22.0.4:
+ version "22.0.4"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.0.4.tgz#9c2a46c0907b1a1af54d9cdbf18e99b447034e11"
+ dependencies:
+ chalk "^2.0.1"
+ glob "^7.1.1"
+ jest-environment-jsdom "^22.0.4"
+ jest-environment-node "^22.0.4"
+ jest-get-type "^22.0.3"
+ jest-jasmine2 "^22.0.4"
+ jest-regex-util "^22.0.3"
+ jest-resolve "^22.0.4"
+ jest-util "^22.0.4"
+ jest-validate "^22.0.3"
+ pretty-format "^22.0.3"
+
+jest-diff@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.0.3.tgz#ffed5aba6beaf63bb77819ba44dd520168986321"
+ dependencies:
+ chalk "^2.0.1"
+ diff "^3.2.0"
+ jest-get-type "^22.0.3"
+ pretty-format "^22.0.3"
+
+jest-docblock@^21, jest-docblock@^21.2.0:
+ version "21.2.0"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414"
+
+jest-docblock@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.0.3.tgz#c33aa22682b9fc68a5373f5f82994428a2ded601"
+ dependencies:
+ detect-newline "^2.1.0"
+
+jest-environment-jsdom@^22.0.4:
+ version "22.0.4"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.0.4.tgz#5723d4e724775ed38948de792e62f2d6a7f452df"
+ dependencies:
+ jest-mock "^22.0.3"
+ jest-util "^22.0.4"
+ jsdom "^11.5.1"
+
+jest-environment-node@^22.0.4:
+ version "22.0.4"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.0.4.tgz#068671f85a545f96a5469be3a3dd228fca79c709"
+ dependencies:
+ jest-mock "^22.0.3"
+ jest-util "^22.0.4"
+
+jest-get-type@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.0.3.tgz#fa894b677c0fcd55eff3fd8ee28c7be942e32d36"
+
+jest-haste-map@^21:
+ version "21.2.0"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-21.2.0.tgz#1363f0a8bb4338f24f001806571eff7a4b2ff3d8"
+ dependencies:
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.1.11"
+ jest-docblock "^21.2.0"
+ micromatch "^2.3.11"
+ sane "^2.0.0"
+ worker-farm "^1.3.1"
+
+jest-haste-map@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.0.3.tgz#c9ecb5c871c5465d4bde4139e527fa0dc784aa2d"
+ dependencies:
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.1.11"
+ jest-docblock "^22.0.3"
+ jest-worker "^22.0.3"
+ micromatch "^2.3.11"
+ sane "^2.0.0"
+
+jest-jasmine2@^22.0.4:
+ version "22.0.4"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.0.4.tgz#f7c0965116efe831ec674dc954b0134639b3dcee"
+ dependencies:
+ callsites "^2.0.0"
+ chalk "^2.0.1"
+ expect "^22.0.3"
+ graceful-fs "^4.1.11"
+ jest-diff "^22.0.3"
+ jest-matcher-utils "^22.0.3"
+ jest-message-util "^22.0.3"
+ jest-snapshot "^22.0.3"
+ source-map-support "^0.5.0"
+
+jest-leak-detector@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.0.3.tgz#b64904f0e8954a11edb79b0809ff4717fa762d99"
+ dependencies:
+ pretty-format "^22.0.3"
+ optionalDependencies:
+ weak "^1.0.1"
+
+jest-matcher-utils@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.0.3.tgz#2ec15ca1af7dcabf4daddc894ccce224b948674e"
+ dependencies:
+ chalk "^2.0.1"
+ jest-get-type "^22.0.3"
+ pretty-format "^22.0.3"
+
+jest-message-util@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.0.3.tgz#bf674b2762ef2dd53facf2136423fcca264976df"
+ dependencies:
+ "@babel/code-frame" "^7.0.0-beta.35"
+ chalk "^2.0.1"
+ micromatch "^2.3.11"
+ slash "^1.0.0"
+ stack-utils "^1.0.1"
+
+jest-mock@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.0.3.tgz#c875e47b5b729c6c020a2fab317b275c0cf88961"
+
+jest-regex-util@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.0.3.tgz#c5c10229de5ce2b27bf4347916d95b802ae9aa4d"
+
+jest-resolve-dependencies@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.0.3.tgz#202ddf370069702cd1865a1952fcc7e52c92720e"
+ dependencies:
+ jest-regex-util "^22.0.3"
+
+jest-resolve@^22.0.4:
+ version "22.0.4"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.0.4.tgz#a6e47f55e9388c7341b5e9732aedc6fe30906121"
+ dependencies:
+ browser-resolve "^1.11.2"
+ chalk "^2.0.1"
+
+jest-runner@^22.0.4:
+ version "22.0.4"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.0.4.tgz#3aa43a31b05ce8271539df580c2eb916023d3367"
+ dependencies:
+ jest-config "^22.0.4"
+ jest-docblock "^22.0.3"
+ jest-haste-map "^22.0.3"
+ jest-jasmine2 "^22.0.4"
+ jest-leak-detector "^22.0.3"
+ jest-message-util "^22.0.3"
+ jest-runtime "^22.0.4"
+ jest-util "^22.0.4"
+ jest-worker "^22.0.3"
+ throat "^4.0.0"
+
+jest-runtime@^22.0.4:
+ version "22.0.4"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.0.4.tgz#8f69aa7b5fbb3acd35dc262cbf654e563f69b7b4"
+ dependencies:
+ babel-core "^6.0.0"
+ babel-jest "^22.0.4"
+ babel-plugin-istanbul "^4.1.5"
+ chalk "^2.0.1"
+ convert-source-map "^1.4.0"
+ graceful-fs "^4.1.11"
+ jest-config "^22.0.4"
+ jest-haste-map "^22.0.3"
+ jest-regex-util "^22.0.3"
+ jest-resolve "^22.0.4"
+ jest-util "^22.0.4"
+ json-stable-stringify "^1.0.1"
+ micromatch "^2.3.11"
+ realpath-native "^1.0.0"
+ slash "^1.0.0"
+ strip-bom "3.0.0"
+ write-file-atomic "^2.1.0"
+ yargs "^10.0.3"
+
+jest-snapshot@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.0.3.tgz#a949b393781d2fdb4773f6ea765dd67ad1da291e"
+ dependencies:
+ chalk "^2.0.1"
+ jest-diff "^22.0.3"
+ jest-matcher-utils "^22.0.3"
+ mkdirp "^0.5.1"
+ natural-compare "^1.4.0"
+ pretty-format "^22.0.3"
+
+jest-util@^22.0.4:
+ version "22.0.4"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.0.4.tgz#d920a513e0645aaab030cee38e4fe7d5bed8bb6d"
+ dependencies:
+ callsites "^2.0.0"
+ chalk "^2.0.1"
+ graceful-fs "^4.1.11"
+ is-ci "^1.0.10"
+ jest-message-util "^22.0.3"
+ jest-validate "^22.0.3"
+ mkdirp "^0.5.1"
+
+jest-validate@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.0.3.tgz#2850d949a36c48b1a40f7eebae1d8539126f7829"
+ dependencies:
+ chalk "^2.0.1"
+ jest-get-type "^22.0.3"
+ leven "^2.1.0"
+ pretty-format "^22.0.3"
+
+jest-worker@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.0.3.tgz#30433faca67814a8f80559f75ab2ceaa61332fd2"
+ dependencies:
+ merge-stream "^1.0.1"
+
+jest@22.0.4:
+ version "22.0.4"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-22.0.4.tgz#d3cf560ece6b825b115dce80b9826ceb40f87961"
+ dependencies:
+ jest-cli "^22.0.4"
+
+js-tokens@^3.0.0, js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+js-yaml@^3.7.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jsdom@^11.5.1:
+ version "11.5.1"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.5.1.tgz#5df753b8d0bca20142ce21f4f6c039f99a992929"
+ dependencies:
+ abab "^1.0.3"
+ acorn "^5.1.2"
+ acorn-globals "^4.0.0"
+ array-equal "^1.0.0"
+ browser-process-hrtime "^0.1.2"
+ content-type-parser "^1.0.1"
+ cssom ">= 0.3.2 < 0.4.0"
+ cssstyle ">= 0.2.37 < 0.3.0"
+ domexception "^1.0.0"
+ escodegen "^1.9.0"
+ html-encoding-sniffer "^1.0.1"
+ left-pad "^1.2.0"
+ nwmatcher "^1.4.3"
+ parse5 "^3.0.2"
+ pn "^1.0.0"
+ request "^2.83.0"
+ request-promise-native "^1.0.3"
+ sax "^1.2.1"
+ symbol-tree "^3.2.1"
+ tough-cookie "^2.3.3"
+ webidl-conversions "^4.0.2"
+ whatwg-encoding "^1.0.1"
+ whatwg-url "^6.3.0"
+ xml-name-validator "^2.0.1"
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-schema-traverse@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json5@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d"
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+kind-of@^3.0.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ dependencies:
+ is-buffer "^1.1.5"
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+lazy-cache@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ dependencies:
+ invert-kv "^1.0.0"
+
+left-pad@^1.1.3, left-pad@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee"
+
+leven@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+load-json-file@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ strip-bom "^3.0.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+lodash._basecopy@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
+
+lodash._basetostring@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
+
+lodash._basevalues@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
+
+lodash._getnative@^3.0.0:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+
+lodash._isiterateecall@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
+
+lodash._reescape@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
+
+lodash._reevaluate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
+
+lodash._reinterpolate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+
+lodash._root@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
+
+lodash.escape@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
+ dependencies:
+ lodash._root "^3.0.0"
+
+lodash.isarguments@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+
+lodash.isarray@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
+
+lodash.keys@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
+ dependencies:
+ lodash._getnative "^3.0.0"
+ lodash.isarguments "^3.0.0"
+ lodash.isarray "^3.0.0"
+
+lodash.pad@^4.1.0:
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70"
+
+lodash.padend@^4.1.0:
+ version "4.6.1"
+ resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e"
+
+lodash.padstart@^4.1.0:
+ version "4.6.1"
+ resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b"
+
+lodash.restparam@^3.0.0:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
+
+lodash.sortby@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+
+lodash.template@^3.0.0:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
+ dependencies:
+ lodash._basecopy "^3.0.0"
+ lodash._basetostring "^3.0.0"
+ lodash._basevalues "^3.0.0"
+ lodash._isiterateecall "^3.0.0"
+ lodash._reinterpolate "^3.0.0"
+ lodash.escape "^3.0.0"
+ lodash.keys "^3.0.0"
+ lodash.restparam "^3.0.0"
+ lodash.templatesettings "^3.0.0"
+
+lodash.templatesettings@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
+ dependencies:
+ lodash._reinterpolate "^3.0.0"
+ lodash.escape "^3.0.0"
+
+lodash@^3.5.0:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+
+lodash@^4.13.1, lodash@^4.14.0, lodash@^4.16.6, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.6.1:
+ version "4.17.4"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
+
+longest@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+ dependencies:
+ js-tokens "^3.0.0"
+
+lru-cache@^4.0.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+macos-release@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-1.1.0.tgz#831945e29365b470aa8724b0ab36c8f8959d10fb"
+
+makeerror@1.0.x:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
+ dependencies:
+ tmpl "1.0.x"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+mem@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+ dependencies:
+ mimic-fn "^1.0.0"
+
+merge-stream@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
+ dependencies:
+ readable-stream "^2.0.1"
+
+merge@^1.1.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
+
+method-override@~2.3.5:
+ version "2.3.10"
+ resolved "https://registry.yarnpkg.com/method-override/-/method-override-2.3.10.tgz#e3daf8d5dee10dd2dce7d4ae88d62bbee77476b4"
+ dependencies:
+ debug "2.6.9"
+ methods "~1.1.2"
+ parseurl "~1.3.2"
+ vary "~1.1.2"
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+
+metro-bundler@^0.20.0:
+ version "0.20.3"
+ resolved "https://registry.yarnpkg.com/metro-bundler/-/metro-bundler-0.20.3.tgz#0ded01b64e8963117017b106f75b83cfc34f3656"
+ dependencies:
+ absolute-path "^0.0.0"
+ async "^2.4.0"
+ babel-core "^6.24.1"
+ babel-generator "^6.24.1"
+ babel-plugin-external-helpers "^6.18.0"
+ babel-preset-es2015-node "^6.1.1"
+ babel-preset-fbjs "^2.1.4"
+ babel-preset-react-native "^4.0.0"
+ babel-register "^6.24.1"
+ babylon "^6.18.0"
+ chalk "^1.1.1"
+ concat-stream "^1.6.0"
+ core-js "^2.2.2"
+ debug "^2.2.0"
+ denodeify "^1.2.1"
+ fbjs "^0.8.14"
+ graceful-fs "^4.1.3"
+ image-size "^0.6.0"
+ jest-docblock "^21"
+ jest-haste-map "^21"
+ json-stable-stringify "^1.0.1"
+ json5 "^0.4.0"
+ left-pad "^1.1.3"
+ lodash "^4.16.6"
+ merge-stream "^1.0.1"
+ mime-types "2.1.11"
+ mkdirp "^0.5.1"
+ request "^2.79.0"
+ rimraf "^2.5.4"
+ source-map "^0.5.6"
+ temp "0.8.3"
+ throat "^4.1.0"
+ uglify-es "^3.1.8"
+ wordwrap "^1.0.0"
+ write-file-atomic "^1.2.0"
+ xpipe "^1.0.5"
+
+micromatch@^2.1.5, micromatch@^2.3.11:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+"mime-db@>= 1.30.0 < 2":
+ version "1.32.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414"
+
+mime-db@~1.23.0:
+ version "1.23.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659"
+
+mime-db@~1.30.0:
+ version "1.30.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
+
+mime-types@2.1.11:
+ version "2.1.11"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c"
+ dependencies:
+ mime-db "~1.23.0"
+
+mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.6, mime-types@~2.1.7, mime-types@~2.1.9:
+ version "2.1.17"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
+ dependencies:
+ mime-db "~1.30.0"
+
+mime@1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
+
+mime@^1.3.4:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+
+mimic-fn@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ dependencies:
+ dom-walk "^0.1.0"
+
+minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minimist@~0.0.1:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+morgan@~1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.6.1.tgz#5fd818398c6819cba28a7cd6664f292fe1c0bbf2"
+ dependencies:
+ basic-auth "~1.0.3"
+ debug "~2.2.0"
+ depd "~1.0.1"
+ on-finished "~2.3.0"
+ on-headers "~1.0.0"
+
+ms@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+
+ms@0.7.2:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+multiparty@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/multiparty/-/multiparty-3.3.2.tgz#35de6804dc19643e5249f3d3e3bdc6c8ce301d3f"
+ dependencies:
+ readable-stream "~1.1.9"
+ stream-counter "~0.2.0"
+
+multipipe@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
+ dependencies:
+ duplexer2 "0.0.2"
+
+mute-stream@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+
+nan@^2.0.5, nan@^2.3.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a"
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+negotiator@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.5.3.tgz#269d5c476810ec92edbe7b6c2f28316384f9a7e8"
+
+negotiator@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+node-fetch@^1.0.1, node-fetch@^1.3.3:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+
+node-notifier@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff"
+ dependencies:
+ growly "^1.3.0"
+ semver "^5.3.0"
+ shellwords "^0.1.0"
+ which "^1.2.12"
+
+node-pre-gyp@^0.6.39:
+ version "0.6.39"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
+ dependencies:
+ detect-libc "^1.0.2"
+ hawk "3.1.3"
+ mkdirp "^0.5.1"
+ nopt "^4.0.1"
+ npmlog "^4.0.2"
+ rc "^1.1.7"
+ request "2.81.0"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^2.2.1"
+ tar-pack "^3.4.0"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-package-data@^2.3.2:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+ dependencies:
+ hosted-git-info "^2.1.4"
+ is-builtin-module "^1.0.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.0, normalize-path@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ dependencies:
+ path-key "^2.0.0"
+
+npmlog@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692"
+ dependencies:
+ ansi "~0.3.1"
+ are-we-there-yet "~1.1.2"
+ gauge "~1.2.5"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+nwmatcher@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c"
+
+oauth-sign@~0.8.1, oauth-sign@~0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+object-assign@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
+
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-keys@^1.0.8:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+
+object.getownpropertydescriptors@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.5.1"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ dependencies:
+ ee-first "1.1.1"
+
+on-headers@~1.0.0, on-headers@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
+
+once@^1.3.0, once@^1.3.3, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+onetime@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+ dependencies:
+ mimic-fn "^1.0.0"
+
+opn@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-3.0.3.tgz#b6d99e7399f78d65c3baaffef1fb288e9b85243a"
+ dependencies:
+ object-assign "^4.0.1"
+
+optimist@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+ dependencies:
+ minimist "~0.0.1"
+ wordwrap "~0.0.2"
+
+optionator@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.4"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ wordwrap "~1.0.0"
+
+options@>=0.0.5:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+ dependencies:
+ execa "^0.7.0"
+ lcid "^1.0.0"
+ mem "^1.1.0"
+
+os-name@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/os-name/-/os-name-2.0.1.tgz#b9a386361c17ae3a21736ef0599405c9a8c5dc5e"
+ dependencies:
+ macos-release "^1.0.0"
+ win-release "^1.0.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-limit@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c"
+ dependencies:
+ p-try "^1.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+parse-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ dependencies:
+ error-ex "^1.2.0"
+
+parse5@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c"
+ dependencies:
+ "@types/node" "*"
+
+parseurl@~1.3.0, parseurl@~1.3.1, parseurl@~1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-key@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+path-type@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+ dependencies:
+ pify "^2.0.0"
+
+pause@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/pause/-/pause-0.1.0.tgz#ebc8a4a8619ff0b8a81ac1513c3434ff469fdb74"
+
+pegjs@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd"
+
+performance-now@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+plist@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/plist/-/plist-2.0.1.tgz#0a32ca9481b1c364e92e18dc55c876de9d01da8b"
+ dependencies:
+ base64-js "1.1.2"
+ xmlbuilder "8.2.2"
+ xmldom "0.1.x"
+
+plist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/plist/-/plist-1.2.0.tgz#084b5093ddc92506e259f874b8d9b1afb8c79593"
+ dependencies:
+ base64-js "0.0.8"
+ util-deprecate "1.0.2"
+ xmlbuilder "4.0.0"
+ xmldom "0.1.x"
+
+pn@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+pretty-format@^22.0.3:
+ version "22.0.3"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.0.3.tgz#a2bfa59fc33ad24aa4429981bb52524b41ba5dd7"
+ dependencies:
+ ansi-regex "^3.0.0"
+ ansi-styles "^3.2.0"
+
+pretty-format@^4.2.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-4.3.1.tgz#530be5c42b3c05b36414a7a2a4337aa80acd0e8d"
+
+private@^0.1.6, private@^0.1.7:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@~1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+process@~0.5.1:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
+
+promise@^7.1.1:
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+ dependencies:
+ asap "~2.0.3"
+
+prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0:
+ version "15.6.0"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856"
+ dependencies:
+ fbjs "^0.8.16"
+ loose-envify "^1.3.1"
+ object-assign "^4.1.1"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+punycode@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+
+qs@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607"
+
+qs@~6.4.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+
+qs@~6.5.1:
+ version "6.5.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+
+random-bytes@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b"
+
+randomatic@^1.1.3:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+range-parser@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz#6872823535c692e2c2a0103826afd82c2e0ff175"
+
+raw-body@~2.1.2:
+ version "2.1.7"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774"
+ dependencies:
+ bytes "2.4.0"
+ iconv-lite "0.4.13"
+ unpipe "1.0.0"
+
+rc@^1.1.7:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077"
+ dependencies:
+ deep-extend "~0.4.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+react-clone-referenced-element@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/react-clone-referenced-element/-/react-clone-referenced-element-1.0.1.tgz#2bba8c69404c5e4a944398600bcc4c941f860682"
+
+react-deep-force-update@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.1.tgz#bcd31478027b64b3339f108921ab520b4313dc2c"
+
+react-devtools-core@^2.5.0:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-2.5.2.tgz#f97bec5afae5d9318d16778065e0c214c4d5714c"
+ dependencies:
+ shell-quote "^1.6.1"
+ ws "^2.0.3"
+
+"react-native-camera@file:..":
+ version "0.12.0"
+ dependencies:
+ lodash "^4.17.4"
+ prop-types "^15.5.10"
+
+react-native@0.51.0:
+ version "0.51.0"
+ resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.51.0.tgz#fe25934b3030fd323f3ca1a70f034133465955ed"
+ dependencies:
+ absolute-path "^0.0.0"
+ art "^0.10.0"
+ babel-core "^6.24.1"
+ babel-plugin-syntax-trailing-function-commas "^6.20.0"
+ babel-plugin-transform-async-to-generator "6.16.0"
+ babel-plugin-transform-class-properties "^6.18.0"
+ babel-plugin-transform-exponentiation-operator "^6.5.0"
+ babel-plugin-transform-flow-strip-types "^6.21.0"
+ babel-plugin-transform-object-rest-spread "^6.20.2"
+ babel-register "^6.24.1"
+ babel-runtime "^6.23.0"
+ base64-js "^1.1.2"
+ chalk "^1.1.1"
+ commander "^2.9.0"
+ connect "^2.8.3"
+ create-react-class "^15.5.2"
+ debug "^2.2.0"
+ denodeify "^1.2.1"
+ envinfo "^3.0.0"
+ event-target-shim "^1.0.5"
+ fbjs "^0.8.14"
+ fbjs-scripts "^0.8.1"
+ fs-extra "^1.0.0"
+ glob "^7.1.1"
+ graceful-fs "^4.1.3"
+ inquirer "^3.0.6"
+ lodash "^4.16.6"
+ metro-bundler "^0.20.0"
+ mime "^1.3.4"
+ minimist "^1.2.0"
+ mkdirp "^0.5.1"
+ node-fetch "^1.3.3"
+ node-notifier "^5.1.2"
+ npmlog "^2.0.4"
+ opn "^3.0.2"
+ optimist "^0.6.1"
+ plist "^1.2.0"
+ pretty-format "^4.2.1"
+ promise "^7.1.1"
+ prop-types "^15.5.8"
+ react-clone-referenced-element "^1.0.1"
+ react-devtools-core "^2.5.0"
+ react-timer-mixin "^0.13.2"
+ regenerator-runtime "^0.11.0"
+ rimraf "^2.5.4"
+ semver "^5.0.3"
+ shell-quote "1.6.1"
+ stacktrace-parser "^0.1.3"
+ whatwg-fetch "^1.0.0"
+ ws "^1.1.0"
+ xcode "^0.9.1"
+ xmldoc "^0.4.0"
+ yargs "^9.0.0"
+
+react-proxy@^1.1.7:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a"
+ dependencies:
+ lodash "^4.6.1"
+ react-deep-force-update "^1.0.0"
+
+react-test-renderer@16.0.0:
+ version "16.0.0"
+ resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.0.0.tgz#9fe7b8308f2f71f29fc356d4102086f131c9cb15"
+ dependencies:
+ fbjs "^0.8.16"
+ object-assign "^4.1.1"
+
+react-timer-mixin@^0.13.2:
+ version "0.13.3"
+ resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.3.tgz#0da8b9f807ec07dc3e854d082c737c65605b3d22"
+
+react-transform-hmr@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb"
+ dependencies:
+ global "^4.3.0"
+ react-proxy "^1.1.7"
+
+react@16.0.0:
+ version "16.0.0"
+ resolved "https://registry.yarnpkg.com/react/-/react-16.0.0.tgz#ce7df8f1941b036f02b2cca9dbd0cb1f0e855e2d"
+ dependencies:
+ fbjs "^0.8.16"
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ prop-types "^15.6.0"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+ dependencies:
+ find-up "^2.0.0"
+ read-pkg "^2.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+read-pkg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+ dependencies:
+ load-json-file "^2.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^2.0.0"
+
+readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.0.3"
+ util-deprecate "~1.0.1"
+
+readable-stream@~1.1.8, readable-stream@~1.1.9:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+realpath-native@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0"
+ dependencies:
+ util.promisify "^1.0.0"
+
+regenerate@^1.2.1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-cache@^0.4.2:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+ dependencies:
+ is-equal-shallow "^0.1.3"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ dependencies:
+ jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ dependencies:
+ is-finite "^1.0.0"
+
+replace-ext@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
+
+request-promise-core@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
+ dependencies:
+ lodash "^4.13.1"
+
+request-promise-native@^1.0.3:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5"
+ dependencies:
+ request-promise-core "1.1.1"
+ stealthy-require "^1.1.0"
+ tough-cookie ">=2.3.3"
+
+request@2.81.0:
+ version "2.81.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+ dependencies:
+ aws-sign2 "~0.6.0"
+ aws4 "^1.2.1"
+ caseless "~0.12.0"
+ combined-stream "~1.0.5"
+ extend "~3.0.0"
+ forever-agent "~0.6.1"
+ form-data "~2.1.1"
+ har-validator "~4.2.1"
+ hawk "~3.1.3"
+ http-signature "~1.1.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.7"
+ oauth-sign "~0.8.1"
+ performance-now "^0.2.0"
+ qs "~6.4.0"
+ safe-buffer "^5.0.1"
+ stringstream "~0.0.4"
+ tough-cookie "~2.3.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.0.0"
+
+request@^2.79.0, request@^2.83.0:
+ version "2.83.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.6.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.5"
+ extend "~3.0.1"
+ forever-agent "~0.6.1"
+ form-data "~2.3.1"
+ har-validator "~5.0.3"
+ hawk "~6.0.2"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.17"
+ oauth-sign "~0.8.2"
+ performance-now "^2.1.0"
+ qs "~6.5.1"
+ safe-buffer "^5.1.1"
+ stringstream "~0.0.5"
+ tough-cookie "~2.3.3"
+ tunnel-agent "^0.6.0"
+ uuid "^3.1.0"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+resolve@1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+
+response-time@~2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/response-time/-/response-time-2.3.2.tgz#ffa71bab952d62f7c1d49b7434355fbc68dffc5a"
+ dependencies:
+ depd "~1.1.0"
+ on-headers "~1.0.1"
+
+restore-cursor@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+ dependencies:
+ onetime "^2.0.0"
+ signal-exit "^3.0.2"
+
+right-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+ dependencies:
+ align-text "^0.1.1"
+
+rimraf@2, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ dependencies:
+ glob "^7.0.5"
+
+rimraf@~2.2.6:
+ version "2.2.8"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
+
+rndm@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/rndm/-/rndm-1.2.0.tgz#f33fe9cfb52bbfd520aa18323bc65db110a1b76c"
+
+run-async@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+ dependencies:
+ is-promise "^2.1.0"
+
+rx-lite-aggregates@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+ dependencies:
+ rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+
+safe-buffer@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
+
+sane@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/sane/-/sane-2.2.0.tgz#d6d2e2fcab00e3d283c93b912b7c3a20846f1d56"
+ dependencies:
+ anymatch "^1.3.0"
+ exec-sh "^0.2.0"
+ fb-watchman "^2.0.0"
+ minimatch "^3.0.2"
+ minimist "^1.1.1"
+ walker "~1.0.5"
+ watch "~0.18.0"
+ optionalDependencies:
+ fsevents "^1.1.1"
+
+sax@^1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+sax@~1.1.1:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240"
+
+"semver@2 || 3 || 4 || 5", semver@5.x, semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
+
+send@0.13.2:
+ version "0.13.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz#765e7607c8055452bba6f0b052595350986036de"
+ dependencies:
+ debug "~2.2.0"
+ depd "~1.1.0"
+ destroy "~1.0.4"
+ escape-html "~1.0.3"
+ etag "~1.7.0"
+ fresh "0.3.0"
+ http-errors "~1.3.1"
+ mime "1.3.4"
+ ms "0.7.1"
+ on-finished "~2.3.0"
+ range-parser "~1.0.3"
+ statuses "~1.2.1"
+
+serve-favicon@~2.3.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.3.2.tgz#dd419e268de012ab72b319d337f2105013f9381f"
+ dependencies:
+ etag "~1.7.0"
+ fresh "0.3.0"
+ ms "0.7.2"
+ parseurl "~1.3.1"
+
+serve-index@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.7.3.tgz#7a057fc6ee28dc63f64566e5fa57b111a86aecd2"
+ dependencies:
+ accepts "~1.2.13"
+ batch "0.5.3"
+ debug "~2.2.0"
+ escape-html "~1.0.3"
+ http-errors "~1.3.1"
+ mime-types "~2.1.9"
+ parseurl "~1.3.1"
+
+serve-static@~1.10.0:
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.10.3.tgz#ce5a6ecd3101fed5ec09827dac22a9c29bfb0535"
+ dependencies:
+ escape-html "~1.0.3"
+ parseurl "~1.3.1"
+ send "0.13.2"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+shell-quote@1.6.1, shell-quote@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+ dependencies:
+ array-filter "~0.0.0"
+ array-map "~0.0.0"
+ array-reduce "~0.0.0"
+ jsonify "~0.0.0"
+
+shellwords@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+simple-plist@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-0.2.1.tgz#71766db352326928cf3a807242ba762322636723"
+ dependencies:
+ bplist-creator "0.0.7"
+ bplist-parser "0.1.1"
+ plist "2.0.1"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slide@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
+
+sntp@1.x.x:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+ dependencies:
+ hoek "2.x.x"
+
+sntp@2.x.x:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
+ dependencies:
+ hoek "4.x.x"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-support@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.0.tgz#2018a7ad2bdf8faf2691e5fddab26bed5a2bacab"
+ dependencies:
+ source-map "^0.6.0"
+
+source-map@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.6:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.6.0, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+sparkles@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3"
+
+spdx-correct@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
+ dependencies:
+ spdx-license-ids "^1.0.2"
+
+spdx-expression-parse@~1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
+
+spdx-license-ids@^1.0.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ dashdash "^1.12.0"
+ getpass "^0.1.1"
+ optionalDependencies:
+ bcrypt-pbkdf "^1.0.0"
+ ecc-jsbn "~0.1.1"
+ jsbn "~0.1.0"
+ tweetnacl "~0.14.0"
+
+stack-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620"
+
+stacktrace-parser@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.4.tgz#01397922e5f62ecf30845522c95c4fe1d25e7d4e"
+
+statuses@1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+
+statuses@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.2.1.tgz#dded45cc18256d51ed40aec142489d5c61026d28"
+
+stealthy-require@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+
+stream-buffers@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4"
+
+stream-counter@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-0.2.0.tgz#ded266556319c8b0e222812b9cf3b26fa7d947de"
+ dependencies:
+ readable-stream "~1.1.8"
+
+string-length@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
+ dependencies:
+ astral-regex "^1.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^1.0.1, string-width@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+string-width@^2.0.0, string-width@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
+ dependencies:
+ safe-buffer "~5.1.0"
+
+stringstream@~0.0.4, stringstream@~0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-bom@3.0.0, strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^3.1.2:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+ dependencies:
+ has-flag "^1.0.0"
+
+supports-color@^4.0.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
+ dependencies:
+ has-flag "^2.0.0"
+
+symbol-tree@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
+
+sync-exec@~0.6.x:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/sync-exec/-/sync-exec-0.6.2.tgz#717d22cc53f0ce1def5594362f3a89a2ebb91105"
+
+tar-pack@^3.4.0:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f"
+ dependencies:
+ debug "^2.2.0"
+ fstream "^1.0.10"
+ fstream-ignore "^1.0.5"
+ once "^1.3.3"
+ readable-stream "^2.1.4"
+ rimraf "^2.5.1"
+ tar "^2.2.1"
+ uid-number "^0.0.6"
+
+tar@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+ dependencies:
+ block-stream "*"
+ fstream "^1.0.2"
+ inherits "2"
+
+temp@0.8.3:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59"
+ dependencies:
+ os-tmpdir "^1.0.0"
+ rimraf "~2.2.6"
+
+test-exclude@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26"
+ dependencies:
+ arrify "^1.0.1"
+ micromatch "^2.3.11"
+ object-assign "^4.1.0"
+ read-pkg-up "^1.0.1"
+ require-main-filename "^1.0.1"
+
+throat@^4.0.0, throat@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
+
+through2@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+ dependencies:
+ readable-stream "^2.1.5"
+ xtend "~4.0.1"
+
+through@^2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+time-stamp@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
+
+tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+tmpl@1.0.x:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
+ dependencies:
+ punycode "^1.4.1"
+
+tr46@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+ dependencies:
+ punycode "^2.1.0"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tsscmp@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.5.tgz#7dc4a33af71581ab4337da91d85ca5427ebd9a97"
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-is@~1.6.6:
+ version "1.6.15"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.15"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+ua-parser-js@^0.7.9:
+ version "0.7.17"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac"
+
+uglify-es@^3.1.8:
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.4.tgz#2d592678791e5310456bbc95e952139e3b13167a"
+ dependencies:
+ commander "~2.12.1"
+ source-map "~0.6.1"
+
+uglify-js@^2.6:
+ version "2.8.29"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+ dependencies:
+ source-map "~0.5.1"
+ yargs "~3.10.0"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uid-number@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
+uid-safe@2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.4.tgz#3ad6f38368c6d4c8c75ec17623fb79aa1d071d81"
+ dependencies:
+ random-bytes "~1.0.0"
+
+uid-safe@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.0.0.tgz#a7f3c6ca64a1f6a5d04ec0ef3e4c3d5367317137"
+ dependencies:
+ base64-url "1.2.1"
+
+ultron@1.0.x:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
+
+ultron@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+util-deprecate@1.0.2, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util.promisify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+ dependencies:
+ define-properties "^1.1.2"
+ object.getownpropertydescriptors "^2.0.3"
+
+utils-merge@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8"
+
+uuid@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
+
+uuid@^3.0.0, uuid@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
+ dependencies:
+ spdx-correct "~1.0.0"
+ spdx-expression-parse "~1.0.0"
+
+vary@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10"
+
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+vhost@~3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/vhost/-/vhost-3.0.2.tgz#2fb1decd4c466aa88b0f9341af33dc1aff2478d5"
+
+vinyl@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
+ dependencies:
+ clone "^1.0.0"
+ clone-stats "^0.0.1"
+ replace-ext "0.0.1"
+
+walker@~1.0.5:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
+ dependencies:
+ makeerror "1.0.x"
+
+watch@~0.18.0:
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986"
+ dependencies:
+ exec-sh "^0.2.0"
+ minimist "^1.2.0"
+
+weak@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/weak/-/weak-1.0.1.tgz#ab99aab30706959aa0200cb8cf545bb9cb33b99e"
+ dependencies:
+ bindings "^1.2.1"
+ nan "^2.0.5"
+
+webidl-conversions@^4.0.1, webidl-conversions@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+
+whatwg-encoding@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3"
+ dependencies:
+ iconv-lite "0.4.19"
+
+whatwg-fetch@>=0.10.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
+
+whatwg-fetch@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.1.1.tgz#ac3c9d39f320c6dce5339969d054ef43dd333319"
+
+whatwg-url@^6.3.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08"
+ dependencies:
+ lodash.sortby "^4.7.0"
+ tr46 "^1.0.0"
+ webidl-conversions "^4.0.1"
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.2.12, which@^1.2.14, which@^1.2.9:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
+ dependencies:
+ string-width "^1.0.2"
+
+win-release@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209"
+ dependencies:
+ semver "^5.0.1"
+
+window-size@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@^1.0.0, wordwrap@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+wordwrap@~0.0.2:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+worker-farm@^1.3.1:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae"
+ dependencies:
+ errno "^0.1.4"
+ xtend "^4.0.1"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write-file-atomic@^1.2.0:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f"
+ dependencies:
+ graceful-fs "^4.1.11"
+ imurmurhash "^0.1.4"
+ slide "^1.1.5"
+
+write-file-atomic@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
+ dependencies:
+ graceful-fs "^4.1.11"
+ imurmurhash "^0.1.4"
+ signal-exit "^3.0.2"
+
+ws@^1.1.0:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51"
+ dependencies:
+ options ">=0.0.5"
+ ultron "1.0.x"
+
+ws@^2.0.3:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-2.3.1.tgz#6b94b3e447cb6a363f785eaf94af6359e8e81c80"
+ dependencies:
+ safe-buffer "~5.0.1"
+ ultron "~1.1.0"
+
+xcode@^0.9.1:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/xcode/-/xcode-0.9.3.tgz#910a89c16aee6cc0b42ca805a6d0b4cf87211cf3"
+ dependencies:
+ pegjs "^0.10.0"
+ simple-plist "^0.2.1"
+ uuid "3.0.1"
+
+xml-name-validator@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
+
+xmlbuilder@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.0.0.tgz#98b8f651ca30aa624036f127d11cc66dc7b907a3"
+ dependencies:
+ lodash "^3.5.0"
+
+xmlbuilder@8.2.2:
+ version "8.2.2"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773"
+
+xmldoc@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-0.4.0.tgz#d257224be8393eaacbf837ef227fd8ec25b36888"
+ dependencies:
+ sax "~1.1.1"
+
+xmldom@0.1.x:
+ version "0.1.27"
+ resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"
+
+xpipe@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.5.tgz#8dd8bf45fc3f7f55f0e054b878f43a62614dafdf"
+
+xtend@^4.0.1, xtend@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yargs-parser@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+ dependencies:
+ camelcase "^4.1.0"
+
+yargs-parser@^8.0.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
+ dependencies:
+ camelcase "^4.1.0"
+
+yargs@^10.0.3:
+ version "10.0.3"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae"
+ dependencies:
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ find-up "^2.1.0"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^8.0.0"
+
+yargs@^9.0.0:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c"
+ dependencies:
+ camelcase "^4.1.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ read-pkg-up "^2.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^7.0.0"
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+ dependencies:
+ camelcase "^1.0.2"
+ cliui "^2.1.0"
+ decamelize "^1.0.0"
+ window-size "0.1.0"
diff --git a/THIRD-PARTY-LICENSES b/THIRD-PARTY-LICENSES
new file mode 100644
index 0000000..917eccf
--- /dev/null
+++ b/THIRD-PARTY-LICENSES
@@ -0,0 +1,246 @@
+===============================================================================
+
+ expo/expo
+ https://github.com/expo/expo
+
+-------------------------------------------------------------------------------
+
+BSD License
+
+For Exponent software
+
+Copyright (c) 2015-present, 650 Industries, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * Neither the names 650 Industries, Exponent, nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+===============================================================================
+
+ google/cameraview
+ https://github.com/google/cameraview
+
+-------------------------------------------------------------------------------
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/android/build.gradle b/android/build.gradle
index 333d69c..28e43a9 100755
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,24 +1,27 @@
buildscript {
repositories {
jcenter()
+ maven {
+ url 'https://maven.google.com'
+ }
}
dependencies {
- classpath 'com.android.tools.build:gradle:1.2.3'
+ classpath 'com.android.tools.build:gradle:3.0.0'
}
}
apply plugin: 'com.android.library'
android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
+ compileSdkVersion 26
+ buildToolsVersion "26.0.2"
defaultConfig {
minSdkVersion 16
- targetSdkVersion 22
+ targetSdkVersion 26
versionCode 1
- versionName "1.0"
+ versionName "1.0.0"
}
lintOptions {
abortOnError false
@@ -28,10 +31,18 @@ android {
repositories {
mavenCentral()
+ maven {
+ url 'https://maven.google.com'
+ }
+ maven { url "https://jitpack.io" }
}
dependencies {
- compile "com.facebook.react:react-native:0.19.+"
+ compile 'com.facebook.react:react-native:+'
compile "com.google.zxing:core:3.2.1"
compile "com.drewnoakes:metadata-extractor:2.9.1"
+ compile 'com.google.android.gms:play-services-vision:+'
+ compile "com.android.support:exifinterface:26.0.2"
+
+ compile 'com.github.react-native-community:cameraview:df60b07573'
}
diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..13372ae
Binary files /dev/null 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
new file mode 100644
index 0000000..bdaabfa
--- /dev/null
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Sun Dec 31 13:43:56 BRST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
diff --git a/android/gradlew b/android/gradlew
new file mode 100755
index 0000000..9d82f78
--- /dev/null
+++ b/android/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# 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
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ 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
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "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
+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
+
+# 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\""
+ fi
+ i=$((i+1))
+ 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
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/android/gradlew.bat b/android/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/android/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@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 DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@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
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_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=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+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%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/android/src/main/java/com/lwansbrough/RCTCamera/RCTCameraPackage.java b/android/src/main/java/com/lwansbrough/RCTCamera/RCTCameraPackage.java
index 182eb8c..12f7492 100644
--- a/android/src/main/java/com/lwansbrough/RCTCamera/RCTCameraPackage.java
+++ b/android/src/main/java/com/lwansbrough/RCTCamera/RCTCameraPackage.java
@@ -10,11 +10,19 @@ import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import com.facebook.react.bridge.JavaScriptModule;
+import org.reactnative.camera.CameraModule;
+import org.reactnative.camera.CameraViewManager;
+import org.reactnative.facedetector.FaceDetectorModule;
+
public class RCTCameraPackage implements ReactPackage {
@Override
public List createNativeModules(ReactApplicationContext reactApplicationContext) {
- return Collections.singletonList(new RCTCameraModule(reactApplicationContext));
+ return Arrays.asList(
+ new RCTCameraModule(reactApplicationContext),
+ new CameraModule(reactApplicationContext),
+ new FaceDetectorModule(reactApplicationContext)
+ );
}
// Deprecated in RN 0.47
@@ -24,8 +32,10 @@ public class RCTCameraPackage implements ReactPackage {
@Override
public List createViewManagers(ReactApplicationContext reactApplicationContext) {
- //noinspection ArraysAsListWithZeroOrOneArgument
- return Collections.singletonList(new RCTCameraViewManager());
+ return Arrays.asList(
+ new RCTCameraViewManager(),
+ new CameraViewManager()
+ );
}
}
diff --git a/android/src/main/java/org/reactnative/MutableImage.java b/android/src/main/java/org/reactnative/MutableImage.java
new file mode 100644
index 0000000..8d5fcc3
--- /dev/null
+++ b/android/src/main/java/org/reactnative/MutableImage.java
@@ -0,0 +1,272 @@
+package org.reactnative;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.media.ExifInterface;
+import android.util.Base64;
+import android.util.Log;
+
+import com.drew.imaging.ImageMetadataReader;
+import com.drew.imaging.ImageProcessingException;
+import com.drew.metadata.Directory;
+import com.drew.metadata.Metadata;
+import com.drew.metadata.MetadataException;
+import com.drew.metadata.Tag;
+import com.drew.metadata.exif.ExifIFD0Directory;
+import com.facebook.react.bridge.ReadableMap;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class MutableImage {
+ private static final String TAG = "RNCamera";
+
+ private final byte[] originalImageData;
+ private Bitmap currentRepresentation;
+ private Metadata originalImageMetaData;
+ private boolean hasBeenReoriented = false;
+
+ public MutableImage(byte[] originalImageData) {
+ this.originalImageData = originalImageData;
+ this.currentRepresentation = toBitmap(originalImageData);
+ }
+
+ public void mirrorImage() throws ImageMutationFailedException {
+ Matrix m = new Matrix();
+
+ m.preScale(-1, 1);
+
+ Bitmap bitmap = Bitmap.createBitmap(
+ currentRepresentation,
+ 0,
+ 0,
+ currentRepresentation.getWidth(),
+ currentRepresentation.getHeight(),
+ m,
+ false
+ );
+
+ if (bitmap == null)
+ throw new ImageMutationFailedException("failed to mirror");
+
+ this.currentRepresentation = bitmap;
+ }
+
+ public void fixOrientation() throws ImageMutationFailedException {
+ try {
+ Metadata metadata = originalImageMetaData();
+
+ ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
+ if (exifIFD0Directory == null) {
+ return;
+ } else if (exifIFD0Directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
+ int exifOrientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
+ if(exifOrientation != 1) {
+ rotate(exifOrientation);
+ exifIFD0Directory.setInt(ExifIFD0Directory.TAG_ORIENTATION, 1);
+ }
+ }
+ } catch (ImageProcessingException | IOException | MetadataException e) {
+ throw new ImageMutationFailedException("failed to fix orientation", e);
+ }
+ }
+
+ //see http://www.impulseadventure.com/photo/exif-orientation.html
+ private void rotate(int exifOrientation) throws ImageMutationFailedException {
+ final Matrix bitmapMatrix = new Matrix();
+ switch (exifOrientation) {
+ case 1:
+ return;//no rotation required
+ case 2:
+ bitmapMatrix.postScale(-1, 1);
+ break;
+ case 3:
+ bitmapMatrix.postRotate(180);
+ break;
+ case 4:
+ bitmapMatrix.postRotate(180);
+ bitmapMatrix.postScale(-1, 1);
+ break;
+ case 5:
+ bitmapMatrix.postRotate(90);
+ bitmapMatrix.postScale(-1, 1);
+ break;
+ case 6:
+ bitmapMatrix.postRotate(90);
+ break;
+ case 7:
+ bitmapMatrix.postRotate(270);
+ bitmapMatrix.postScale(-1, 1);
+ break;
+ case 8:
+ bitmapMatrix.postRotate(270);
+ break;
+ default:
+ break;
+ }
+
+ Bitmap transformedBitmap = Bitmap.createBitmap(
+ currentRepresentation,
+ 0,
+ 0,
+ currentRepresentation.getWidth(),
+ currentRepresentation.getHeight(),
+ bitmapMatrix,
+ false
+ );
+
+ if (transformedBitmap == null)
+ throw new ImageMutationFailedException("failed to rotate");
+
+ this.currentRepresentation = transformedBitmap;
+ this.hasBeenReoriented = true;
+ }
+
+ private static Bitmap toBitmap(byte[] data) {
+ try {
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
+ Bitmap photo = BitmapFactory.decodeStream(inputStream);
+ inputStream.close();
+ return photo;
+ } catch (IOException e) {
+ throw new IllegalStateException("Will not happen", e);
+ }
+ }
+
+ public String toBase64(int jpegQualityPercent) {
+ return Base64.encodeToString(toJpeg(currentRepresentation, jpegQualityPercent), Base64.DEFAULT);
+ }
+
+ public void writeDataToFile(File file, ReadableMap options, int jpegQualityPercent) throws IOException {
+ FileOutputStream fos = new FileOutputStream(file);
+ fos.write(toJpeg(currentRepresentation, jpegQualityPercent));
+ fos.close();
+
+ try {
+ ExifInterface exif = new ExifInterface(file.getAbsolutePath());
+
+ // copy original exif data to the output exif...
+ // unfortunately, this Android ExifInterface class doesn't understand all the tags so we lose some
+ for (Directory directory : originalImageMetaData().getDirectories()) {
+ for (Tag tag : directory.getTags()) {
+ int tagType = tag.getTagType();
+ Object object = directory.getObject(tagType);
+ exif.setAttribute(tag.getTagName(), object.toString());
+ }
+ }
+
+ writeLocationExifData(options, exif);
+
+ if(hasBeenReoriented)
+ rewriteOrientation(exif);
+
+ exif.saveAttributes();
+ } catch (ImageProcessingException | IOException e) {
+ Log.e(TAG, "failed to save exif data", e);
+ }
+ }
+
+ private void rewriteOrientation(ExifInterface exif) {
+ exif.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(ExifInterface.ORIENTATION_NORMAL));
+ }
+
+ private void writeLocationExifData(ReadableMap options, ExifInterface exif) {
+ if(!options.hasKey("metadata"))
+ return;
+
+ ReadableMap metadata = options.getMap("metadata");
+ if (!metadata.hasKey("location"))
+ return;
+
+ ReadableMap location = metadata.getMap("location");
+ if(!location.hasKey("coords"))
+ return;
+
+ try {
+ ReadableMap coords = location.getMap("coords");
+ double latitude = coords.getDouble("latitude");
+ double longitude = coords.getDouble("longitude");
+
+ GPS.writeExifData(latitude, longitude, exif);
+ } catch (IOException e) {
+ Log.e(TAG, "Couldn't write location data", e);
+ }
+ }
+
+ private Metadata originalImageMetaData() throws ImageProcessingException, IOException {
+ if(this.originalImageMetaData == null) {//this is expensive, don't do it more than once
+ originalImageMetaData = ImageMetadataReader.readMetadata(
+ new BufferedInputStream(new ByteArrayInputStream(originalImageData)),
+ originalImageData.length
+ );
+ }
+ return originalImageMetaData;
+ }
+
+ private static byte[] toJpeg(Bitmap bitmap, int quality) throws OutOfMemoryError {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
+
+ try {
+ return outputStream.toByteArray();
+ } finally {
+ try {
+ outputStream.close();
+ } catch (IOException e) {
+ Log.e(TAG, "problem compressing jpeg", e);
+ }
+ }
+ }
+
+ public static class ImageMutationFailedException extends Exception {
+ public ImageMutationFailedException(String detailMessage, Throwable throwable) {
+ super(detailMessage, throwable);
+ }
+
+ public ImageMutationFailedException(String detailMessage) {
+ super(detailMessage);
+ }
+ }
+
+ private static class GPS {
+ public static void writeExifData(double latitude, double longitude, ExifInterface exif) throws IOException {
+ exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, toDegreeMinuteSecods(latitude));
+ exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, latitudeRef(latitude));
+ exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, toDegreeMinuteSecods(longitude));
+ exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, longitudeRef(longitude));
+ }
+
+ private static String latitudeRef(double latitude) {
+ return latitude < 0.0d ? "S" : "N";
+ }
+
+ private static String longitudeRef(double longitude) {
+ return longitude < 0.0d ? "W" : "E";
+ }
+
+ private static String toDegreeMinuteSecods(double latitude) {
+ latitude = Math.abs(latitude);
+ int degree = (int) latitude;
+ latitude *= 60;
+ latitude -= (degree * 60.0d);
+ int minute = (int) latitude;
+ latitude *= 60;
+ latitude -= (minute * 60.0d);
+ int second = (int) (latitude * 1000.0d);
+
+ StringBuffer sb = new StringBuffer();
+ sb.append(degree);
+ sb.append("/1,");
+ sb.append(minute);
+ sb.append("/1,");
+ sb.append(second);
+ sb.append("/1000,");
+ return sb.toString();
+ }
+ }
+}
diff --git a/android/src/main/java/org/reactnative/camera/CameraModule.java b/android/src/main/java/org/reactnative/camera/CameraModule.java
new file mode 100644
index 0000000..a183f3b
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/CameraModule.java
@@ -0,0 +1,211 @@
+package org.reactnative.camera;
+
+import android.content.Context;
+
+import org.reactnative.facedetector.RNFaceDetector;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.Promise;
+import com.facebook.react.bridge.ReactApplicationContext;
+import com.facebook.react.bridge.ReactContextBaseJavaModule;
+import com.facebook.react.bridge.ReactMethod;
+import com.facebook.react.bridge.ReadableMap;
+import com.facebook.react.bridge.WritableArray;
+import com.google.android.cameraview.AspectRatio;
+import com.google.zxing.BarcodeFormat;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.Nullable;
+
+public class CameraModule extends ReactContextBaseJavaModule {
+ private static final String TAG = "CameraModule";
+
+ private static ReactApplicationContext mReactContext;
+
+// private static ScopedContext mScopedContext;
+ static final int VIDEO_2160P = 0;
+ static final int VIDEO_1080P = 1;
+ static final int VIDEO_720P = 2;
+ static final int VIDEO_480P = 3;
+ static final int VIDEO_4x3 = 4;
+
+ public static final Map VALID_BARCODE_TYPES =
+ Collections.unmodifiableMap(new HashMap() {
+ {
+ put("aztec", BarcodeFormat.AZTEC.toString());
+ put("ean13", BarcodeFormat.EAN_13.toString());
+ put("ean8", BarcodeFormat.EAN_8.toString());
+ put("qr", BarcodeFormat.QR_CODE.toString());
+ put("pdf417", BarcodeFormat.PDF_417.toString());
+ put("upc_e", BarcodeFormat.UPC_E.toString());
+ put("datamatrix", BarcodeFormat.DATA_MATRIX.toString());
+ put("code39", BarcodeFormat.CODE_39.toString());
+ put("code93", BarcodeFormat.CODE_93.toString());
+ put("interleaved2of5", BarcodeFormat.ITF.toString());
+ put("codabar", BarcodeFormat.CODABAR.toString());
+ put("code128", BarcodeFormat.CODE_128.toString());
+ put("maxicode", BarcodeFormat.MAXICODE.toString());
+ put("rss14", BarcodeFormat.RSS_14.toString());
+ put("rssexpanded", BarcodeFormat.RSS_EXPANDED.toString());
+ put("upc_a", BarcodeFormat.UPC_A.toString());
+ put("upc_ean", BarcodeFormat.UPC_EAN_EXTENSION.toString());
+ }
+ });
+
+ public CameraModule(ReactApplicationContext reactContext) {
+ super(reactContext);
+ mReactContext = reactContext;
+ }
+
+ public static ReactApplicationContext getReactContextSingleton() {
+ return mReactContext;
+ }
+
+ public static Context getScopedContextSingleton() {
+ return mReactContext;
+ }
+
+ @Override
+ public String getName() {
+ return "RNCameraModule";
+ }
+
+ @Nullable
+ @Override
+ public Map getConstants() {
+ return Collections.unmodifiableMap(new HashMap() {
+ {
+ put("Type", getTypeConstants());
+ put("FlashMode", getFlashModeConstants());
+ put("AutoFocus", getAutoFocusConstants());
+ put("WhiteBalance", getWhiteBalanceConstants());
+ put("VideoQuality", getVideoQualityConstants());
+ put("BarCodeType", getBarCodeConstants());
+ put("FaceDetection", Collections.unmodifiableMap(new HashMap() {
+ {
+ put("Mode", getFaceDetectionModeConstants());
+ put("Landmarks", getFaceDetectionLandmarksConstants());
+ put("Classifications", getFaceDetectionClassificationsConstants());
+ }
+
+ private Map getFaceDetectionModeConstants() {
+ return Collections.unmodifiableMap(new HashMap() {
+ {
+ put("fast", RNFaceDetector.FAST_MODE);
+ put("accurate", RNFaceDetector.ACCURATE_MODE);
+ }
+ });
+ }
+
+ private Map getFaceDetectionClassificationsConstants() {
+ return Collections.unmodifiableMap(new HashMap() {
+ {
+ put("all", RNFaceDetector.ALL_CLASSIFICATIONS);
+ put("none", RNFaceDetector.NO_CLASSIFICATIONS);
+ }
+ });
+ }
+
+ private Map getFaceDetectionLandmarksConstants() {
+ return Collections.unmodifiableMap(new HashMap() {
+ {
+ put("all", RNFaceDetector.ALL_LANDMARKS);
+ put("none", RNFaceDetector.NO_LANDMARKS);
+ }
+ });
+ }
+ }));
+ }
+
+ private Map getTypeConstants() {
+ return Collections.unmodifiableMap(new HashMap() {
+ {
+ put("front", Constants.FACING_FRONT);
+ put("back", Constants.FACING_BACK);
+ }
+ });
+ }
+
+ private Map getFlashModeConstants() {
+ return Collections.unmodifiableMap(new HashMap() {
+ {
+ put("off", Constants.FLASH_OFF);
+ put("on", Constants.FLASH_ON);
+ put("auto", Constants.FLASH_AUTO);
+ put("torch", Constants.FLASH_TORCH);
+ }
+ });
+ }
+
+ private Map getAutoFocusConstants() {
+ return Collections.unmodifiableMap(new HashMap() {
+ {
+ put("on", true);
+ put("off", false);
+ }
+ });
+ }
+
+ private Map getWhiteBalanceConstants() {
+ return Collections.unmodifiableMap(new HashMap() {
+ {
+ put("auto", Constants.WB_AUTO);
+ put("cloudy", Constants.WB_CLOUDY);
+ put("sunny", Constants.WB_SUNNY);
+ put("shadow", Constants.WB_SHADOW);
+ put("fluorescent", Constants.WB_FLUORESCENT);
+ put("incandescent", Constants.WB_INCANDESCENT);
+ }
+ });
+ }
+
+ private Map getVideoQualityConstants() {
+ return Collections.unmodifiableMap(new HashMap() {
+ {
+ put("2160p", VIDEO_2160P);
+ put("1080p", VIDEO_1080P);
+ put("720p", VIDEO_720P);
+ put("480p", VIDEO_480P);
+ put("4:3", VIDEO_4x3);
+ }
+ });
+ }
+
+ private Map getBarCodeConstants() {
+ return VALID_BARCODE_TYPES;
+ }
+ });
+ }
+
+ @ReactMethod
+ public void takePicture(ReadableMap options, final Promise promise) {
+ CameraViewManager.getInstance().takePicture(options, promise);
+ }
+
+ @ReactMethod
+ public void record(ReadableMap options, final Promise promise) {
+ CameraViewManager.getInstance().record(options, promise);
+ }
+
+ @ReactMethod
+ public void stopRecording() {
+ CameraViewManager.getInstance().stopRecording();
+ }
+
+ @ReactMethod
+ public void getSupportedRatios(final Promise promise) {
+ WritableArray result = Arguments.createArray();
+ Set ratios = CameraViewManager.getInstance().getSupportedRatios();
+ if (ratios != null) {
+ for (AspectRatio ratio : ratios) {
+ result.pushString(ratio.toString());
+ }
+ promise.resolve(result);
+ } else {
+ promise.reject("E_CAMERA_UNAVAILABLE", "Camera is not running");
+ }
+ }
+}
diff --git a/android/src/main/java/org/reactnative/camera/CameraViewManager.java b/android/src/main/java/org/reactnative/camera/CameraViewManager.java
new file mode 100644
index 0000000..0f329cd
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/CameraViewManager.java
@@ -0,0 +1,196 @@
+package org.reactnative.camera;
+
+import android.Manifest;
+import android.graphics.Bitmap;
+import android.os.Build;
+import android.support.annotation.Nullable;
+
+import org.reactnative.camera.tasks.ResolveTakenPictureAsyncTask;
+import com.facebook.react.bridge.Promise;
+import com.facebook.react.bridge.ReadableArray;
+import com.facebook.react.bridge.ReadableMap;
+import com.facebook.react.common.MapBuilder;
+import com.facebook.react.uimanager.ThemedReactContext;
+import com.facebook.react.uimanager.ViewGroupManager;
+import com.facebook.react.uimanager.annotations.ReactProp;
+import com.google.android.cameraview.AspectRatio;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class CameraViewManager extends ViewGroupManager {
+ public enum Events {
+ EVENT_CAMERA_READY("onCameraReady"),
+ EVENT_ON_MOUNT_ERROR("onMountError"),
+ EVENT_ON_BAR_CODE_READ("onBarCodeRead"),
+ EVENT_ON_FACES_DETECTED("onFacesDetected"),
+ EVENT_ON_FACE_DETECTION_ERROR("onFaceDetectionError");
+
+ private final String mName;
+
+ Events(final String name) {
+ mName = name;
+ }
+
+ @Override
+ public String toString() {
+ return mName;
+ }
+ }
+
+ private static final String REACT_CLASS = "RNCamera";
+
+ private static CameraViewManager instance;
+ private RNCameraView mCameraView;
+
+ public CameraViewManager() {
+ super();
+ instance = this;
+ }
+
+ public static CameraViewManager getInstance() { return instance; }
+
+ @Override
+ public String getName() {
+ return REACT_CLASS;
+ }
+
+ @Override
+ protected RNCameraView createViewInstance(ThemedReactContext themedReactContext) {
+ mCameraView = new RNCameraView(themedReactContext);
+ return mCameraView;
+ }
+
+ @Override
+ @Nullable
+ public Map getExportedCustomDirectEventTypeConstants() {
+ MapBuilder.Builder builder = MapBuilder.builder();
+ for (Events event : Events.values()) {
+ builder.put(event.toString(), MapBuilder.of("registrationName", event.toString()));
+ }
+ return builder.build();
+ }
+
+ @ReactProp(name = "type")
+ public void setType(RNCameraView view, int type) {
+ view.setFacing(type);
+ }
+
+ @ReactProp(name = "ratio")
+ public void setRatio(RNCameraView view, String ratio) {
+ view.setAspectRatio(AspectRatio.parse(ratio));
+ }
+
+ @ReactProp(name = "flashMode")
+ public void setFlashMode(RNCameraView view, int torchMode) {
+ view.setFlash(torchMode);
+ }
+
+ @ReactProp(name = "autoFocus")
+ public void setAutoFocus(RNCameraView view, boolean autoFocus) {
+ view.setAutoFocus(autoFocus);
+ }
+
+ @ReactProp(name = "focusDepth")
+ public void setFocusDepth(RNCameraView view, float depth) {
+ view.setFocusDepth(depth);
+ }
+
+ @ReactProp(name = "zoom")
+ public void setZoom(RNCameraView view, float zoom) {
+ view.setZoom(zoom);
+ }
+
+ @ReactProp(name = "whiteBalance")
+ public void setWhiteBalance(RNCameraView view, int whiteBalance) {
+ view.setWhiteBalance(whiteBalance);
+ }
+
+ @ReactProp(name = "barCodeTypes")
+ public void setBarCodeTypes(RNCameraView view, ReadableArray barCodeTypes) {
+ if (barCodeTypes == null) {
+ return;
+ }
+ List result = new ArrayList<>(barCodeTypes.size());
+ for (int i = 0; i < barCodeTypes.size(); i++) {
+ result.add(barCodeTypes.getString(i));
+ }
+ view.setBarCodeTypes(result);
+ }
+
+ @ReactProp(name = "barCodeScannerEnabled")
+ public void setBarCodeScanning(RNCameraView view, boolean barCodeScannerEnabled) {
+ view.setShouldScanBarCodes(barCodeScannerEnabled);
+ }
+
+ @ReactProp(name = "faceDetectorEnabled")
+ public void setFaceDetecting(RNCameraView view, boolean faceDetectorEnabled) {
+ view.setShouldDetectFaces(faceDetectorEnabled);
+ }
+
+ @ReactProp(name = "faceDetectionMode")
+ public void setFaceDetectionMode(RNCameraView view, int mode) {
+ view.setFaceDetectionMode(mode);
+ }
+
+ @ReactProp(name = "faceDetectionLandmarks")
+ public void setFaceDetectionLandmarks(RNCameraView view, int landmarks) {
+ view.setFaceDetectionLandmarks(landmarks);
+ }
+
+ @ReactProp(name = "faceDetectionClassifications")
+ public void setFaceDetectionClassifications(RNCameraView view, int classifications) {
+ view.setFaceDetectionClassifications(classifications);
+ }
+
+ public void takePicture(ReadableMap options, Promise promise) {
+ if (!Build.FINGERPRINT.contains("generic")) {
+ if (mCameraView.isCameraOpened()) {
+ mCameraView.takePicture(options, promise);
+ } else {
+ promise.reject("E_CAMERA_UNAVAILABLE", "Camera is not running");
+ }
+ } else {
+ Bitmap image = RNCameraViewHelper.generateSimulatorPhoto(mCameraView.getWidth(), mCameraView.getHeight());
+ ByteBuffer byteBuffer = ByteBuffer.allocate(image.getRowBytes() * image.getHeight());
+ image.copyPixelsToBuffer(byteBuffer);
+ new ResolveTakenPictureAsyncTask(byteBuffer.array(), promise, options).execute();
+ }
+ }
+
+ public void record(final ReadableMap options, final Promise promise) {
+ // TODO fix this
+// RN.getInstance().getPermissions(new RN.PermissionsListener() {
+// @Override
+// public void permissionsGranted() {
+// if (mCameraView.isCameraOpened()) {
+// mCameraView.record(options, promise);
+// } else {
+// promise.reject("E_CAMERA_UNAVAILABLE", "Camera is not running");
+// }
+// }
+//
+// @Override
+// public void permissionsDenied() {
+// promise.reject(new SecurityException("User rejected audio permissions"));
+// }
+// }, new String[]{Manifest.permission.RECORD_AUDIO});
+
+ }
+
+ public void stopRecording() {
+ if (mCameraView.isCameraOpened()) {
+ mCameraView.stopRecording();
+ }
+ }
+
+ public Set getSupportedRatios() {
+ if (mCameraView.isCameraOpened()) {
+ return mCameraView.getSupportedAspectRatios();
+ }
+ return null;
+ }
+}
diff --git a/android/src/main/java/org/reactnative/camera/Constants.java b/android/src/main/java/org/reactnative/camera/Constants.java
new file mode 100644
index 0000000..9395bd4
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/Constants.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.reactnative.camera;
+
+import com.google.android.cameraview.AspectRatio;
+
+public interface Constants {
+
+ AspectRatio DEFAULT_ASPECT_RATIO = AspectRatio.of(4, 3);
+
+ int FACING_BACK = 0;
+ int FACING_FRONT = 1;
+
+ int FLASH_OFF = 0;
+ int FLASH_ON = 1;
+ int FLASH_TORCH = 2;
+ int FLASH_AUTO = 3;
+ int FLASH_RED_EYE = 4;
+
+ int LANDSCAPE_90 = 90;
+ int LANDSCAPE_270 = 270;
+
+ int WB_AUTO = 0;
+ int WB_CLOUDY = 1;
+ int WB_SUNNY = 2;
+ int WB_SHADOW = 3;
+ int WB_FLUORESCENT = 4;
+ int WB_INCANDESCENT = 5;
+}
diff --git a/android/src/main/java/org/reactnative/camera/RNCameraView.java b/android/src/main/java/org/reactnative/camera/RNCameraView.java
new file mode 100644
index 0000000..0912f92
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/RNCameraView.java
@@ -0,0 +1,316 @@
+package org.reactnative.camera;
+
+import android.Manifest;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.graphics.Color;
+import android.media.CamcorderProfile;
+import android.os.Build;
+import android.support.v4.content.ContextCompat;
+import android.util.SparseArray;
+import android.view.View;
+
+import org.reactnative.camera.tasks.BarCodeScannerAsyncTask;
+import org.reactnative.camera.tasks.BarCodeScannerAsyncTaskDelegate;
+import org.reactnative.camera.tasks.FaceDetectorAsyncTask;
+import org.reactnative.camera.tasks.FaceDetectorAsyncTaskDelegate;
+import org.reactnative.camera.tasks.ResolveTakenPictureAsyncTask;
+import org.reactnative.camera.utils.ImageDimensions;
+import org.reactnative.facedetector.RNFaceDetector;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.LifecycleEventListener;
+import com.facebook.react.bridge.Promise;
+import com.facebook.react.bridge.ReadableMap;
+import com.facebook.react.bridge.WritableMap;
+import com.facebook.react.uimanager.ThemedReactContext;
+import com.google.android.cameraview.CameraView;
+import com.google.android.gms.vision.face.Face;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.DecodeHintType;
+import com.google.zxing.MultiFormatReader;
+import com.google.zxing.Result;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+public class RNCameraView extends CameraView implements LifecycleEventListener, BarCodeScannerAsyncTaskDelegate, FaceDetectorAsyncTaskDelegate {
+ private Queue mPictureTakenPromises = new ConcurrentLinkedQueue<>();
+ private Map mPictureTakenOptions = new ConcurrentHashMap<>();
+ private Promise mVideoRecordedPromise;
+ private List mBarCodeTypes = null;
+
+ // Concurrency lock for scanners to avoid flooding the runtime
+ public volatile boolean barCodeScannerTaskLock = false;
+ public volatile boolean faceDetectorTaskLock = false;
+
+ // Scanning-related properties
+ private final MultiFormatReader mMultiFormatReader = new MultiFormatReader();
+ private final RNFaceDetector mFaceDetector;
+ private boolean mShouldDetectFaces = false;
+ private boolean mShouldScanBarCodes = false;
+ private int mFaceDetectorMode = RNFaceDetector.FAST_MODE;
+ private int mFaceDetectionLandmarks = RNFaceDetector.NO_LANDMARKS;
+ private int mFaceDetectionClassifications = RNFaceDetector.NO_CLASSIFICATIONS;
+
+ public RNCameraView(ThemedReactContext themedReactContext) {
+ super(themedReactContext);
+ initBarcodeReader();
+ mFaceDetector = new RNFaceDetector(themedReactContext);
+ setupFaceDetector();
+ themedReactContext.addLifecycleEventListener(this);
+
+ addCallback(new Callback() {
+ @Override
+ public void onCameraOpened(CameraView cameraView) {
+ RNCameraViewHelper.emitCameraReadyEvent(cameraView);
+ }
+
+ @Override
+ public void onMountError(CameraView cameraView) {
+ RNCameraViewHelper.emitMountErrorEvent(cameraView);
+ }
+
+ @Override
+ public void onPictureTaken(CameraView cameraView, final byte[] data) {
+ Promise promise = mPictureTakenPromises.poll();
+ ReadableMap options = mPictureTakenOptions.remove(promise);
+ new ResolveTakenPictureAsyncTask(data, promise, options).execute();
+ }
+
+ @Override
+ public void onVideoRecorded(CameraView cameraView, String path) {
+ if (mVideoRecordedPromise != null) {
+ if (path != null) {
+ WritableMap result = Arguments.createMap();
+ // TODO - fix this
+ //result.putString("uri", ExpFileUtils.uriFromFile(new File(path)).toString());
+ mVideoRecordedPromise.resolve(result);
+ } else {
+ mVideoRecordedPromise.reject("E_RECORDING", "Couldn't stop recording - there is none in progress");
+ }
+ mVideoRecordedPromise = null;
+ }
+ }
+
+ @Override
+ public void onFramePreview(CameraView cameraView, byte[] data, int width, int height, int rotation) {
+ int correctRotation = RNCameraViewHelper.getCorrectCameraRotation(rotation, getFacing());
+
+ if (mShouldScanBarCodes && !barCodeScannerTaskLock && cameraView instanceof BarCodeScannerAsyncTaskDelegate) {
+ barCodeScannerTaskLock = true;
+ BarCodeScannerAsyncTaskDelegate delegate = (BarCodeScannerAsyncTaskDelegate) cameraView;
+ new BarCodeScannerAsyncTask(delegate, mMultiFormatReader, data, width, height).execute();
+ }
+
+ if (mShouldDetectFaces && !faceDetectorTaskLock && cameraView instanceof FaceDetectorAsyncTaskDelegate) {
+ faceDetectorTaskLock = true;
+ FaceDetectorAsyncTaskDelegate delegate = (FaceDetectorAsyncTaskDelegate) cameraView;
+ new FaceDetectorAsyncTask(delegate, mFaceDetector, data, width, height, correctRotation).execute();
+ }
+ }
+ });
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ View preview = getView();
+ if (null == preview) {
+ return;
+ }
+ this.setBackgroundColor(Color.BLACK);
+ int width = right - left;
+ int height = bottom - top;
+ preview.layout(0, 0, width, height);
+ }
+
+ @Override
+ public void requestLayout() {
+ // React handles this for us, so we don't need to call super.requestLayout();
+ }
+
+ @Override
+ public void onViewAdded(View child) {
+ if (this.getView() == child || this.getView() == null) return;
+ // remove and readd view to make sure it is in the back.
+ // @TODO figure out why there was a z order issue in the first place and fix accordingly.
+ this.removeView(this.getView());
+ this.addView(this.getView(), 0);
+ }
+
+ public void setBarCodeTypes(List barCodeTypes) {
+ mBarCodeTypes = barCodeTypes;
+ initBarcodeReader();
+ }
+
+ public void takePicture(ReadableMap options, final Promise promise) {
+ mPictureTakenPromises.add(promise);
+ mPictureTakenOptions.put(promise, options);
+ super.takePicture();
+ }
+
+ public void record(ReadableMap options, final Promise promise) {
+// try {
+ // TODO - fix this
+ String path = "";
+ //String path = ExpFileUtils.generateOutputPath(CameraModule.getScopedContextSingleton().getCacheDir(), "Camera", ".mp4");
+ int maxDuration = options.hasKey("maxDuration") ? options.getInt("maxDuration") : -1;
+ int maxFileSize = options.hasKey("maxFileSize") ? options.getInt("maxFileSize") : -1;
+
+ CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
+ if (options.hasKey("quality")) {
+ profile = RNCameraViewHelper.getCamcorderProfile(options.getInt("quality"));
+ }
+
+ boolean recordAudio = !options.hasKey("mute");
+
+ if (super.record(path, maxDuration * 1000, maxFileSize, recordAudio, profile)) {
+ mVideoRecordedPromise = promise;
+ } else {
+ promise.reject("E_RECORDING_FAILED", "Starting video recording failed. Another recording might be in progress.");
+ }
+// } catch (IOException e) {
+// promise.reject("E_RECORDING_FAILED", "Starting video recording failed - could not create video file.");
+// }
+ }
+
+ /**
+ * Initialize the barcode decoder.
+ * Supports all iOS codes except [code138, code39mod43, itf14]
+ * Additionally supports [codabar, code128, maxicode, rss14, rssexpanded, upc_a, upc_ean]
+ */
+ private void initBarcodeReader() {
+ EnumMap hints = new EnumMap<>(DecodeHintType.class);
+ EnumSet decodeFormats = EnumSet.noneOf(BarcodeFormat.class);
+
+ if (mBarCodeTypes != null) {
+ for (String code : mBarCodeTypes) {
+ String formatString = (String) CameraModule.VALID_BARCODE_TYPES.get(code);
+ if (formatString != null) {
+ decodeFormats.add(BarcodeFormat.valueOf(code));
+ }
+ }
+ }
+
+ hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats);
+ mMultiFormatReader.setHints(hints);
+ }
+
+ public void setShouldScanBarCodes(boolean shouldScanBarCodes) {
+ this.mShouldScanBarCodes = shouldScanBarCodes;
+ setScanning(mShouldDetectFaces || mShouldScanBarCodes);
+ }
+
+ public void onBarCodeRead(Result barCode) {
+ String barCodeType = barCode.getBarcodeFormat().toString();
+ if (!mShouldScanBarCodes || !mBarCodeTypes.contains(barCodeType)) {
+ return;
+ }
+
+ RNCameraViewHelper.emitBarCodeReadEvent(this, barCode);
+ }
+
+ public void onBarCodeScanningTaskCompleted() {
+ barCodeScannerTaskLock = false;
+ mMultiFormatReader.reset();
+ }
+
+ /**
+ * Initial setup of the face detector
+ */
+ private void setupFaceDetector() {
+ mFaceDetector.setMode(mFaceDetectorMode);
+ mFaceDetector.setLandmarkType(mFaceDetectionLandmarks);
+ mFaceDetector.setClassificationType(mFaceDetectionClassifications);
+ mFaceDetector.setTracking(true);
+ }
+
+ public void setFaceDetectionLandmarks(int landmarks) {
+ mFaceDetectionLandmarks = landmarks;
+ if (mFaceDetector != null) {
+ mFaceDetector.setLandmarkType(landmarks);
+ }
+ }
+
+ public void setFaceDetectionClassifications(int classifications) {
+ mFaceDetectionClassifications = classifications;
+ if (mFaceDetector != null) {
+ mFaceDetector.setClassificationType(classifications);
+ }
+ }
+
+ public void setFaceDetectionMode(int mode) {
+ mFaceDetectorMode = mode;
+ if (mFaceDetector != null) {
+ mFaceDetector.setMode(mode);
+ }
+ }
+
+ public void setShouldDetectFaces(boolean shouldDetectFaces) {
+ this.mShouldDetectFaces = shouldDetectFaces;
+ setScanning(mShouldDetectFaces || mShouldScanBarCodes);
+ }
+
+ public void onFacesDetected(SparseArray facesReported, int sourceWidth, int sourceHeight, int sourceRotation) {
+ if (!mShouldDetectFaces) {
+ return;
+ }
+
+ SparseArray facesDetected = facesReported == null ? new SparseArray() : facesReported;
+
+ ImageDimensions dimensions = new ImageDimensions(sourceWidth, sourceHeight, sourceRotation, getFacing());
+ RNCameraViewHelper.emitFacesDetectedEvent(this, facesDetected, dimensions);
+ }
+
+ public void onFaceDetectionError(RNFaceDetector faceDetector) {
+ if (!mShouldDetectFaces) {
+ return;
+ }
+
+ RNCameraViewHelper.emitFaceDetectionErrorEvent(this, faceDetector);
+ }
+
+ @Override
+ public void onFaceDetectingTaskCompleted() {
+ faceDetectorTaskLock = false;
+ }
+
+ @Override
+ public void onHostResume() {
+ if (hasCameraPermissions()) {
+ if (!Build.FINGERPRINT.contains("generic")) {
+ start();
+ }
+ } else {
+ WritableMap error = Arguments.createMap();
+ error.putString("message", "Camera permissions not granted - component could not be rendered.");
+ RNCameraViewHelper.emitMountErrorEvent(this);
+ }
+ }
+
+ @Override
+ public void onHostPause() {
+ stop();
+ }
+
+ @Override
+ public void onHostDestroy() {
+ mFaceDetector.release();
+ stop();
+ }
+
+ private boolean hasCameraPermissions() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ int result = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA);
+ return result == PackageManager.PERMISSION_GRANTED;
+ } else {
+ return true;
+ }
+ }
+}
diff --git a/android/src/main/java/org/reactnative/camera/RNCameraViewHelper.java b/android/src/main/java/org/reactnative/camera/RNCameraViewHelper.java
new file mode 100644
index 0000000..4668670
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/RNCameraViewHelper.java
@@ -0,0 +1,170 @@
+package org.reactnative.camera;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.media.CamcorderProfile;
+import android.os.Build;
+import android.support.media.ExifInterface;
+import android.util.SparseArray;
+import android.view.ViewGroup;
+
+import org.reactnative.camera.events.BarCodeReadEvent;
+import org.reactnative.camera.events.CameraMountErrorEvent;
+import org.reactnative.camera.events.CameraReadyEvent;
+import org.reactnative.camera.events.FaceDetectionErrorEvent;
+import org.reactnative.camera.events.FacesDetectedEvent;
+import org.reactnative.camera.utils.ImageDimensions;
+import org.reactnative.facedetector.RNFaceDetector;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.ReactContext;
+import com.facebook.react.bridge.WritableMap;
+import com.facebook.react.uimanager.UIManagerModule;
+import com.google.android.cameraview.CameraView;
+import com.google.android.gms.vision.face.Face;
+import com.google.zxing.Result;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.UUID;
+
+public class RNCameraViewHelper {
+ // Mount error event
+
+ public static void emitMountErrorEvent(ViewGroup view) {
+ CameraMountErrorEvent event = CameraMountErrorEvent.obtain(view.getId());
+ ReactContext reactContext = (ReactContext) view.getContext();
+ reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher().dispatchEvent(event);
+ }
+
+ // Camera ready event
+
+ public static void emitCameraReadyEvent(ViewGroup view) {
+ CameraReadyEvent event = CameraReadyEvent.obtain(view.getId());
+ ReactContext reactContext = (ReactContext) view.getContext();
+ reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher().dispatchEvent(event);
+ }
+
+ // Face detection events
+
+ public static void emitFacesDetectedEvent(
+ ViewGroup view,
+ SparseArray faces,
+ ImageDimensions dimensions
+ ) {
+ float density = view.getResources().getDisplayMetrics().density;
+
+ double scaleX = (double) view.getWidth() / (dimensions.getWidth() * density);
+ double scaleY = (double) view.getHeight() / (dimensions.getHeight() * density);
+
+ FacesDetectedEvent event = FacesDetectedEvent.obtain(
+ view.getId(),
+ faces,
+ dimensions,
+ scaleX,
+ scaleY
+ );
+
+ ReactContext reactContext = (ReactContext) view.getContext();
+ reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher().dispatchEvent(event);
+ }
+
+ public static void emitFaceDetectionErrorEvent(ViewGroup view, RNFaceDetector faceDetector) {
+ FaceDetectionErrorEvent event = FaceDetectionErrorEvent.obtain(view.getId(), faceDetector);
+ ReactContext reactContext = (ReactContext) view.getContext();
+ reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher().dispatchEvent(event);
+ }
+
+ // Bar code read event
+
+ public static void emitBarCodeReadEvent(ViewGroup view, Result barCode) {
+ BarCodeReadEvent event = BarCodeReadEvent.obtain(view.getId(), barCode);
+ ReactContext reactContext = (ReactContext) view.getContext();
+ reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher().dispatchEvent(event);
+ }
+
+ // Utilities
+
+ public static int getCorrectCameraRotation(int rotation, int facing) {
+ if (facing == CameraView.FACING_FRONT) {
+ return (rotation - 90 + 360) % 360;
+ } else {
+ return (-rotation + 90 + 360) % 360;
+ }
+ }
+
+ public static CamcorderProfile getCamcorderProfile(int quality) {
+ CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
+ switch (quality) {
+ case CameraModule.VIDEO_2160P:
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ profile = CamcorderProfile.get(CamcorderProfile.QUALITY_2160P);
+ }
+ break;
+ case CameraModule.VIDEO_1080P:
+ profile = CamcorderProfile.get(CamcorderProfile.QUALITY_1080P);
+ break;
+ case CameraModule.VIDEO_720P:
+ profile = CamcorderProfile.get(CamcorderProfile.QUALITY_720P);
+ break;
+ case CameraModule.VIDEO_480P:
+ profile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
+ break;
+ case CameraModule.VIDEO_4x3:
+ profile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
+ profile.videoFrameWidth = 640;
+ break;
+ }
+ return profile;
+ }
+
+ public static WritableMap getExifData(ExifInterface exifInterface) {
+ WritableMap exifMap = Arguments.createMap();
+ // TODO - fix this
+// for (String[] tagInfo : ImagePickerModule.exifTags) {
+// String name = tagInfo[1];
+// if (exifInterface.getAttribute(name) != null) {
+// String type = tagInfo[0];
+// switch (type) {
+// case "string":
+// exifMap.putString(name, exifInterface.getAttribute(name));
+// break;
+// case "int":
+// exifMap.putInt(name, exifInterface.getAttributeInt(name, 0));
+// break;
+// case "double":
+// exifMap.putDouble(name, exifInterface.getAttributeDouble(name, 0));
+// break;
+// }
+// }
+// }
+
+ double[] latLong = exifInterface.getLatLong();
+ if (latLong != null) {
+ exifMap.putDouble(ExifInterface.TAG_GPS_LATITUDE, latLong[0]);
+ exifMap.putDouble(ExifInterface.TAG_GPS_LONGITUDE, latLong[1]);
+ exifMap.putDouble(ExifInterface.TAG_GPS_ALTITUDE, exifInterface.getAltitude(0));
+ }
+
+ return exifMap;
+ }
+
+ public static Bitmap generateSimulatorPhoto(int width, int height) {
+ Bitmap fakePhoto = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(fakePhoto);
+ Paint background = new Paint();
+ background.setColor(Color.BLACK);
+ canvas.drawRect(0, 0, width, height, background);
+ Paint textPaint = new Paint();
+ textPaint.setColor(Color.YELLOW);
+ textPaint.setTextSize(35);
+ Calendar calendar = Calendar.getInstance();
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.YY HH:mm:ss", Locale.getDefault());
+ canvas.drawText(simpleDateFormat.format(calendar.getTime()), width * 0.1f, height * 0.9f, textPaint);
+ return fakePhoto;
+ }
+}
diff --git a/android/src/main/java/org/reactnative/camera/events/BarCodeReadEvent.java b/android/src/main/java/org/reactnative/camera/events/BarCodeReadEvent.java
new file mode 100644
index 0000000..f4b26c5
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/events/BarCodeReadEvent.java
@@ -0,0 +1,68 @@
+package org.reactnative.camera.events;
+
+import android.support.v4.util.Pools;
+
+import org.reactnative.camera.CameraViewManager;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.WritableMap;
+import com.facebook.react.uimanager.events.Event;
+import com.facebook.react.uimanager.events.RCTEventEmitter;
+import com.google.zxing.Result;
+
+import java.util.Date;
+
+public class BarCodeReadEvent extends Event {
+ private static final Pools.SynchronizedPool EVENTS_POOL =
+ new Pools.SynchronizedPool<>(3);
+
+ private Result mBarCode;
+
+ private BarCodeReadEvent() {}
+
+ public static BarCodeReadEvent obtain(int viewTag, Result barCode) {
+ BarCodeReadEvent event = EVENTS_POOL.acquire();
+ if (event == null) {
+ event = new BarCodeReadEvent();
+ }
+ event.init(viewTag);
+ return event;
+ }
+
+ private void init(int viewTag, Result barCode) {
+ super.init(viewTag);
+ mBarCode = barCode;
+ }
+
+ /**
+ * We want every distinct barcode to be reported to the JS listener.
+ * If we return some static value as a coalescing key there may be two barcode events
+ * containing two different barcodes waiting to be transmitted to JS
+ * that would get coalesced (because both of them would have the same coalescing key).
+ * So let's differentiate them with a hash of the contents (mod short's max value).
+ */
+ @Override
+ public short getCoalescingKey() {
+ int hashCode = mBarCode.getText().hashCode() % Short.MAX_VALUE;
+ return (short) hashCode;
+ }
+
+ @Override
+ public String getEventName() {
+ return CameraViewManager.Events.EVENT_ON_BAR_CODE_READ.toString();
+ }
+
+ @Override
+ public void dispatch(RCTEventEmitter rctEventEmitter) {
+ rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
+ }
+
+ private WritableMap serializeEventData() {
+ WritableMap event = Arguments.createMap();
+
+ event.putInt("target", getViewTag());
+ event.putString("data", mBarCode.getText());
+ event.putString("type", mBarCode.getBarcodeFormat().toString());
+
+ return event;
+ }
+}
diff --git a/android/src/main/java/org/reactnative/camera/events/CameraMountErrorEvent.java b/android/src/main/java/org/reactnative/camera/events/CameraMountErrorEvent.java
new file mode 100644
index 0000000..ce2e9a5
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/events/CameraMountErrorEvent.java
@@ -0,0 +1,44 @@
+package org.reactnative.camera.events;
+
+import android.support.v4.util.Pools;
+
+import org.reactnative.camera.CameraViewManager;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.WritableMap;
+import com.facebook.react.uimanager.events.Event;
+import com.facebook.react.uimanager.events.RCTEventEmitter;
+
+import java.util.Date;
+
+public class CameraMountErrorEvent extends Event {
+ private static final Pools.SynchronizedPool EVENTS_POOL = new Pools.SynchronizedPool<>(3);
+ private CameraMountErrorEvent() {}
+
+ public static CameraMountErrorEvent obtain(int viewTag) {
+ CameraMountErrorEvent event = EVENTS_POOL.acquire();
+ if (event == null) {
+ event = new CameraMountErrorEvent();
+ }
+ event.init(viewTag);
+ return event;
+ }
+
+ @Override
+ public short getCoalescingKey() {
+ return 0;
+ }
+
+ @Override
+ public String getEventName() {
+ return CameraViewManager.Events.EVENT_ON_MOUNT_ERROR.toString();
+ }
+
+ @Override
+ public void dispatch(RCTEventEmitter rctEventEmitter) {
+ rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
+ }
+
+ private WritableMap serializeEventData() {
+ return Arguments.createMap();
+ }
+}
diff --git a/android/src/main/java/org/reactnative/camera/events/CameraReadyEvent.java b/android/src/main/java/org/reactnative/camera/events/CameraReadyEvent.java
new file mode 100644
index 0000000..43cb863
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/events/CameraReadyEvent.java
@@ -0,0 +1,44 @@
+package org.reactnative.camera.events;
+
+import android.support.v4.util.Pools;
+
+import org.reactnative.camera.CameraViewManager;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.WritableMap;
+import com.facebook.react.uimanager.events.Event;
+import com.facebook.react.uimanager.events.RCTEventEmitter;
+
+import java.util.Date;
+
+public class CameraReadyEvent extends Event {
+ private static final Pools.SynchronizedPool EVENTS_POOL = new Pools.SynchronizedPool<>(3);
+ private CameraReadyEvent() {}
+
+ public static CameraReadyEvent obtain(int viewTag) {
+ CameraReadyEvent event = EVENTS_POOL.acquire();
+ if (event == null) {
+ event = new CameraReadyEvent();
+ }
+ event.init(viewTag);
+ return event;
+ }
+
+ @Override
+ public short getCoalescingKey() {
+ return 0;
+ }
+
+ @Override
+ public String getEventName() {
+ return CameraViewManager.Events.EVENT_CAMERA_READY.toString();
+ }
+
+ @Override
+ public void dispatch(RCTEventEmitter rctEventEmitter) {
+ rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
+ }
+
+ private WritableMap serializeEventData() {
+ return Arguments.createMap();
+ }
+}
diff --git a/android/src/main/java/org/reactnative/camera/events/FaceDetectionErrorEvent.java b/android/src/main/java/org/reactnative/camera/events/FaceDetectionErrorEvent.java
new file mode 100644
index 0000000..54f43b1
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/events/FaceDetectionErrorEvent.java
@@ -0,0 +1,53 @@
+package org.reactnative.camera.events;
+
+import android.support.v4.util.Pools;
+
+import org.reactnative.camera.CameraViewManager;
+import org.reactnative.facedetector.RNFaceDetector;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.WritableMap;
+import com.facebook.react.uimanager.events.Event;
+import com.facebook.react.uimanager.events.RCTEventEmitter;
+
+import java.util.Date;
+
+public class FaceDetectionErrorEvent extends Event {
+ private static final Pools.SynchronizedPool EVENTS_POOL = new Pools.SynchronizedPool<>(3);
+ private RNFaceDetector mFaceDetector;
+ private FaceDetectionErrorEvent() {}
+
+ public static FaceDetectionErrorEvent obtain(int viewTag, RNFaceDetector faceDetector) {
+ FaceDetectionErrorEvent event = EVENTS_POOL.acquire();
+ if (event == null) {
+ event = new FaceDetectionErrorEvent();
+ }
+ event.init(viewTag);
+ return event;
+ }
+
+ private void init(int viewTag, RNFaceDetector faceDetector) {
+ super.init(viewTag);
+ mFaceDetector = faceDetector;
+ }
+
+ @Override
+ public short getCoalescingKey() {
+ return 0;
+ }
+
+ @Override
+ public String getEventName() {
+ return CameraViewManager.Events.EVENT_ON_MOUNT_ERROR.toString();
+ }
+
+ @Override
+ public void dispatch(RCTEventEmitter rctEventEmitter) {
+ rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
+ }
+
+ private WritableMap serializeEventData() {
+ WritableMap map = Arguments.createMap();
+ map.putBoolean("isOperational", mFaceDetector.isOperational());
+ return map;
+ }
+}
diff --git a/android/src/main/java/org/reactnative/camera/events/FacesDetectedEvent.java b/android/src/main/java/org/reactnative/camera/events/FacesDetectedEvent.java
new file mode 100644
index 0000000..e8472b4
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/events/FacesDetectedEvent.java
@@ -0,0 +1,103 @@
+package org.reactnative.camera.events;
+
+import android.support.v4.util.Pools;
+import android.util.SparseArray;
+
+import org.reactnative.camera.CameraViewManager;
+import org.reactnative.camera.utils.ImageDimensions;
+import org.reactnative.facedetector.FaceDetectorUtils;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.WritableArray;
+import com.facebook.react.bridge.WritableMap;
+import com.facebook.react.uimanager.events.Event;
+import com.facebook.react.uimanager.events.RCTEventEmitter;
+import com.google.android.cameraview.CameraView;
+import com.google.android.gms.vision.face.Face;
+
+import java.util.Date;
+
+public class FacesDetectedEvent extends Event {
+ private static final Pools.SynchronizedPool EVENTS_POOL =
+ new Pools.SynchronizedPool<>(3);
+
+ private double mScaleX;
+ private double mScaleY;
+ private SparseArray mFaces;
+ private ImageDimensions mImageDimensions;
+
+ private FacesDetectedEvent() {}
+
+ public static FacesDetectedEvent obtain(
+ int viewTag,
+ SparseArray faces,
+ ImageDimensions dimensions,
+ double scaleX,
+ double scaleY
+ ) {
+ FacesDetectedEvent event = EVENTS_POOL.acquire();
+ if (event == null) {
+ event = new FacesDetectedEvent();
+ }
+ event.init(viewTag, faces, dimensions, scaleX, scaleY);
+ return event;
+ }
+
+ private void init(
+ int viewTag,
+ SparseArray faces,
+ ImageDimensions dimensions,
+ double scaleX,
+ double scaleY
+ ) {
+ super.init(viewTag);
+ mFaces = faces;
+ mImageDimensions = dimensions;
+ mScaleX = scaleX;
+ mScaleY = scaleY;
+ }
+
+ /**
+ * note(@sjchmiela)
+ * Should the events about detected faces coalesce, the best strategy will be
+ * to ensure that events with different faces count are always being transmitted.
+ */
+ @Override
+ public short getCoalescingKey() {
+ if (mFaces.size() > Short.MAX_VALUE) {
+ return Short.MAX_VALUE;
+ }
+
+ return (short) mFaces.size();
+ }
+
+ @Override
+ public String getEventName() {
+ return CameraViewManager.Events.EVENT_ON_FACES_DETECTED.toString();
+ }
+
+ @Override
+ public void dispatch(RCTEventEmitter rctEventEmitter) {
+ rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
+ }
+
+ private WritableMap serializeEventData() {
+ WritableArray facesList = Arguments.createArray();
+
+ for(int i = 0; i < mFaces.size(); i++) {
+ Face face = mFaces.valueAt(i);
+ WritableMap serializedFace = FaceDetectorUtils.serializeFace(face, mScaleX, mScaleY);
+ if (mImageDimensions.getFacing() == CameraView.FACING_FRONT) {
+ serializedFace = FaceDetectorUtils.rotateFaceX(serializedFace, mImageDimensions.getWidth(), mScaleX);
+ } else {
+ serializedFace = FaceDetectorUtils.changeAnglesDirection(serializedFace);
+ }
+ facesList.pushMap(serializedFace);
+ }
+
+ WritableMap event = Arguments.createMap();
+ event.putString("type", "face");
+ event.putArray("faces", facesList);
+ event.putInt("target", getViewTag());
+ return event;
+ }
+}
diff --git a/android/src/main/java/org/reactnative/camera/tasks/BarCodeScannerAsyncTask.java b/android/src/main/java/org/reactnative/camera/tasks/BarCodeScannerAsyncTask.java
new file mode 100644
index 0000000..8c3e1d6
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/tasks/BarCodeScannerAsyncTask.java
@@ -0,0 +1,74 @@
+package org.reactnative.camera.tasks;
+
+import com.google.zxing.BinaryBitmap;
+import com.google.zxing.MultiFormatReader;
+import com.google.zxing.NotFoundException;
+import com.google.zxing.PlanarYUVLuminanceSource;
+import com.google.zxing.Result;
+import com.google.zxing.common.HybridBinarizer;
+
+public class BarCodeScannerAsyncTask extends android.os.AsyncTask {
+ private byte[] mImageData;
+ private int mWidth;
+ private int mHeight;
+ private BarCodeScannerAsyncTaskDelegate mDelegate;
+ private final MultiFormatReader mMultiFormatReader;
+
+ // note(sjchmiela): From my short research it's ok to ignore rotation of the image.
+ public BarCodeScannerAsyncTask(
+ BarCodeScannerAsyncTaskDelegate delegate,
+ MultiFormatReader multiFormatReader,
+ byte[] imageData,
+ int width,
+ int height
+ ) {
+ mImageData = imageData;
+ mWidth = width;
+ mHeight = height;
+ mDelegate = delegate;
+ mMultiFormatReader = multiFormatReader;
+ }
+
+ @Override
+ protected Result doInBackground(Void... ignored) {
+ if (isCancelled() || mDelegate == null) {
+ return null;
+ }
+
+ Result result = null;
+
+ try {
+ BinaryBitmap bitmap = generateBitmapFromImageData(mImageData, mWidth, mHeight);
+ result = mMultiFormatReader.decodeWithState(bitmap);
+ } catch (NotFoundException e) {
+ // No barcode found, result is already null.
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+
+ return result;
+ }
+
+ @Override
+ protected void onPostExecute(Result result) {
+ super.onPostExecute(result);
+ if (result != null) {
+ mDelegate.onBarCodeRead(result);
+ }
+ mDelegate.onBarCodeScanningTaskCompleted();
+ }
+
+ private BinaryBitmap generateBitmapFromImageData(byte[] imageData, int width, int height) {
+ PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(
+ imageData, // byte[] yuvData
+ width, // int dataWidth
+ height, // int dataHeight
+ 0, // int left
+ 0, // int top
+ width, // int width
+ height, // int height
+ false // boolean reverseHorizontal
+ );
+ return new BinaryBitmap(new HybridBinarizer(source));
+ }
+}
diff --git a/android/src/main/java/org/reactnative/camera/tasks/BarCodeScannerAsyncTaskDelegate.java b/android/src/main/java/org/reactnative/camera/tasks/BarCodeScannerAsyncTaskDelegate.java
new file mode 100644
index 0000000..b23b515
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/tasks/BarCodeScannerAsyncTaskDelegate.java
@@ -0,0 +1,8 @@
+package org.reactnative.camera.tasks;
+
+import com.google.zxing.Result;
+
+public interface BarCodeScannerAsyncTaskDelegate {
+ void onBarCodeRead(Result barCode);
+ void onBarCodeScanningTaskCompleted();
+}
diff --git a/android/src/main/java/org/reactnative/camera/tasks/FaceDetectorAsyncTask.java b/android/src/main/java/org/reactnative/camera/tasks/FaceDetectorAsyncTask.java
new file mode 100644
index 0000000..9ad5986
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/tasks/FaceDetectorAsyncTask.java
@@ -0,0 +1,55 @@
+package org.reactnative.camera.tasks;
+
+import android.util.SparseArray;
+
+import org.reactnative.facedetector.RNFaceDetector;
+import org.reactnative.facedetector.RNFrame;
+import org.reactnative.facedetector.RNFrameFactory;
+import com.google.android.gms.vision.face.Face;
+
+public class FaceDetectorAsyncTask extends android.os.AsyncTask> {
+ private byte[] mImageData;
+ private int mWidth;
+ private int mHeight;
+ private int mRotation;
+ private RNFaceDetector mFaceDetector;
+ private FaceDetectorAsyncTaskDelegate mDelegate;
+
+ public FaceDetectorAsyncTask(
+ FaceDetectorAsyncTaskDelegate delegate,
+ RNFaceDetector faceDetector,
+ byte[] imageData,
+ int width,
+ int height,
+ int rotation
+ ) {
+ mImageData = imageData;
+ mWidth = width;
+ mHeight = height;
+ mRotation = rotation;
+ mDelegate = delegate;
+ mFaceDetector = faceDetector;
+ }
+
+ @Override
+ protected SparseArray doInBackground(Void... ignored) {
+ if (isCancelled() || mDelegate == null || mFaceDetector == null || !mFaceDetector.isOperational()) {
+ return null;
+ }
+
+ RNFrame frame = RNFrameFactory.buildFrame(mImageData, mWidth, mHeight, mRotation);
+ return mFaceDetector.detect(frame);
+ }
+
+ @Override
+ protected void onPostExecute(SparseArray faces) {
+ super.onPostExecute(faces);
+
+ if (faces == null) {
+ mDelegate.onFaceDetectionError(mFaceDetector);
+ } else {
+ mDelegate.onFacesDetected(faces, mWidth, mHeight, mRotation);
+ mDelegate.onFaceDetectingTaskCompleted();
+ }
+ }
+}
diff --git a/android/src/main/java/org/reactnative/camera/tasks/FaceDetectorAsyncTaskDelegate.java b/android/src/main/java/org/reactnative/camera/tasks/FaceDetectorAsyncTaskDelegate.java
new file mode 100644
index 0000000..abd03fa
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/tasks/FaceDetectorAsyncTaskDelegate.java
@@ -0,0 +1,12 @@
+package org.reactnative.camera.tasks;
+
+import android.util.SparseArray;
+
+import org.reactnative.facedetector.RNFaceDetector;
+import com.google.android.gms.vision.face.Face;
+
+public interface FaceDetectorAsyncTaskDelegate {
+ void onFacesDetected(SparseArray face, int sourceWidth, int sourceHeight, int sourceRotation);
+ void onFaceDetectionError(RNFaceDetector faceDetector);
+ void onFaceDetectingTaskCompleted();
+}
diff --git a/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java b/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java
new file mode 100644
index 0000000..2bd4d67
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/tasks/ResolveTakenPictureAsyncTask.java
@@ -0,0 +1,75 @@
+package org.reactnative.camera.tasks;
+
+import android.content.res.Resources;
+import android.graphics.Matrix;
+import android.os.AsyncTask;
+
+import org.reactnative.MutableImage;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.Promise;
+import com.facebook.react.bridge.ReadableMap;
+import com.facebook.react.bridge.WritableMap;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+public class ResolveTakenPictureAsyncTask extends AsyncTask {
+ private static final String ERROR_TAG = "E_TAKING_PICTURE_FAILED";
+ private Promise mPromise;
+ private byte[] mImageData;
+ private ReadableMap mOptions;
+
+ public ResolveTakenPictureAsyncTask(byte[] imageData, Promise promise, ReadableMap options) {
+ mPromise = promise;
+ mOptions = options;
+ mImageData = imageData;
+ }
+
+ private int getQuality() {
+ return (int) (mOptions.getDouble("quality") * 100);
+ }
+
+ @Override
+ protected WritableMap doInBackground(Void... voids) {
+ WritableMap response = Arguments.createMap();
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(mImageData);
+
+ try {
+ MutableImage mutableImage = new MutableImage(mImageData);
+ mutableImage.mirrorImage();
+ mutableImage.fixOrientation();
+ String encoded = mutableImage.toBase64(getQuality());
+
+ response.putString("base64", encoded);
+
+ return response;
+ } catch (Resources.NotFoundException e) {
+ mPromise.reject(ERROR_TAG, "Documents directory of the app could not be found.", e);
+ e.printStackTrace();
+ } catch (MutableImage.ImageMutationFailedException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // An exception had to occur, promise has already been rejected. Do not try to resolve it again.
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(WritableMap response) {
+ super.onPostExecute(response);
+
+ // If the response is not null everything went well and we can resolve the promise.
+ if (response != null) {
+ mPromise.resolve(response);
+ }
+ }
+
+}
diff --git a/android/src/main/java/org/reactnative/camera/utils/ImageDimensions.java b/android/src/main/java/org/reactnative/camera/utils/ImageDimensions.java
new file mode 100644
index 0000000..4e13205
--- /dev/null
+++ b/android/src/main/java/org/reactnative/camera/utils/ImageDimensions.java
@@ -0,0 +1,64 @@
+package org.reactnative.camera.utils;
+
+public class ImageDimensions {
+ private int mWidth;
+ private int mHeight;
+ private int mFacing;
+ private int mRotation;
+
+ public ImageDimensions(int width, int height) {
+ this(width, height, 0);
+ }
+
+ public ImageDimensions(int width, int height, int rotation) {
+ this(width, height, rotation, -1);
+ }
+
+ public ImageDimensions(int width, int height, int rotation, int facing) {
+ mWidth = width;
+ mHeight = height;
+ mFacing = facing;
+ mRotation = rotation;
+ }
+
+ public boolean isLandscape() {
+ return mRotation % 180 == 90;
+ }
+
+ public int getWidth() {
+ if (isLandscape()) {
+ return mHeight;
+ }
+
+ return mWidth;
+ }
+
+ public int getHeight() {
+ if (isLandscape()) {
+ return mWidth;
+ }
+
+ return mHeight;
+ }
+
+ public int getRotation() {
+ return mRotation;
+ }
+
+ public int getFacing() {
+ return mFacing;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof ImageDimensions) {
+ ImageDimensions otherDimensions = (ImageDimensions) obj;
+ return (otherDimensions.getWidth() == getWidth() &&
+ otherDimensions.getHeight() == getHeight() &&
+ otherDimensions.getFacing() == getFacing() &&
+ otherDimensions.getRotation() == getRotation());
+ } else {
+ return super.equals(obj);
+ }
+ }
+}
diff --git a/android/src/main/java/org/reactnative/facedetector/FaceDetectorModule.java b/android/src/main/java/org/reactnative/facedetector/FaceDetectorModule.java
new file mode 100644
index 0000000..03a0916
--- /dev/null
+++ b/android/src/main/java/org/reactnative/facedetector/FaceDetectorModule.java
@@ -0,0 +1,76 @@
+package org.reactnative.facedetector;
+
+import android.content.Context;
+
+import org.reactnative.facedetector.tasks.FileFaceDetectionAsyncTask;
+import com.facebook.react.bridge.Promise;
+import com.facebook.react.bridge.ReactApplicationContext;
+import com.facebook.react.bridge.ReactContextBaseJavaModule;
+import com.facebook.react.bridge.ReactMethod;
+import com.facebook.react.bridge.ReadableMap;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Nullable;
+
+public class FaceDetectorModule extends ReactContextBaseJavaModule {
+ private static final String TAG = "RNFaceDetector";
+// private ScopedContext mScopedContext;
+private static ReactApplicationContext mScopedContext;
+
+ public FaceDetectorModule(ReactApplicationContext reactContext) {
+ super(reactContext);
+ mScopedContext = reactContext;
+ }
+
+ @Override
+ public String getName() {
+ return TAG;
+ }
+
+ @Nullable
+ @Override
+ public Map getConstants() {
+ return Collections.unmodifiableMap(new HashMap() {
+ {
+ put("Mode", getFaceDetectionModeConstants());
+ put("Landmarks", getFaceDetectionLandmarksConstants());
+ put("Classifications", getFaceDetectionClassificationsConstants());
+ }
+
+ private Map getFaceDetectionModeConstants() {
+ return Collections.unmodifiableMap(new HashMap() {
+ {
+ put("fast", RNFaceDetector.FAST_MODE);
+ put("accurate", RNFaceDetector.ACCURATE_MODE);
+ }
+ });
+ }
+
+ private Map getFaceDetectionClassificationsConstants() {
+ return Collections.unmodifiableMap(new HashMap() {
+ {
+ put("all", RNFaceDetector.ALL_CLASSIFICATIONS);
+ put("none", RNFaceDetector.NO_CLASSIFICATIONS);
+ }
+ });
+ }
+
+ private Map getFaceDetectionLandmarksConstants() {
+ return Collections.unmodifiableMap(new HashMap() {
+ {
+ put("all", RNFaceDetector.ALL_LANDMARKS);
+ put("none", RNFaceDetector.NO_LANDMARKS);
+ }
+ });
+ }
+ });
+ }
+
+ @ReactMethod
+ public void detectFaces(ReadableMap options, final Promise promise) {
+ new FileFaceDetectionAsyncTask(mScopedContext, options, promise).execute();
+ }
+}
diff --git a/android/src/main/java/org/reactnative/facedetector/FaceDetectorUtils.java b/android/src/main/java/org/reactnative/facedetector/FaceDetectorUtils.java
new file mode 100644
index 0000000..a4839b1
--- /dev/null
+++ b/android/src/main/java/org/reactnative/facedetector/FaceDetectorUtils.java
@@ -0,0 +1,120 @@
+package org.reactnative.facedetector;
+
+import android.graphics.PointF;
+
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.ReadableMap;
+import com.facebook.react.bridge.WritableMap;
+import com.google.android.gms.vision.face.Face;
+import com.google.android.gms.vision.face.Landmark;
+
+public class FaceDetectorUtils {
+ // All the landmarks reported by Google Mobile Vision in constants' order.
+ // https://developers.google.com/android/reference/com/google/android/gms/vision/face/Landmark
+ private static final String[] landmarkNames = {
+ "bottomMouthPosition", "leftCheekPosition", "leftEarPosition", "leftEarTipPosition",
+ "leftEyePosition", "leftMouthPosition", "noseBasePosition", "rightCheekPosition",
+ "rightEarPosition", "rightEarTipPosition", "rightEyePosition", "rightMouthPosition"
+ };
+
+ public static WritableMap serializeFace(Face face) {
+ return serializeFace(face, 1, 1);
+ }
+
+ public static WritableMap serializeFace(Face face, double scaleX, double scaleY) {
+ WritableMap encodedFace = Arguments.createMap();
+
+ encodedFace.putInt("faceID", face.getId());
+ encodedFace.putDouble("rollAngle", face.getEulerZ());
+ encodedFace.putDouble("yawAngle", face.getEulerY());
+
+ if (face.getIsSmilingProbability() >= 0) {
+ encodedFace.putDouble("smilingProbability", face.getIsSmilingProbability());
+ }
+ if (face.getIsLeftEyeOpenProbability() >= 0) {
+ encodedFace.putDouble("leftEyeOpenProbability", face.getIsLeftEyeOpenProbability());
+ }
+ if (face.getIsRightEyeOpenProbability() >= 0) {
+ encodedFace.putDouble("rightEyeOpenProbability", face.getIsRightEyeOpenProbability());
+ }
+
+ for(Landmark landmark : face.getLandmarks()) {
+ encodedFace.putMap(landmarkNames[landmark.getType()], mapFromPoint(landmark.getPosition(), scaleX, scaleY));
+ }
+
+ WritableMap origin = Arguments.createMap();
+ origin.putDouble("x", face.getPosition().x * scaleX);
+ origin.putDouble("y", face.getPosition().y * scaleY);
+
+ WritableMap size = Arguments.createMap();
+ size.putDouble("width", face.getWidth() * scaleX);
+ size.putDouble("height", face.getHeight() * scaleY);
+
+ WritableMap bounds = Arguments.createMap();
+ bounds.putMap("origin", origin);
+ bounds.putMap("size", size);
+
+ encodedFace.putMap("bounds", bounds);
+
+ return encodedFace;
+ }
+
+ public static WritableMap rotateFaceX(WritableMap face, int sourceWidth, double scaleX) {
+ ReadableMap faceBounds = face.getMap("bounds");
+
+ ReadableMap oldOrigin = faceBounds.getMap("origin");
+ WritableMap mirroredOrigin = positionMirroredHorizontally(oldOrigin, sourceWidth, scaleX);
+
+ double translateX = -faceBounds.getMap("size").getDouble("width");
+ WritableMap translatedMirroredOrigin = positionTranslatedHorizontally(mirroredOrigin, translateX);
+
+ WritableMap newBounds = Arguments.createMap();
+ newBounds.merge(faceBounds);
+ newBounds.putMap("origin", translatedMirroredOrigin);
+
+ for (String landmarkName : landmarkNames) {
+ ReadableMap landmark = face.hasKey(landmarkName) ? face.getMap(landmarkName) : null;
+ if (landmark != null) {
+ WritableMap mirroredPosition = positionMirroredHorizontally(landmark, sourceWidth, scaleX);
+ face.putMap(landmarkName, mirroredPosition);
+ }
+ }
+
+ face.putMap("bounds", newBounds);
+
+ return face;
+ }
+
+ public static WritableMap changeAnglesDirection(WritableMap face) {
+ face.putDouble("rollAngle", (-face.getDouble("rollAngle") + 360) % 360);
+ face.putDouble("yawAngle", (-face.getDouble("yawAngle") + 360) % 360);
+ return face;
+ }
+
+ public static WritableMap mapFromPoint(PointF point, double scaleX, double scaleY) {
+ WritableMap map = Arguments.createMap();
+ map.putDouble("x", point.x * scaleX);
+ map.putDouble("y", point.y * scaleY);
+ return map;
+ }
+
+ public static WritableMap positionTranslatedHorizontally(ReadableMap position, double translateX) {
+ WritableMap newPosition = Arguments.createMap();
+ newPosition.merge(position);
+ newPosition.putDouble("x", position.getDouble("x") + translateX);
+ return newPosition;
+ }
+
+ public static WritableMap positionMirroredHorizontally(ReadableMap position, int containerWidth, double scaleX) {
+ WritableMap newPosition = Arguments.createMap();
+ newPosition.merge(position);
+ newPosition.putDouble("x", valueMirroredHorizontally(position.getDouble("x"), containerWidth, scaleX));
+ return newPosition;
+ }
+
+ public static double valueMirroredHorizontally(double elementX, int containerWidth, double scaleX) {
+ double originalX = elementX / scaleX;
+ double mirroredX = containerWidth - originalX;
+ return mirroredX * scaleX;
+ }
+}
diff --git a/android/src/main/java/org/reactnative/facedetector/RNFaceDetector.java b/android/src/main/java/org/reactnative/facedetector/RNFaceDetector.java
new file mode 100644
index 0000000..91c58a8
--- /dev/null
+++ b/android/src/main/java/org/reactnative/facedetector/RNFaceDetector.java
@@ -0,0 +1,113 @@
+package org.reactnative.facedetector;
+
+import android.content.Context;
+import android.util.Log;
+import android.util.SparseArray;
+
+import org.reactnative.camera.utils.ImageDimensions;
+import com.google.android.gms.vision.face.Face;
+import com.google.android.gms.vision.face.FaceDetector;
+
+public class RNFaceDetector {
+ public static int ALL_CLASSIFICATIONS = FaceDetector.ALL_CLASSIFICATIONS;
+ public static int NO_CLASSIFICATIONS = FaceDetector.NO_CLASSIFICATIONS;
+ public static int ALL_LANDMARKS = FaceDetector.ALL_LANDMARKS;
+ public static int NO_LANDMARKS = FaceDetector.NO_LANDMARKS;
+ public static int ACCURATE_MODE = FaceDetector.ACCURATE_MODE;
+ public static int FAST_MODE = FaceDetector.FAST_MODE;
+
+ private FaceDetector mFaceDetector = null;
+ private ImageDimensions mPreviousDimensions;
+ private FaceDetector.Builder mBuilder = null;
+
+ private int mClassificationType = NO_CLASSIFICATIONS;
+ private int mLandmarkType = NO_LANDMARKS;
+ private float mMinFaceSize = 0.15f;
+ private int mMode = FAST_MODE;
+
+ public RNFaceDetector(Context context) {
+ mBuilder = new FaceDetector.Builder(context);
+ mBuilder.setMinFaceSize(mMinFaceSize);
+ mBuilder.setMode(mMode);
+ mBuilder.setLandmarkType(mLandmarkType);
+ mBuilder.setClassificationType(mClassificationType);
+ }
+
+ // Public API
+
+ public boolean isOperational() {
+ if (mFaceDetector == null) {
+ createFaceDetector();
+ }
+
+ return mFaceDetector.isOperational();
+ }
+
+ public SparseArray detect(RNFrame frame) {
+ // If the frame has different dimensions, create another face detector.
+ // Otherwise we will get nasty "inconsistent image dimensions" error from detector
+ // and no face will be detected.
+ if (!frame.getDimensions().equals(mPreviousDimensions)) {
+ releaseFaceDetector();
+ }
+
+ if (mFaceDetector == null) {
+ createFaceDetector();
+ mPreviousDimensions = frame.getDimensions();
+ }
+
+ return mFaceDetector.detect(frame.getFrame());
+ }
+
+ public void setTracking(boolean trackingEnabled) {
+ release();
+ mBuilder.setTrackingEnabled(trackingEnabled);
+ }
+
+ public void setClassificationType(int classificationType) {
+ if (classificationType != mClassificationType) {
+ release();
+ mBuilder.setClassificationType(classificationType);
+ mClassificationType = classificationType;
+ }
+ }
+
+ public void setLandmarkType(int landmarkType) {
+ if (landmarkType != mLandmarkType) {
+ release();
+ mBuilder.setLandmarkType(landmarkType);
+ mLandmarkType = landmarkType;
+ }
+ }
+
+ public void setMode(int mode) {
+ if (mode != mMode) {
+ release();
+ mBuilder.setMode(mode);
+ mMode = mode;
+ }
+ }
+
+ public void setTrackingEnabled(boolean tracking) {
+ release();
+ mBuilder.setTrackingEnabled(tracking);
+ }
+
+ public void release() {
+ releaseFaceDetector();
+ mPreviousDimensions = null;
+ }
+
+ // Lifecycle methods
+
+ private void releaseFaceDetector() {
+ if (mFaceDetector != null) {
+ mFaceDetector.release();
+ mFaceDetector = null;
+ }
+ }
+
+ private void createFaceDetector() {
+ mFaceDetector = mBuilder.build();
+ }
+}
diff --git a/android/src/main/java/org/reactnative/facedetector/RNFrame.java b/android/src/main/java/org/reactnative/facedetector/RNFrame.java
new file mode 100644
index 0000000..80295f7
--- /dev/null
+++ b/android/src/main/java/org/reactnative/facedetector/RNFrame.java
@@ -0,0 +1,28 @@
+package org.reactnative.facedetector;
+
+import org.reactnative.camera.utils.ImageDimensions;
+import com.google.android.gms.vision.Frame;
+
+/**
+ * Wrapper around Frame allowing us to track Frame dimensions.
+ * Tracking dimensions is used in RNFaceDetector to provide painless FaceDetector recreation
+ * when image dimensions change.
+ */
+
+public class RNFrame {
+ private Frame mFrame;
+ private ImageDimensions mDimensions;
+
+ public RNFrame(Frame frame, ImageDimensions dimensions) {
+ mFrame = frame;
+ mDimensions = dimensions;
+ }
+
+ public Frame getFrame() {
+ return mFrame;
+ }
+
+ public ImageDimensions getDimensions() {
+ return mDimensions;
+ }
+}
diff --git a/android/src/main/java/org/reactnative/facedetector/RNFrameFactory.java b/android/src/main/java/org/reactnative/facedetector/RNFrameFactory.java
new file mode 100644
index 0000000..339fb35
--- /dev/null
+++ b/android/src/main/java/org/reactnative/facedetector/RNFrameFactory.java
@@ -0,0 +1,43 @@
+package org.reactnative.facedetector;
+
+import android.graphics.Bitmap;
+import android.graphics.ImageFormat;
+
+import org.reactnative.camera.utils.ImageDimensions;
+import com.google.android.gms.vision.Frame;
+
+import java.nio.ByteBuffer;
+
+public class RNFrameFactory {
+ public static RNFrame buildFrame(byte[] bitmapData, int width, int height, int rotation) {
+ Frame.Builder builder = new Frame.Builder();
+
+ ByteBuffer byteBuffer = ByteBuffer.wrap(bitmapData);
+ builder.setImageData(byteBuffer, width, height, ImageFormat.NV21);
+
+ switch (rotation) {
+ case 90:
+ builder.setRotation(Frame.ROTATION_90);
+ break;
+ case 180:
+ builder.setRotation(Frame.ROTATION_180);
+ break;
+ case 270:
+ builder.setRotation(Frame.ROTATION_270);
+ break;
+ default:
+ builder.setRotation(Frame.ROTATION_0);
+ }
+
+ ImageDimensions dimensions = new ImageDimensions(width, height, rotation);
+
+ return new RNFrame(builder.build(), dimensions);
+ }
+
+ public static RNFrame buildFrame(Bitmap bitmap) {
+ Frame.Builder builder = new Frame.Builder();
+ builder.setBitmap(bitmap);
+ ImageDimensions dimensions = new ImageDimensions(bitmap.getWidth(), bitmap.getHeight());
+ return new RNFrame(builder.build(), dimensions);
+ }
+}
diff --git a/android/src/main/java/org/reactnative/facedetector/tasks/FileFaceDetectionAsyncTask.java b/android/src/main/java/org/reactnative/facedetector/tasks/FileFaceDetectionAsyncTask.java
new file mode 100644
index 0000000..d2b5335
--- /dev/null
+++ b/android/src/main/java/org/reactnative/facedetector/tasks/FileFaceDetectionAsyncTask.java
@@ -0,0 +1,153 @@
+package org.reactnative.facedetector.tasks;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.media.ExifInterface;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.util.Log;
+import android.util.SparseArray;
+
+import org.reactnative.facedetector.RNFaceDetector;
+import org.reactnative.facedetector.RNFrame;
+import org.reactnative.facedetector.RNFrameFactory;
+import org.reactnative.facedetector.FaceDetectorUtils;
+import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.Promise;
+import com.facebook.react.bridge.ReadableMap;
+import com.facebook.react.bridge.WritableArray;
+import com.facebook.react.bridge.WritableMap;
+import com.google.android.gms.vision.Frame;
+import com.google.android.gms.vision.face.Face;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+
+public class FileFaceDetectionAsyncTask extends AsyncTask> {
+ private static final String ERROR_TAG = "E_FACE_DETECTION_FAILED";
+
+ private static final String MODE_OPTION_KEY = "mode";
+ private static final String DETECT_LANDMARKS_OPTION_KEY = "detectLandmarks";
+ private static final String RUN_CLASSIFICATIONS_OPTION_KEY = "runClassifications";
+
+ private String mUri;
+ private String mPath;
+ private Promise mPromise;
+ private int mWidth = 0;
+ private int mHeight = 0;
+ private Context mContext;
+ private ReadableMap mOptions;
+ private int mOrientation = ExifInterface.ORIENTATION_UNDEFINED;
+ private RNFaceDetector mRNFaceDetector;
+
+ public FileFaceDetectionAsyncTask(Context context, ReadableMap options, Promise promise) {
+ mUri = options.getString("uri");
+ mPromise = promise;
+ mOptions = options;
+ mContext = context;
+ }
+
+ @Override
+ protected void onPreExecute() {
+ if (mUri == null) {
+ mPromise.reject(ERROR_TAG, "You have to provide an URI of an image.");
+ cancel(true);
+ return;
+ }
+
+ Uri uri = Uri.parse(mUri);
+ mPath = uri.getPath();
+
+ if (mPath == null) {
+ mPromise.reject(ERROR_TAG, "Invalid URI provided: `" + mUri + "`.");
+ cancel(true);
+ return;
+ }
+
+ // We have to check if the requested image is in a directory safely accessible by our app.
+ boolean fileIsInSafeDirectories =
+ mPath.startsWith(mContext.getCacheDir().getPath()) || mPath.startsWith(mContext.getFilesDir().getPath());
+
+ if (!fileIsInSafeDirectories) {
+ mPromise.reject(ERROR_TAG, "The image has to be in the local app's directories.");
+ cancel(true);
+ return;
+ }
+
+ if(!new File(mPath).exists()) {
+ mPromise.reject(ERROR_TAG, "The file does not exist. Given path: `" + mPath + "`.");
+ cancel(true);
+ }
+ }
+
+ @Override
+ protected SparseArray doInBackground(Void... voids) {
+ if (isCancelled()) {
+ return null;
+ }
+
+ mRNFaceDetector = detectorForOptions(mOptions, mContext);
+ Bitmap bitmap = BitmapFactory.decodeFile(mPath);
+ mWidth = bitmap.getWidth();
+ mHeight = bitmap.getHeight();
+
+ try {
+ ExifInterface exif = new ExifInterface(mPath);
+ mOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
+ } catch (IOException e) {
+ Log.e(ERROR_TAG, "Reading orientation from file `" + mPath + "` failed.", e);
+ }
+
+ RNFrame frame = RNFrameFactory.buildFrame(bitmap);
+ return mRNFaceDetector.detect(frame);
+ }
+
+ @Override
+ protected void onPostExecute(SparseArray faces) {
+ super.onPostExecute(faces);
+ WritableMap result = Arguments.createMap();
+ WritableArray facesArray = Arguments.createArray();
+
+ for(int i = 0; i < faces.size(); i++) {
+ Face face = faces.valueAt(i);
+ WritableMap encodedFace = FaceDetectorUtils.serializeFace(face);
+ encodedFace.putDouble("yawAngle", (-encodedFace.getDouble("yawAngle") + 360) % 360);
+ encodedFace.putDouble("rollAngle", (-encodedFace.getDouble("rollAngle") + 360) % 360);
+ facesArray.pushMap(encodedFace);
+ }
+
+ result.putArray("faces", facesArray);
+
+ WritableMap image = Arguments.createMap();
+ image.putInt("width", mWidth);
+ image.putInt("height", mHeight);
+ image.putInt("orientation", mOrientation);
+ image.putString("uri", mUri);
+ result.putMap("image", image);
+
+ mRNFaceDetector.release();
+ mPromise.resolve(result);
+ }
+
+ private static RNFaceDetector detectorForOptions(ReadableMap options, Context context) {
+ RNFaceDetector detector = new RNFaceDetector(context);
+ detector.setTrackingEnabled(false);
+
+ if(options.hasKey(MODE_OPTION_KEY)) {
+ detector.setMode(options.getInt(MODE_OPTION_KEY));
+ }
+
+ if(options.hasKey(RUN_CLASSIFICATIONS_OPTION_KEY)) {
+ detector.setClassificationType(options.getInt(RUN_CLASSIFICATIONS_OPTION_KEY));
+ }
+
+ if(options.hasKey(DETECT_LANDMARKS_OPTION_KEY)) {
+ detector.setLandmarkType(options.getInt(DETECT_LANDMARKS_OPTION_KEY));
+ }
+
+ return detector;
+ }
+}
diff --git a/package.json b/package.json
index 0352a90..08a8e4c 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
"logo": "https://opencollective.com/opencollective/logo.txt"
},
"dependencies": {
+ "lodash": "^4.17.4",
"prop-types": "^15.5.10"
},
"devDependencies": {
diff --git a/src/Camera.js b/src/Camera.js
new file mode 100644
index 0000000..7d7835e
--- /dev/null
+++ b/src/Camera.js
@@ -0,0 +1,341 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import {
+ DeviceEventEmitter, // android
+ NativeAppEventEmitter, // ios
+ NativeModules,
+ Platform,
+ StyleSheet,
+ requireNativeComponent,
+ ViewPropTypes,
+ PermissionsAndroid,
+ ActivityIndicator,
+ View,
+ Text,
+} from 'react-native';
+
+const CameraManager = NativeModules.CameraManager || NativeModules.CameraModule;
+const CAMERA_REF = 'camera';
+
+function convertNativeProps(props) {
+ const newProps = { ...props };
+ if (typeof props.aspect === 'string') {
+ newProps.aspect = Camera.constants.Aspect[props.aspect];
+ }
+
+ if (typeof props.flashMode === 'string') {
+ newProps.flashMode = Camera.constants.FlashMode[props.flashMode];
+ }
+
+ if (typeof props.orientation === 'string') {
+ newProps.orientation = Camera.constants.Orientation[props.orientation];
+ }
+
+ if (typeof props.torchMode === 'string') {
+ newProps.torchMode = Camera.constants.TorchMode[props.torchMode];
+ }
+
+ if (typeof props.type === 'string') {
+ newProps.type = Camera.constants.Type[props.type];
+ }
+
+ if (typeof props.captureQuality === 'string') {
+ newProps.captureQuality = Camera.constants.CaptureQuality[props.captureQuality];
+ }
+
+ if (typeof props.captureMode === 'string') {
+ newProps.captureMode = Camera.constants.CaptureMode[props.captureMode];
+ }
+
+ if (typeof props.captureTarget === 'string') {
+ newProps.captureTarget = Camera.constants.CaptureTarget[props.captureTarget];
+ }
+
+ // do not register barCodeTypes if no barcode listener
+ if (typeof props.onBarCodeRead !== 'function') {
+ newProps.barCodeTypes = [];
+ }
+
+ newProps.barcodeScannerEnabled = typeof props.onBarCodeRead === 'function';
+
+ return newProps;
+}
+
+export default class Camera extends Component {
+ static constants = {
+ Aspect: CameraManager.Aspect,
+ BarCodeType: CameraManager.BarCodeType,
+ Type: CameraManager.Type,
+ CaptureMode: CameraManager.CaptureMode,
+ CaptureTarget: CameraManager.CaptureTarget,
+ CaptureQuality: CameraManager.CaptureQuality,
+ Orientation: CameraManager.Orientation,
+ FlashMode: CameraManager.FlashMode,
+ TorchMode: CameraManager.TorchMode,
+ };
+
+ static propTypes = {
+ ...ViewPropTypes,
+ aspect: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ captureAudio: PropTypes.bool,
+ captureMode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ captureQuality: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ captureTarget: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ defaultOnFocusComponent: PropTypes.bool,
+ flashMode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ keepAwake: PropTypes.bool,
+ onBarCodeRead: PropTypes.func,
+ barcodeScannerEnabled: PropTypes.bool,
+ onFocusChanged: PropTypes.func,
+ onZoomChanged: PropTypes.func,
+ mirrorImage: PropTypes.bool,
+ fixOrientation: PropTypes.bool,
+ barCodeTypes: PropTypes.array,
+ orientation: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ playSoundOnCapture: PropTypes.bool,
+ torchMode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ type: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ permissionDialogTitle: PropTypes.string,
+ permissionDialogMessage: PropTypes.string,
+ notAuthorizedView: PropTypes.element,
+ pendingAuthorizationView: PropTypes.element,
+ };
+
+ static defaultProps = {
+ aspect: CameraManager.Aspect.fill,
+ type: CameraManager.Type.back,
+ orientation: CameraManager.Orientation.auto,
+ fixOrientation: false,
+ captureAudio: false,
+ captureMode: CameraManager.CaptureMode.still,
+ captureTarget: CameraManager.CaptureTarget.cameraRoll,
+ captureQuality: CameraManager.CaptureQuality.high,
+ defaultOnFocusComponent: true,
+ flashMode: CameraManager.FlashMode.off,
+ playSoundOnCapture: true,
+ torchMode: CameraManager.TorchMode.off,
+ mirrorImage: false,
+ barCodeTypes: Object.values(CameraManager.BarCodeType),
+ permissionDialogTitle: '',
+ permissionDialogMessage: '',
+ notAuthorizedView: (
+
+
+ Camera not authorized
+
+
+ ),
+ pendingAuthorizationView: (
+
+
+
+ ),
+ };
+
+ static checkDeviceAuthorizationStatus = CameraManager.checkDeviceAuthorizationStatus;
+ static checkVideoAuthorizationStatus = CameraManager.checkVideoAuthorizationStatus;
+ static checkAudioAuthorizationStatus = CameraManager.checkAudioAuthorizationStatus;
+
+ setNativeProps(props) {
+ // eslint-disable-next-line
+ this.refs[CAMERA_REF].setNativeProps(props);
+ }
+
+ constructor() {
+ super();
+ this.state = {
+ isAuthorized: false,
+ isAuthorizationChecked: false,
+ isRecording: false,
+ };
+ }
+
+ async componentWillMount() {
+ this._addOnBarCodeReadListener();
+
+ let { captureMode } = convertNativeProps({ captureMode: this.props.captureMode });
+ let hasVideoAndAudio =
+ this.props.captureAudio && captureMode === Camera.constants.CaptureMode.video;
+
+ if (Platform.OS === 'ios') {
+ let check = hasVideoAndAudio
+ ? Camera.checkDeviceAuthorizationStatus
+ : Camera.checkVideoAuthorizationStatus;
+
+ if (check) {
+ const isAuthorized = await check();
+ this.setState({ isAuthorized, isAuthorizationChecked: true });
+ }
+ } else if (Platform.OS === 'android') {
+ const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.CAMERA, {
+ title: this.props.permissionDialogTitle,
+ message: this.props.permissionDialogMessage,
+ });
+
+ this.setState({
+ isAuthorized: granted === PermissionsAndroid.RESULTS.GRANTED,
+ isAuthorizationChecked: true,
+ });
+ } else {
+ this.setState({ isAuthorized: true, isAuthorizationChecked: true });
+ }
+ }
+
+ componentWillUnmount() {
+ this._removeOnBarCodeReadListener();
+
+ if (this.state.isRecording) {
+ this.stopCapture();
+ }
+ }
+
+ componentWillReceiveProps(newProps) {
+ const { onBarCodeRead } = this.props;
+ if (onBarCodeRead !== newProps.onBarCodeRead) {
+ this._addOnBarCodeReadListener(newProps);
+ }
+ }
+
+ _addOnBarCodeReadListener(props) {
+ const { onBarCodeRead } = props || this.props;
+ this._removeOnBarCodeReadListener();
+ if (onBarCodeRead) {
+ this.cameraBarCodeReadListener = Platform.select({
+ ios: NativeAppEventEmitter.addListener('CameraBarCodeRead', this._onBarCodeRead),
+ android: DeviceEventEmitter.addListener('CameraBarCodeReadAndroid', this._onBarCodeRead),
+ });
+ }
+ }
+ _removeOnBarCodeReadListener() {
+ const listener = this.cameraBarCodeReadListener;
+ if (listener) {
+ listener.remove();
+ }
+ }
+
+ render() {
+ // TODO - style is not used, figure it out why
+ // eslint-disable-next-line
+ const style = [styles.base, this.props.style];
+ const nativeProps = convertNativeProps(this.props);
+
+ if (this.state.isAuthorized) {
+ return ;
+ } else if (!this.state.isAuthorizationChecked) {
+ return this.props.pendingAuthorizationView;
+ } else {
+ return this.props.notAuthorizedView;
+ }
+ }
+
+ _onBarCodeRead = data => {
+ if (this.props.onBarCodeRead) {
+ this.props.onBarCodeRead(data);
+ }
+ };
+
+ capture(options) {
+ const props = convertNativeProps(this.props);
+ options = {
+ audio: props.captureAudio,
+ barCodeTypes: props.barCodeTypes,
+ mode: props.captureMode,
+ playSoundOnCapture: props.playSoundOnCapture,
+ target: props.captureTarget,
+ quality: props.captureQuality,
+ type: props.type,
+ title: '',
+ description: '',
+ mirrorImage: props.mirrorImage,
+ fixOrientation: props.fixOrientation,
+ ...options,
+ };
+
+ if (options.mode === Camera.constants.CaptureMode.video) {
+ options.totalSeconds = options.totalSeconds > -1 ? options.totalSeconds : -1;
+ options.preferredTimeScale = options.preferredTimeScale || 30;
+ this.setState({ isRecording: true });
+ }
+
+ return CameraManager.capture(options);
+ }
+
+ startPreview() {
+ if (Platform.OS === 'android') {
+ const props = convertNativeProps(this.props);
+ CameraManager.startPreview({
+ type: props.type,
+ });
+ } else {
+ CameraManager.startPreview();
+ }
+ }
+
+ stopPreview() {
+ if (Platform.OS === 'android') {
+ const props = convertNativeProps(this.props);
+ CameraManager.stopPreview({
+ type: props.type,
+ });
+ } else {
+ CameraManager.stopPreview();
+ }
+ }
+
+ stopCapture() {
+ if (this.state.isRecording) {
+ this.setState({ isRecording: false });
+ return CameraManager.stopCapture();
+ }
+ return Promise.resolve('Not Recording.');
+ }
+
+ getFOV() {
+ return CameraManager.getFOV();
+ }
+
+ hasFlash() {
+ if (Platform.OS === 'android') {
+ const props = convertNativeProps(this.props);
+ return CameraManager.hasFlash({
+ type: props.type,
+ });
+ }
+ return CameraManager.hasFlash();
+ }
+}
+
+export const constants = Camera.constants;
+
+const RCTCamera = requireNativeComponent('RCTCamera', Camera, {
+ nativeOnly: {
+ testID: true,
+ renderToHardwareTextureAndroid: true,
+ accessibilityLabel: true,
+ importantForAccessibility: true,
+ accessibilityLiveRegion: true,
+ accessibilityComponentType: true,
+ onLayout: true,
+ },
+});
+
+const styles = StyleSheet.create({
+ base: {},
+});
diff --git a/src/FaceDetector.js b/src/FaceDetector.js
new file mode 100644
index 0000000..3d770f0
--- /dev/null
+++ b/src/FaceDetector.js
@@ -0,0 +1,60 @@
+// @flow
+import { NativeModules } from 'react-native';
+
+const faceDetectionDisabledMessage = 'Face detection has not been included in this build.';
+
+const FaceDetectorModule: Object = NativeModules.RNFaceDetector || {
+ stubbed: true,
+ Mode: {},
+ Landmarks: {},
+ Classifications: {},
+ detectFaces: () => new Promise((_, reject) => reject(faceDetectionDisabledMessage)),
+};
+
+type Point = { x: number, y: number };
+
+export type FaceFeature = {
+ bounds: {
+ size: {
+ width: number,
+ height: number,
+ },
+ origin: Point,
+ },
+ smilingProbability?: number,
+ leftEarPosition?: Point,
+ rightEarPosition?: Point,
+ leftEyePosition?: Point,
+ leftEyeOpenProbability?: number,
+ rightEyePosition?: Point,
+ rightEyeOpenProbability?: number,
+ leftCheekPosition?: Point,
+ rightCheekPosition?: Point,
+ leftMouthPosition?: Point,
+ mouthPosition?: Point,
+ rightMouthPosition?: Point,
+ bottomMouthPosition?: Point,
+ noseBasePosition?: Point,
+ yawAngle?: number,
+ rollAngle?: number,
+};
+
+type DetectionOptions = {
+ mode?: $Keys,
+ detectLandmarks?: $Keys,
+ runClassifications?: $Keys,
+};
+
+export default class FaceDetector {
+ static Constants = {
+ Mode: FaceDetectorModule.Mode,
+ Landmarks: FaceDetectorModule.Landmarks,
+ Classifications: FaceDetectorModule.Classifications,
+ };
+
+ static detectFacesAsync(uri: string, options: ?DetectionOptions): Promise> {
+ return FaceDetectorModule.detectFaces({ ...options, uri });
+ }
+}
+
+export const Constants = FaceDetector.Constants;
diff --git a/src/RNCamera.js b/src/RNCamera.js
new file mode 100644
index 0000000..39c0c4d
--- /dev/null
+++ b/src/RNCamera.js
@@ -0,0 +1,250 @@
+// @flow
+import React from 'react';
+import PropTypes from 'prop-types';
+import { mapValues } from 'lodash';
+import { Platform, NativeModules, ViewPropTypes, requireNativeComponent } from 'react-native';
+
+import type { FaceFeature } from './FaceDetector';
+
+type PictureOptions = {
+ quality?: number,
+};
+
+type TrackedFaceFeature = FaceFeature & {
+ faceID?: number,
+};
+
+type RecordingOptions = {
+ maxDuration?: number,
+ maxFileSize?: number,
+ quality?: number | string,
+};
+
+type EventCallbackArgumentsType = {
+ nativeEvent: Object,
+};
+
+type PropsType = ViewPropTypes & {
+ zoom?: number,
+ ratio?: string,
+ focusDepth?: number,
+ type?: number | string,
+ onCameraReady?: Function,
+ onBarCodeRead?: Function,
+ faceDetectionMode?: number,
+ flashMode?: number | string,
+ barCodeTypes?: Array,
+ whiteBalance?: number | string,
+ faceDetectionLandmarks?: number,
+ autoFocus?: string | boolean | number,
+ faceDetectionClassifications?: number,
+ onFacesDetected?: ({ faces: Array }) => void,
+};
+
+const CameraManager: Object =
+ NativeModules.RNCameraManager || NativeModules.RNCameraModule || {
+ stubbed: true,
+ Type: {
+ back: 1,
+ },
+ AutoFocus: {
+ on: 1
+ },
+ FlashMode: {
+ off: 1,
+ },
+ WhiteBalance: {},
+ BarCodeType: {},
+ FaceDetection: {
+ fast: 1,
+ Mode: {},
+ Landmarks: {
+ none: 0,
+ },
+ Classifications: {
+ none: 0,
+ },
+ },
+};
+
+const EventThrottleMs = 500;
+
+export default class Camera extends React.Component {
+ static Constants = {
+ Type: CameraManager.Type,
+ FlashMode: CameraManager.FlashMode,
+ AutoFocus: CameraManager.AutoFocus,
+ WhiteBalance: CameraManager.WhiteBalance,
+ VideoQuality: CameraManager.VideoQuality,
+ BarCodeType: CameraManager.BarCodeType,
+ FaceDetection: CameraManager.FaceDetection,
+ };
+
+ // Values under keys from this object will be transformed to native options
+ static ConversionTables = {
+ type: CameraManager.Type,
+ flashMode: CameraManager.FlashMode,
+ autoFocus: CameraManager.AutoFocus,
+ whiteBalance: CameraManager.WhiteBalance,
+ faceDetectionMode: CameraManager.FaceDetection.Mode,
+ faceDetectionLandmarks: CameraManager.FaceDetection.Landmarks,
+ faceDetectionClassifications: CameraManager.FaceDetection.Classifications,
+ };
+
+ static propTypes = {
+ ...ViewPropTypes,
+ zoom: PropTypes.number,
+ ratio: PropTypes.string,
+ focusDepth: PropTypes.number,
+ onMountError: PropTypes.func,
+ onCameraReady: PropTypes.func,
+ onBarCodeRead: PropTypes.func,
+ onFacesDetected: PropTypes.func,
+ faceDetectionMode: PropTypes.number,
+ faceDetectionLandmarks: PropTypes.number,
+ faceDetectionClassifications: PropTypes.number,
+ barCodeTypes: PropTypes.arrayOf(PropTypes.string),
+ type: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ flashMode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ whiteBalance: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ autoFocus: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.bool]),
+ };
+
+ static defaultProps: Object = {
+ zoom: 0,
+ ratio: '4:3',
+ focusDepth: 0,
+ type: CameraManager.Type.back,
+ autoFocus: CameraManager.AutoFocus.on,
+ flashMode: CameraManager.FlashMode.off,
+ whiteBalance: CameraManager.WhiteBalance.auto,
+ faceDetectionMode: CameraManager.FaceDetection.fast,
+ barCodeTypes: Object.values(CameraManager.BarCodeType),
+ faceDetectionLandmarks: CameraManager.FaceDetection.Landmarks.none,
+ faceDetectionClassifications: CameraManager.FaceDetection.Classifications.none,
+ };
+
+ _lastEvents: { [string]: string };
+ _lastEventsTimes: { [string]: Date };
+
+ constructor(props: PropsType) {
+ super(props);
+ this._lastEvents = {};
+ this._lastEventsTimes = {};
+ }
+
+ async takePictureAsync(options?: PictureOptions) {
+ if (!options) {
+ options = {};
+ }
+ if (!options.quality) {
+ options.quality = 1;
+ }
+ return await CameraManager.takePicture(options);
+ }
+
+ async getSupportedRatiosAsync() {
+ if (Platform.OS === 'android') {
+ return await CameraManager.getSupportedRatios();
+ } else {
+ throw new Error('Ratio is not supported on iOS');
+ }
+ }
+
+ async recordAsync(options?: RecordingOptions) {
+ if (!options || typeof options !== 'object') {
+ options = {};
+ } else if (typeof options.quality === 'string') {
+ options.quality = Camera.Constants.VideoQuality[options.quality];
+ }
+ return await CameraManager.record(options);
+ }
+
+ stopRecording() {
+ CameraManager.stopRecording();
+ }
+
+ _onMountError = () => {
+ if (this.props.onMountError) {
+ this.props.onMountError();
+ }
+ };
+
+ _onCameraReady = () => {
+ if (this.props.onCameraReady) {
+ this.props.onCameraReady();
+ }
+ };
+
+ _onObjectDetected = (callback: ?Function) => ({ nativeEvent }: EventCallbackArgumentsType) => {
+ const { type } = nativeEvent;
+
+ if (
+ this._lastEvents[type] &&
+ this._lastEventsTimes[type] &&
+ JSON.stringify(nativeEvent) === this._lastEvents[type] &&
+ new Date() - this._lastEventsTimes[type] < EventThrottleMs
+ ) {
+ return;
+ }
+
+ if (callback) {
+ callback(nativeEvent);
+ this._lastEventsTimes[type] = new Date();
+ this._lastEvents[type] = JSON.stringify(nativeEvent);
+ }
+ };
+
+ render() {
+ const nativeProps = this._convertNativeProps(this.props);
+
+ return (
+
+ );
+ }
+
+ _convertNativeProps(props: PropsType) {
+ const newProps = mapValues(props, this._convertProp);
+
+ if (props.onBarCodeRead) {
+ newProps.barCodeScannerEnabled = true;
+ }
+
+ if (props.onFacesDetected) {
+ newProps.faceDetectorEnabled = true;
+ }
+
+ if (Platform.OS === 'ios') {
+ delete newProps.ratio;
+ }
+
+ return newProps;
+ }
+
+ _convertProp(value: *, key: string): * {
+ if (typeof value === 'string' && Camera.ConversionTables[key]) {
+ return Camera.ConversionTables[key][value];
+ }
+
+ return value;
+ }
+}
+
+export const Constants = Camera.Constants;
+
+const RNCamera = requireNativeComponent('RNCamera', Camera, {
+ nativeOnly: {
+ onCameraReady: true,
+ onMountError: true,
+ onBarCodeRead: true,
+ onFaceDetected: true,
+ faceDetectorEnabled: true,
+ barCodeScannerEnabled: true,
+ },
+});
diff --git a/src/index.js b/src/index.js
index 7000596..98f4e7b 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,335 +1,7 @@
-import React, { Component } from 'react';
-import PropTypes from 'prop-types';
-import {
- DeviceEventEmitter, // android
- NativeAppEventEmitter, // ios
- NativeModules,
- Platform,
- StyleSheet,
- requireNativeComponent,
- ViewPropTypes,
- PermissionsAndroid,
- ActivityIndicator,
- View,
- Text,
-} from 'react-native';
+import Camera from './Camera';
+import RNCamera from './RNCamera';
+import FaceDetector from './FaceDetector';
-const CameraManager = NativeModules.CameraManager || NativeModules.CameraModule;
-const CAMERA_REF = 'camera';
+export { RNCamera, FaceDetector };
-function convertNativeProps(props) {
- const newProps = { ...props };
- if (typeof props.aspect === 'string') {
- newProps.aspect = Camera.constants.Aspect[props.aspect];
- }
-
- if (typeof props.flashMode === 'string') {
- newProps.flashMode = Camera.constants.FlashMode[props.flashMode];
- }
-
- if (typeof props.orientation === 'string') {
- newProps.orientation = Camera.constants.Orientation[props.orientation];
- }
-
- if (typeof props.torchMode === 'string') {
- newProps.torchMode = Camera.constants.TorchMode[props.torchMode];
- }
-
- if (typeof props.type === 'string') {
- newProps.type = Camera.constants.Type[props.type];
- }
-
- if (typeof props.captureQuality === 'string') {
- newProps.captureQuality = Camera.constants.CaptureQuality[props.captureQuality];
- }
-
- if (typeof props.captureMode === 'string') {
- newProps.captureMode = Camera.constants.CaptureMode[props.captureMode];
- }
-
- if (typeof props.captureTarget === 'string') {
- newProps.captureTarget = Camera.constants.CaptureTarget[props.captureTarget];
- }
-
- // do not register barCodeTypes if no barcode listener
- if (typeof props.onBarCodeRead !== 'function') {
- newProps.barCodeTypes = [];
- }
-
- newProps.barcodeScannerEnabled = typeof props.onBarCodeRead === 'function';
-
- return newProps;
-}
-
-export default class Camera extends Component {
- static constants = {
- Aspect: CameraManager.Aspect,
- BarCodeType: CameraManager.BarCodeType,
- Type: CameraManager.Type,
- CaptureMode: CameraManager.CaptureMode,
- CaptureTarget: CameraManager.CaptureTarget,
- CaptureQuality: CameraManager.CaptureQuality,
- Orientation: CameraManager.Orientation,
- FlashMode: CameraManager.FlashMode,
- TorchMode: CameraManager.TorchMode,
- };
-
- static propTypes = {
- ...ViewPropTypes,
- aspect: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
- captureAudio: PropTypes.bool,
- captureMode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
- captureQuality: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
- captureTarget: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
- defaultOnFocusComponent: PropTypes.bool,
- flashMode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
- keepAwake: PropTypes.bool,
- onBarCodeRead: PropTypes.func,
- barcodeScannerEnabled: PropTypes.bool,
- onFocusChanged: PropTypes.func,
- onZoomChanged: PropTypes.func,
- mirrorImage: PropTypes.bool,
- fixOrientation: PropTypes.bool,
- barCodeTypes: PropTypes.array,
- orientation: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
- playSoundOnCapture: PropTypes.bool,
- torchMode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
- type: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
- permissionDialogTitle: PropTypes.string,
- permissionDialogMessage: PropTypes.string,
- notAuthorizedView: PropTypes.element,
- pendingAuthorizationView: PropTypes.element,
- };
-
- static defaultProps = {
- aspect: CameraManager.Aspect.fill,
- type: CameraManager.Type.back,
- orientation: CameraManager.Orientation.auto,
- fixOrientation: false,
- captureAudio: false,
- captureMode: CameraManager.CaptureMode.still,
- captureTarget: CameraManager.CaptureTarget.cameraRoll,
- captureQuality: CameraManager.CaptureQuality.high,
- defaultOnFocusComponent: true,
- flashMode: CameraManager.FlashMode.off,
- playSoundOnCapture: true,
- torchMode: CameraManager.TorchMode.off,
- mirrorImage: false,
- barCodeTypes: Object.values(CameraManager.BarCodeType),
- permissionDialogTitle: '',
- permissionDialogMessage: '',
- notAuthorizedView: (
-
-
- Camera not authorized
-
-
- ),
- pendingAuthorizationView: (
-
-
-
- ),
- };
-
- static checkDeviceAuthorizationStatus = CameraManager.checkDeviceAuthorizationStatus;
- static checkVideoAuthorizationStatus = CameraManager.checkVideoAuthorizationStatus;
- static checkAudioAuthorizationStatus = CameraManager.checkAudioAuthorizationStatus;
-
- setNativeProps(props) {
- // eslint-disable-next-line
- this.refs[CAMERA_REF].setNativeProps(props);
- }
-
- constructor() {
- super();
- this.state = {
- isAuthorized: false,
- isAuthorizationChecked: false,
- isRecording: false,
- };
- }
-
- async componentWillMount() {
- this._addOnBarCodeReadListener();
-
- let { captureMode } = convertNativeProps({ captureMode: this.props.captureMode });
- let hasVideoAndAudio = this.props.captureAudio && captureMode === Camera.constants.CaptureMode.video;
-
- if (Platform.OS === 'ios') {
-
- let check = hasVideoAndAudio ? Camera.checkDeviceAuthorizationStatus : Camera.checkVideoAuthorizationStatus;
-
- if (check) {
- const isAuthorized = await check();
- this.setState({ isAuthorized, isAuthorizationChecked: true });
- }
-
- } else if (Platform.OS === 'android') {
-
- const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.CAMERA, {
- title: this.props.permissionDialogTitle,
- message: this.props.permissionDialogMessage,
- }
- );
-
- this.setState({ isAuthorized: granted === PermissionsAndroid.RESULTS.GRANTED, isAuthorizationChecked: true });
- } else {
-
- this.setState({ isAuthorized: true, isAuthorizationChecked: true })
- }
-
- }
-
- componentWillUnmount() {
- this._removeOnBarCodeReadListener();
-
- if (this.state.isRecording) {
- this.stopCapture();
- }
- }
-
- componentWillReceiveProps(newProps) {
- const { onBarCodeRead } = this.props;
- if (onBarCodeRead !== newProps.onBarCodeRead) {
- this._addOnBarCodeReadListener(newProps);
- }
- }
-
- _addOnBarCodeReadListener(props) {
- const { onBarCodeRead } = props || this.props;
- this._removeOnBarCodeReadListener();
- if (onBarCodeRead) {
- this.cameraBarCodeReadListener = Platform.select({
- ios: NativeAppEventEmitter.addListener('CameraBarCodeRead', this._onBarCodeRead),
- android: DeviceEventEmitter.addListener('CameraBarCodeReadAndroid', this._onBarCodeRead),
- });
- }
- }
- _removeOnBarCodeReadListener() {
- const listener = this.cameraBarCodeReadListener;
- if (listener) {
- listener.remove();
- }
- }
-
- render() {
- // TODO - style is not used, figure it out why
- // eslint-disable-next-line
- const style = [styles.base, this.props.style];
- const nativeProps = convertNativeProps(this.props);
-
- if(this.state.isAuthorized) {
- return ;
- } else if (!this.state.isAuthorizationChecked) {
- return this.props.pendingAuthorizationView
- } else {
- return this.props.notAuthorizedView
- }
- }
-
- _onBarCodeRead = data => {
- if (this.props.onBarCodeRead) {
- this.props.onBarCodeRead(data);
- }
- };
-
- capture(options) {
- const props = convertNativeProps(this.props);
- options = {
- audio: props.captureAudio,
- barCodeTypes: props.barCodeTypes,
- mode: props.captureMode,
- playSoundOnCapture: props.playSoundOnCapture,
- target: props.captureTarget,
- quality: props.captureQuality,
- type: props.type,
- title: '',
- description: '',
- mirrorImage: props.mirrorImage,
- fixOrientation: props.fixOrientation,
- ...options,
- };
-
- if (options.mode === Camera.constants.CaptureMode.video) {
- options.totalSeconds = options.totalSeconds > -1 ? options.totalSeconds : -1;
- options.preferredTimeScale = options.preferredTimeScale || 30;
- this.setState({ isRecording: true });
- }
-
- return CameraManager.capture(options);
- }
-
- startPreview() {
- if (Platform.OS === 'android') {
- const props = convertNativeProps(this.props);
- CameraManager.startPreview({
- type: props.type,
- });
- } else {
- CameraManager.startPreview();
- }
- }
-
- stopPreview() {
- if (Platform.OS === 'android') {
- const props = convertNativeProps(this.props);
- CameraManager.stopPreview({
- type: props.type,
- });
- } else {
- CameraManager.stopPreview();
- }
- }
-
- stopCapture() {
- if (this.state.isRecording) {
- this.setState({ isRecording: false });
- return CameraManager.stopCapture();
- }
- return Promise.resolve('Not Recording.');
- }
-
- getFOV() {
- return CameraManager.getFOV();
- }
-
- hasFlash() {
- if (Platform.OS === 'android') {
- const props = convertNativeProps(this.props);
- return CameraManager.hasFlash({
- type: props.type,
- });
- }
- return CameraManager.hasFlash();
- }
-}
-
-export const constants = Camera.constants;
-
-const RCTCamera = requireNativeComponent('RCTCamera', Camera, {
- nativeOnly: {
- testID: true,
- renderToHardwareTextureAndroid: true,
- accessibilityLabel: true,
- importantForAccessibility: true,
- accessibilityLiveRegion: true,
- accessibilityComponentType: true,
- onLayout: true,
- },
-});
-
-const styles = StyleSheet.create({
- base: {},
-});
+export default Camera;