├── ios
├── Runner
│ ├── Runner-Bridging-Header.h
│ ├── Assets.xcassets
│ │ ├── LaunchImage.imageset
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ ├── README.md
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-83.5x83.5@2x.png
│ │ │ └── Contents.json
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── Main.storyboard
│ │ └── LaunchScreen.storyboard
│ └── Info.plist
├── Flutter
│ ├── Debug.xcconfig
│ ├── Release.xcconfig
│ └── AppFrameworkInfo.plist
├── Runner.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── WorkspaceSettings.xcsettings
│ │ │ └── IDEWorkspaceChecks.plist
│ ├── xcshareddata
│ │ └── xcschemes
│ │ │ └── Runner.xcscheme
│ └── project.pbxproj
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── IDEWorkspaceChecks.plist
├── .gitignore
└── Podfile
├── firestore.indexes.json
├── media
└── screenshots.png
├── .firebaserc
├── android
├── gradle.properties
├── .gitignore
├── app
│ ├── src
│ │ ├── main
│ │ │ ├── res
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── drawable
│ │ │ │ │ └── launch_background.xml
│ │ │ │ └── values
│ │ │ │ │ └── styles.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── example
│ │ │ │ │ └── restaurant_ratings_flutter_firebase
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── AndroidManifest.xml
│ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ └── profile
│ │ │ └── AndroidManifest.xml
│ └── build.gradle
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
├── settings.gradle
└── build.gradle
├── functions
├── .gitignore
├── tsconfig.json
├── package.json
├── src
│ └── index.ts
├── tslint.json
└── package-lock.json
├── lib
├── services
│ ├── firestore_path.dart
│ └── firestore_database.dart
├── app
│ ├── sign_in
│ │ ├── sign_in_button.dart
│ │ ├── sign_in_view_model.dart
│ │ └── sign_in_page.dart
│ └── home
│ │ ├── restaurant_rating_bar.dart
│ │ ├── restaurant_details_page.dart
│ │ └── restaurants_list_page.dart
├── constants
│ └── strings.dart
├── generated_plugin_registrant.dart
├── models
│ ├── restaurant_rating.dart
│ └── restaurant.dart
└── main.dart
├── firebase.json
├── firestore.rules
├── .metadata
├── LICENSE.md
├── test
└── widget_test.dart
├── .gitignore
├── README.md
└── pubspec.yaml
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/firestore.indexes.json:
--------------------------------------------------------------------------------
1 | {
2 | "indexes": [],
3 | "fieldOverrides": []
4 | }
5 |
--------------------------------------------------------------------------------
/media/screenshots.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/media/screenshots.png
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "dev": "restaurant-ratings-flutter",
4 | "default": "restaurant-ratings-flutter"
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
--------------------------------------------------------------------------------
/functions/.gitignore:
--------------------------------------------------------------------------------
1 | ## Compiled JavaScript files
2 | **/*.js
3 | **/*.js.map
4 |
5 | # Typescript v1 declaration files
6 | typings/
7 |
8 | node_modules/
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bizz84/restaurant_ratings_flutter_firebase/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/example/restaurant_ratings_flutter_firebase/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.restaurant_ratings_flutter_firebase
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
7 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/lib/services/firestore_path.dart:
--------------------------------------------------------------------------------
1 | class FirestorePath {
2 | static String restaurantUserRating(String restaurantId, String uid) =>
3 | 'restaurants/$restaurantId/ratings/$uid';
4 | static String restaurants() => 'restaurants';
5 | static String restaurant(String restaurantId) => 'restaurants/$restaurantId';
6 | }
7 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "firestore": {
3 | "rules": "firestore.rules",
4 | "indexes": "firestore.indexes.json"
5 | },
6 | "functions": {
7 | "predeploy": [
8 | "npm --prefix \"$RESOURCE_DIR\" run lint",
9 | "npm --prefix \"$RESOURCE_DIR\" run build"
10 | ],
11 | "source": "functions"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/firestore.rules:
--------------------------------------------------------------------------------
1 | rules_version = '2';
2 | service cloud.firestore {
3 | match /databases/{database}/documents {
4 | match /restaurants/{restaurantId} {
5 | allow read: if true;
6 | }
7 | match /restaurants/{restaurantId}/ratings/{uid} {
8 | allow read,write: if request.auth.uid == uid;
9 | }
10 | }
11 | }
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/functions/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "noImplicitReturns": true,
5 | "noUnusedLocals": true,
6 | "outDir": "lib",
7 | "sourceMap": true,
8 | "strict": true,
9 | "target": "es2017"
10 | },
11 | "compileOnSave": true,
12 | "include": [
13 | "src"
14 | ]
15 | }
16 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: b041144f833e05cf463b8887fa12efdec9493488
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/lib/app/sign_in/sign_in_button.dart:
--------------------------------------------------------------------------------
1 | import 'package:custom_buttons/custom_buttons.dart';
2 | import 'package:flutter/material.dart';
3 |
4 | class SignInButton extends CustomRaisedButton {
5 | SignInButton({
6 | Key key,
7 | @required String text,
8 | @required Color color,
9 | @required VoidCallback onPressed,
10 | Color textColor = Colors.black87,
11 | double height = 50.0,
12 | }) : super(
13 | key: key,
14 | child: Text(text, style: TextStyle(color: textColor, fontSize: 16.0)),
15 | color: color,
16 | textColor: textColor,
17 | height: height,
18 | onPressed: onPressed,
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | // Copyright 2014 The Flutter Authors. All rights reserved.
2 | // Use of this source code is governed by a BSD-style license that can be
3 | // found in the LICENSE file.
4 |
5 | include ':app'
6 |
7 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
8 | def properties = new Properties()
9 |
10 | assert localPropertiesFile.exists()
11 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
12 |
13 | def flutterSdkPath = properties.getProperty("flutter.sdk")
14 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
15 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
16 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.50'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.5.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | jcenter()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/lib/constants/strings.dart:
--------------------------------------------------------------------------------
1 | class Strings {
2 | // Generic strings
3 | static const String ok = 'OK';
4 | static const String cancel = 'Cancel';
5 |
6 | // Logout
7 | static const String logout = 'Logout';
8 | static const String logoutAreYouSure =
9 | 'Are you sure that you want to logout?';
10 | static const String logoutFailed = 'Logout failed';
11 |
12 | // Sign In Page
13 | static const String signIn = 'Sign in';
14 | static const String signInWithEmailPassword =
15 | 'Sign in with email and password';
16 | static const String goAnonymous = 'Go anonymous';
17 | static const String or = 'or';
18 | static const String signInFailed = 'Sign in failed';
19 |
20 | // Home page
21 | static const String homePage = 'Home Page';
22 | }
23 |
--------------------------------------------------------------------------------
/lib/generated_plugin_registrant.dart:
--------------------------------------------------------------------------------
1 | //
2 | // Generated file. Do not edit.
3 | //
4 |
5 | // ignore: unused_import
6 | import 'dart:ui';
7 |
8 | import 'package:cloud_firestore_web/cloud_firestore_web.dart';
9 | import 'package:firebase_auth_web/firebase_auth_web.dart';
10 | import 'package:firebase_core_web/firebase_core_web.dart';
11 |
12 | import 'package:flutter_web_plugins/flutter_web_plugins.dart';
13 |
14 | // ignore: public_member_api_docs
15 | void registerPlugins(PluginRegistry registry) {
16 | FirestoreWeb.registerWith(registry.registrarFor(FirestoreWeb));
17 | FirebaseAuthWeb.registerWith(registry.registrarFor(FirebaseAuthWeb));
18 | FirebaseCoreWeb.registerWith(registry.registrarFor(FirebaseCoreWeb));
19 | registry.registerMessageHandler();
20 | }
21 |
--------------------------------------------------------------------------------
/functions/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "functions",
3 | "scripts": {
4 | "lint": "tslint --project tsconfig.json",
5 | "build": "tsc",
6 | "serve": "npm run build && firebase emulators:start --only functions",
7 | "shell": "npm run build && firebase functions:shell",
8 | "start": "npm run shell",
9 | "deploy": "firebase deploy --only functions",
10 | "logs": "firebase functions:log"
11 | },
12 | "engines": {
13 | "node": "10"
14 | },
15 | "main": "lib/index.js",
16 | "dependencies": {
17 | "firebase-admin": "^8.10.0",
18 | "firebase-functions": "^3.6.1"
19 | },
20 | "devDependencies": {
21 | "tslint": "^5.12.0",
22 | "typescript": "^3.8.0",
23 | "firebase-functions-test": "^0.2.0"
24 | },
25 | "private": true
26 | }
--------------------------------------------------------------------------------
/lib/app/sign_in/sign_in_view_model.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:flutter/foundation.dart';
4 | import 'package:meta/meta.dart';
5 | import 'package:firebase_auth_service/firebase_auth_service.dart';
6 |
7 | class SignInViewModel with ChangeNotifier {
8 | SignInViewModel({@required this.auth});
9 | final FirebaseAuthService auth;
10 | bool isLoading = false;
11 |
12 | Future _signIn(Future Function() signInMethod) async {
13 | try {
14 | isLoading = true;
15 | notifyListeners();
16 | return await signInMethod();
17 | } catch (e) {
18 | isLoading = false;
19 | notifyListeners();
20 | rethrow;
21 | }
22 | }
23 |
24 | Future signInAnonymously() async {
25 | return _signIn(auth.signInAnonymously);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/lib/app/home/restaurant_rating_bar.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_rating_bar/flutter_rating_bar.dart';
3 |
4 | class RestaurantRatingBar extends StatelessWidget {
5 | const RestaurantRatingBar(
6 | {Key key,
7 | this.initialRating,
8 | this.itemSize = 40,
9 | this.ignoreGestures = false,
10 | this.onRatingUpdate})
11 | : super(key: key);
12 | final double initialRating;
13 | final bool ignoreGestures;
14 | final double itemSize;
15 | final ValueChanged onRatingUpdate;
16 |
17 | @override
18 | Widget build(BuildContext context) {
19 | return RatingBar(
20 | initialRating: initialRating,
21 | ignoreGestures: ignoreGestures,
22 | glow: false,
23 | allowHalfRating: true,
24 | itemSize: itemSize,
25 | itemBuilder: (context, _) => Icon(
26 | Icons.star,
27 | color: Colors.amber,
28 | ),
29 | onRatingUpdate: onRatingUpdate,
30 | );
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | Copyright (c) 2019 Andrea Bizzotto [bizz84@gmail.com](mailto:bizz84@gmail.com)
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/test/widget_test.dart:
--------------------------------------------------------------------------------
1 | // This is a basic Flutter widget test.
2 | //
3 | // To perform an interaction with a widget in your test, use the WidgetTester
4 | // utility that Flutter provides. For example, you can send tap and scroll
5 | // gestures. You can also use WidgetTester to find child widgets in the widget
6 | // tree, read text, and verify that the values of widget properties are correct.
7 |
8 | import 'package:flutter/material.dart';
9 | import 'package:flutter_test/flutter_test.dart';
10 |
11 | import 'package:restaurant_ratings_flutter_firebase/main.dart';
12 |
13 | void main() {
14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async {
15 | // Build our app and trigger a frame.
16 | await tester.pumpWidget(MyApp());
17 |
18 | // Verify that our counter starts at 0.
19 | expect(find.text('0'), findsOneWidget);
20 | expect(find.text('1'), findsNothing);
21 |
22 | // Tap the '+' icon and trigger a frame.
23 | await tester.tap(find.byIcon(Icons.add));
24 | await tester.pump();
25 |
26 | // Verify that our counter has incremented.
27 | expect(find.text('0'), findsNothing);
28 | expect(find.text('1'), findsOneWidget);
29 | });
30 | }
31 |
--------------------------------------------------------------------------------
/functions/src/index.ts:
--------------------------------------------------------------------------------
1 | import * as admin from 'firebase-admin'
2 | import * as functions from 'firebase-functions'
3 |
4 | admin.initializeApp()
5 |
6 | export const updateRestaurantRating = functions.firestore
7 | .document(`restaurants/{restaurantId}/ratings/{uid}`)
8 | .onWrite(async (change, _) => await updateRating(change))
9 |
10 | async function updateRating(change: functions.Change) {
11 |
12 | const restaurantRatingsRef = change.after.ref.parent
13 | let numRatings = 0
14 | let total = 0
15 | const docRefs = await restaurantRatingsRef.listDocuments()
16 | for (const docRef of docRefs) {
17 | const snapshot = await docRef.get()
18 | const data = snapshot.data()
19 | if (data !== undefined) {
20 | total += data.rating
21 | numRatings++
22 | }
23 | }
24 | const avgRating = total / numRatings
25 |
26 | const restaurantRef = restaurantRatingsRef.parent!
27 | console.log(`${restaurantRef.path} now has ${numRatings} ratings with a ${avgRating} average`)
28 | await restaurantRef.update({
29 | avgRating: avgRating,
30 | numRatings: numRatings
31 | })
32 | }
33 |
--------------------------------------------------------------------------------
/lib/models/restaurant_rating.dart:
--------------------------------------------------------------------------------
1 | import 'dart:ui';
2 |
3 | import 'package:flutter/foundation.dart';
4 |
5 | @immutable
6 | class RestaurantRating {
7 | const RestaurantRating({@required this.restaurantId, this.rating});
8 | final String restaurantId;
9 | final double rating;
10 |
11 | factory RestaurantRating.fromMap(
12 | Map data, String documentId) {
13 | if (data == null) {
14 | return null;
15 | }
16 | final String name = data['name'];
17 | if (name == null) {
18 | return null;
19 | }
20 | final double rating = data['rating'];
21 | return RestaurantRating(
22 | restaurantId: documentId,
23 | rating: rating,
24 | );
25 | }
26 |
27 | // @override
28 | // int get hashCode => hashValues(restaurantId, rating);
29 |
30 | // @override
31 | // bool operator ==(Object other) {
32 | // if (identical(this, other)) return true;
33 | // if (runtimeType != other.runtimeType) return false;
34 | // final Restaurant otherRestaurant = other;
35 | // return id == otherRestaurant.id &&
36 | // name == otherRestaurant.name &&
37 | // numRatings == otherRestaurant.numRatings &&
38 | // avgRating == otherRestaurant.avgRating;
39 | // }
40 |
41 | // @override
42 | // String toString() =>
43 | // 'id: $id, name: $name, numRatings: $numRatings, avgRating: $avgRating';
44 | }
45 |
--------------------------------------------------------------------------------
/lib/services/firestore_database.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:firestore_service/firestore_service.dart';
4 | import 'package:restaurant_ratings_flutter_firebase/models/restaurant.dart';
5 | import 'package:meta/meta.dart';
6 | import 'package:restaurant_ratings_flutter_firebase/services/firestore_path.dart';
7 |
8 | class FirestoreDatabase {
9 | FirestoreDatabase({@required this.uid})
10 | : assert(uid != null, 'Cannot create FirestoreDatabase with null uid');
11 | final String uid;
12 |
13 | final _service = FirestoreService.instance;
14 |
15 | Future submitUserRating({Restaurant restaurant, double rating}) =>
16 | _service.setData(
17 | path: FirestorePath.restaurantUserRating(restaurant.id, uid),
18 | data: {'rating': rating},
19 | );
20 |
21 | Stream> restaurants() => _service.collectionStream(
22 | path: FirestorePath.restaurants(),
23 | builder: (data, documentId) => Restaurant.fromMap(data, documentId),
24 | );
25 |
26 | Stream restaurant(String restaurantId) => _service.documentStream(
27 | path: FirestorePath.restaurant(restaurantId),
28 | builder: (data, documentId) => Restaurant.fromMap(data, documentId),
29 | );
30 |
31 | Stream restaurantUserRating(String restaurantId) =>
32 | _service.documentStream(
33 | path: FirestorePath.restaurantUserRating(restaurantId, uid),
34 | builder: (data, _) => data != null ? data['rating'] : null,
35 | );
36 | }
37 |
--------------------------------------------------------------------------------
/lib/models/restaurant.dart:
--------------------------------------------------------------------------------
1 | import 'dart:ui';
2 |
3 | import 'package:flutter/foundation.dart';
4 |
5 | @immutable
6 | class Restaurant {
7 | const Restaurant(
8 | {@required this.id,
9 | @required this.name,
10 | @required this.numRatings,
11 | this.avgRating});
12 | final String id;
13 | final String name;
14 | final int numRatings;
15 | final double avgRating;
16 |
17 | factory Restaurant.fromMap(Map data, String documentId) {
18 | if (data == null) {
19 | return null;
20 | }
21 | final String name = data['name'];
22 | if (name == null) {
23 | return null;
24 | }
25 | final int numRatings = data['numRatings'] ?? 0;
26 | final double avgRating = (data['avgRating'] ?? 0).toDouble();
27 | return Restaurant(
28 | id: documentId,
29 | name: name,
30 | numRatings: numRatings,
31 | avgRating: avgRating,
32 | );
33 | }
34 |
35 | @override
36 | int get hashCode => hashValues(id, name, numRatings, avgRating);
37 |
38 | @override
39 | bool operator ==(Object other) {
40 | if (identical(this, other)) return true;
41 | if (runtimeType != other.runtimeType) return false;
42 | final Restaurant otherRestaurant = other;
43 | return id == otherRestaurant.id &&
44 | name == otherRestaurant.name &&
45 | numRatings == otherRestaurant.numRatings &&
46 | avgRating == otherRestaurant.avgRating;
47 | }
48 |
49 | @override
50 | String toString() =>
51 | 'id: $id, name: $name, numRatings: $numRatings, avgRating: $avgRating';
52 | }
53 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | restaurant_ratings_flutter_firebase
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIViewControllerBasedStatusBarAppearance
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply plugin: 'kotlin-android'
26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
27 |
28 | android {
29 | compileSdkVersion 28
30 |
31 | sourceSets {
32 | main.java.srcDirs += 'src/main/kotlin'
33 | }
34 |
35 | lintOptions {
36 | disable 'InvalidPackage'
37 | }
38 |
39 | defaultConfig {
40 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
41 | applicationId "com.example.restaurant_ratings_flutter_firebase"
42 | minSdkVersion 16
43 | targetSdkVersion 28
44 | versionCode flutterVersionCode.toInteger()
45 | versionName flutterVersionName
46 | }
47 |
48 | buildTypes {
49 | release {
50 | // TODO: Add your own signing config for the release build.
51 | // Signing with the debug keys for now, so `flutter run --release` works.
52 | signingConfig signingConfigs.debug
53 | }
54 | }
55 | }
56 |
57 | flutter {
58 | source '../..'
59 | }
60 |
61 | dependencies {
62 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
63 | }
64 |
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:auth_widget_builder/auth_widget_builder.dart';
2 | import 'package:restaurant_ratings_flutter_firebase/app/home/restaurants_list_page.dart';
3 | import 'package:restaurant_ratings_flutter_firebase/app/sign_in/sign_in_page.dart';
4 | import 'package:flutter/material.dart';
5 | import 'package:provider/provider.dart';
6 | import 'package:restaurant_ratings_flutter_firebase/services/firestore_database.dart';
7 | import 'package:firebase_auth_service/firebase_auth_service.dart';
8 |
9 | void main() => runApp(MyApp(
10 | authServiceBuilder: (_) => FirebaseAuthService(),
11 | databaseBuilder: (_, uid) => FirestoreDatabase(uid: uid),
12 | ));
13 |
14 | class MyApp extends StatelessWidget {
15 | const MyApp({Key key, this.authServiceBuilder, this.databaseBuilder})
16 | : super(key: key);
17 | // Expose builders for 3rd party services at the root of the widget tree
18 | // This is useful when mocking services while testing
19 | final FirebaseAuthService Function(BuildContext context) authServiceBuilder;
20 | final FirestoreDatabase Function(BuildContext context, String uid)
21 | databaseBuilder;
22 |
23 | @override
24 | Widget build(BuildContext context) {
25 | // MultiProvider for top-level services that don't depend on any runtime values (e.g. uid)
26 | return MultiProvider(
27 | providers: [
28 | Provider(
29 | create: authServiceBuilder,
30 | ),
31 | ],
32 | child: AuthWidgetBuilder(
33 | userProvidersBuilder: (_, user) => [
34 | Provider.value(value: user),
35 | Provider(
36 | create: (_) => FirestoreDatabase(uid: user.uid),
37 | ),
38 | ],
39 | builder: (context, userSnapshot) {
40 | return MaterialApp(
41 | theme: ThemeData(primarySwatch: Colors.indigo),
42 | debugShowCheckedModeBanner: false,
43 | home: AuthWidget(
44 | userSnapshot: userSnapshot,
45 | nonSignedInBuilder: (_) => SignInPageBuilder(),
46 | signedInBuilder: (_) => RestaurantsListPage(),
47 | ),
48 | );
49 | },
50 | ),
51 | );
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.lock
4 | *.log
5 | *.pyc
6 | *.swp
7 | .DS_Store
8 | .atom/
9 | .buildlog/
10 | .history
11 | .svn/
12 |
13 | # IntelliJ related
14 | *.iml
15 | *.ipr
16 | *.iws
17 | .idea/
18 |
19 | # Visual Studio Code related
20 | .vscode/
21 |
22 | # Flutter repo-specific
23 | /bin/cache/
24 | /bin/mingit/
25 | /dev/benchmarks/mega_gallery/
26 | /dev/bots/.recipe_deps
27 | /dev/bots/android_tools/
28 | /dev/docs/doc/
29 | /dev/docs/flutter.docs.zip
30 | /dev/docs/lib/
31 | /dev/docs/pubspec.yaml
32 | /packages/flutter/coverage/
33 | version
34 |
35 | # Flutter/Dart/Pub related
36 | **/doc/api/
37 | .dart_tool/
38 | .flutter-plugins
39 | .packages
40 | .pub-cache/
41 | .pub/
42 | build/
43 | flutter_*.png
44 | linked_*.ds
45 | unlinked.ds
46 | unlinked_spec.ds
47 | .flutter-plugins-dependencies
48 |
49 | # Android related
50 | **/android/**/gradle-wrapper.jar
51 | **/android/.gradle
52 | **/android/captures/
53 | **/android/gradlew
54 | **/android/gradlew.bat
55 | **/android/local.properties
56 | **/android/**/GeneratedPluginRegistrant.java
57 | **/android/key.properties
58 | *.jks
59 |
60 | # iOS/XCode related
61 | **/ios/**/*.mode1v3
62 | **/ios/**/*.mode2v3
63 | **/ios/**/*.moved-aside
64 | **/ios/**/*.pbxuser
65 | **/ios/**/*.perspectivev3
66 | **/ios/**/*sync/
67 | **/ios/**/.sconsign.dblite
68 | **/ios/**/.tags*
69 | **/ios/**/.vagrant/
70 | **/ios/**/DerivedData/
71 | **/ios/**/Icon?
72 | **/ios/**/Pods/
73 | **/ios/**/.symlinks/
74 | **/ios/**/profile
75 | **/ios/**/xcuserdata
76 | **/ios/.generated/
77 | **/ios/Flutter/App.framework
78 | **/ios/Flutter/Flutter.framework
79 | **/ios/Flutter/Generated.xcconfig
80 | **/ios/Flutter/app.flx
81 | **/ios/Flutter/app.zip
82 | **/ios/Flutter/flutter_assets/
83 | **/ios/ServiceDefinitions.json
84 | **/ios/Runner/GeneratedPluginRegistrant.*
85 | **/ios/Flutter/flutter_export_environment.sh
86 |
87 | # web
88 | web/firebase-config.js
89 |
90 | # Exceptions to above rules.
91 | !**/ios/**/default.mode1v3
92 | !**/ios/**/default.mode2v3
93 | !**/ios/**/default.pbxuser
94 | !**/ios/**/default.perspectivev3
95 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
96 |
97 | # Firebase configuration files
98 | ios/Runner/GoogleService-Info.plist
99 | android/app/google-services.json
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Restaurant In-App Rating Demo App with Flutter & Firebase
2 |
3 | 
4 |
5 | ## Features
6 |
7 | - Sign in with email & password / anonymous
8 | - Restaurants List
9 | - Restaurant detail page with rating UI
10 | - Cloud Function to calculate average rating and number of ratings
11 |
12 | ## Running the project with Firebase
13 |
14 | To use this project with Firebase, some configuration steps are required.
15 |
16 | - Create a new project with the Firebase console.
17 | - Add iOS and Android apps in the Firebase project settings.
18 | - On Android, use `com.example.restaurant_ratings_flutter_firebase` as the package name.
19 | - then, [download and copy](https://firebase.google.com/docs/flutter/setup#configure_an_android_app) `google-services.json` into `android/app`.
20 | - On iOS, use `com.example.restaurantRatingsFlutterFirebase` as the bundle ID.
21 | - then, [download and copy](https://firebase.google.com/docs/flutter/setup#configure_an_ios_app) `GoogleService-Info.plist` into `iOS/Runner`, and add it to the Runner target in Xcode.
22 |
23 | See this document for full instructions:
24 |
25 | - [https://firebase.google.com/docs/flutter/setup](https://firebase.google.com/docs/flutter/setup)
26 |
27 | ## References
28 |
29 | ### Videos
30 |
31 | - [Learning Cloud Functions for Firebase (video series)](https://firebase.google.com/docs/functions/video-series)
32 | - [How do Cloud Functions work? | Get to Know Cloud Firestore #11](https://youtu.be/rERRuBjxJ80)
33 |
34 | ### Documentation
35 |
36 | - [Cloud Functions for Firebase](https://firebase.google.com/docs/functions)
37 | - [Call functions from your app](https://firebase.google.com/docs/functions/callable) (aka callable functions)
38 | - [Call functions via HTTP requests](https://firebase.google.com/docs/functions/http-events)
39 | - [Cloud Firestore triggers](https://firebase.google.com/docs/functions/firestore-events)
40 | - [Manage functions deployment and runtime options](https://firebase.google.com/docs/functions/manage-functions)
41 | - [Environment configuration](https://firebase.google.com/docs/functions/config-env) (useful to set API keys without hard-coding them)
42 | - [Deploy to multiple environments with Firebase Hosting](https://firebase.googleblog.com/2016/07/deploy-to-multiple-environments-with.html)
43 |
44 | ### Sample code
45 |
46 | - [Cloud Functions for Firebase Sample Library](https://github.com/firebase/functions-samples)
47 |
48 |
49 | ## [LICENSE: MIT](LICENSE.md)
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
8 |
12 |
19 |
23 |
27 |
32 |
36 |
37 |
38 |
39 |
40 |
41 |
43 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment this line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
6 |
7 | project 'Runner', {
8 | 'Debug' => :debug,
9 | 'Profile' => :release,
10 | 'Release' => :release,
11 | }
12 |
13 | def parse_KV_file(file, separator='=')
14 | file_abs_path = File.expand_path(file)
15 | if !File.exists? file_abs_path
16 | return [];
17 | end
18 | generated_key_values = {}
19 | skip_line_start_symbols = ["#", "/"]
20 | File.foreach(file_abs_path) do |line|
21 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
22 | plugin = line.split(pattern=separator)
23 | if plugin.length == 2
24 | podname = plugin[0].strip()
25 | path = plugin[1].strip()
26 | podpath = File.expand_path("#{path}", file_abs_path)
27 | generated_key_values[podname] = podpath
28 | else
29 | puts "Invalid plugin specification: #{line}"
30 | end
31 | end
32 | generated_key_values
33 | end
34 |
35 | target 'Runner' do
36 | use_frameworks!
37 | use_modular_headers!
38 |
39 | # Flutter Pod
40 |
41 | copied_flutter_dir = File.join(__dir__, 'Flutter')
42 | copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework')
43 | copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec')
44 | unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path)
45 | # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet.
46 | # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration.
47 | # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist.
48 |
49 | generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig')
50 | unless File.exist?(generated_xcode_build_settings_path)
51 | raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first"
52 | end
53 | generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path)
54 | cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR'];
55 |
56 | unless File.exist?(copied_framework_path)
57 | FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir)
58 | end
59 | unless File.exist?(copied_podspec_path)
60 | FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir)
61 | end
62 | end
63 |
64 | # Keep pod path relative so it can be checked into Podfile.lock.
65 | pod 'Flutter', :path => 'Flutter'
66 |
67 | # Plugin Pods
68 |
69 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
70 | # referring to absolute paths on developers' machines.
71 | system('rm -rf .symlinks')
72 | system('mkdir -p .symlinks/plugins')
73 | plugin_pods = parse_KV_file('../.flutter-plugins')
74 | plugin_pods.each do |name, path|
75 | symlink = File.join('.symlinks', 'plugins', name)
76 | File.symlink(path, symlink)
77 | pod name, :path => File.join(symlink, 'ios')
78 | end
79 | end
80 |
81 | post_install do |installer|
82 | installer.pods_project.targets.each do |target|
83 | target.build_configurations.each do |config|
84 | config.build_settings['ENABLE_BITCODE'] = 'NO'
85 | end
86 | end
87 | end
88 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
67 |
73 |
75 |
81 |
82 |
83 |
84 |
86 |
87 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: restaurant_ratings_flutter_firebase
2 | description: A new Flutter project.
3 |
4 | # The following line prevents the package from being accidentally published to
5 | # pub.dev using `pub publish`. This is preferred for private packages.
6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev
7 |
8 | # The following defines the version and build number for your application.
9 | # A version number is three numbers separated by dots, like 1.2.43
10 | # followed by an optional build number separated by a +.
11 | # Both the version and the builder number may be overridden in flutter
12 | # build by specifying --build-name and --build-number, respectively.
13 | # In Android, build-name is used as versionName while build-number used as versionCode.
14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning
15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
16 | # Read more about iOS versioning at
17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
18 | version: 1.0.0+1
19 |
20 | environment:
21 | sdk: ">=2.8.0 <3.0.0"
22 |
23 | dependencies:
24 | flutter:
25 | sdk: flutter
26 | firebase_auth: ^0.16.0
27 | firebase_auth_service:
28 | git:
29 | url: https://github.com/bizz84/codewithandrea_flutter_packages
30 | path: packages/firebase_auth_service
31 | auth_widget_builder:
32 | git:
33 | url: https://github.com/bizz84/codewithandrea_flutter_packages
34 | path: packages/auth_widget_builder
35 | cloud_firestore: ^0.13.5
36 | firestore_service:
37 | git:
38 | url: https://github.com/bizz84/codewithandrea_flutter_packages
39 | path: packages/firestore_service
40 | custom_buttons:
41 | git:
42 | url: https://github.com/bizz84/codewithandrea_flutter_packages
43 | path: packages/custom_buttons
44 | alert_dialogs:
45 | git:
46 | url: https://github.com/bizz84/codewithandrea_flutter_packages
47 | path: packages/alert_dialogs
48 | email_password_sign_in_ui:
49 | git:
50 | url: https://github.com/bizz84/codewithandrea_flutter_packages
51 | path: packages/email_password_sign_in_ui
52 | provider: ^4.1.2
53 | rxdart: ^0.24.1
54 | intl: ^0.16.1
55 | flutter_rating_bar: ^3.0.1+1
56 |
57 |
58 | # The following adds the Cupertino Icons font to your application.
59 | # Use with the CupertinoIcons class for iOS style icons.
60 | cupertino_icons: ^0.1.3
61 |
62 | dev_dependencies:
63 | flutter_test:
64 | sdk: flutter
65 | mockito: ^4.1.1
66 | random_string: ^2.0.0
67 | flutter_driver:
68 | sdk: flutter
69 | test: any
70 |
71 | # For information on the generic Dart part of this file, see the
72 | # following page: https://dart.dev/tools/pub/pubspec
73 |
74 | # The following section is specific to Flutter.
75 | flutter:
76 |
77 | # The following line ensures that the Material Icons font is
78 | # included with your application, so that you can use the icons in
79 | # the material Icons class.
80 | uses-material-design: true
81 |
82 | # To add assets to your application, add an assets section, like this:
83 | # assets:
84 | # - images/a_dot_burr.jpeg
85 | # - images/a_dot_ham.jpeg
86 |
87 | # An image asset can refer to one or more resolution-specific "variants", see
88 | # https://flutter.dev/assets-and-images/#resolution-aware.
89 |
90 | # For details regarding adding assets from package dependencies, see
91 | # https://flutter.dev/assets-and-images/#from-packages
92 |
93 | # To add custom fonts to your application, add a fonts section here,
94 | # in this "flutter" section. Each entry in this list should have a
95 | # "family" key with the font family name, and a "fonts" key with a
96 | # list giving the asset and other descriptors for the font. For
97 | # example:
98 | # fonts:
99 | # - family: Schyler
100 | # fonts:
101 | # - asset: fonts/Schyler-Regular.ttf
102 | # - asset: fonts/Schyler-Italic.ttf
103 | # style: italic
104 | # - family: Trajan Pro
105 | # fonts:
106 | # - asset: fonts/TrajanPro.ttf
107 | # - asset: fonts/TrajanPro_Bold.ttf
108 | # weight: 700
109 | #
110 | # For details regarding fonts from package dependencies,
111 | # see https://flutter.dev/custom-fonts/#from-packages
112 |
--------------------------------------------------------------------------------
/lib/app/home/restaurant_details_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:alert_dialogs/alert_dialogs.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:restaurant_ratings_flutter_firebase/app/home/restaurant_rating_bar.dart';
4 | import 'package:restaurant_ratings_flutter_firebase/constants/strings.dart';
5 | import 'package:restaurant_ratings_flutter_firebase/models/restaurant.dart';
6 | import 'package:restaurant_ratings_flutter_firebase/services/firestore_database.dart';
7 | import 'package:provider/provider.dart';
8 |
9 | class RestaurantDetailsPage extends StatelessWidget {
10 | const RestaurantDetailsPage({Key key, this.restaurant}) : super(key: key);
11 | final Restaurant restaurant;
12 |
13 | @override
14 | Widget build(BuildContext context) {
15 | return Scaffold(
16 | appBar: AppBar(
17 | title: Text(restaurant.name),
18 | ),
19 | body: Column(
20 | children: [
21 | Spacer(flex: 1),
22 | RestaurantRatingDisplay(restaurant: restaurant),
23 | SizedBox(height: 64),
24 | RestaurantRatingPrompt(restaurant: restaurant),
25 | Spacer(flex: 2),
26 | ],
27 | ),
28 | );
29 | }
30 | }
31 |
32 | class RestaurantRatingDisplay extends StatelessWidget {
33 | const RestaurantRatingDisplay({Key key, this.restaurant}) : super(key: key);
34 | final Restaurant restaurant;
35 | @override
36 | Widget build(BuildContext context) {
37 | final database = Provider.of(context, listen: false);
38 | return StreamBuilder(
39 | stream: database.restaurant(restaurant.id),
40 | builder: (_, snapshot) {
41 | if (snapshot.connectionState == ConnectionState.waiting) {
42 | return Center(child: CircularProgressIndicator());
43 | }
44 | final restaurant = snapshot.data;
45 | return Center(
46 | child: Column(
47 | mainAxisSize: MainAxisSize.min,
48 | crossAxisAlignment: CrossAxisAlignment.center,
49 | children: [
50 | Text('Average rating'),
51 | RestaurantRatingBar(
52 | initialRating: restaurant?.avgRating ?? 0,
53 | ignoreGestures: true,
54 | itemSize: 24.0,
55 | ),
56 | if (restaurant != null)
57 | Text('from ${restaurant.numRatings} ratings'),
58 | ],
59 | ),
60 | );
61 | },
62 | );
63 | }
64 | }
65 |
66 | class RestaurantRatingPrompt extends StatelessWidget {
67 | const RestaurantRatingPrompt({Key key, this.restaurant}) : super(key: key);
68 | final Restaurant restaurant;
69 |
70 | Future _submitRating(BuildContext context, {double rating}) async {
71 | try {
72 | final bool didConfirmSubmit = await showAlertDialog(
73 | context: context,
74 | title: 'Submit Rating',
75 | content: 'Do you want to submit a rating of $rating?',
76 | cancelActionText: Strings.cancel,
77 | defaultActionText: 'Submit',
78 | ) ??
79 | false;
80 | if (didConfirmSubmit) {
81 | final database = Provider.of(context, listen: false);
82 | await database.submitUserRating(restaurant: restaurant, rating: rating);
83 | }
84 | } catch (e) {
85 | print(e);
86 | }
87 | }
88 |
89 | @override
90 | Widget build(BuildContext context) {
91 | final database = Provider.of(context, listen: false);
92 | return StreamBuilder(
93 | stream: database.restaurantUserRating(restaurant.id),
94 | builder: (_, snapshot) {
95 | if (snapshot.connectionState == ConnectionState.waiting) {
96 | return Center(child: CircularProgressIndicator());
97 | }
98 | final rating = snapshot.data;
99 | // user never rated this before
100 | return Column(
101 | mainAxisSize: MainAxisSize.min,
102 | crossAxisAlignment: CrossAxisAlignment.center,
103 | children: [
104 | Text(rating == null ? 'Tap to rate' : 'You rated this restaurant:',
105 | style: Theme.of(context).textTheme.headline6),
106 | SizedBox(height: 8),
107 | RestaurantRatingBar(
108 | initialRating: rating ?? 0,
109 | ignoreGestures: false,
110 | itemSize: 40,
111 | onRatingUpdate: (newRating) => _submitRating(
112 | context,
113 | rating: newRating,
114 | ),
115 | )
116 | ],
117 | );
118 | },
119 | );
120 | }
121 | }
122 |
--------------------------------------------------------------------------------
/lib/app/home/restaurants_list_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:alert_dialogs/alert_dialogs.dart';
2 | import 'package:firebase_auth_service/firebase_auth_service.dart';
3 | import 'package:flutter/material.dart';
4 | import 'package:restaurant_ratings_flutter_firebase/app/home/restaurant_details_page.dart';
5 | import 'package:restaurant_ratings_flutter_firebase/app/home/restaurant_rating_bar.dart';
6 | import 'package:restaurant_ratings_flutter_firebase/constants/strings.dart';
7 | import 'package:restaurant_ratings_flutter_firebase/models/restaurant.dart';
8 | import 'package:restaurant_ratings_flutter_firebase/services/firestore_database.dart';
9 | import 'package:provider/provider.dart';
10 |
11 | class RestaurantsListPage extends StatelessWidget {
12 | Future _signOut(BuildContext context) async {
13 | try {
14 | final FirebaseAuthService auth =
15 | Provider.of(context, listen: false);
16 | await auth.signOut();
17 | } catch (e) {
18 | showExceptionAlertDialog(
19 | context: context,
20 | title: Strings.logoutFailed,
21 | exception: e,
22 | );
23 | }
24 | }
25 |
26 | Future _confirmSignOut(BuildContext context) async {
27 | final bool didRequestSignOut = await showAlertDialog(
28 | context: context,
29 | title: Strings.logout,
30 | content: Strings.logoutAreYouSure,
31 | cancelActionText: Strings.cancel,
32 | defaultActionText: Strings.logout,
33 | ) ??
34 | false;
35 | if (didRequestSignOut == true) {
36 | await _signOut(context);
37 | }
38 | }
39 |
40 | @override
41 | Widget build(BuildContext context) {
42 | return Scaffold(
43 | appBar: AppBar(
44 | title: Text('Restaurant List'),
45 | elevation: 0,
46 | actions: [
47 | FlatButton(
48 | child: Text(
49 | Strings.logout,
50 | style: TextStyle(
51 | fontSize: 18.0,
52 | color: Colors.white,
53 | ),
54 | ),
55 | onPressed: () => _confirmSignOut(context),
56 | ),
57 | ],
58 | ),
59 | body: RestaurantsList(),
60 | );
61 | }
62 | }
63 |
64 | class RestaurantsList extends StatelessWidget {
65 | @override
66 | Widget build(BuildContext context) {
67 | final database = Provider.of(context, listen: false);
68 | return StreamBuilder>(
69 | stream: database.restaurants(),
70 | builder: (_, snapshot) {
71 | if (snapshot.connectionState == ConnectionState.waiting) {
72 | return Center(child: CircularProgressIndicator());
73 | }
74 | final restaurants = snapshot.data ?? [];
75 | return ListView.separated(
76 | itemBuilder: (_, index) => RestaurantListTile(
77 | restaurant: restaurants[index],
78 | onPressed: () {
79 | Navigator.of(context).push(
80 | MaterialPageRoute(
81 | builder: (_) =>
82 | RestaurantDetailsPage(restaurant: restaurants[index]),
83 | ),
84 | );
85 | },
86 | ),
87 | separatorBuilder: (_, index) => Divider(height: 0.5),
88 | itemCount: restaurants.length,
89 | );
90 | },
91 | );
92 | }
93 | }
94 |
95 | class RestaurantListTile extends StatelessWidget {
96 | const RestaurantListTile({Key key, @required this.restaurant, this.onPressed})
97 | : super(key: key);
98 | final Restaurant restaurant;
99 | final VoidCallback onPressed;
100 |
101 | String get ratingsString =>
102 | restaurant.numRatings > 0 ? '${restaurant.numRatings}' : 'No';
103 |
104 | @override
105 | Widget build(BuildContext context) {
106 | return InkWell(
107 | onTap: onPressed,
108 | child: Padding(
109 | padding: const EdgeInsets.all(8.0),
110 | child: Row(
111 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
112 | children: [
113 | Text(restaurant.name),
114 | Column(
115 | mainAxisAlignment: MainAxisAlignment.center,
116 | children: [
117 | RestaurantRatingBar(
118 | initialRating:
119 | restaurant.numRatings > 0 ? restaurant.avgRating : 0,
120 | ignoreGestures: true,
121 | itemSize: 24,
122 | ),
123 | SizedBox(height: 4),
124 | Text('$ratingsString ratings'),
125 | ],
126 | ),
127 | ],
128 | ),
129 | ),
130 | );
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/lib/app/sign_in/sign_in_page.dart:
--------------------------------------------------------------------------------
1 | import 'dart:math';
2 |
3 | import 'package:alert_dialogs/alert_dialogs.dart';
4 | import 'package:email_password_sign_in_ui/email_password_sign_in_ui.dart';
5 | import 'package:restaurant_ratings_flutter_firebase/app/sign_in/sign_in_view_model.dart';
6 | import 'package:restaurant_ratings_flutter_firebase/app/sign_in/sign_in_button.dart';
7 | import 'package:restaurant_ratings_flutter_firebase/constants/strings.dart';
8 | import 'package:flutter/foundation.dart';
9 | import 'package:flutter/material.dart';
10 | import 'package:provider/provider.dart';
11 | import 'package:firebase_auth_service/firebase_auth_service.dart';
12 |
13 | class SignInPageBuilder extends StatelessWidget {
14 | @override
15 | Widget build(BuildContext context) {
16 | final FirebaseAuthService auth =
17 | Provider.of(context, listen: false);
18 | return ChangeNotifierProvider(
19 | create: (_) => SignInViewModel(auth: auth),
20 | child: Consumer(
21 | builder: (_, viewModel, __) => SignInPage._(
22 | viewModel: viewModel,
23 | title: 'Restaurant Ratings',
24 | ),
25 | ),
26 | );
27 | }
28 | }
29 |
30 | class SignInPage extends StatelessWidget {
31 | const SignInPage._({Key key, this.viewModel, this.title}) : super(key: key);
32 | final SignInViewModel viewModel;
33 | final String title;
34 |
35 | Future _showSignInError(BuildContext context, dynamic exception) async {
36 | await showExceptionAlertDialog(
37 | context: context,
38 | title: Strings.signInFailed,
39 | exception: exception,
40 | );
41 | }
42 |
43 | Future _signInAnonymously(BuildContext context) async {
44 | try {
45 | await viewModel.signInAnonymously();
46 | } catch (e) {
47 | await _showSignInError(context, e);
48 | }
49 | }
50 |
51 | Future _showEmailPasswordSignInPage(BuildContext context) async {
52 | final navigator = Navigator.of(context);
53 | await navigator.push(
54 | MaterialPageRoute(
55 | builder: (_) =>
56 | EmailPasswordSignInPage(onSignedIn: () => navigator.pop()),
57 | fullscreenDialog: true,
58 | ),
59 | );
60 | }
61 |
62 | @override
63 | Widget build(BuildContext context) {
64 | return Scaffold(
65 | appBar: AppBar(
66 | elevation: 2.0,
67 | title: Text(title),
68 | ),
69 | backgroundColor: Colors.grey[200],
70 | body: _buildSignIn(context),
71 | );
72 | }
73 |
74 | Widget _buildHeader() {
75 | if (viewModel.isLoading) {
76 | return const Center(
77 | child: CircularProgressIndicator(),
78 | );
79 | }
80 | return Text(
81 | Strings.signIn,
82 | textAlign: TextAlign.center,
83 | style: TextStyle(fontSize: 32.0, fontWeight: FontWeight.w600),
84 | );
85 | }
86 |
87 | Widget _buildSignIn(BuildContext context) {
88 | return Center(
89 | child: LayoutBuilder(builder: (context, constraints) {
90 | return Container(
91 | width: min(constraints.maxWidth, 600),
92 | padding: const EdgeInsets.all(16.0),
93 | child: Column(
94 | mainAxisAlignment: MainAxisAlignment.center,
95 | crossAxisAlignment: CrossAxisAlignment.stretch,
96 | children: [
97 | const SizedBox(height: 32.0),
98 | SizedBox(
99 | height: 50.0,
100 | child: _buildHeader(),
101 | ),
102 | const SizedBox(height: 32.0),
103 | SignInButton(
104 | text: Strings.signInWithEmailPassword,
105 | onPressed: viewModel.isLoading
106 | ? null
107 | : () => _showEmailPasswordSignInPage(context),
108 | textColor: Colors.white,
109 | color: Theme.of(context).primaryColor,
110 | ),
111 | const SizedBox(height: 8),
112 | Text(
113 | Strings.or,
114 | style: TextStyle(fontSize: 14.0, color: Colors.black87),
115 | textAlign: TextAlign.center,
116 | ),
117 | const SizedBox(height: 8),
118 | SignInButton(
119 | text: Strings.goAnonymous,
120 | color: Theme.of(context).primaryColor,
121 | textColor: Colors.white,
122 | onPressed: viewModel.isLoading
123 | ? null
124 | : () => _signInAnonymously(context),
125 | ),
126 | ],
127 | ),
128 | );
129 | }),
130 | );
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/functions/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "rules": {
3 | // -- Strict errors --
4 | // These lint rules are likely always a good idea.
5 |
6 | // Force function overloads to be declared together. This ensures readers understand APIs.
7 | "adjacent-overload-signatures": true,
8 |
9 | // Do not allow the subtle/obscure comma operator.
10 | "ban-comma-operator": true,
11 |
12 | // Do not allow internal modules or namespaces . These are deprecated in favor of ES6 modules.
13 | "no-namespace": true,
14 |
15 | // Do not allow parameters to be reassigned. To avoid bugs, developers should instead assign new values to new vars.
16 | "no-parameter-reassignment": true,
17 |
18 | // Force the use of ES6-style imports instead of /// imports.
19 | "no-reference": true,
20 |
21 | // Do not allow type assertions that do nothing. This is a big warning that the developer may not understand the
22 | // code currently being edited (they may be incorrectly handling a different type case that does not exist).
23 | "no-unnecessary-type-assertion": true,
24 |
25 | // Disallow nonsensical label usage.
26 | "label-position": true,
27 |
28 | // Disallows the (often typo) syntax if (var1 = var2). Replace with if (var2) { var1 = var2 }.
29 | "no-conditional-assignment": true,
30 |
31 | // Disallows constructors for primitive types (e.g. new Number('123'), though Number('123') is still allowed).
32 | "no-construct": true,
33 |
34 | // Do not allow super() to be called twice in a constructor.
35 | "no-duplicate-super": true,
36 |
37 | // Do not allow the same case to appear more than once in a switch block.
38 | "no-duplicate-switch-case": true,
39 |
40 | // Do not allow a variable to be declared more than once in the same block. Consider function parameters in this
41 | // rule.
42 | "no-duplicate-variable": [true, "check-parameters"],
43 |
44 | // Disallows a variable definition in an inner scope from shadowing a variable in an outer scope. Developers should
45 | // instead use a separate variable name.
46 | "no-shadowed-variable": true,
47 |
48 | // Empty blocks are almost never needed. Allow the one general exception: empty catch blocks.
49 | "no-empty": [true, "allow-empty-catch"],
50 |
51 | // Functions must either be handled directly (e.g. with a catch() handler) or returned to another function.
52 | // This is a major source of errors in Cloud Functions and the team strongly recommends leaving this rule on.
53 | "no-floating-promises": true,
54 |
55 | // Do not allow any imports for modules that are not in package.json. These will almost certainly fail when
56 | // deployed.
57 | "no-implicit-dependencies": true,
58 |
59 | // The 'this' keyword can only be used inside of classes.
60 | "no-invalid-this": true,
61 |
62 | // Do not allow strings to be thrown because they will not include stack traces. Throw Errors instead.
63 | "no-string-throw": true,
64 |
65 | // Disallow control flow statements, such as return, continue, break, and throw in finally blocks.
66 | "no-unsafe-finally": true,
67 |
68 | // Expressions must always return a value. Avoids common errors like const myValue = functionReturningVoid();
69 | "no-void-expression": [true, "ignore-arrow-function-shorthand"],
70 |
71 | // Disallow duplicate imports in the same file.
72 | "no-duplicate-imports": true,
73 |
74 |
75 | // -- Strong Warnings --
76 | // These rules should almost never be needed, but may be included due to legacy code.
77 | // They are left as a warning to avoid frustration with blocked deploys when the developer
78 | // understand the warning and wants to deploy anyway.
79 |
80 | // Warn when an empty interface is defined. These are generally not useful.
81 | "no-empty-interface": {"severity": "warning"},
82 |
83 | // Warn when an import will have side effects.
84 | "no-import-side-effect": {"severity": "warning"},
85 |
86 | // Warn when variables are defined with var. Var has subtle meaning that can lead to bugs. Strongly prefer const for
87 | // most values and let for values that will change.
88 | "no-var-keyword": {"severity": "warning"},
89 |
90 | // Prefer === and !== over == and !=. The latter operators support overloads that are often accidental.
91 | "triple-equals": {"severity": "warning"},
92 |
93 | // Warn when using deprecated APIs.
94 | "deprecation": {"severity": "warning"},
95 |
96 | // -- Light Warnings --
97 | // These rules are intended to help developers use better style. Simpler code has fewer bugs. These would be "info"
98 | // if TSLint supported such a level.
99 |
100 | // prefer for( ... of ... ) to an index loop when the index is only used to fetch an object from an array.
101 | // (Even better: check out utils like .map if transforming an array!)
102 | "prefer-for-of": {"severity": "warning"},
103 |
104 | // Warns if function overloads could be unified into a single function with optional or rest parameters.
105 | "unified-signatures": {"severity": "warning"},
106 |
107 | // Prefer const for values that will not change. This better documents code.
108 | "prefer-const": {"severity": "warning"},
109 |
110 | // Multi-line object literals and function calls should have a trailing comma. This helps avoid merge conflicts.
111 | "trailing-comma": {"severity": "warning"}
112 | },
113 |
114 | "defaultSeverity": "error"
115 | }
116 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
12 | 65C5344B249CA57300C73233 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 65C5344A249CA57300C73233 /* GoogleService-Info.plist */; };
13 | 68C56507DBD4931FDC489D6C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2DB9A462AADA9B0EE98345A2 /* Pods_Runner.framework */; };
14 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
15 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
16 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
17 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
18 | /* End PBXBuildFile section */
19 |
20 | /* Begin PBXCopyFilesBuildPhase section */
21 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
22 | isa = PBXCopyFilesBuildPhase;
23 | buildActionMask = 2147483647;
24 | dstPath = "";
25 | dstSubfolderSpec = 10;
26 | files = (
27 | );
28 | name = "Embed Frameworks";
29 | runOnlyForDeploymentPostprocessing = 0;
30 | };
31 | /* End PBXCopyFilesBuildPhase section */
32 |
33 | /* Begin PBXFileReference section */
34 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
35 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
36 | 2DB9A462AADA9B0EE98345A2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
37 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
38 | 65C5344A249CA57300C73233 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; };
39 | 7157CD5AB61EC0162911F2E8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
40 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
41 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
42 | 7997448AA450321EF927A720 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
43 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
44 | 96961B61761B765D7D5BD8B5 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
45 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
46 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
47 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
48 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
49 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
50 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
51 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
52 | /* End PBXFileReference section */
53 |
54 | /* Begin PBXFrameworksBuildPhase section */
55 | 97C146EB1CF9000F007C117D /* Frameworks */ = {
56 | isa = PBXFrameworksBuildPhase;
57 | buildActionMask = 2147483647;
58 | files = (
59 | 68C56507DBD4931FDC489D6C /* Pods_Runner.framework in Frameworks */,
60 | );
61 | runOnlyForDeploymentPostprocessing = 0;
62 | };
63 | /* End PBXFrameworksBuildPhase section */
64 |
65 | /* Begin PBXGroup section */
66 | 3EF437502708114F7B76D29A /* Frameworks */ = {
67 | isa = PBXGroup;
68 | children = (
69 | 2DB9A462AADA9B0EE98345A2 /* Pods_Runner.framework */,
70 | );
71 | name = Frameworks;
72 | sourceTree = "";
73 | };
74 | 579CEBA1B375EDBF674EBF27 /* Pods */ = {
75 | isa = PBXGroup;
76 | children = (
77 | 7997448AA450321EF927A720 /* Pods-Runner.debug.xcconfig */,
78 | 96961B61761B765D7D5BD8B5 /* Pods-Runner.release.xcconfig */,
79 | 7157CD5AB61EC0162911F2E8 /* Pods-Runner.profile.xcconfig */,
80 | );
81 | name = Pods;
82 | path = Pods;
83 | sourceTree = "";
84 | };
85 | 9740EEB11CF90186004384FC /* Flutter */ = {
86 | isa = PBXGroup;
87 | children = (
88 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
89 | 9740EEB21CF90195004384FC /* Debug.xcconfig */,
90 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
91 | 9740EEB31CF90195004384FC /* Generated.xcconfig */,
92 | );
93 | name = Flutter;
94 | sourceTree = "";
95 | };
96 | 97C146E51CF9000F007C117D = {
97 | isa = PBXGroup;
98 | children = (
99 | 9740EEB11CF90186004384FC /* Flutter */,
100 | 97C146F01CF9000F007C117D /* Runner */,
101 | 97C146EF1CF9000F007C117D /* Products */,
102 | 579CEBA1B375EDBF674EBF27 /* Pods */,
103 | 3EF437502708114F7B76D29A /* Frameworks */,
104 | );
105 | sourceTree = "";
106 | };
107 | 97C146EF1CF9000F007C117D /* Products */ = {
108 | isa = PBXGroup;
109 | children = (
110 | 97C146EE1CF9000F007C117D /* Runner.app */,
111 | );
112 | name = Products;
113 | sourceTree = "";
114 | };
115 | 97C146F01CF9000F007C117D /* Runner */ = {
116 | isa = PBXGroup;
117 | children = (
118 | 97C146FA1CF9000F007C117D /* Main.storyboard */,
119 | 97C146FD1CF9000F007C117D /* Assets.xcassets */,
120 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
121 | 97C147021CF9000F007C117D /* Info.plist */,
122 | 65C5344A249CA57300C73233 /* GoogleService-Info.plist */,
123 | 97C146F11CF9000F007C117D /* Supporting Files */,
124 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
125 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
126 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
127 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
128 | );
129 | path = Runner;
130 | sourceTree = "";
131 | };
132 | 97C146F11CF9000F007C117D /* Supporting Files */ = {
133 | isa = PBXGroup;
134 | children = (
135 | );
136 | name = "Supporting Files";
137 | sourceTree = "";
138 | };
139 | /* End PBXGroup section */
140 |
141 | /* Begin PBXNativeTarget section */
142 | 97C146ED1CF9000F007C117D /* Runner */ = {
143 | isa = PBXNativeTarget;
144 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
145 | buildPhases = (
146 | 805E2250B9FBC6483FED6E85 /* [CP] Check Pods Manifest.lock */,
147 | 9740EEB61CF901F6004384FC /* Run Script */,
148 | 97C146EA1CF9000F007C117D /* Sources */,
149 | 97C146EB1CF9000F007C117D /* Frameworks */,
150 | 97C146EC1CF9000F007C117D /* Resources */,
151 | 9705A1C41CF9048500538489 /* Embed Frameworks */,
152 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
153 | 27BF541F5E52587F3B872888 /* [CP] Embed Pods Frameworks */,
154 | );
155 | buildRules = (
156 | );
157 | dependencies = (
158 | );
159 | name = Runner;
160 | productName = Runner;
161 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
162 | productType = "com.apple.product-type.application";
163 | };
164 | /* End PBXNativeTarget section */
165 |
166 | /* Begin PBXProject section */
167 | 97C146E61CF9000F007C117D /* Project object */ = {
168 | isa = PBXProject;
169 | attributes = {
170 | LastUpgradeCheck = 1020;
171 | ORGANIZATIONNAME = "";
172 | TargetAttributes = {
173 | 97C146ED1CF9000F007C117D = {
174 | CreatedOnToolsVersion = 7.3.1;
175 | LastSwiftMigration = 1100;
176 | };
177 | };
178 | };
179 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
180 | compatibilityVersion = "Xcode 9.3";
181 | developmentRegion = en;
182 | hasScannedForEncodings = 0;
183 | knownRegions = (
184 | en,
185 | Base,
186 | );
187 | mainGroup = 97C146E51CF9000F007C117D;
188 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
189 | projectDirPath = "";
190 | projectRoot = "";
191 | targets = (
192 | 97C146ED1CF9000F007C117D /* Runner */,
193 | );
194 | };
195 | /* End PBXProject section */
196 |
197 | /* Begin PBXResourcesBuildPhase section */
198 | 97C146EC1CF9000F007C117D /* Resources */ = {
199 | isa = PBXResourcesBuildPhase;
200 | buildActionMask = 2147483647;
201 | files = (
202 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
203 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
204 | 65C5344B249CA57300C73233 /* GoogleService-Info.plist in Resources */,
205 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
206 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
207 | );
208 | runOnlyForDeploymentPostprocessing = 0;
209 | };
210 | /* End PBXResourcesBuildPhase section */
211 |
212 | /* Begin PBXShellScriptBuildPhase section */
213 | 27BF541F5E52587F3B872888 /* [CP] Embed Pods Frameworks */ = {
214 | isa = PBXShellScriptBuildPhase;
215 | buildActionMask = 2147483647;
216 | files = (
217 | );
218 | inputFileListPaths = (
219 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
220 | );
221 | name = "[CP] Embed Pods Frameworks";
222 | outputFileListPaths = (
223 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
224 | );
225 | runOnlyForDeploymentPostprocessing = 0;
226 | shellPath = /bin/sh;
227 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
228 | showEnvVarsInLog = 0;
229 | };
230 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
231 | isa = PBXShellScriptBuildPhase;
232 | buildActionMask = 2147483647;
233 | files = (
234 | );
235 | inputPaths = (
236 | );
237 | name = "Thin Binary";
238 | outputPaths = (
239 | );
240 | runOnlyForDeploymentPostprocessing = 0;
241 | shellPath = /bin/sh;
242 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
243 | };
244 | 805E2250B9FBC6483FED6E85 /* [CP] Check Pods Manifest.lock */ = {
245 | isa = PBXShellScriptBuildPhase;
246 | buildActionMask = 2147483647;
247 | files = (
248 | );
249 | inputFileListPaths = (
250 | );
251 | inputPaths = (
252 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
253 | "${PODS_ROOT}/Manifest.lock",
254 | );
255 | name = "[CP] Check Pods Manifest.lock";
256 | outputFileListPaths = (
257 | );
258 | outputPaths = (
259 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
260 | );
261 | runOnlyForDeploymentPostprocessing = 0;
262 | shellPath = /bin/sh;
263 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
264 | showEnvVarsInLog = 0;
265 | };
266 | 9740EEB61CF901F6004384FC /* Run Script */ = {
267 | isa = PBXShellScriptBuildPhase;
268 | buildActionMask = 2147483647;
269 | files = (
270 | );
271 | inputPaths = (
272 | );
273 | name = "Run Script";
274 | outputPaths = (
275 | );
276 | runOnlyForDeploymentPostprocessing = 0;
277 | shellPath = /bin/sh;
278 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
279 | };
280 | /* End PBXShellScriptBuildPhase section */
281 |
282 | /* Begin PBXSourcesBuildPhase section */
283 | 97C146EA1CF9000F007C117D /* Sources */ = {
284 | isa = PBXSourcesBuildPhase;
285 | buildActionMask = 2147483647;
286 | files = (
287 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
288 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
289 | );
290 | runOnlyForDeploymentPostprocessing = 0;
291 | };
292 | /* End PBXSourcesBuildPhase section */
293 |
294 | /* Begin PBXVariantGroup section */
295 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
296 | isa = PBXVariantGroup;
297 | children = (
298 | 97C146FB1CF9000F007C117D /* Base */,
299 | );
300 | name = Main.storyboard;
301 | sourceTree = "";
302 | };
303 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
304 | isa = PBXVariantGroup;
305 | children = (
306 | 97C147001CF9000F007C117D /* Base */,
307 | );
308 | name = LaunchScreen.storyboard;
309 | sourceTree = "";
310 | };
311 | /* End PBXVariantGroup section */
312 |
313 | /* Begin XCBuildConfiguration section */
314 | 249021D3217E4FDB00AE95B9 /* Profile */ = {
315 | isa = XCBuildConfiguration;
316 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
317 | buildSettings = {
318 | ALWAYS_SEARCH_USER_PATHS = NO;
319 | CLANG_ANALYZER_NONNULL = YES;
320 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
321 | CLANG_CXX_LIBRARY = "libc++";
322 | CLANG_ENABLE_MODULES = YES;
323 | CLANG_ENABLE_OBJC_ARC = YES;
324 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
325 | CLANG_WARN_BOOL_CONVERSION = YES;
326 | CLANG_WARN_COMMA = YES;
327 | CLANG_WARN_CONSTANT_CONVERSION = YES;
328 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
329 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
330 | CLANG_WARN_EMPTY_BODY = YES;
331 | CLANG_WARN_ENUM_CONVERSION = YES;
332 | CLANG_WARN_INFINITE_RECURSION = YES;
333 | CLANG_WARN_INT_CONVERSION = YES;
334 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
335 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
336 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
337 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
338 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
339 | CLANG_WARN_STRICT_PROTOTYPES = YES;
340 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
341 | CLANG_WARN_UNREACHABLE_CODE = YES;
342 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
343 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
344 | COPY_PHASE_STRIP = NO;
345 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
346 | ENABLE_NS_ASSERTIONS = NO;
347 | ENABLE_STRICT_OBJC_MSGSEND = YES;
348 | GCC_C_LANGUAGE_STANDARD = gnu99;
349 | GCC_NO_COMMON_BLOCKS = YES;
350 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
351 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
352 | GCC_WARN_UNDECLARED_SELECTOR = YES;
353 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
354 | GCC_WARN_UNUSED_FUNCTION = YES;
355 | GCC_WARN_UNUSED_VARIABLE = YES;
356 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
357 | MTL_ENABLE_DEBUG_INFO = NO;
358 | SDKROOT = iphoneos;
359 | SUPPORTED_PLATFORMS = iphoneos;
360 | TARGETED_DEVICE_FAMILY = "1,2";
361 | VALIDATE_PRODUCT = YES;
362 | };
363 | name = Profile;
364 | };
365 | 249021D4217E4FDB00AE95B9 /* Profile */ = {
366 | isa = XCBuildConfiguration;
367 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
368 | buildSettings = {
369 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
370 | CLANG_ENABLE_MODULES = YES;
371 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
372 | ENABLE_BITCODE = NO;
373 | FRAMEWORK_SEARCH_PATHS = (
374 | "$(inherited)",
375 | "$(PROJECT_DIR)/Flutter",
376 | );
377 | INFOPLIST_FILE = Runner/Info.plist;
378 | LD_RUNPATH_SEARCH_PATHS = (
379 | "$(inherited)",
380 | "@executable_path/Frameworks",
381 | );
382 | LIBRARY_SEARCH_PATHS = (
383 | "$(inherited)",
384 | "$(PROJECT_DIR)/Flutter",
385 | );
386 | PRODUCT_BUNDLE_IDENTIFIER = com.example.restaurantRatingsFlutterFirebase;
387 | PRODUCT_NAME = "$(TARGET_NAME)";
388 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
389 | SWIFT_VERSION = 5.0;
390 | VERSIONING_SYSTEM = "apple-generic";
391 | };
392 | name = Profile;
393 | };
394 | 97C147031CF9000F007C117D /* Debug */ = {
395 | isa = XCBuildConfiguration;
396 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
397 | buildSettings = {
398 | ALWAYS_SEARCH_USER_PATHS = NO;
399 | CLANG_ANALYZER_NONNULL = YES;
400 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
401 | CLANG_CXX_LIBRARY = "libc++";
402 | CLANG_ENABLE_MODULES = YES;
403 | CLANG_ENABLE_OBJC_ARC = YES;
404 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
405 | CLANG_WARN_BOOL_CONVERSION = YES;
406 | CLANG_WARN_COMMA = YES;
407 | CLANG_WARN_CONSTANT_CONVERSION = YES;
408 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
409 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
410 | CLANG_WARN_EMPTY_BODY = YES;
411 | CLANG_WARN_ENUM_CONVERSION = YES;
412 | CLANG_WARN_INFINITE_RECURSION = YES;
413 | CLANG_WARN_INT_CONVERSION = YES;
414 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
415 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
416 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
417 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
418 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
419 | CLANG_WARN_STRICT_PROTOTYPES = YES;
420 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
421 | CLANG_WARN_UNREACHABLE_CODE = YES;
422 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
423 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
424 | COPY_PHASE_STRIP = NO;
425 | DEBUG_INFORMATION_FORMAT = dwarf;
426 | ENABLE_STRICT_OBJC_MSGSEND = YES;
427 | ENABLE_TESTABILITY = YES;
428 | GCC_C_LANGUAGE_STANDARD = gnu99;
429 | GCC_DYNAMIC_NO_PIC = NO;
430 | GCC_NO_COMMON_BLOCKS = YES;
431 | GCC_OPTIMIZATION_LEVEL = 0;
432 | GCC_PREPROCESSOR_DEFINITIONS = (
433 | "DEBUG=1",
434 | "$(inherited)",
435 | );
436 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
437 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
438 | GCC_WARN_UNDECLARED_SELECTOR = YES;
439 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
440 | GCC_WARN_UNUSED_FUNCTION = YES;
441 | GCC_WARN_UNUSED_VARIABLE = YES;
442 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
443 | MTL_ENABLE_DEBUG_INFO = YES;
444 | ONLY_ACTIVE_ARCH = YES;
445 | SDKROOT = iphoneos;
446 | TARGETED_DEVICE_FAMILY = "1,2";
447 | };
448 | name = Debug;
449 | };
450 | 97C147041CF9000F007C117D /* Release */ = {
451 | isa = XCBuildConfiguration;
452 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
453 | buildSettings = {
454 | ALWAYS_SEARCH_USER_PATHS = NO;
455 | CLANG_ANALYZER_NONNULL = YES;
456 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
457 | CLANG_CXX_LIBRARY = "libc++";
458 | CLANG_ENABLE_MODULES = YES;
459 | CLANG_ENABLE_OBJC_ARC = YES;
460 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
461 | CLANG_WARN_BOOL_CONVERSION = YES;
462 | CLANG_WARN_COMMA = YES;
463 | CLANG_WARN_CONSTANT_CONVERSION = YES;
464 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
465 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
466 | CLANG_WARN_EMPTY_BODY = YES;
467 | CLANG_WARN_ENUM_CONVERSION = YES;
468 | CLANG_WARN_INFINITE_RECURSION = YES;
469 | CLANG_WARN_INT_CONVERSION = YES;
470 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
471 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
472 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
473 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
474 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
475 | CLANG_WARN_STRICT_PROTOTYPES = YES;
476 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
477 | CLANG_WARN_UNREACHABLE_CODE = YES;
478 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
479 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
480 | COPY_PHASE_STRIP = NO;
481 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
482 | ENABLE_NS_ASSERTIONS = NO;
483 | ENABLE_STRICT_OBJC_MSGSEND = YES;
484 | GCC_C_LANGUAGE_STANDARD = gnu99;
485 | GCC_NO_COMMON_BLOCKS = YES;
486 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
487 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
488 | GCC_WARN_UNDECLARED_SELECTOR = YES;
489 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
490 | GCC_WARN_UNUSED_FUNCTION = YES;
491 | GCC_WARN_UNUSED_VARIABLE = YES;
492 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
493 | MTL_ENABLE_DEBUG_INFO = NO;
494 | SDKROOT = iphoneos;
495 | SUPPORTED_PLATFORMS = iphoneos;
496 | SWIFT_COMPILATION_MODE = wholemodule;
497 | SWIFT_OPTIMIZATION_LEVEL = "-O";
498 | TARGETED_DEVICE_FAMILY = "1,2";
499 | VALIDATE_PRODUCT = YES;
500 | };
501 | name = Release;
502 | };
503 | 97C147061CF9000F007C117D /* Debug */ = {
504 | isa = XCBuildConfiguration;
505 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
506 | buildSettings = {
507 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
508 | CLANG_ENABLE_MODULES = YES;
509 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
510 | ENABLE_BITCODE = NO;
511 | FRAMEWORK_SEARCH_PATHS = (
512 | "$(inherited)",
513 | "$(PROJECT_DIR)/Flutter",
514 | );
515 | INFOPLIST_FILE = Runner/Info.plist;
516 | LD_RUNPATH_SEARCH_PATHS = (
517 | "$(inherited)",
518 | "@executable_path/Frameworks",
519 | );
520 | LIBRARY_SEARCH_PATHS = (
521 | "$(inherited)",
522 | "$(PROJECT_DIR)/Flutter",
523 | );
524 | PRODUCT_BUNDLE_IDENTIFIER = com.example.restaurantRatingsFlutterFirebase;
525 | PRODUCT_NAME = "$(TARGET_NAME)";
526 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
527 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
528 | SWIFT_VERSION = 5.0;
529 | VERSIONING_SYSTEM = "apple-generic";
530 | };
531 | name = Debug;
532 | };
533 | 97C147071CF9000F007C117D /* Release */ = {
534 | isa = XCBuildConfiguration;
535 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
536 | buildSettings = {
537 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
538 | CLANG_ENABLE_MODULES = YES;
539 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
540 | ENABLE_BITCODE = NO;
541 | FRAMEWORK_SEARCH_PATHS = (
542 | "$(inherited)",
543 | "$(PROJECT_DIR)/Flutter",
544 | );
545 | INFOPLIST_FILE = Runner/Info.plist;
546 | LD_RUNPATH_SEARCH_PATHS = (
547 | "$(inherited)",
548 | "@executable_path/Frameworks",
549 | );
550 | LIBRARY_SEARCH_PATHS = (
551 | "$(inherited)",
552 | "$(PROJECT_DIR)/Flutter",
553 | );
554 | PRODUCT_BUNDLE_IDENTIFIER = com.example.restaurantRatingsFlutterFirebase;
555 | PRODUCT_NAME = "$(TARGET_NAME)";
556 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
557 | SWIFT_VERSION = 5.0;
558 | VERSIONING_SYSTEM = "apple-generic";
559 | };
560 | name = Release;
561 | };
562 | /* End XCBuildConfiguration section */
563 |
564 | /* Begin XCConfigurationList section */
565 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
566 | isa = XCConfigurationList;
567 | buildConfigurations = (
568 | 97C147031CF9000F007C117D /* Debug */,
569 | 97C147041CF9000F007C117D /* Release */,
570 | 249021D3217E4FDB00AE95B9 /* Profile */,
571 | );
572 | defaultConfigurationIsVisible = 0;
573 | defaultConfigurationName = Release;
574 | };
575 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
576 | isa = XCConfigurationList;
577 | buildConfigurations = (
578 | 97C147061CF9000F007C117D /* Debug */,
579 | 97C147071CF9000F007C117D /* Release */,
580 | 249021D4217E4FDB00AE95B9 /* Profile */,
581 | );
582 | defaultConfigurationIsVisible = 0;
583 | defaultConfigurationName = Release;
584 | };
585 | /* End XCConfigurationList section */
586 | };
587 | rootObject = 97C146E61CF9000F007C117D /* Project object */;
588 | }
589 |
--------------------------------------------------------------------------------
/functions/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "functions",
3 | "requires": true,
4 | "lockfileVersion": 1,
5 | "dependencies": {
6 | "@babel/code-frame": {
7 | "version": "7.10.1",
8 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
9 | "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
10 | "dev": true,
11 | "requires": {
12 | "@babel/highlight": "^7.10.1"
13 | }
14 | },
15 | "@babel/helper-validator-identifier": {
16 | "version": "7.10.1",
17 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz",
18 | "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==",
19 | "dev": true
20 | },
21 | "@babel/highlight": {
22 | "version": "7.10.1",
23 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
24 | "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
25 | "dev": true,
26 | "requires": {
27 | "@babel/helper-validator-identifier": "^7.10.1",
28 | "chalk": "^2.0.0",
29 | "js-tokens": "^4.0.0"
30 | }
31 | },
32 | "@firebase/app-types": {
33 | "version": "0.6.1",
34 | "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.1.tgz",
35 | "integrity": "sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg=="
36 | },
37 | "@firebase/auth-interop-types": {
38 | "version": "0.1.5",
39 | "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz",
40 | "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw=="
41 | },
42 | "@firebase/component": {
43 | "version": "0.1.14",
44 | "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.14.tgz",
45 | "integrity": "sha512-jbcTAne5mn5T508TY5BFrDOT1v/hXiX/22eMXweCXFbD+9JbsMztwQhNwqjwB8ihNAYG2FKw64UfI9NM04lD/g==",
46 | "requires": {
47 | "@firebase/util": "0.2.49",
48 | "tslib": "^1.11.1"
49 | }
50 | },
51 | "@firebase/database": {
52 | "version": "0.6.5",
53 | "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.5.tgz",
54 | "integrity": "sha512-4AnsLUscnCZ48nRGe0YKmHq/cQ4pcM3pRV9O4Uh6mPQpTSixPDLMveuAHYJFUI9tgj5I+FNqjxezUFLS7+9XOw==",
55 | "requires": {
56 | "@firebase/auth-interop-types": "0.1.5",
57 | "@firebase/component": "0.1.14",
58 | "@firebase/database-types": "0.5.1",
59 | "@firebase/logger": "0.2.5",
60 | "@firebase/util": "0.2.49",
61 | "faye-websocket": "0.11.3",
62 | "tslib": "^1.11.1"
63 | }
64 | },
65 | "@firebase/database-types": {
66 | "version": "0.5.1",
67 | "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.1.tgz",
68 | "integrity": "sha512-onQxom1ZBYBJ648w/VNRzUewovEDAH7lvnrrpCd69ukkyrMk6rGEO/PQ9BcNEbhlNtukpsqRS0oNOFlHs0FaSA==",
69 | "requires": {
70 | "@firebase/app-types": "0.6.1"
71 | }
72 | },
73 | "@firebase/logger": {
74 | "version": "0.2.5",
75 | "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.5.tgz",
76 | "integrity": "sha512-qqw3m0tWs/qrg7axTZG/QZq24DIMdSY6dGoWuBn08ddq7+GLF5HiqkRj71XznYeUUbfRq5W9C/PSFnN4JxX+WA=="
77 | },
78 | "@firebase/util": {
79 | "version": "0.2.49",
80 | "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.49.tgz",
81 | "integrity": "sha512-SjUoxSqIfcSvDBiMiFEF5SmUOcWNbMH2asJ0VZ1T3vPBlCIRp6tk+T3LMvUWAI8OCnTpbGtpX1fTKiUDLP4xkQ==",
82 | "requires": {
83 | "tslib": "^1.11.1"
84 | }
85 | },
86 | "@google-cloud/common": {
87 | "version": "2.4.0",
88 | "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.4.0.tgz",
89 | "integrity": "sha512-zWFjBS35eI9leAHhjfeOYlK5Plcuj/77EzstnrJIZbKgF/nkqjcQuGiMCpzCwOfPyUbz8ZaEOYgbHa759AKbjg==",
90 | "optional": true,
91 | "requires": {
92 | "@google-cloud/projectify": "^1.0.0",
93 | "@google-cloud/promisify": "^1.0.0",
94 | "arrify": "^2.0.0",
95 | "duplexify": "^3.6.0",
96 | "ent": "^2.2.0",
97 | "extend": "^3.0.2",
98 | "google-auth-library": "^5.5.0",
99 | "retry-request": "^4.0.0",
100 | "teeny-request": "^6.0.0"
101 | }
102 | },
103 | "@google-cloud/firestore": {
104 | "version": "3.8.5",
105 | "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-3.8.5.tgz",
106 | "integrity": "sha512-MMUiQRhraXybayNZ6vbs+tLUq/TwXi7i40NEY9W5Wo5f4tX3SxX0km6FFbnNBy6pAEwpkZ02s0RMVy/RsMeGqA==",
107 | "optional": true,
108 | "requires": {
109 | "deep-equal": "^2.0.0",
110 | "functional-red-black-tree": "^1.0.1",
111 | "google-gax": "^1.15.3",
112 | "readable-stream": "^3.4.0",
113 | "through2": "^3.0.0"
114 | }
115 | },
116 | "@google-cloud/paginator": {
117 | "version": "2.0.3",
118 | "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-2.0.3.tgz",
119 | "integrity": "sha512-kp/pkb2p/p0d8/SKUu4mOq8+HGwF8NPzHWkj+VKrIPQPyMRw8deZtrO/OcSiy9C/7bpfU5Txah5ltUNfPkgEXg==",
120 | "optional": true,
121 | "requires": {
122 | "arrify": "^2.0.0",
123 | "extend": "^3.0.2"
124 | }
125 | },
126 | "@google-cloud/projectify": {
127 | "version": "1.0.4",
128 | "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-1.0.4.tgz",
129 | "integrity": "sha512-ZdzQUN02eRsmTKfBj9FDL0KNDIFNjBn/d6tHQmA/+FImH5DO6ZV8E7FzxMgAUiVAUq41RFAkb25p1oHOZ8psfg==",
130 | "optional": true
131 | },
132 | "@google-cloud/promisify": {
133 | "version": "1.0.4",
134 | "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-1.0.4.tgz",
135 | "integrity": "sha512-VccZDcOql77obTnFh0TbNED/6ZbbmHDf8UMNnzO1d5g9V0Htfm4k5cllY8P1tJsRKC3zWYGRLaViiupcgVjBoQ==",
136 | "optional": true
137 | },
138 | "@google-cloud/storage": {
139 | "version": "4.7.0",
140 | "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-4.7.0.tgz",
141 | "integrity": "sha512-f0guAlbeg7Z0m3gKjCfBCu7FG9qS3M3oL5OQQxlvGoPtK7/qg3+W+KQV73O2/sbuS54n0Kh2mvT5K2FWzF5vVQ==",
142 | "optional": true,
143 | "requires": {
144 | "@google-cloud/common": "^2.1.1",
145 | "@google-cloud/paginator": "^2.0.0",
146 | "@google-cloud/promisify": "^1.0.0",
147 | "arrify": "^2.0.0",
148 | "compressible": "^2.0.12",
149 | "concat-stream": "^2.0.0",
150 | "date-and-time": "^0.13.0",
151 | "duplexify": "^3.5.0",
152 | "extend": "^3.0.2",
153 | "gaxios": "^3.0.0",
154 | "gcs-resumable-upload": "^2.2.4",
155 | "hash-stream-validation": "^0.2.2",
156 | "mime": "^2.2.0",
157 | "mime-types": "^2.0.8",
158 | "onetime": "^5.1.0",
159 | "p-limit": "^2.2.0",
160 | "pumpify": "^2.0.0",
161 | "readable-stream": "^3.4.0",
162 | "snakeize": "^0.1.0",
163 | "stream-events": "^1.0.1",
164 | "through2": "^3.0.0",
165 | "xdg-basedir": "^4.0.0"
166 | },
167 | "dependencies": {
168 | "gaxios": {
169 | "version": "3.0.3",
170 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.0.3.tgz",
171 | "integrity": "sha512-PkzQludeIFhd535/yucALT/Wxyj/y2zLyrMwPcJmnLHDugmV49NvAi/vb+VUq/eWztATZCNcb8ue+ywPG+oLuw==",
172 | "optional": true,
173 | "requires": {
174 | "abort-controller": "^3.0.0",
175 | "extend": "^3.0.2",
176 | "https-proxy-agent": "^5.0.0",
177 | "is-stream": "^2.0.0",
178 | "node-fetch": "^2.3.0"
179 | }
180 | }
181 | }
182 | },
183 | "@grpc/grpc-js": {
184 | "version": "1.0.5",
185 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.0.5.tgz",
186 | "integrity": "sha512-Hm+xOiqAhcpT9RYM8lc15dbQD7aQurM7ZU8ulmulepiPlN7iwBXXwP3vSBUimoFoApRqz7pSIisXU8pZaCB4og==",
187 | "optional": true,
188 | "requires": {
189 | "semver": "^6.2.0"
190 | }
191 | },
192 | "@grpc/proto-loader": {
193 | "version": "0.5.4",
194 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.4.tgz",
195 | "integrity": "sha512-HTM4QpI9B2XFkPz7pjwMyMgZchJ93TVkL3kWPW8GDMDKYxsMnmf4w2TNMJK7+KNiYHS5cJrCEAFlF+AwtXWVPA==",
196 | "optional": true,
197 | "requires": {
198 | "lodash.camelcase": "^4.3.0",
199 | "protobufjs": "^6.8.6"
200 | }
201 | },
202 | "@protobufjs/aspromise": {
203 | "version": "1.1.2",
204 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
205 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=",
206 | "optional": true
207 | },
208 | "@protobufjs/base64": {
209 | "version": "1.1.2",
210 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
211 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
212 | "optional": true
213 | },
214 | "@protobufjs/codegen": {
215 | "version": "2.0.4",
216 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
217 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
218 | "optional": true
219 | },
220 | "@protobufjs/eventemitter": {
221 | "version": "1.1.0",
222 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
223 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=",
224 | "optional": true
225 | },
226 | "@protobufjs/fetch": {
227 | "version": "1.1.0",
228 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
229 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
230 | "optional": true,
231 | "requires": {
232 | "@protobufjs/aspromise": "^1.1.1",
233 | "@protobufjs/inquire": "^1.1.0"
234 | }
235 | },
236 | "@protobufjs/float": {
237 | "version": "1.0.2",
238 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
239 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=",
240 | "optional": true
241 | },
242 | "@protobufjs/inquire": {
243 | "version": "1.1.0",
244 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
245 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=",
246 | "optional": true
247 | },
248 | "@protobufjs/path": {
249 | "version": "1.1.2",
250 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
251 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=",
252 | "optional": true
253 | },
254 | "@protobufjs/pool": {
255 | "version": "1.1.0",
256 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
257 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=",
258 | "optional": true
259 | },
260 | "@protobufjs/utf8": {
261 | "version": "1.1.0",
262 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
263 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=",
264 | "optional": true
265 | },
266 | "@tootallnate/once": {
267 | "version": "1.1.2",
268 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
269 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
270 | "optional": true
271 | },
272 | "@types/body-parser": {
273 | "version": "1.19.0",
274 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
275 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
276 | "requires": {
277 | "@types/connect": "*",
278 | "@types/node": "*"
279 | }
280 | },
281 | "@types/connect": {
282 | "version": "3.4.33",
283 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz",
284 | "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==",
285 | "requires": {
286 | "@types/node": "*"
287 | }
288 | },
289 | "@types/express": {
290 | "version": "4.17.3",
291 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz",
292 | "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==",
293 | "requires": {
294 | "@types/body-parser": "*",
295 | "@types/express-serve-static-core": "*",
296 | "@types/serve-static": "*"
297 | }
298 | },
299 | "@types/express-serve-static-core": {
300 | "version": "4.17.7",
301 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz",
302 | "integrity": "sha512-EMgTj/DF9qpgLXyc+Btimg+XoH7A2liE8uKul8qSmMTHCeNYzydDKFdsJskDvw42UsesCnhO63dO0Grbj8J4Dw==",
303 | "requires": {
304 | "@types/node": "*",
305 | "@types/qs": "*",
306 | "@types/range-parser": "*"
307 | }
308 | },
309 | "@types/fs-extra": {
310 | "version": "8.1.1",
311 | "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.1.tgz",
312 | "integrity": "sha512-TcUlBem321DFQzBNuz8p0CLLKp0VvF/XH9E4KHNmgwyp4E3AfgI5cjiIVZWlbfThBop2qxFIh4+LeY6hVWWZ2w==",
313 | "optional": true,
314 | "requires": {
315 | "@types/node": "*"
316 | }
317 | },
318 | "@types/lodash": {
319 | "version": "4.14.155",
320 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.155.tgz",
321 | "integrity": "sha512-vEcX7S7aPhsBCivxMwAANQburHBtfN9RdyXFk84IJmu2Z4Hkg1tOFgaslRiEqqvoLtbCBi6ika1EMspE+NZ9Lg==",
322 | "dev": true
323 | },
324 | "@types/long": {
325 | "version": "4.0.1",
326 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
327 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==",
328 | "optional": true
329 | },
330 | "@types/mime": {
331 | "version": "2.0.2",
332 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.2.tgz",
333 | "integrity": "sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q=="
334 | },
335 | "@types/node": {
336 | "version": "8.10.61",
337 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.61.tgz",
338 | "integrity": "sha512-l+zSbvT8TPRaCxL1l9cwHCb0tSqGAGcjPJFItGGYat5oCTiq1uQQKYg5m7AF1mgnEBzFXGLJ2LRmNjtreRX76Q=="
339 | },
340 | "@types/qs": {
341 | "version": "6.9.3",
342 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.3.tgz",
343 | "integrity": "sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA=="
344 | },
345 | "@types/range-parser": {
346 | "version": "1.2.3",
347 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz",
348 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA=="
349 | },
350 | "@types/serve-static": {
351 | "version": "1.13.4",
352 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.4.tgz",
353 | "integrity": "sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug==",
354 | "requires": {
355 | "@types/express-serve-static-core": "*",
356 | "@types/mime": "*"
357 | }
358 | },
359 | "abort-controller": {
360 | "version": "3.0.0",
361 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
362 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
363 | "optional": true,
364 | "requires": {
365 | "event-target-shim": "^5.0.0"
366 | }
367 | },
368 | "accepts": {
369 | "version": "1.3.7",
370 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
371 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
372 | "requires": {
373 | "mime-types": "~2.1.24",
374 | "negotiator": "0.6.2"
375 | }
376 | },
377 | "agent-base": {
378 | "version": "6.0.0",
379 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz",
380 | "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==",
381 | "optional": true,
382 | "requires": {
383 | "debug": "4"
384 | }
385 | },
386 | "ansi-styles": {
387 | "version": "3.2.1",
388 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
389 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
390 | "dev": true,
391 | "requires": {
392 | "color-convert": "^1.9.0"
393 | }
394 | },
395 | "argparse": {
396 | "version": "1.0.10",
397 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
398 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
399 | "dev": true,
400 | "requires": {
401 | "sprintf-js": "~1.0.2"
402 | }
403 | },
404 | "array-filter": {
405 | "version": "1.0.0",
406 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz",
407 | "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=",
408 | "optional": true
409 | },
410 | "array-flatten": {
411 | "version": "1.1.1",
412 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
413 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
414 | },
415 | "arrify": {
416 | "version": "2.0.1",
417 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
418 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
419 | "optional": true
420 | },
421 | "available-typed-arrays": {
422 | "version": "1.0.2",
423 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz",
424 | "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==",
425 | "optional": true,
426 | "requires": {
427 | "array-filter": "^1.0.0"
428 | }
429 | },
430 | "balanced-match": {
431 | "version": "1.0.0",
432 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
433 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
434 | "dev": true
435 | },
436 | "base64-js": {
437 | "version": "1.3.1",
438 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
439 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
440 | "optional": true
441 | },
442 | "bignumber.js": {
443 | "version": "9.0.0",
444 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
445 | "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==",
446 | "optional": true
447 | },
448 | "body-parser": {
449 | "version": "1.19.0",
450 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
451 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
452 | "requires": {
453 | "bytes": "3.1.0",
454 | "content-type": "~1.0.4",
455 | "debug": "2.6.9",
456 | "depd": "~1.1.2",
457 | "http-errors": "1.7.2",
458 | "iconv-lite": "0.4.24",
459 | "on-finished": "~2.3.0",
460 | "qs": "6.7.0",
461 | "raw-body": "2.4.0",
462 | "type-is": "~1.6.17"
463 | },
464 | "dependencies": {
465 | "debug": {
466 | "version": "2.6.9",
467 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
468 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
469 | "requires": {
470 | "ms": "2.0.0"
471 | }
472 | },
473 | "ms": {
474 | "version": "2.0.0",
475 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
476 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
477 | }
478 | }
479 | },
480 | "brace-expansion": {
481 | "version": "1.1.11",
482 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
483 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
484 | "dev": true,
485 | "requires": {
486 | "balanced-match": "^1.0.0",
487 | "concat-map": "0.0.1"
488 | }
489 | },
490 | "buffer-equal-constant-time": {
491 | "version": "1.0.1",
492 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
493 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
494 | },
495 | "buffer-from": {
496 | "version": "1.1.1",
497 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
498 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
499 | "optional": true
500 | },
501 | "builtin-modules": {
502 | "version": "1.1.1",
503 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
504 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
505 | "dev": true
506 | },
507 | "bytes": {
508 | "version": "3.1.0",
509 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
510 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
511 | },
512 | "chalk": {
513 | "version": "2.4.2",
514 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
515 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
516 | "dev": true,
517 | "requires": {
518 | "ansi-styles": "^3.2.1",
519 | "escape-string-regexp": "^1.0.5",
520 | "supports-color": "^5.3.0"
521 | }
522 | },
523 | "color-convert": {
524 | "version": "1.9.3",
525 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
526 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
527 | "dev": true,
528 | "requires": {
529 | "color-name": "1.1.3"
530 | }
531 | },
532 | "color-name": {
533 | "version": "1.1.3",
534 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
535 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
536 | "dev": true
537 | },
538 | "commander": {
539 | "version": "2.20.3",
540 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
541 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
542 | "dev": true
543 | },
544 | "compressible": {
545 | "version": "2.0.18",
546 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
547 | "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
548 | "optional": true,
549 | "requires": {
550 | "mime-db": ">= 1.43.0 < 2"
551 | }
552 | },
553 | "concat-map": {
554 | "version": "0.0.1",
555 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
556 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
557 | "dev": true
558 | },
559 | "concat-stream": {
560 | "version": "2.0.0",
561 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
562 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
563 | "optional": true,
564 | "requires": {
565 | "buffer-from": "^1.0.0",
566 | "inherits": "^2.0.3",
567 | "readable-stream": "^3.0.2",
568 | "typedarray": "^0.0.6"
569 | }
570 | },
571 | "configstore": {
572 | "version": "5.0.1",
573 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
574 | "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
575 | "optional": true,
576 | "requires": {
577 | "dot-prop": "^5.2.0",
578 | "graceful-fs": "^4.1.2",
579 | "make-dir": "^3.0.0",
580 | "unique-string": "^2.0.0",
581 | "write-file-atomic": "^3.0.0",
582 | "xdg-basedir": "^4.0.0"
583 | }
584 | },
585 | "content-disposition": {
586 | "version": "0.5.3",
587 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
588 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
589 | "requires": {
590 | "safe-buffer": "5.1.2"
591 | },
592 | "dependencies": {
593 | "safe-buffer": {
594 | "version": "5.1.2",
595 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
596 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
597 | }
598 | }
599 | },
600 | "content-type": {
601 | "version": "1.0.4",
602 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
603 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
604 | },
605 | "cookie": {
606 | "version": "0.4.0",
607 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
608 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
609 | },
610 | "cookie-signature": {
611 | "version": "1.0.6",
612 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
613 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
614 | },
615 | "core-util-is": {
616 | "version": "1.0.2",
617 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
618 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
619 | "optional": true
620 | },
621 | "cors": {
622 | "version": "2.8.5",
623 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
624 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
625 | "requires": {
626 | "object-assign": "^4",
627 | "vary": "^1"
628 | }
629 | },
630 | "crypto-random-string": {
631 | "version": "2.0.0",
632 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
633 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
634 | "optional": true
635 | },
636 | "date-and-time": {
637 | "version": "0.13.1",
638 | "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.13.1.tgz",
639 | "integrity": "sha512-/Uge9DJAT+s+oAcDxtBhyR8+sKjUnZbYmyhbmWjTHNtX7B7oWD8YyYdeXcBRbwSj6hVvj+IQegJam7m7czhbFw==",
640 | "optional": true
641 | },
642 | "debug": {
643 | "version": "4.1.1",
644 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
645 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
646 | "optional": true,
647 | "requires": {
648 | "ms": "^2.1.1"
649 | }
650 | },
651 | "deep-equal": {
652 | "version": "2.0.3",
653 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.3.tgz",
654 | "integrity": "sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA==",
655 | "optional": true,
656 | "requires": {
657 | "es-abstract": "^1.17.5",
658 | "es-get-iterator": "^1.1.0",
659 | "is-arguments": "^1.0.4",
660 | "is-date-object": "^1.0.2",
661 | "is-regex": "^1.0.5",
662 | "isarray": "^2.0.5",
663 | "object-is": "^1.1.2",
664 | "object-keys": "^1.1.1",
665 | "object.assign": "^4.1.0",
666 | "regexp.prototype.flags": "^1.3.0",
667 | "side-channel": "^1.0.2",
668 | "which-boxed-primitive": "^1.0.1",
669 | "which-collection": "^1.0.1",
670 | "which-typed-array": "^1.1.2"
671 | }
672 | },
673 | "define-properties": {
674 | "version": "1.1.3",
675 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
676 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
677 | "requires": {
678 | "object-keys": "^1.0.12"
679 | }
680 | },
681 | "depd": {
682 | "version": "1.1.2",
683 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
684 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
685 | },
686 | "destroy": {
687 | "version": "1.0.4",
688 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
689 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
690 | },
691 | "dicer": {
692 | "version": "0.3.0",
693 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz",
694 | "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==",
695 | "requires": {
696 | "streamsearch": "0.1.2"
697 | }
698 | },
699 | "diff": {
700 | "version": "4.0.2",
701 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
702 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
703 | "dev": true
704 | },
705 | "dot-prop": {
706 | "version": "5.2.0",
707 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
708 | "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
709 | "optional": true,
710 | "requires": {
711 | "is-obj": "^2.0.0"
712 | }
713 | },
714 | "duplexify": {
715 | "version": "3.7.1",
716 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
717 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
718 | "optional": true,
719 | "requires": {
720 | "end-of-stream": "^1.0.0",
721 | "inherits": "^2.0.1",
722 | "readable-stream": "^2.0.0",
723 | "stream-shift": "^1.0.0"
724 | },
725 | "dependencies": {
726 | "isarray": {
727 | "version": "1.0.0",
728 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
729 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
730 | "optional": true
731 | },
732 | "readable-stream": {
733 | "version": "2.3.7",
734 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
735 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
736 | "optional": true,
737 | "requires": {
738 | "core-util-is": "~1.0.0",
739 | "inherits": "~2.0.3",
740 | "isarray": "~1.0.0",
741 | "process-nextick-args": "~2.0.0",
742 | "safe-buffer": "~5.1.1",
743 | "string_decoder": "~1.1.1",
744 | "util-deprecate": "~1.0.1"
745 | }
746 | },
747 | "safe-buffer": {
748 | "version": "5.1.2",
749 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
750 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
751 | "optional": true
752 | }
753 | }
754 | },
755 | "ecdsa-sig-formatter": {
756 | "version": "1.0.11",
757 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
758 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
759 | "requires": {
760 | "safe-buffer": "^5.0.1"
761 | }
762 | },
763 | "ee-first": {
764 | "version": "1.1.1",
765 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
766 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
767 | },
768 | "encodeurl": {
769 | "version": "1.0.2",
770 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
771 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
772 | },
773 | "end-of-stream": {
774 | "version": "1.4.4",
775 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
776 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
777 | "optional": true,
778 | "requires": {
779 | "once": "^1.4.0"
780 | }
781 | },
782 | "ent": {
783 | "version": "2.2.0",
784 | "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
785 | "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
786 | "optional": true
787 | },
788 | "es-abstract": {
789 | "version": "1.17.6",
790 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
791 | "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
792 | "requires": {
793 | "es-to-primitive": "^1.2.1",
794 | "function-bind": "^1.1.1",
795 | "has": "^1.0.3",
796 | "has-symbols": "^1.0.1",
797 | "is-callable": "^1.2.0",
798 | "is-regex": "^1.1.0",
799 | "object-inspect": "^1.7.0",
800 | "object-keys": "^1.1.1",
801 | "object.assign": "^4.1.0",
802 | "string.prototype.trimend": "^1.0.1",
803 | "string.prototype.trimstart": "^1.0.1"
804 | }
805 | },
806 | "es-get-iterator": {
807 | "version": "1.1.0",
808 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz",
809 | "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==",
810 | "optional": true,
811 | "requires": {
812 | "es-abstract": "^1.17.4",
813 | "has-symbols": "^1.0.1",
814 | "is-arguments": "^1.0.4",
815 | "is-map": "^2.0.1",
816 | "is-set": "^2.0.1",
817 | "is-string": "^1.0.5",
818 | "isarray": "^2.0.5"
819 | }
820 | },
821 | "es-to-primitive": {
822 | "version": "1.2.1",
823 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
824 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
825 | "requires": {
826 | "is-callable": "^1.1.4",
827 | "is-date-object": "^1.0.1",
828 | "is-symbol": "^1.0.2"
829 | }
830 | },
831 | "escape-html": {
832 | "version": "1.0.3",
833 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
834 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
835 | },
836 | "escape-string-regexp": {
837 | "version": "1.0.5",
838 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
839 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
840 | "dev": true
841 | },
842 | "esprima": {
843 | "version": "4.0.1",
844 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
845 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
846 | "dev": true
847 | },
848 | "etag": {
849 | "version": "1.8.1",
850 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
851 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
852 | },
853 | "event-target-shim": {
854 | "version": "5.0.1",
855 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
856 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
857 | "optional": true
858 | },
859 | "express": {
860 | "version": "4.17.1",
861 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
862 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
863 | "requires": {
864 | "accepts": "~1.3.7",
865 | "array-flatten": "1.1.1",
866 | "body-parser": "1.19.0",
867 | "content-disposition": "0.5.3",
868 | "content-type": "~1.0.4",
869 | "cookie": "0.4.0",
870 | "cookie-signature": "1.0.6",
871 | "debug": "2.6.9",
872 | "depd": "~1.1.2",
873 | "encodeurl": "~1.0.2",
874 | "escape-html": "~1.0.3",
875 | "etag": "~1.8.1",
876 | "finalhandler": "~1.1.2",
877 | "fresh": "0.5.2",
878 | "merge-descriptors": "1.0.1",
879 | "methods": "~1.1.2",
880 | "on-finished": "~2.3.0",
881 | "parseurl": "~1.3.3",
882 | "path-to-regexp": "0.1.7",
883 | "proxy-addr": "~2.0.5",
884 | "qs": "6.7.0",
885 | "range-parser": "~1.2.1",
886 | "safe-buffer": "5.1.2",
887 | "send": "0.17.1",
888 | "serve-static": "1.14.1",
889 | "setprototypeof": "1.1.1",
890 | "statuses": "~1.5.0",
891 | "type-is": "~1.6.18",
892 | "utils-merge": "1.0.1",
893 | "vary": "~1.1.2"
894 | },
895 | "dependencies": {
896 | "debug": {
897 | "version": "2.6.9",
898 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
899 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
900 | "requires": {
901 | "ms": "2.0.0"
902 | }
903 | },
904 | "ms": {
905 | "version": "2.0.0",
906 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
907 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
908 | },
909 | "safe-buffer": {
910 | "version": "5.1.2",
911 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
912 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
913 | }
914 | }
915 | },
916 | "extend": {
917 | "version": "3.0.2",
918 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
919 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
920 | "optional": true
921 | },
922 | "fast-text-encoding": {
923 | "version": "1.0.3",
924 | "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz",
925 | "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==",
926 | "optional": true
927 | },
928 | "faye-websocket": {
929 | "version": "0.11.3",
930 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
931 | "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
932 | "requires": {
933 | "websocket-driver": ">=0.5.1"
934 | }
935 | },
936 | "finalhandler": {
937 | "version": "1.1.2",
938 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
939 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
940 | "requires": {
941 | "debug": "2.6.9",
942 | "encodeurl": "~1.0.2",
943 | "escape-html": "~1.0.3",
944 | "on-finished": "~2.3.0",
945 | "parseurl": "~1.3.3",
946 | "statuses": "~1.5.0",
947 | "unpipe": "~1.0.0"
948 | },
949 | "dependencies": {
950 | "debug": {
951 | "version": "2.6.9",
952 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
953 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
954 | "requires": {
955 | "ms": "2.0.0"
956 | }
957 | },
958 | "ms": {
959 | "version": "2.0.0",
960 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
961 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
962 | }
963 | }
964 | },
965 | "firebase-admin": {
966 | "version": "8.12.1",
967 | "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-8.12.1.tgz",
968 | "integrity": "sha512-DZ4Q7QQJYaO2BhnhZLrhL+mGRTCLS5WrxjbJtuKGmbKRBepwMhx++EQA5yhnGnIXgDHnp5SrZnVKygNdXtH8BQ==",
969 | "requires": {
970 | "@firebase/database": "^0.6.0",
971 | "@google-cloud/firestore": "^3.0.0",
972 | "@google-cloud/storage": "^4.1.2",
973 | "@types/node": "^8.10.59",
974 | "dicer": "^0.3.0",
975 | "jsonwebtoken": "8.1.0",
976 | "node-forge": "0.7.4"
977 | }
978 | },
979 | "firebase-functions": {
980 | "version": "3.7.0",
981 | "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.7.0.tgz",
982 | "integrity": "sha512-+ROj2Gs2/KyM+T8jYo7AKaHynFsN49sXbgZMll3zuGa9/8oiDsXp9e1Iy2JMkFmSZg67jeYw5Ue2OSpz0XiqFQ==",
983 | "requires": {
984 | "@types/express": "4.17.3",
985 | "cors": "^2.8.5",
986 | "express": "^4.17.1",
987 | "lodash": "^4.17.14"
988 | }
989 | },
990 | "firebase-functions-test": {
991 | "version": "0.2.1",
992 | "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-0.2.1.tgz",
993 | "integrity": "sha512-+ZaNrDoRVy0ar4NGtrYbqVTsnitL3/Ud5yC7ElZUkX3956j+AzPCcrsCfa+5GJnpnVODXkMKpw9AySFJ/12nvA==",
994 | "dev": true,
995 | "requires": {
996 | "@types/lodash": "^4.14.104",
997 | "lodash": "^4.17.5"
998 | }
999 | },
1000 | "foreach": {
1001 | "version": "2.0.5",
1002 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
1003 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
1004 | "optional": true
1005 | },
1006 | "forwarded": {
1007 | "version": "0.1.2",
1008 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
1009 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
1010 | },
1011 | "fresh": {
1012 | "version": "0.5.2",
1013 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1014 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
1015 | },
1016 | "fs.realpath": {
1017 | "version": "1.0.0",
1018 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1019 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1020 | "dev": true
1021 | },
1022 | "function-bind": {
1023 | "version": "1.1.1",
1024 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1025 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
1026 | },
1027 | "functional-red-black-tree": {
1028 | "version": "1.0.1",
1029 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
1030 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
1031 | "optional": true
1032 | },
1033 | "gaxios": {
1034 | "version": "2.3.4",
1035 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz",
1036 | "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==",
1037 | "optional": true,
1038 | "requires": {
1039 | "abort-controller": "^3.0.0",
1040 | "extend": "^3.0.2",
1041 | "https-proxy-agent": "^5.0.0",
1042 | "is-stream": "^2.0.0",
1043 | "node-fetch": "^2.3.0"
1044 | }
1045 | },
1046 | "gcp-metadata": {
1047 | "version": "3.5.0",
1048 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz",
1049 | "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==",
1050 | "optional": true,
1051 | "requires": {
1052 | "gaxios": "^2.1.0",
1053 | "json-bigint": "^0.3.0"
1054 | }
1055 | },
1056 | "gcs-resumable-upload": {
1057 | "version": "2.3.3",
1058 | "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-2.3.3.tgz",
1059 | "integrity": "sha512-sf896I5CC/1AxeaGfSFg3vKMjUq/r+A3bscmVzZm10CElyRanN0XwPu/MxeIO4LSP+9uF6yKzXvNsaTsMXUG6Q==",
1060 | "optional": true,
1061 | "requires": {
1062 | "abort-controller": "^3.0.0",
1063 | "configstore": "^5.0.0",
1064 | "gaxios": "^2.0.0",
1065 | "google-auth-library": "^5.0.0",
1066 | "pumpify": "^2.0.0",
1067 | "stream-events": "^1.0.4"
1068 | }
1069 | },
1070 | "glob": {
1071 | "version": "7.1.6",
1072 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
1073 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
1074 | "dev": true,
1075 | "requires": {
1076 | "fs.realpath": "^1.0.0",
1077 | "inflight": "^1.0.4",
1078 | "inherits": "2",
1079 | "minimatch": "^3.0.4",
1080 | "once": "^1.3.0",
1081 | "path-is-absolute": "^1.0.0"
1082 | }
1083 | },
1084 | "google-auth-library": {
1085 | "version": "5.10.1",
1086 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz",
1087 | "integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==",
1088 | "optional": true,
1089 | "requires": {
1090 | "arrify": "^2.0.0",
1091 | "base64-js": "^1.3.0",
1092 | "ecdsa-sig-formatter": "^1.0.11",
1093 | "fast-text-encoding": "^1.0.0",
1094 | "gaxios": "^2.1.0",
1095 | "gcp-metadata": "^3.4.0",
1096 | "gtoken": "^4.1.0",
1097 | "jws": "^4.0.0",
1098 | "lru-cache": "^5.0.0"
1099 | }
1100 | },
1101 | "google-gax": {
1102 | "version": "1.15.3",
1103 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-1.15.3.tgz",
1104 | "integrity": "sha512-3JKJCRumNm3x2EksUTw4P1Rad43FTpqrtW9jzpf3xSMYXx+ogaqTM1vGo7VixHB4xkAyATXVIa3OcNSh8H9zsQ==",
1105 | "optional": true,
1106 | "requires": {
1107 | "@grpc/grpc-js": "~1.0.3",
1108 | "@grpc/proto-loader": "^0.5.1",
1109 | "@types/fs-extra": "^8.0.1",
1110 | "@types/long": "^4.0.0",
1111 | "abort-controller": "^3.0.0",
1112 | "duplexify": "^3.6.0",
1113 | "google-auth-library": "^5.0.0",
1114 | "is-stream-ended": "^0.1.4",
1115 | "lodash.at": "^4.6.0",
1116 | "lodash.has": "^4.5.2",
1117 | "node-fetch": "^2.6.0",
1118 | "protobufjs": "^6.8.9",
1119 | "retry-request": "^4.0.0",
1120 | "semver": "^6.0.0",
1121 | "walkdir": "^0.4.0"
1122 | }
1123 | },
1124 | "google-p12-pem": {
1125 | "version": "2.0.4",
1126 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz",
1127 | "integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==",
1128 | "optional": true,
1129 | "requires": {
1130 | "node-forge": "^0.9.0"
1131 | },
1132 | "dependencies": {
1133 | "node-forge": {
1134 | "version": "0.9.1",
1135 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz",
1136 | "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==",
1137 | "optional": true
1138 | }
1139 | }
1140 | },
1141 | "graceful-fs": {
1142 | "version": "4.2.4",
1143 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
1144 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
1145 | "optional": true
1146 | },
1147 | "gtoken": {
1148 | "version": "4.1.4",
1149 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz",
1150 | "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==",
1151 | "optional": true,
1152 | "requires": {
1153 | "gaxios": "^2.1.0",
1154 | "google-p12-pem": "^2.0.0",
1155 | "jws": "^4.0.0",
1156 | "mime": "^2.2.0"
1157 | }
1158 | },
1159 | "has": {
1160 | "version": "1.0.3",
1161 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1162 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1163 | "requires": {
1164 | "function-bind": "^1.1.1"
1165 | }
1166 | },
1167 | "has-flag": {
1168 | "version": "3.0.0",
1169 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1170 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1171 | "dev": true
1172 | },
1173 | "has-symbols": {
1174 | "version": "1.0.1",
1175 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
1176 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
1177 | },
1178 | "hash-stream-validation": {
1179 | "version": "0.2.3",
1180 | "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.3.tgz",
1181 | "integrity": "sha512-OEohGLoUOh+bwsIpHpdvhIXFyRGjeLqJbT8Yc5QTZPbRM7LKywagTQxnX/6mghLDOrD9YGz88hy5mLN2eKflYQ==",
1182 | "optional": true,
1183 | "requires": {
1184 | "through2": "^2.0.0"
1185 | },
1186 | "dependencies": {
1187 | "isarray": {
1188 | "version": "1.0.0",
1189 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1190 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1191 | "optional": true
1192 | },
1193 | "readable-stream": {
1194 | "version": "2.3.7",
1195 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1196 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
1197 | "optional": true,
1198 | "requires": {
1199 | "core-util-is": "~1.0.0",
1200 | "inherits": "~2.0.3",
1201 | "isarray": "~1.0.0",
1202 | "process-nextick-args": "~2.0.0",
1203 | "safe-buffer": "~5.1.1",
1204 | "string_decoder": "~1.1.1",
1205 | "util-deprecate": "~1.0.1"
1206 | }
1207 | },
1208 | "safe-buffer": {
1209 | "version": "5.1.2",
1210 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1211 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1212 | "optional": true
1213 | },
1214 | "through2": {
1215 | "version": "2.0.5",
1216 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
1217 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
1218 | "optional": true,
1219 | "requires": {
1220 | "readable-stream": "~2.3.6",
1221 | "xtend": "~4.0.1"
1222 | }
1223 | }
1224 | }
1225 | },
1226 | "http-errors": {
1227 | "version": "1.7.2",
1228 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
1229 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
1230 | "requires": {
1231 | "depd": "~1.1.2",
1232 | "inherits": "2.0.3",
1233 | "setprototypeof": "1.1.1",
1234 | "statuses": ">= 1.5.0 < 2",
1235 | "toidentifier": "1.0.0"
1236 | },
1237 | "dependencies": {
1238 | "inherits": {
1239 | "version": "2.0.3",
1240 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1241 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
1242 | }
1243 | }
1244 | },
1245 | "http-parser-js": {
1246 | "version": "0.5.2",
1247 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz",
1248 | "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ=="
1249 | },
1250 | "http-proxy-agent": {
1251 | "version": "4.0.1",
1252 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
1253 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
1254 | "optional": true,
1255 | "requires": {
1256 | "@tootallnate/once": "1",
1257 | "agent-base": "6",
1258 | "debug": "4"
1259 | }
1260 | },
1261 | "https-proxy-agent": {
1262 | "version": "5.0.0",
1263 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
1264 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
1265 | "optional": true,
1266 | "requires": {
1267 | "agent-base": "6",
1268 | "debug": "4"
1269 | }
1270 | },
1271 | "iconv-lite": {
1272 | "version": "0.4.24",
1273 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1274 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1275 | "requires": {
1276 | "safer-buffer": ">= 2.1.2 < 3"
1277 | }
1278 | },
1279 | "imurmurhash": {
1280 | "version": "0.1.4",
1281 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1282 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1283 | "optional": true
1284 | },
1285 | "inflight": {
1286 | "version": "1.0.6",
1287 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1288 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1289 | "dev": true,
1290 | "requires": {
1291 | "once": "^1.3.0",
1292 | "wrappy": "1"
1293 | }
1294 | },
1295 | "inherits": {
1296 | "version": "2.0.4",
1297 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1298 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1299 | },
1300 | "ipaddr.js": {
1301 | "version": "1.9.1",
1302 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1303 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
1304 | },
1305 | "is-arguments": {
1306 | "version": "1.0.4",
1307 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
1308 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
1309 | "optional": true
1310 | },
1311 | "is-bigint": {
1312 | "version": "1.0.0",
1313 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz",
1314 | "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==",
1315 | "optional": true
1316 | },
1317 | "is-boolean-object": {
1318 | "version": "1.0.1",
1319 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz",
1320 | "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==",
1321 | "optional": true
1322 | },
1323 | "is-callable": {
1324 | "version": "1.2.0",
1325 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
1326 | "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw=="
1327 | },
1328 | "is-date-object": {
1329 | "version": "1.0.2",
1330 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
1331 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
1332 | },
1333 | "is-map": {
1334 | "version": "2.0.1",
1335 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz",
1336 | "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==",
1337 | "optional": true
1338 | },
1339 | "is-number-object": {
1340 | "version": "1.0.4",
1341 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz",
1342 | "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==",
1343 | "optional": true
1344 | },
1345 | "is-obj": {
1346 | "version": "2.0.0",
1347 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
1348 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
1349 | "optional": true
1350 | },
1351 | "is-regex": {
1352 | "version": "1.1.0",
1353 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
1354 | "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
1355 | "requires": {
1356 | "has-symbols": "^1.0.1"
1357 | }
1358 | },
1359 | "is-set": {
1360 | "version": "2.0.1",
1361 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz",
1362 | "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==",
1363 | "optional": true
1364 | },
1365 | "is-stream": {
1366 | "version": "2.0.0",
1367 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
1368 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
1369 | "optional": true
1370 | },
1371 | "is-stream-ended": {
1372 | "version": "0.1.4",
1373 | "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz",
1374 | "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==",
1375 | "optional": true
1376 | },
1377 | "is-string": {
1378 | "version": "1.0.5",
1379 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
1380 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
1381 | "optional": true
1382 | },
1383 | "is-symbol": {
1384 | "version": "1.0.3",
1385 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
1386 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
1387 | "requires": {
1388 | "has-symbols": "^1.0.1"
1389 | }
1390 | },
1391 | "is-typed-array": {
1392 | "version": "1.1.3",
1393 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz",
1394 | "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==",
1395 | "optional": true,
1396 | "requires": {
1397 | "available-typed-arrays": "^1.0.0",
1398 | "es-abstract": "^1.17.4",
1399 | "foreach": "^2.0.5",
1400 | "has-symbols": "^1.0.1"
1401 | }
1402 | },
1403 | "is-typedarray": {
1404 | "version": "1.0.0",
1405 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1406 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
1407 | "optional": true
1408 | },
1409 | "is-weakmap": {
1410 | "version": "2.0.1",
1411 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
1412 | "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
1413 | "optional": true
1414 | },
1415 | "is-weakset": {
1416 | "version": "2.0.1",
1417 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz",
1418 | "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==",
1419 | "optional": true
1420 | },
1421 | "isarray": {
1422 | "version": "2.0.5",
1423 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
1424 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
1425 | "optional": true
1426 | },
1427 | "js-tokens": {
1428 | "version": "4.0.0",
1429 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1430 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1431 | "dev": true
1432 | },
1433 | "js-yaml": {
1434 | "version": "3.14.0",
1435 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
1436 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
1437 | "dev": true,
1438 | "requires": {
1439 | "argparse": "^1.0.7",
1440 | "esprima": "^4.0.0"
1441 | }
1442 | },
1443 | "json-bigint": {
1444 | "version": "0.3.1",
1445 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.1.tgz",
1446 | "integrity": "sha512-DGWnSzmusIreWlEupsUelHrhwmPPE+FiQvg+drKfk2p+bdEYa5mp4PJ8JsCWqae0M2jQNb0HPvnwvf1qOTThzQ==",
1447 | "optional": true,
1448 | "requires": {
1449 | "bignumber.js": "^9.0.0"
1450 | }
1451 | },
1452 | "jsonwebtoken": {
1453 | "version": "8.1.0",
1454 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz",
1455 | "integrity": "sha1-xjl80uX9WD1lwAeoPce7eOaYK4M=",
1456 | "requires": {
1457 | "jws": "^3.1.4",
1458 | "lodash.includes": "^4.3.0",
1459 | "lodash.isboolean": "^3.0.3",
1460 | "lodash.isinteger": "^4.0.4",
1461 | "lodash.isnumber": "^3.0.3",
1462 | "lodash.isplainobject": "^4.0.6",
1463 | "lodash.isstring": "^4.0.1",
1464 | "lodash.once": "^4.0.0",
1465 | "ms": "^2.0.0",
1466 | "xtend": "^4.0.1"
1467 | },
1468 | "dependencies": {
1469 | "jwa": {
1470 | "version": "1.4.1",
1471 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
1472 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
1473 | "requires": {
1474 | "buffer-equal-constant-time": "1.0.1",
1475 | "ecdsa-sig-formatter": "1.0.11",
1476 | "safe-buffer": "^5.0.1"
1477 | }
1478 | },
1479 | "jws": {
1480 | "version": "3.2.2",
1481 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
1482 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
1483 | "requires": {
1484 | "jwa": "^1.4.1",
1485 | "safe-buffer": "^5.0.1"
1486 | }
1487 | }
1488 | }
1489 | },
1490 | "jwa": {
1491 | "version": "2.0.0",
1492 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
1493 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
1494 | "optional": true,
1495 | "requires": {
1496 | "buffer-equal-constant-time": "1.0.1",
1497 | "ecdsa-sig-formatter": "1.0.11",
1498 | "safe-buffer": "^5.0.1"
1499 | }
1500 | },
1501 | "jws": {
1502 | "version": "4.0.0",
1503 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
1504 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
1505 | "optional": true,
1506 | "requires": {
1507 | "jwa": "^2.0.0",
1508 | "safe-buffer": "^5.0.1"
1509 | }
1510 | },
1511 | "lodash": {
1512 | "version": "4.17.15",
1513 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
1514 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
1515 | },
1516 | "lodash.at": {
1517 | "version": "4.6.0",
1518 | "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz",
1519 | "integrity": "sha1-k83OZk8KGZTqM9181A4jr9EbD/g=",
1520 | "optional": true
1521 | },
1522 | "lodash.camelcase": {
1523 | "version": "4.3.0",
1524 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
1525 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
1526 | "optional": true
1527 | },
1528 | "lodash.has": {
1529 | "version": "4.5.2",
1530 | "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz",
1531 | "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=",
1532 | "optional": true
1533 | },
1534 | "lodash.includes": {
1535 | "version": "4.3.0",
1536 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
1537 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
1538 | },
1539 | "lodash.isboolean": {
1540 | "version": "3.0.3",
1541 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
1542 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
1543 | },
1544 | "lodash.isinteger": {
1545 | "version": "4.0.4",
1546 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
1547 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
1548 | },
1549 | "lodash.isnumber": {
1550 | "version": "3.0.3",
1551 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
1552 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
1553 | },
1554 | "lodash.isplainobject": {
1555 | "version": "4.0.6",
1556 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
1557 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
1558 | },
1559 | "lodash.isstring": {
1560 | "version": "4.0.1",
1561 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
1562 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
1563 | },
1564 | "lodash.once": {
1565 | "version": "4.1.1",
1566 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
1567 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
1568 | },
1569 | "long": {
1570 | "version": "4.0.0",
1571 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
1572 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
1573 | "optional": true
1574 | },
1575 | "lru-cache": {
1576 | "version": "5.1.1",
1577 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1578 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1579 | "optional": true,
1580 | "requires": {
1581 | "yallist": "^3.0.2"
1582 | }
1583 | },
1584 | "make-dir": {
1585 | "version": "3.1.0",
1586 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
1587 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
1588 | "optional": true,
1589 | "requires": {
1590 | "semver": "^6.0.0"
1591 | }
1592 | },
1593 | "media-typer": {
1594 | "version": "0.3.0",
1595 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1596 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
1597 | },
1598 | "merge-descriptors": {
1599 | "version": "1.0.1",
1600 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1601 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
1602 | },
1603 | "methods": {
1604 | "version": "1.1.2",
1605 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1606 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
1607 | },
1608 | "mime": {
1609 | "version": "2.4.6",
1610 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
1611 | "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
1612 | "optional": true
1613 | },
1614 | "mime-db": {
1615 | "version": "1.44.0",
1616 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
1617 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
1618 | },
1619 | "mime-types": {
1620 | "version": "2.1.27",
1621 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
1622 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
1623 | "requires": {
1624 | "mime-db": "1.44.0"
1625 | }
1626 | },
1627 | "mimic-fn": {
1628 | "version": "2.1.0",
1629 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1630 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1631 | "optional": true
1632 | },
1633 | "minimatch": {
1634 | "version": "3.0.4",
1635 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1636 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1637 | "dev": true,
1638 | "requires": {
1639 | "brace-expansion": "^1.1.7"
1640 | }
1641 | },
1642 | "minimist": {
1643 | "version": "1.2.5",
1644 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1645 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
1646 | "dev": true
1647 | },
1648 | "mkdirp": {
1649 | "version": "0.5.5",
1650 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
1651 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
1652 | "dev": true,
1653 | "requires": {
1654 | "minimist": "^1.2.5"
1655 | }
1656 | },
1657 | "ms": {
1658 | "version": "2.1.2",
1659 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1660 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1661 | },
1662 | "negotiator": {
1663 | "version": "0.6.2",
1664 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
1665 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
1666 | },
1667 | "node-fetch": {
1668 | "version": "2.6.0",
1669 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
1670 | "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==",
1671 | "optional": true
1672 | },
1673 | "node-forge": {
1674 | "version": "0.7.4",
1675 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.4.tgz",
1676 | "integrity": "sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA=="
1677 | },
1678 | "object-assign": {
1679 | "version": "4.1.1",
1680 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1681 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1682 | },
1683 | "object-inspect": {
1684 | "version": "1.8.0",
1685 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
1686 | "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA=="
1687 | },
1688 | "object-is": {
1689 | "version": "1.1.2",
1690 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz",
1691 | "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==",
1692 | "optional": true,
1693 | "requires": {
1694 | "define-properties": "^1.1.3",
1695 | "es-abstract": "^1.17.5"
1696 | }
1697 | },
1698 | "object-keys": {
1699 | "version": "1.1.1",
1700 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1701 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
1702 | },
1703 | "object.assign": {
1704 | "version": "4.1.0",
1705 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
1706 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
1707 | "requires": {
1708 | "define-properties": "^1.1.2",
1709 | "function-bind": "^1.1.1",
1710 | "has-symbols": "^1.0.0",
1711 | "object-keys": "^1.0.11"
1712 | }
1713 | },
1714 | "on-finished": {
1715 | "version": "2.3.0",
1716 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1717 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1718 | "requires": {
1719 | "ee-first": "1.1.1"
1720 | }
1721 | },
1722 | "once": {
1723 | "version": "1.4.0",
1724 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1725 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1726 | "requires": {
1727 | "wrappy": "1"
1728 | }
1729 | },
1730 | "onetime": {
1731 | "version": "5.1.0",
1732 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
1733 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
1734 | "optional": true,
1735 | "requires": {
1736 | "mimic-fn": "^2.1.0"
1737 | }
1738 | },
1739 | "p-limit": {
1740 | "version": "2.3.0",
1741 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
1742 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
1743 | "optional": true,
1744 | "requires": {
1745 | "p-try": "^2.0.0"
1746 | }
1747 | },
1748 | "p-try": {
1749 | "version": "2.2.0",
1750 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
1751 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
1752 | "optional": true
1753 | },
1754 | "parseurl": {
1755 | "version": "1.3.3",
1756 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1757 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1758 | },
1759 | "path-is-absolute": {
1760 | "version": "1.0.1",
1761 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1762 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1763 | "dev": true
1764 | },
1765 | "path-parse": {
1766 | "version": "1.0.6",
1767 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1768 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
1769 | "dev": true
1770 | },
1771 | "path-to-regexp": {
1772 | "version": "0.1.7",
1773 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1774 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
1775 | },
1776 | "process-nextick-args": {
1777 | "version": "2.0.1",
1778 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1779 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
1780 | "optional": true
1781 | },
1782 | "protobufjs": {
1783 | "version": "6.9.0",
1784 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.9.0.tgz",
1785 | "integrity": "sha512-LlGVfEWDXoI/STstRDdZZKb/qusoAWUnmLg9R8OLSO473mBLWHowx8clbX5/+mKDEI+v7GzjoK9tRPZMMcoTrg==",
1786 | "optional": true,
1787 | "requires": {
1788 | "@protobufjs/aspromise": "^1.1.2",
1789 | "@protobufjs/base64": "^1.1.2",
1790 | "@protobufjs/codegen": "^2.0.4",
1791 | "@protobufjs/eventemitter": "^1.1.0",
1792 | "@protobufjs/fetch": "^1.1.0",
1793 | "@protobufjs/float": "^1.0.2",
1794 | "@protobufjs/inquire": "^1.1.0",
1795 | "@protobufjs/path": "^1.1.2",
1796 | "@protobufjs/pool": "^1.1.0",
1797 | "@protobufjs/utf8": "^1.1.0",
1798 | "@types/long": "^4.0.1",
1799 | "@types/node": "^13.7.0",
1800 | "long": "^4.0.0"
1801 | },
1802 | "dependencies": {
1803 | "@types/node": {
1804 | "version": "13.13.12",
1805 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.12.tgz",
1806 | "integrity": "sha512-zWz/8NEPxoXNT9YyF2osqyA9WjssZukYpgI4UYZpOjcyqwIUqWGkcCionaEb9Ki+FULyPyvNFpg/329Kd2/pbw==",
1807 | "optional": true
1808 | }
1809 | }
1810 | },
1811 | "proxy-addr": {
1812 | "version": "2.0.6",
1813 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
1814 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
1815 | "requires": {
1816 | "forwarded": "~0.1.2",
1817 | "ipaddr.js": "1.9.1"
1818 | }
1819 | },
1820 | "pump": {
1821 | "version": "3.0.0",
1822 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1823 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1824 | "optional": true,
1825 | "requires": {
1826 | "end-of-stream": "^1.1.0",
1827 | "once": "^1.3.1"
1828 | }
1829 | },
1830 | "pumpify": {
1831 | "version": "2.0.1",
1832 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz",
1833 | "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==",
1834 | "optional": true,
1835 | "requires": {
1836 | "duplexify": "^4.1.1",
1837 | "inherits": "^2.0.3",
1838 | "pump": "^3.0.0"
1839 | },
1840 | "dependencies": {
1841 | "duplexify": {
1842 | "version": "4.1.1",
1843 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz",
1844 | "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==",
1845 | "optional": true,
1846 | "requires": {
1847 | "end-of-stream": "^1.4.1",
1848 | "inherits": "^2.0.3",
1849 | "readable-stream": "^3.1.1",
1850 | "stream-shift": "^1.0.0"
1851 | }
1852 | }
1853 | }
1854 | },
1855 | "qs": {
1856 | "version": "6.7.0",
1857 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
1858 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
1859 | },
1860 | "range-parser": {
1861 | "version": "1.2.1",
1862 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1863 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1864 | },
1865 | "raw-body": {
1866 | "version": "2.4.0",
1867 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
1868 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
1869 | "requires": {
1870 | "bytes": "3.1.0",
1871 | "http-errors": "1.7.2",
1872 | "iconv-lite": "0.4.24",
1873 | "unpipe": "1.0.0"
1874 | }
1875 | },
1876 | "readable-stream": {
1877 | "version": "3.6.0",
1878 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
1879 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
1880 | "optional": true,
1881 | "requires": {
1882 | "inherits": "^2.0.3",
1883 | "string_decoder": "^1.1.1",
1884 | "util-deprecate": "^1.0.1"
1885 | }
1886 | },
1887 | "regexp.prototype.flags": {
1888 | "version": "1.3.0",
1889 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
1890 | "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
1891 | "optional": true,
1892 | "requires": {
1893 | "define-properties": "^1.1.3",
1894 | "es-abstract": "^1.17.0-next.1"
1895 | }
1896 | },
1897 | "resolve": {
1898 | "version": "1.17.0",
1899 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
1900 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
1901 | "dev": true,
1902 | "requires": {
1903 | "path-parse": "^1.0.6"
1904 | }
1905 | },
1906 | "retry-request": {
1907 | "version": "4.1.1",
1908 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz",
1909 | "integrity": "sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ==",
1910 | "optional": true,
1911 | "requires": {
1912 | "debug": "^4.1.1",
1913 | "through2": "^3.0.1"
1914 | }
1915 | },
1916 | "safe-buffer": {
1917 | "version": "5.2.1",
1918 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1919 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1920 | },
1921 | "safer-buffer": {
1922 | "version": "2.1.2",
1923 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1924 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1925 | },
1926 | "semver": {
1927 | "version": "6.3.0",
1928 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1929 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1930 | "optional": true
1931 | },
1932 | "send": {
1933 | "version": "0.17.1",
1934 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
1935 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
1936 | "requires": {
1937 | "debug": "2.6.9",
1938 | "depd": "~1.1.2",
1939 | "destroy": "~1.0.4",
1940 | "encodeurl": "~1.0.2",
1941 | "escape-html": "~1.0.3",
1942 | "etag": "~1.8.1",
1943 | "fresh": "0.5.2",
1944 | "http-errors": "~1.7.2",
1945 | "mime": "1.6.0",
1946 | "ms": "2.1.1",
1947 | "on-finished": "~2.3.0",
1948 | "range-parser": "~1.2.1",
1949 | "statuses": "~1.5.0"
1950 | },
1951 | "dependencies": {
1952 | "debug": {
1953 | "version": "2.6.9",
1954 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1955 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1956 | "requires": {
1957 | "ms": "2.0.0"
1958 | },
1959 | "dependencies": {
1960 | "ms": {
1961 | "version": "2.0.0",
1962 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1963 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1964 | }
1965 | }
1966 | },
1967 | "mime": {
1968 | "version": "1.6.0",
1969 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1970 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1971 | },
1972 | "ms": {
1973 | "version": "2.1.1",
1974 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1975 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1976 | }
1977 | }
1978 | },
1979 | "serve-static": {
1980 | "version": "1.14.1",
1981 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
1982 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
1983 | "requires": {
1984 | "encodeurl": "~1.0.2",
1985 | "escape-html": "~1.0.3",
1986 | "parseurl": "~1.3.3",
1987 | "send": "0.17.1"
1988 | }
1989 | },
1990 | "setprototypeof": {
1991 | "version": "1.1.1",
1992 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
1993 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
1994 | },
1995 | "side-channel": {
1996 | "version": "1.0.2",
1997 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz",
1998 | "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==",
1999 | "optional": true,
2000 | "requires": {
2001 | "es-abstract": "^1.17.0-next.1",
2002 | "object-inspect": "^1.7.0"
2003 | }
2004 | },
2005 | "signal-exit": {
2006 | "version": "3.0.3",
2007 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
2008 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
2009 | "optional": true
2010 | },
2011 | "snakeize": {
2012 | "version": "0.1.0",
2013 | "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz",
2014 | "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=",
2015 | "optional": true
2016 | },
2017 | "sprintf-js": {
2018 | "version": "1.0.3",
2019 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
2020 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
2021 | "dev": true
2022 | },
2023 | "statuses": {
2024 | "version": "1.5.0",
2025 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
2026 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
2027 | },
2028 | "stream-events": {
2029 | "version": "1.0.5",
2030 | "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz",
2031 | "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==",
2032 | "optional": true,
2033 | "requires": {
2034 | "stubs": "^3.0.0"
2035 | }
2036 | },
2037 | "stream-shift": {
2038 | "version": "1.0.1",
2039 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
2040 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
2041 | "optional": true
2042 | },
2043 | "streamsearch": {
2044 | "version": "0.1.2",
2045 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
2046 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
2047 | },
2048 | "string.prototype.trimend": {
2049 | "version": "1.0.1",
2050 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
2051 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
2052 | "requires": {
2053 | "define-properties": "^1.1.3",
2054 | "es-abstract": "^1.17.5"
2055 | }
2056 | },
2057 | "string.prototype.trimstart": {
2058 | "version": "1.0.1",
2059 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
2060 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
2061 | "requires": {
2062 | "define-properties": "^1.1.3",
2063 | "es-abstract": "^1.17.5"
2064 | }
2065 | },
2066 | "string_decoder": {
2067 | "version": "1.1.1",
2068 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2069 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2070 | "optional": true,
2071 | "requires": {
2072 | "safe-buffer": "~5.1.0"
2073 | },
2074 | "dependencies": {
2075 | "safe-buffer": {
2076 | "version": "5.1.2",
2077 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2078 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
2079 | "optional": true
2080 | }
2081 | }
2082 | },
2083 | "stubs": {
2084 | "version": "3.0.0",
2085 | "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz",
2086 | "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=",
2087 | "optional": true
2088 | },
2089 | "supports-color": {
2090 | "version": "5.5.0",
2091 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2092 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2093 | "dev": true,
2094 | "requires": {
2095 | "has-flag": "^3.0.0"
2096 | }
2097 | },
2098 | "teeny-request": {
2099 | "version": "6.0.3",
2100 | "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-6.0.3.tgz",
2101 | "integrity": "sha512-TZG/dfd2r6yeji19es1cUIwAlVD8y+/svB1kAC2Y0bjEyysrfbO8EZvJBRwIE6WkwmUoB7uvWLwTIhJbMXZ1Dw==",
2102 | "optional": true,
2103 | "requires": {
2104 | "http-proxy-agent": "^4.0.0",
2105 | "https-proxy-agent": "^5.0.0",
2106 | "node-fetch": "^2.2.0",
2107 | "stream-events": "^1.0.5",
2108 | "uuid": "^7.0.0"
2109 | }
2110 | },
2111 | "through2": {
2112 | "version": "3.0.1",
2113 | "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz",
2114 | "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==",
2115 | "optional": true,
2116 | "requires": {
2117 | "readable-stream": "2 || 3"
2118 | }
2119 | },
2120 | "toidentifier": {
2121 | "version": "1.0.0",
2122 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
2123 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
2124 | },
2125 | "tslib": {
2126 | "version": "1.13.0",
2127 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
2128 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
2129 | },
2130 | "tslint": {
2131 | "version": "5.20.1",
2132 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz",
2133 | "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==",
2134 | "dev": true,
2135 | "requires": {
2136 | "@babel/code-frame": "^7.0.0",
2137 | "builtin-modules": "^1.1.1",
2138 | "chalk": "^2.3.0",
2139 | "commander": "^2.12.1",
2140 | "diff": "^4.0.1",
2141 | "glob": "^7.1.1",
2142 | "js-yaml": "^3.13.1",
2143 | "minimatch": "^3.0.4",
2144 | "mkdirp": "^0.5.1",
2145 | "resolve": "^1.3.2",
2146 | "semver": "^5.3.0",
2147 | "tslib": "^1.8.0",
2148 | "tsutils": "^2.29.0"
2149 | },
2150 | "dependencies": {
2151 | "semver": {
2152 | "version": "5.7.1",
2153 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
2154 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
2155 | "dev": true
2156 | }
2157 | }
2158 | },
2159 | "tsutils": {
2160 | "version": "2.29.0",
2161 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
2162 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
2163 | "dev": true,
2164 | "requires": {
2165 | "tslib": "^1.8.1"
2166 | }
2167 | },
2168 | "type-is": {
2169 | "version": "1.6.18",
2170 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
2171 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
2172 | "requires": {
2173 | "media-typer": "0.3.0",
2174 | "mime-types": "~2.1.24"
2175 | }
2176 | },
2177 | "typedarray": {
2178 | "version": "0.0.6",
2179 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
2180 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
2181 | "optional": true
2182 | },
2183 | "typedarray-to-buffer": {
2184 | "version": "3.1.5",
2185 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
2186 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
2187 | "optional": true,
2188 | "requires": {
2189 | "is-typedarray": "^1.0.0"
2190 | }
2191 | },
2192 | "typescript": {
2193 | "version": "3.9.5",
2194 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz",
2195 | "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==",
2196 | "dev": true
2197 | },
2198 | "unique-string": {
2199 | "version": "2.0.0",
2200 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
2201 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
2202 | "optional": true,
2203 | "requires": {
2204 | "crypto-random-string": "^2.0.0"
2205 | }
2206 | },
2207 | "unpipe": {
2208 | "version": "1.0.0",
2209 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
2210 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
2211 | },
2212 | "util-deprecate": {
2213 | "version": "1.0.2",
2214 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2215 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
2216 | "optional": true
2217 | },
2218 | "utils-merge": {
2219 | "version": "1.0.1",
2220 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
2221 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
2222 | },
2223 | "uuid": {
2224 | "version": "7.0.3",
2225 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
2226 | "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
2227 | "optional": true
2228 | },
2229 | "vary": {
2230 | "version": "1.1.2",
2231 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
2232 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
2233 | },
2234 | "walkdir": {
2235 | "version": "0.4.1",
2236 | "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz",
2237 | "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==",
2238 | "optional": true
2239 | },
2240 | "websocket-driver": {
2241 | "version": "0.7.4",
2242 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
2243 | "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
2244 | "requires": {
2245 | "http-parser-js": ">=0.5.1",
2246 | "safe-buffer": ">=5.1.0",
2247 | "websocket-extensions": ">=0.1.1"
2248 | }
2249 | },
2250 | "websocket-extensions": {
2251 | "version": "0.1.4",
2252 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
2253 | "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="
2254 | },
2255 | "which-boxed-primitive": {
2256 | "version": "1.0.1",
2257 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz",
2258 | "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==",
2259 | "optional": true,
2260 | "requires": {
2261 | "is-bigint": "^1.0.0",
2262 | "is-boolean-object": "^1.0.0",
2263 | "is-number-object": "^1.0.3",
2264 | "is-string": "^1.0.4",
2265 | "is-symbol": "^1.0.2"
2266 | }
2267 | },
2268 | "which-collection": {
2269 | "version": "1.0.1",
2270 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
2271 | "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
2272 | "optional": true,
2273 | "requires": {
2274 | "is-map": "^2.0.1",
2275 | "is-set": "^2.0.1",
2276 | "is-weakmap": "^2.0.1",
2277 | "is-weakset": "^2.0.1"
2278 | }
2279 | },
2280 | "which-typed-array": {
2281 | "version": "1.1.2",
2282 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz",
2283 | "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==",
2284 | "optional": true,
2285 | "requires": {
2286 | "available-typed-arrays": "^1.0.2",
2287 | "es-abstract": "^1.17.5",
2288 | "foreach": "^2.0.5",
2289 | "function-bind": "^1.1.1",
2290 | "has-symbols": "^1.0.1",
2291 | "is-typed-array": "^1.1.3"
2292 | }
2293 | },
2294 | "wrappy": {
2295 | "version": "1.0.2",
2296 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2297 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
2298 | },
2299 | "write-file-atomic": {
2300 | "version": "3.0.3",
2301 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
2302 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
2303 | "optional": true,
2304 | "requires": {
2305 | "imurmurhash": "^0.1.4",
2306 | "is-typedarray": "^1.0.0",
2307 | "signal-exit": "^3.0.2",
2308 | "typedarray-to-buffer": "^3.1.5"
2309 | }
2310 | },
2311 | "xdg-basedir": {
2312 | "version": "4.0.0",
2313 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
2314 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
2315 | "optional": true
2316 | },
2317 | "xtend": {
2318 | "version": "4.0.2",
2319 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
2320 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
2321 | },
2322 | "yallist": {
2323 | "version": "3.1.1",
2324 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
2325 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
2326 | "optional": true
2327 | }
2328 | }
2329 | }
2330 |
--------------------------------------------------------------------------------