diff --git a/.browserslistrc b/.browserslistrc index 427441d..c289ba6 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -11,7 +11,6 @@ last 1 Chrome version last 1 Firefox version last 2 Edge major versions -last 2 Safari major versions last 2 iOS major versions Firefox ESR not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/.eslintrc.json b/.eslintrc.json index 58fd208..7650603 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -35,7 +35,9 @@ "prefix": "app", "style": "camelCase" } - ] + ], + + "@typescript-eslint/naming-convention": "off" } }, { diff --git a/angular.json b/angular.json index c6da09d..454af43 100644 --- a/angular.json +++ b/angular.json @@ -73,7 +73,8 @@ "serve": { "builder": "@angular-devkit/build-angular:dev-server", "options": { - "browserTarget": "app:build" + "browserTarget": "app:build", + "port": 4200 }, "configurations": { "production": { @@ -171,6 +172,7 @@ } }, "cli": { + "analytics": false, "defaultCollection": "@ionic/angular-toolkit" }, "schematics": { diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..75e8c5a --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,9 @@ +App/build +App/Pods +App/Podfile.lock +App/App/public +DerivedData +xcuserdata + +# Cordova plugins for Capacitor +capacitor-cordova-ios-plugins diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj new file mode 100644 index 0000000..5b04278 --- /dev/null +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -0,0 +1,404 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; }; + 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 50379B222058CBB4000EE86E /* capacitor.config.json */; }; + 504EC3081FED79650016851F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC3071FED79650016851F /* AppDelegate.swift */; }; + 504EC30D1FED79650016851F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30B1FED79650016851F /* Main.storyboard */; }; + 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; + 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; + 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; + A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = ""; }; + 50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = ""; }; + 504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 504EC3071FED79650016851F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 504EC30C1FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 504EC30E1FED79650016851F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; + AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = ""; }; + FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 504EC3011FED79650016851F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = { + isa = PBXGroup; + children = ( + AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 504EC2FB1FED79650016851F = { + isa = PBXGroup; + children = ( + 504EC3061FED79650016851F /* App */, + 504EC3051FED79650016851F /* Products */, + 7F8756D8B27F46E3366F6CEA /* Pods */, + 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */, + ); + sourceTree = ""; + }; + 504EC3051FED79650016851F /* Products */ = { + isa = PBXGroup; + children = ( + 504EC3041FED79650016851F /* App.app */, + ); + name = Products; + sourceTree = ""; + }; + 504EC3061FED79650016851F /* App */ = { + isa = PBXGroup; + children = ( + 50379B222058CBB4000EE86E /* capacitor.config.json */, + 504EC3071FED79650016851F /* AppDelegate.swift */, + 504EC30B1FED79650016851F /* Main.storyboard */, + 504EC30E1FED79650016851F /* Assets.xcassets */, + 504EC3101FED79650016851F /* LaunchScreen.storyboard */, + 504EC3131FED79650016851F /* Info.plist */, + 2FAD9762203C412B000D30F8 /* config.xml */, + 50B271D01FEDC1A000F3C39B /* public */, + ); + path = App; + sourceTree = ""; + }; + 7F8756D8B27F46E3366F6CEA /* Pods */ = { + isa = PBXGroup; + children = ( + FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */, + AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 504EC3031FED79650016851F /* App */ = { + isa = PBXNativeTarget; + buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */; + buildPhases = ( + 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */, + 504EC3001FED79650016851F /* Sources */, + 504EC3011FED79650016851F /* Frameworks */, + 504EC3021FED79650016851F /* Resources */, + 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = App; + productName = App; + productReference = 504EC3041FED79650016851F /* App.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 504EC2FC1FED79650016851F /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 0920; + TargetAttributes = { + 504EC3031FED79650016851F = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 504EC2FB1FED79650016851F; + productRefGroup = 504EC3051FED79650016851F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 504EC3031FED79650016851F /* App */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 504EC3021FED79650016851F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */, + 50B271D11FEDC1A000F3C39B /* public in Resources */, + 504EC30F1FED79650016851F /* Assets.xcassets in Resources */, + 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */, + 504EC30D1FED79650016851F /* Main.storyboard in Resources */, + 2FAD9763203C412B000D30F8 /* config.xml in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 504EC3001FED79650016851F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 504EC3081FED79650016851F /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 504EC30B1FED79650016851F /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 504EC30C1FED79650016851F /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 504EC3101FED79650016851F /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 504EC3111FED79650016851F /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 504EC3141FED79650016851F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 504EC3151FED79650016851F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 504EC3171FED79650016851F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = QD2W53S54Q; + INFOPLIST_FILE = App/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; + PRODUCT_BUNDLE_IDENTIFIER = io.ionic.starter; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 504EC3181FED79650016851F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = QD2W53S54Q; + INFOPLIST_FILE = App/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = io.ionic.starter; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 504EC3141FED79650016851F /* Debug */, + 504EC3151FED79650016851F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 504EC3171FED79650016851F /* Debug */, + 504EC3181FED79650016851F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 504EC2FC1FED79650016851F /* Project object */; +} diff --git a/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..42daef8 --- /dev/null +++ b/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/App/App.xcworkspace/contents.xcworkspacedata b/ios/App/App.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..b301e82 --- /dev/null +++ b/ios/App/App.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/App/App/AppDelegate.swift b/ios/App/App/AppDelegate.swift new file mode 100644 index 0000000..53e3760 --- /dev/null +++ b/ios/App/App/AppDelegate.swift @@ -0,0 +1,60 @@ +import UIKit +import Capacitor + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { + // Called when the app was launched with a url. Feel free to add additional processing here, + // but if you want the App API to support tracking app url opens, make sure to keep this call + return ApplicationDelegateProxy.shared.application(app, open: url, options: options) + } + + func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { + // Called when the app was launched with an activity, including Universal Links. + // Feel free to add additional processing here, but if you want the App API to support + // tracking app url opens, make sure to keep this call + return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + super.touchesBegan(touches, with: event) + + let statusBarRect = UIApplication.shared.statusBarFrame + guard let touchPoint = event?.allTouches?.first?.location(in: self.window) else { return } + + if statusBarRect.contains(touchPoint) { + NotificationCenter.default.post(name: .capacitorStatusBarTapped, object: nil) + } + } + +} diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png new file mode 100644 index 0000000..2f50374 Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png new file mode 100644 index 0000000..dd72c1c Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png new file mode 100644 index 0000000..dd72c1c Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png new file mode 100644 index 0000000..7fbf0a8 Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png new file mode 100644 index 0000000..f996ea1 Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png new file mode 100644 index 0000000..bb2935f Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png new file mode 100644 index 0000000..bb2935f Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png new file mode 100644 index 0000000..21d16e5 Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png new file mode 100644 index 0000000..dd72c1c Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png new file mode 100644 index 0000000..ff07545 Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png new file mode 100644 index 0000000..ff07545 Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png new file mode 100644 index 0000000..3401fa8 Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png new file mode 100644 index 0000000..adf6ba0 Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png new file mode 100644 index 0000000..ffd0da7 Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png new file mode 100644 index 0000000..90aea7c Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png new file mode 100644 index 0000000..2f5eafb Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png new file mode 100644 index 0000000..89c8d04 Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png new file mode 100644 index 0000000..ef541c9 Binary files /dev/null and b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png differ diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..90eea7e --- /dev/null +++ b/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "AppIcon-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "AppIcon-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "AppIcon-29x29@2x-1.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "AppIcon-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "AppIcon-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "AppIcon-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "AppIcon-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "AppIcon-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "AppIcon-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "AppIcon-20x20@2x-1.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "AppIcon-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "AppIcon-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "AppIcon-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "AppIcon-40x40@2x-1.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "AppIcon-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "AppIcon-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "AppIcon-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "AppIcon-512@2x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/App/App/Assets.xcassets/Contents.json b/ios/App/App/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/ios/App/App/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json b/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json new file mode 100644 index 0000000..d7d96a6 --- /dev/null +++ b/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "splash-2732x2732-2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "splash-2732x2732-1.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "splash-2732x2732.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png new file mode 100644 index 0000000..33ea6c9 Binary files /dev/null and b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png differ diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png new file mode 100644 index 0000000..33ea6c9 Binary files /dev/null and b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png differ diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png new file mode 100644 index 0000000..33ea6c9 Binary files /dev/null and b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png differ diff --git a/ios/App/App/Base.lproj/LaunchScreen.storyboard b/ios/App/App/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..e7ae5d7 --- /dev/null +++ b/ios/App/App/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/App/App/Base.lproj/Main.storyboard b/ios/App/App/Base.lproj/Main.storyboard new file mode 100644 index 0000000..b44df7b --- /dev/null +++ b/ios/App/App/Base.lproj/Main.storyboard @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ios/App/App/Info.plist b/ios/App/App/Info.plist new file mode 100644 index 0000000..113c4a5 --- /dev/null +++ b/ios/App/App/Info.plist @@ -0,0 +1,54 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + semmie-poc + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/ios/App/App/capacitor.config.json b/ios/App/App/capacitor.config.json new file mode 100644 index 0000000..026fba9 --- /dev/null +++ b/ios/App/App/capacitor.config.json @@ -0,0 +1,9 @@ +{ + "appId": "io.ionic.starter", + "appName": "semmie-poc", + "webDir": "www", + "bundledWebRuntime": false, + "server": { + "url": "http://192.168.10.212:4200" + } +} diff --git a/ios/App/App/config.xml b/ios/App/App/config.xml new file mode 100644 index 0000000..1b1b0e0 --- /dev/null +++ b/ios/App/App/config.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ios/App/Podfile b/ios/App/Podfile new file mode 100644 index 0000000..c3a4afe --- /dev/null +++ b/ios/App/Podfile @@ -0,0 +1,21 @@ +platform :ios, '12.0' +use_frameworks! + +# workaround to avoid Xcode caching of Pods that requires +# Product -> Clean Build Folder after new Cordova plugins installed +# Requires CocoaPods 1.6 or newer +install! 'cocoapods', :disable_input_output_paths => true + +def capacitor_pods + pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' + pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' + pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app' + pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics' + pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard' + pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar' +end + +target 'App' do + capacitor_pods + # Add your Pods here +end diff --git a/package-lock.json b/package-lock.json index ee5dc3c..cd950ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,18 +8,24 @@ "name": "semmie-poc", "version": "0.0.1", "dependencies": { + "@angular/cdk": "^13.2.4", "@angular/common": "~13.0.0", "@angular/core": "~13.0.0", "@angular/forms": "~13.0.0", "@angular/platform-browser": "~13.0.0", "@angular/platform-browser-dynamic": "~13.0.0", "@angular/router": "~13.0.0", + "@awesome-cordova-plugins/vibration": "^5.39.1", "@capacitor/app": "1.1.0", "@capacitor/core": "3.4.1", "@capacitor/haptics": "1.1.4", + "@capacitor/ios": "3.4.1", "@capacitor/keyboard": "1.2.2", "@capacitor/status-bar": "1.0.8", + "@datorama/akita": "^7.1.1", + "@datorama/akita-ngdevtools": "^7.0.0", "@ionic/angular": "^6.0.0", + "chart.js": "^3.7.1", "rxjs": "~6.6.0", "tslib": "^2.2.0", "zone.js": "~0.11.4" @@ -383,6 +389,28 @@ "typescript": "*" } }, + "node_modules/@angular/cdk": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.2.4.tgz", + "integrity": "sha512-t8LX/xySaIyN5EpWQjCwZFVLmdW/LE7pvx+6PghYGiLNvS+Vu/INi1Bhwt+b3fJDJ1uNYVCkB64G0UYhIsAwhg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^5.0.0" + }, + "peerDependencies": { + "@angular/common": "^13.0.0 || ^14.0.0-0", + "@angular/core": "^13.0.0 || ^14.0.0-0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cdk/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + }, "node_modules/@angular/cli": { "version": "13.0.4", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.0.4.tgz", @@ -578,6 +606,30 @@ "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", "dev": true }, + "node_modules/@awesome-cordova-plugins/core": { + "version": "5.39.1", + "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/core/-/core-5.39.1.tgz", + "integrity": "sha512-IHBemJf7/kNXCyOghNHckdSY+pu+59W5cTE8w2UMFKQCtJugXVkdDqBPQjmmefzKLmDNCJ+lYhbv0V3VIr6N2g==", + "peer": true, + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0" + } + }, + "node_modules/@awesome-cordova-plugins/vibration": { + "version": "5.39.1", + "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/vibration/-/vibration-5.39.1.tgz", + "integrity": "sha512-XSyACER6UwsH3HgiXXekxzKuoQYK/CDLK7Bj0paGZaQ0c73+JNAnhNmj5VmrgFXJrg4MvybbC+IbCbIIRuvr5Q==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@awesome-cordova-plugins/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", @@ -2433,6 +2485,14 @@ "@capacitor/core": "^3.0.0" } }, + "node_modules/@capacitor/ios": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-3.4.1.tgz", + "integrity": "sha512-ycFCyKI8DsgedVg7PW5MpCVgqFuD0PMHQGVfC5ichXc2C/jAATX32EVdEMCB0N3guKoH2k6T3Efwg59+Fcdx2w==", + "peerDependencies": { + "@capacitor/core": "^3.4.0" + } + }, "node_modules/@capacitor/keyboard": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-1.2.2.tgz", @@ -2458,6 +2518,30 @@ "node": ">=4.0.0" } }, + "node_modules/@datorama/akita": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@datorama/akita/-/akita-7.1.1.tgz", + "integrity": "sha512-x/RgwleA1u/Z3ICL7OBSsiUByzIwSjAnx4IcdgIYS090wc2C94u4UG5mWP8Yx98NUS6mnFeHLUVllXP+BQsl1A==", + "dependencies": { + "schematics-utilities": "^2.0.3" + }, + "peerDependencies": { + "rxjs": "*" + } + }, + "node_modules/@datorama/akita-ngdevtools": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@datorama/akita-ngdevtools/-/akita-ngdevtools-7.0.0.tgz", + "integrity": "sha512-ufUYu+mG9LFxDlbF4A8HYB6RhWLWy0U8iadu1ORUIEwpKhNZ6f+H4UH8ntzNxtKgf2yf61yV+s2CJ4i+WezfzA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": ">= 13.0.0", + "@datorama/akita": ">= 7.0.0", + "rxjs": "*" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", @@ -6223,6 +6307,538 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@schematics/update": { + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.29.tgz", + "integrity": "sha512-Syf6h6DYeu1WU9aLihMwIgVASpcHCxUYqhZyHfQABiK8NkdlZ+KAp4cOxihsZyDqIJNLWON+0/FLPAQF3BXh5Q==", + "dependencies": { + "@angular-devkit/core": "8.3.29", + "@angular-devkit/schematics": "8.3.29", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.5.5", + "rxjs": "6.4.0", + "semver": "6.3.0", + "semver-intersect": "1.4.0" + }, + "engines": { + "node": ">= 10.9.0", + "npm": ">= 6.2.0" + } + }, + "node_modules/@schematics/update/node_modules/@angular-devkit/core": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.29.tgz", + "integrity": "sha512-4jdja9QPwR6XG14ZSunyyOWT3nE2WtZC5IMDIBZADxujXvhzOU0n4oWpy6/JVHLUAxYNNgzLz+/LQORRWndcPg==", + "dependencies": { + "ajv": "6.12.3", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + }, + "engines": { + "node": ">= 10.9.0", + "npm": ">= 6.2.0" + } + }, + "node_modules/@schematics/update/node_modules/@angular-devkit/schematics": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.29.tgz", + "integrity": "sha512-AFJ9EK0XbcNlO5Dm9vr0OlBo1Nw6AaFXPR+DmHGBdcDDHxqEmYYLWfT+JU/8U2YFIdgrtlwvdtf6UQ3V2jdz1g==", + "dependencies": { + "@angular-devkit/core": "8.3.29", + "rxjs": "6.4.0" + }, + "engines": { + "node": ">= 10.9.0", + "npm": ">= 6.2.0" + } + }, + "node_modules/@schematics/update/node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@schematics/update/node_modules/agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@schematics/update/node_modules/ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@schematics/update/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/@schematics/update/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/@schematics/update/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@schematics/update/node_modules/err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" + }, + "node_modules/@schematics/update/node_modules/fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "node_modules/@schematics/update/node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/@schematics/update/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@schematics/update/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/@schematics/update/node_modules/http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" + }, + "node_modules/@schematics/update/node_modules/http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dependencies": { + "agent-base": "4", + "debug": "3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/@schematics/update/node_modules/https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/@schematics/update/node_modules/ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/@schematics/update/node_modules/ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue", + "engines": { + "node": "*" + } + }, + "node_modules/@schematics/update/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/@schematics/update/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@schematics/update/node_modules/magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/@schematics/update/node_modules/make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "dependencies": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "node_modules/@schematics/update/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/@schematics/update/node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dependencies": { + "minipass": "^2.9.0" + } + }, + "node_modules/@schematics/update/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@schematics/update/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/@schematics/update/node_modules/npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dependencies": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "node_modules/@schematics/update/node_modules/npm-package-arg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@schematics/update/node_modules/npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dependencies": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/@schematics/update/node_modules/npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "dependencies": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "node_modules/@schematics/update/node_modules/npm-pick-manifest/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@schematics/update/node_modules/npm-registry-fetch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", + "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", + "dependencies": { + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "JSONStream": "^1.3.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/@schematics/update/node_modules/pacote": { + "version": "9.5.5", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz", + "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", + "dependencies": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + } + }, + "node_modules/@schematics/update/node_modules/pacote/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@schematics/update/node_modules/promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dependencies": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/@schematics/update/node_modules/retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "engines": { + "node": "*" + } + }, + "node_modules/@schematics/update/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/@schematics/update/node_modules/rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@schematics/update/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/@schematics/update/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@schematics/update/node_modules/socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dependencies": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + }, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/@schematics/update/node_modules/socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dependencies": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@schematics/update/node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@schematics/update/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/@schematics/update/node_modules/tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "dependencies": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/@schematics/update/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@schematics/update/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/@schematics/update/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/@schematics/update/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "node_modules/@socket.io/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", @@ -6274,6 +6890,11 @@ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, + "node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, "node_modules/@types/cors": { "version": "2.8.12", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", @@ -6732,8 +7353,7 @@ "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" }, "node_modules/abab": { "version": "2.0.5", @@ -7415,8 +8035,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base": { "version": "0.11.2", @@ -7559,6 +8178,11 @@ "node": ">=6.9.x" } }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, "node_modules/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", @@ -7631,7 +8255,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7751,8 +8374,7 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/buffer-indexof": { "version": "1.1.1", @@ -7763,8 +8385,7 @@ "node_modules/builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" }, "node_modules/bytes": { "version": "3.1.2", @@ -7909,6 +8530,11 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "node_modules/chart.js": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.7.1.tgz", + "integrity": "sha512-8knRegQLFnPQAheZV8MjxIXc5gQEfDFD897BJgv/klO/vtIyFFmgMXrNfgrXpbTr/XbTturxRgxIXx/Y+ASJBA==" + }, "node_modules/cheerio": { "version": "1.0.0-rc.10", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", @@ -8331,8 +8957,43 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } }, "node_modules/connect": { "version": "3.7.0", @@ -8465,6 +9126,46 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-concurrently/node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/copy-concurrently/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -8608,8 +9309,7 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "node_modules/cors": { "version": "2.8.5", @@ -9264,6 +9964,11 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -9633,6 +10338,39 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -9716,8 +10454,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -9726,8 +10462,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -9739,7 +10473,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "dependencies": { "once": "^1.4.0" } @@ -9934,14 +10667,12 @@ "node_modules/es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "node_modules/es6-promisify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, "dependencies": { "es6-promise": "^4.0.3" } @@ -11203,8 +11934,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.2.11", @@ -11264,6 +11994,11 @@ "pend": "~1.2.0" } }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -11408,6 +12143,37 @@ "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", "dev": true }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/flush-write-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/flush-write-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/follow-redirects": { "version": "1.14.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", @@ -11490,6 +12256,37 @@ "node": ">= 0.6" } }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -11523,11 +12320,43 @@ "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", "dev": true }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs-write-stream-atomic/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fs-write-stream-atomic/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fsevents": { "version": "2.3.2", @@ -11546,8 +12375,7 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/functional-red-black-tree": { "version": "1.0.1", @@ -11575,6 +12403,11 @@ "node": "^12.13.0 || ^14.15.0 || >=16" } }, + "node_modules/genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==" + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -11666,7 +12499,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11732,8 +12564,7 @@ "node_modules/graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "node_modules/handle-thing": { "version": "2.0.1", @@ -11790,7 +12621,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -12156,7 +12986,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, "dependencies": { "ms": "^2.0.0" } @@ -12205,6 +13034,11 @@ } ] }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, "node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -12372,7 +13206,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -12395,14 +13228,12 @@ "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -12411,8 +13242,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "2.0.0", @@ -12591,8 +13421,7 @@ "node_modules/ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "node_modules/ip-regex": { "version": "4.3.0", @@ -12717,7 +13546,6 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -13070,8 +13898,7 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "node_modules/isbinaryfile": { "version": "4.0.8", @@ -13088,8 +13915,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "node_modules/isobject": { "version": "3.0.1", @@ -13363,8 +14189,7 @@ "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -13438,11 +14263,25 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true, "engines": [ "node >= 0.2.0" ] }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -14566,7 +15405,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14577,8 +15415,7 @@ "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "node_modules/minipass": { "version": "3.1.6", @@ -14680,6 +15517,57 @@ "node": ">= 8" } }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mississippi/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/mississippi/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/mississippi/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -14705,11 +15593,50 @@ "node": ">=10" } }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/move-concurrently/node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/move-concurrently/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "6.2.3", @@ -14885,6 +15812,19 @@ "dev": true, "optional": true }, + "node_modules/node-fetch-npm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "dependencies": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/node-forge": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", @@ -14955,7 +15895,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -14966,14 +15905,12 @@ "node_modules/normalize-package-data/node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "node_modules/normalize-package-data/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, "bin": { "semver": "bin/semver" } @@ -15012,7 +15949,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, "dependencies": { "npm-normalize-package-bin": "^1.0.1" } @@ -15032,8 +15968,7 @@ "node_modules/npm-normalize-package-bin": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" }, "node_modules/npm-package-arg": { "version": "8.1.5", @@ -15380,7 +16315,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "dependencies": { "wrappy": "1" } @@ -15557,15 +16491,31 @@ "url-parse": "^1.4.3" } }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "node_modules/p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -15747,6 +16697,38 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parallel-transform/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/parallel-transform/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -15857,7 +16839,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -15880,8 +16861,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "0.1.7", @@ -18069,8 +19049,7 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/progress": { "version": "2.0.3", @@ -18084,8 +19063,7 @@ "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "node_modules/promise-retry": { "version": "2.0.1", @@ -18122,6 +19100,14 @@ "node": ">=6" } }, + "node_modules/protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dependencies": { + "genfun": "^5.0.0" + } + }, "node_modules/protractor": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", @@ -18404,7 +19390,25 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -18414,7 +19418,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, "engines": { "node": ">=6" } @@ -18912,7 +19915,6 @@ "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, "dependencies": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -19135,6 +20137,19 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/run-queue/node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, "node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -19163,8 +20178,7 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safe-regex": { "version": "1.1.0", @@ -19178,8 +20192,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { "version": "1.43.4", @@ -19331,6 +20344,131 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/schematics-utilities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/schematics-utilities/-/schematics-utilities-2.0.3.tgz", + "integrity": "sha512-Elpkg3NVwAMsuo6CKi5MattjGo5ZK2F0vku1FGJAX5Fr4ebJvgKeDEn1J+rho97Ol7lM4LqeubBfJfYBTi/xYg==", + "dependencies": { + "@angular-devkit/core": "^8.3.8", + "@angular-devkit/schematics": "^8.3.8", + "@schematics/angular": "^8.3.8", + "@schematics/update": "^0.803.8", + "rxjs": "^6.4.0", + "typescript": "^3.6.3" + }, + "optionalDependencies": { + "parse5": "^5.1.0" + } + }, + "node_modules/schematics-utilities/node_modules/@angular-devkit/core": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.29.tgz", + "integrity": "sha512-4jdja9QPwR6XG14ZSunyyOWT3nE2WtZC5IMDIBZADxujXvhzOU0n4oWpy6/JVHLUAxYNNgzLz+/LQORRWndcPg==", + "dependencies": { + "ajv": "6.12.3", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + }, + "engines": { + "node": ">= 10.9.0", + "npm": ">= 6.2.0" + } + }, + "node_modules/schematics-utilities/node_modules/@angular-devkit/schematics": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.29.tgz", + "integrity": "sha512-AFJ9EK0XbcNlO5Dm9vr0OlBo1Nw6AaFXPR+DmHGBdcDDHxqEmYYLWfT+JU/8U2YFIdgrtlwvdtf6UQ3V2jdz1g==", + "dependencies": { + "@angular-devkit/core": "8.3.29", + "rxjs": "6.4.0" + }, + "engines": { + "node": ">= 10.9.0", + "npm": ">= 6.2.0" + } + }, + "node_modules/schematics-utilities/node_modules/@schematics/angular": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.29.tgz", + "integrity": "sha512-If+UhCsQzCgnQymiiF8dQRoic34+RgJ6rV0n4k7Tm4N2xNYJOG7ajjzKM7PIeafsF50FKnFP8dqaNGxCMyq5Ew==", + "dependencies": { + "@angular-devkit/core": "8.3.29", + "@angular-devkit/schematics": "8.3.29" + }, + "engines": { + "node": ">= 10.9.0", + "npm": ">= 6.2.0" + } + }, + "node_modules/schematics-utilities/node_modules/ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schematics-utilities/node_modules/fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "node_modules/schematics-utilities/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/schematics-utilities/node_modules/magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/schematics-utilities/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + }, + "node_modules/schematics-utilities/node_modules/rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/schematics-utilities/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/schematics-utilities/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -19400,6 +20538,22 @@ "node": ">=10" } }, + "node_modules/semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dependencies": { + "semver": "^5.0.0" + } + }, + "node_modules/semver-intersect/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/send": { "version": "0.17.2", "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", @@ -19720,7 +20874,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -20046,7 +21199,6 @@ "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, "engines": { "node": ">= 8" } @@ -20133,14 +21285,12 @@ "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -20149,14 +21299,12 @@ "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -20165,8 +21313,7 @@ "node_modules/spdx-license-ids": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" }, "node_modules/spdy": { "version": "4.0.2", @@ -20373,6 +21520,20 @@ "node": ">= 0.6" } }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, "node_modules/streamroller": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", @@ -20846,8 +22007,7 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "node_modules/through2": { "version": "4.0.2", @@ -21106,6 +22266,11 @@ "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "dev": true }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "node_modules/typescript": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", @@ -21227,7 +22392,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, "dependencies": { "unique-slug": "^2.0.0" } @@ -21236,7 +22400,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, "dependencies": { "imurmurhash": "^0.1.4" } @@ -21330,7 +22493,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -21380,8 +22542,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "node_modules/utils-merge": { "version": "1.0.1", @@ -21411,7 +22572,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -21421,7 +22581,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "dev": true, "dependencies": { "builtins": "^1.0.3" } @@ -22206,8 +23365,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/ws": { "version": "7.5.7", @@ -22252,6 +23410,14 @@ "node": ">=4.0" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -22565,6 +23731,23 @@ "@typescript-eslint/experimental-utils": "5.3.0" } }, + "@angular/cdk": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.2.4.tgz", + "integrity": "sha512-t8LX/xySaIyN5EpWQjCwZFVLmdW/LE7pvx+6PghYGiLNvS+Vu/INi1Bhwt+b3fJDJ1uNYVCkB64G0UYhIsAwhg==", + "requires": { + "parse5": "^5.0.0", + "tslib": "^2.3.0" + }, + "dependencies": { + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + } + } + }, "@angular/cli": { "version": "13.0.4", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.0.4.tgz", @@ -22679,6 +23862,23 @@ "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", "dev": true }, + "@awesome-cordova-plugins/core": { + "version": "5.39.1", + "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/core/-/core-5.39.1.tgz", + "integrity": "sha512-IHBemJf7/kNXCyOghNHckdSY+pu+59W5cTE8w2UMFKQCtJugXVkdDqBPQjmmefzKLmDNCJ+lYhbv0V3VIr6N2g==", + "peer": true, + "requires": { + "@types/cordova": "latest" + } + }, + "@awesome-cordova-plugins/vibration": { + "version": "5.39.1", + "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/vibration/-/vibration-5.39.1.tgz", + "integrity": "sha512-XSyACER6UwsH3HgiXXekxzKuoQYK/CDLK7Bj0paGZaQ0c73+JNAnhNmj5VmrgFXJrg4MvybbC+IbCbIIRuvr5Q==", + "requires": { + "@types/cordova": "latest" + } + }, "@babel/code-frame": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", @@ -24016,6 +25216,12 @@ "integrity": "sha512-+pJIb5X7xAcbrWj6rJaV+cwBlv8aFwB1/Ob6EV4atydThuuVSSsAL4hI4ZYlPNOxM6H5s+ZDLj7Pa2os4eFmtg==", "requires": {} }, + "@capacitor/ios": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-3.4.1.tgz", + "integrity": "sha512-ycFCyKI8DsgedVg7PW5MpCVgqFuD0PMHQGVfC5ichXc2C/jAATX32EVdEMCB0N3guKoH2k6T3Efwg59+Fcdx2w==", + "requires": {} + }, "@capacitor/keyboard": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-1.2.2.tgz", @@ -24034,6 +25240,22 @@ "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", "dev": true }, + "@datorama/akita": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@datorama/akita/-/akita-7.1.1.tgz", + "integrity": "sha512-x/RgwleA1u/Z3ICL7OBSsiUByzIwSjAnx4IcdgIYS090wc2C94u4UG5mWP8Yx98NUS6mnFeHLUVllXP+BQsl1A==", + "requires": { + "schematics-utilities": "^2.0.3" + } + }, + "@datorama/akita-ngdevtools": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@datorama/akita-ngdevtools/-/akita-ngdevtools-7.0.0.tgz", + "integrity": "sha512-ufUYu+mG9LFxDlbF4A8HYB6RhWLWy0U8iadu1ORUIEwpKhNZ6f+H4UH8ntzNxtKgf2yf61yV+s2CJ4i+WezfzA==", + "requires": { + "tslib": "^2.3.0" + } + }, "@discoveryjs/json-ext": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", @@ -26836,6 +28058,456 @@ "jsonc-parser": "3.0.0" } }, + "@schematics/update": { + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.29.tgz", + "integrity": "sha512-Syf6h6DYeu1WU9aLihMwIgVASpcHCxUYqhZyHfQABiK8NkdlZ+KAp4cOxihsZyDqIJNLWON+0/FLPAQF3BXh5Q==", + "requires": { + "@angular-devkit/core": "8.3.29", + "@angular-devkit/schematics": "8.3.29", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.5.5", + "rxjs": "6.4.0", + "semver": "6.3.0", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.29.tgz", + "integrity": "sha512-4jdja9QPwR6XG14ZSunyyOWT3nE2WtZC5IMDIBZADxujXvhzOU0n4oWpy6/JVHLUAxYNNgzLz+/LQORRWndcPg==", + "requires": { + "ajv": "6.12.3", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.29.tgz", + "integrity": "sha512-AFJ9EK0XbcNlO5Dm9vr0OlBo1Nw6AaFXPR+DmHGBdcDDHxqEmYYLWfT+JU/8U2YFIdgrtlwvdtf6UQ3V2jdz1g==", + "requires": { + "@angular-devkit/core": "8.3.29", + "rxjs": "6.4.0" + } + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "requires": { + "agent-base": "4", + "debug": "3.1.0" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "npm-registry-fetch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", + "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", + "requires": { + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "JSONStream": "^1.3.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + } + }, + "pacote": { + "version": "9.5.5", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz", + "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + } + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "requires": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, "@socket.io/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", @@ -26871,6 +28543,11 @@ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, + "@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, "@types/cors": { "version": "2.8.12", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", @@ -27254,8 +28931,7 @@ "@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" }, "abab": { "version": "2.0.5", @@ -27767,8 +29443,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", @@ -27871,6 +29546,11 @@ "minimist": "^1.2.0" } }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, "body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", @@ -27939,7 +29619,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -28025,8 +29704,7 @@ "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "buffer-indexof": { "version": "1.1.1", @@ -28037,8 +29715,7 @@ "builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" }, "bytes": { "version": "3.1.2", @@ -28158,6 +29835,11 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "chart.js": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.7.1.tgz", + "integrity": "sha512-8knRegQLFnPQAheZV8MjxIXc5gQEfDFD897BJgv/klO/vtIyFFmgMXrNfgrXpbTr/XbTturxRgxIXx/Y+ASJBA==" + }, "cheerio": { "version": "1.0.0-rc.10", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", @@ -28488,8 +30170,42 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } }, "connect": { "version": "3.7.0", @@ -28591,6 +30307,42 @@ "is-what": "^3.14.1" } }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -28692,8 +30444,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cors": { "version": "2.8.5", @@ -29175,6 +30926,11 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -29463,6 +31219,41 @@ "domhandler": "^4.2.0" } }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -29533,8 +31324,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, "requires": { "iconv-lite": "^0.6.2" }, @@ -29543,8 +31332,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -29555,7 +31342,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -29705,14 +31491,12 @@ "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "es6-promisify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, "requires": { "es6-promise": "^4.0.3" } @@ -30646,8 +32430,7 @@ "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { "version": "3.2.11", @@ -30701,6 +32484,11 @@ "pend": "~1.2.0" } }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -30819,6 +32607,39 @@ "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", "dev": true }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "follow-redirects": { "version": "1.14.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", @@ -30869,6 +32690,39 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -30896,11 +32750,45 @@ "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", "dev": true }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", @@ -30912,8 +32800,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -30938,6 +32825,11 @@ "wide-align": "^1.1.5" } }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==" + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -31002,7 +32894,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -31050,8 +32941,7 @@ "graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "handle-thing": { "version": "2.0.1", @@ -31099,7 +32989,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -31391,7 +33280,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, "requires": { "ms": "^2.0.0" } @@ -31418,6 +33306,11 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -31537,8 +33430,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { "version": "4.0.0", @@ -31555,14 +33447,12 @@ "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -31571,8 +33461,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "2.0.0", @@ -31711,8 +33600,7 @@ "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ip-regex": { "version": "4.3.0", @@ -31801,7 +33689,6 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -32037,8 +33924,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isbinaryfile": { "version": "4.0.8", @@ -32049,8 +33935,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -32265,8 +34150,7 @@ "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -32331,8 +34215,16 @@ "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } }, "jsprim": { "version": "1.4.2", @@ -33211,7 +35103,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -33219,8 +35110,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { "version": "3.1.6", @@ -33299,6 +35189,56 @@ "yallist": "^4.0.0" } }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -33315,11 +35255,46 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { "version": "6.2.3", @@ -33468,6 +35443,16 @@ "dev": true, "optional": true }, + "node-fetch-npm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, "node-forge": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", @@ -33518,7 +35503,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -33529,14 +35513,12 @@ "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -33562,7 +35544,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, "requires": { "npm-normalize-package-bin": "^1.0.1" } @@ -33579,8 +35560,7 @@ "npm-normalize-package-bin": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" }, "npm-package-arg": { "version": "8.1.5", @@ -33844,7 +35824,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -33977,11 +35956,24 @@ "url-parse": "^1.4.3" } }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } }, "p-defer": { "version": "1.0.0", @@ -34114,6 +36106,40 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -34202,8 +36228,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -34220,8 +36245,7 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "0.1.7", @@ -35823,8 +37847,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { "version": "2.0.3", @@ -35835,8 +37858,7 @@ "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "promise-retry": { "version": "2.0.1", @@ -35866,6 +37888,14 @@ } } }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "requires": { + "genfun": "^5.0.0" + } + }, "protractor": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", @@ -36095,17 +38125,36 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "q": { "version": "1.4.1", @@ -36485,7 +38534,6 @@ "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -36632,6 +38680,21 @@ "queue-microtask": "^1.2.2" } }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + } + } + }, "rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -36657,8 +38720,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -36672,8 +38734,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { "version": "1.43.4", @@ -36777,6 +38838,105 @@ } } }, + "schematics-utilities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/schematics-utilities/-/schematics-utilities-2.0.3.tgz", + "integrity": "sha512-Elpkg3NVwAMsuo6CKi5MattjGo5ZK2F0vku1FGJAX5Fr4ebJvgKeDEn1J+rho97Ol7lM4LqeubBfJfYBTi/xYg==", + "requires": { + "@angular-devkit/core": "^8.3.8", + "@angular-devkit/schematics": "^8.3.8", + "@schematics/angular": "^8.3.8", + "@schematics/update": "^0.803.8", + "parse5": "^5.1.0", + "rxjs": "^6.4.0", + "typescript": "^3.6.3" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.29.tgz", + "integrity": "sha512-4jdja9QPwR6XG14ZSunyyOWT3nE2WtZC5IMDIBZADxujXvhzOU0n4oWpy6/JVHLUAxYNNgzLz+/LQORRWndcPg==", + "requires": { + "ajv": "6.12.3", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.29.tgz", + "integrity": "sha512-AFJ9EK0XbcNlO5Dm9vr0OlBo1Nw6AaFXPR+DmHGBdcDDHxqEmYYLWfT+JU/8U2YFIdgrtlwvdtf6UQ3V2jdz1g==", + "requires": { + "@angular-devkit/core": "8.3.29", + "rxjs": "6.4.0" + } + }, + "@schematics/angular": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.29.tgz", + "integrity": "sha512-If+UhCsQzCgnQymiiF8dQRoic34+RgJ6rV0n4k7Tm4N2xNYJOG7ajjzKM7PIeafsF50FKnFP8dqaNGxCMyq5Ew==", + "requires": { + "@angular-devkit/core": "8.3.29", + "@angular-devkit/schematics": "8.3.29" + } + }, + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==" + } + } + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -36833,6 +38993,21 @@ "lru-cache": "^6.0.0" } }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "requires": { + "semver": "^5.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, "send": { "version": "0.17.2", "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", @@ -37102,8 +39277,7 @@ "smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "snapdragon": { "version": "0.8.2", @@ -37377,8 +39551,7 @@ "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" }, "source-map-js": { "version": "0.6.2", @@ -37445,14 +39618,12 @@ "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -37461,14 +39632,12 @@ "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -37477,8 +39646,7 @@ "spdx-license-ids": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" }, "spdy": { "version": "4.0.2", @@ -37647,6 +39815,20 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, "streamroller": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", @@ -37978,8 +40160,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "4.0.2", @@ -38184,6 +40365,11 @@ "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "dev": true }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "typescript": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", @@ -38266,7 +40452,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, "requires": { "unique-slug": "^2.0.0" } @@ -38275,7 +40460,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, "requires": { "imurmurhash": "^0.1.4" } @@ -38348,7 +40532,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -38396,8 +40579,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { "version": "1.0.1", @@ -38421,7 +40603,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -38431,7 +40612,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "dev": true, "requires": { "builtins": "^1.0.3" } @@ -39001,8 +41181,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { "version": "7.5.7", @@ -39027,6 +41206,11 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index e36206f..f31b2e0 100644 --- a/package.json +++ b/package.json @@ -7,24 +7,31 @@ "ng": "ng", "start": "ng serve", "build": "ng build", + "build:prod": "ng build --configuration production", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e" }, "private": true, "dependencies": { + "@angular/cdk": "^13.2.4", "@angular/common": "~13.0.0", "@angular/core": "~13.0.0", "@angular/forms": "~13.0.0", "@angular/platform-browser": "~13.0.0", "@angular/platform-browser-dynamic": "~13.0.0", "@angular/router": "~13.0.0", + "@awesome-cordova-plugins/vibration": "^5.39.1", "@capacitor/app": "1.1.0", "@capacitor/core": "3.4.1", "@capacitor/haptics": "1.1.4", + "@capacitor/ios": "3.4.1", "@capacitor/keyboard": "1.2.2", "@capacitor/status-bar": "1.0.8", + "@datorama/akita": "^7.1.1", + "@datorama/akita-ngdevtools": "^7.0.0", "@ionic/angular": "^6.0.0", + "chart.js": "^3.7.1", "rxjs": "~6.6.0", "tslib": "^2.2.0", "zone.js": "~0.11.4" diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 48fc28d..44367b0 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -1,16 +1,24 @@ import { NgModule } from '@angular/core'; import { PreloadAllModules, RouterModule, Routes } from '@angular/router'; +import { AuthenticatedGuard } from './guards'; const routes: Routes = [ { path: '', - loadChildren: () => import('./tabs/tabs.module').then(m => m.TabsPageModule) - } + canActivate: [AuthenticatedGuard], + loadChildren: () => + import('./modules/tabs/tabs.module').then((m) => m.TabsPageModule), + }, + { + path: 'login', + loadChildren: () => + import('./modules/login/login.module').then((m) => m.LoginPageModule), + }, ]; @NgModule({ imports: [ - RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }) + RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }), ], - exports: [RouterModule] + exports: [RouterModule], }) export class AppRoutingModule {} diff --git a/src/app/app.module.ts b/src/app/app.module.ts index d33b737..37de3a8 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,17 +1,64 @@ -import { NgModule } from '@angular/core'; +import { + HttpClient, + HttpClientModule, + HTTP_INTERCEPTORS, +} from '@angular/common/http'; +import { APP_INITIALIZER, NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouteReuseStrategy } from '@angular/router'; - +import { AkitaNgDevtools } from '@datorama/akita-ngdevtools'; import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; - +import { EMPTY } from 'rxjs'; +import { catchError, take, tap } from 'rxjs/operators'; +import { environment } from 'src/environments/environment'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; +import { AuthenticatedGuard } from './guards'; +import { AuthInterceptor } from './interceptor'; +import { User } from './models'; +import { UserStore } from './store/user'; +import { API_ROOT_URL } from './tokens'; + +// eslint-disable-next-line prefer-arrow/prefer-arrow-functions +function getUser(http: HttpClient, userStore: UserStore) { + return () => + http.get(`${environment.baseUrl}/user`).pipe( + take(1), + tap((user) => userStore.update({ user })), + catchError(() => { + userStore.update({ user: null, tokenData: null }); + return EMPTY; + }) + ); +} @NgModule({ declarations: [AppComponent], entryComponents: [], - imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule], - providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }], + imports: [ + BrowserModule, + IonicModule.forRoot(), + AppRoutingModule, + HttpClientModule, + environment.production ? [] : AkitaNgDevtools.forRoot({ name: 'semmie' }), + ], + providers: [ + AuthenticatedGuard, + AuthInterceptor, + { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, + { provide: API_ROOT_URL, useValue: environment.baseUrl }, + { + provide: HTTP_INTERCEPTORS, + useClass: AuthInterceptor, + multi: true, + }, + { + provide: APP_INITIALIZER, + multi: true, + deps: [HttpClient, UserStore], + useFactory: getUser, + }, + ], bootstrap: [AppComponent], }) export class AppModule {} diff --git a/src/app/components/modal-with-navigation/modal-with-navigation.component.html b/src/app/components/modal-with-navigation/modal-with-navigation.component.html new file mode 100644 index 0000000..7b88c96 --- /dev/null +++ b/src/app/components/modal-with-navigation/modal-with-navigation.component.html @@ -0,0 +1 @@ + diff --git a/src/app/components/modal-with-navigation/modal-with-navigation.component.ts b/src/app/components/modal-with-navigation/modal-with-navigation.component.ts new file mode 100644 index 0000000..00e1a4d --- /dev/null +++ b/src/app/components/modal-with-navigation/modal-with-navigation.component.ts @@ -0,0 +1,22 @@ +import { CommonModule } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-modal-with-navigation', + templateUrl: './modal-with-navigation.component.html', +}) +export class ModalWithNavigationPage { + rootPage: any; + + constructor(private modalController: ModalController) {} +} + +import { NgModule } from '@angular/core'; +import { IonicModule, ModalController } from '@ionic/angular'; + +@NgModule({ + imports: [CommonModule, IonicModule], + exports: [ModalWithNavigationPage], + declarations: [ModalWithNavigationPage], +}) +export class ModalWithNavigationModule {} diff --git a/src/app/contants/images.ts b/src/app/contants/images.ts new file mode 100644 index 0000000..2399729 --- /dev/null +++ b/src/app/contants/images.ts @@ -0,0 +1,2714 @@ +/* eslint-disable @typescript-eslint/quotes */ +/* eslint-disable max-len */ +/* eslint-disable @typescript-eslint/naming-convention */ + +export const IMAGES = [ + { + id: 'XmQRK0d2eos', + + created_at: '2021-12-27T11:33:13-05:00', + updated_at: '2022-02-24T23:27:47-05:00', + promoted_at: null, + width: 4000, + height: 6000, + color: '#d9d9d9', + blur_hash: 'LcF~ga_NRiD%_2%goeRjM{NGbHog', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1640622657553-f5af5b34ee2d?ixid=MnwzMDUyNzZ8MXwxfGFsbHwxfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1640622657553-f5af5b34ee2d?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwxfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1640622657553-f5af5b34ee2d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwxfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1640622657553-f5af5b34ee2d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwxfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1640622657553-f5af5b34ee2d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwxfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1640622657553-f5af5b34ee2d', + }, + links: { + self: 'https://api.unsplash.com/photos/XmQRK0d2eos', + html: 'https://unsplash.com/photos/XmQRK0d2eos', + download: + 'https://unsplash.com/photos/XmQRK0d2eos/download?ixid=MnwzMDUyNzZ8MXwxfGFsbHwxfHx8fHx8Mnx8MTY0NTc4MzM0OQ', + download_location: + 'https://api.unsplash.com/photos/XmQRK0d2eos/download?ixid=MnwzMDUyNzZ8MXwxfGFsbHwxfHx8fHx8Mnx8MTY0NTc4MzM0OQ', + }, + categories: [], + likes: 61, + liked_by_user: false, + current_user_collections: [], + sponsorship: { + impression_urls: [ + 'https://secure.insightexpressai.com/adServer/adServerESI.aspx?script=false&bannerID=9710753&rnd=[timestamp]&redir=https://secure.insightexpressai.com/adserver/1pixel.gif', + ], + tagline: 'Closer to what you love', + tagline_url: + 'https://www.microsoft.com/windows/?ocid=UnsplashFY22_soc_pmc_win_', + sponsor: { + id: 'kSlnstJTnY8', + updated_at: '2022-02-25T04:23:49-05:00', + username: 'windows', + name: 'Windows', + first_name: 'Windows', + last_name: null, + twitter_username: 'windows', + portfolio_url: 'https://www.windows.com', + bio: 'Follow us @Windows. #DoGreatThings', + location: null, + links: { + self: 'https://api.unsplash.com/users/windows', + html: 'https://unsplash.com/@windows', + photos: 'https://api.unsplash.com/users/windows/photos', + likes: 'https://api.unsplash.com/users/windows/likes', + portfolio: 'https://api.unsplash.com/users/windows/portfolio', + following: 'https://api.unsplash.com/users/windows/following', + followers: 'https://api.unsplash.com/users/windows/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1633364056312-0319b9fc4586image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1633364056312-0319b9fc4586image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1633364056312-0319b9fc4586image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'windows', + total_collections: 1, + total_likes: 0, + total_photos: 162, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: 'windows', + portfolio_url: 'https://www.windows.com', + twitter_username: 'windows', + paypal_email: null, + }, + }, + }, + topic_submissions: {}, + user: { + id: 'kSlnstJTnY8', + updated_at: '2022-02-25T04:23:49-05:00', + username: 'windows', + name: 'Windows', + first_name: 'Windows', + last_name: null, + twitter_username: 'windows', + portfolio_url: 'https://www.windows.com', + bio: 'Follow us @Windows. #DoGreatThings', + location: null, + links: { + self: 'https://api.unsplash.com/users/windows', + html: 'https://unsplash.com/@windows', + photos: 'https://api.unsplash.com/users/windows/photos', + likes: 'https://api.unsplash.com/users/windows/likes', + portfolio: 'https://api.unsplash.com/users/windows/portfolio', + following: 'https://api.unsplash.com/users/windows/following', + followers: 'https://api.unsplash.com/users/windows/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1633364056312-0319b9fc4586image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1633364056312-0319b9fc4586image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1633364056312-0319b9fc4586image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'windows', + total_collections: 1, + total_likes: 0, + total_photos: 162, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: 'windows', + portfolio_url: 'https://www.windows.com', + twitter_username: 'windows', + paypal_email: null, + }, + }, + }, + { + id: 'QX6iEExamYI', + created_at: '2022-02-24T16:26:38-05:00', + updated_at: '2022-02-25T05:00:01-05:00', + promoted_at: '2022-02-25T05:00:01-05:00', + width: 2999, + height: 1999, + color: '#730c0c', + blur_hash: 'LF9ZWQoc0$t9b|$_xU9%yWoHR7bK', + description: + 'Lithuanian people protesting agains Russian invasion of Ukraine. Ukraine Forever.', + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645737522917-f87b14c085d6?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645737522917-f87b14c085d6?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645737522917-f87b14c085d6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645737522917-f87b14c085d6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645737522917-f87b14c085d6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645737522917-f87b14c085d6', + }, + links: { + self: 'https://api.unsplash.com/photos/QX6iEExamYI', + html: 'https://unsplash.com/photos/QX6iEExamYI', + download: + 'https://unsplash.com/photos/QX6iEExamYI/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyfHx8fHx8Mnx8MTY0NTc4MzM0OQ', + download_location: + 'https://api.unsplash.com/photos/QX6iEExamYI/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyfHx8fHx8Mnx8MTY0NTc4MzM0OQ', + }, + categories: [], + likes: 4, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'j5B7Lzd0pKE', + updated_at: '2022-02-25T05:00:02-05:00', + username: 'dovilerm', + name: 'Dovile Ramoskaite', + first_name: 'Dovile', + last_name: 'Ramoskaite', + twitter_username: null, + portfolio_url: 'https://www.instagram.com/dovile_ramoskaite/', + bio: null, + location: null, + links: { + self: 'https://api.unsplash.com/users/dovilerm', + html: 'https://unsplash.com/@dovilerm', + photos: 'https://api.unsplash.com/users/dovilerm/photos', + likes: 'https://api.unsplash.com/users/dovilerm/likes', + portfolio: 'https://api.unsplash.com/users/dovilerm/portfolio', + following: 'https://api.unsplash.com/users/dovilerm/following', + followers: 'https://api.unsplash.com/users/dovilerm/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1570198375493-25c089668870image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1570198375493-25c089668870image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1570198375493-25c089668870image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'dovile_ramoskaite', + total_collections: 6, + total_likes: 3, + total_photos: 38, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'dovile_ramoskaite', + portfolio_url: 'https://www.instagram.com/dovile_ramoskaite/', + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: 'BcbIFrwBolg', + created_at: '2022-02-24T16:39:19-05:00', + updated_at: '2022-02-25T04:56:01-05:00', + promoted_at: '2022-02-25T04:56:01-05:00', + width: 4828, + height: 7238, + color: '#d9d9d9', + blur_hash: 'LJO46oIo?voL~qt7-;?bE1t74mD%', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645738696972-47ba71de8e58?ixid=MnwzMDUyNzZ8MHwxfGFsbHwzfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645738696972-47ba71de8e58?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwzfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645738696972-47ba71de8e58?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwzfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645738696972-47ba71de8e58?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwzfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645738696972-47ba71de8e58?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwzfHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645738696972-47ba71de8e58', + }, + links: { + self: 'https://api.unsplash.com/photos/BcbIFrwBolg', + html: 'https://unsplash.com/photos/BcbIFrwBolg', + download: + 'https://unsplash.com/photos/BcbIFrwBolg/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwzfHx8fHx8Mnx8MTY0NTc4MzM0OQ', + download_location: + 'https://api.unsplash.com/photos/BcbIFrwBolg/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwzfHx8fHx8Mnx8MTY0NTc4MzM0OQ', + }, + categories: [], + likes: 3, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'Jh1KBGhbWB8', + updated_at: '2022-02-25T04:58:49-05:00', + username: 'zacwolff', + name: 'Zac Wolff', + first_name: 'Zac', + last_name: 'Wolff', + twitter_username: 'zzacwolff', + portfolio_url: 'http://instagram.com/zac.wolff', + bio: 'UX & Product Designer. \r\n... Please credit.', + location: 'New York', + links: { + self: 'https://api.unsplash.com/users/zacwolff', + html: 'https://unsplash.com/@zacwolff', + photos: 'https://api.unsplash.com/users/zacwolff/photos', + likes: 'https://api.unsplash.com/users/zacwolff/likes', + portfolio: 'https://api.unsplash.com/users/zacwolff/portfolio', + following: 'https://api.unsplash.com/users/zacwolff/following', + followers: 'https://api.unsplash.com/users/zacwolff/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1623290991732-d6a6f9e52332image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1623290991732-d6a6f9e52332image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1623290991732-d6a6f9e52332image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'zac.wolff', + total_collections: 1, + total_likes: 7, + total_photos: 250, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'zac.wolff', + portfolio_url: 'http://instagram.com/zac.wolff', + twitter_username: 'zzacwolff', + paypal_email: null, + }, + }, + }, + { + id: 'vAE1Zcgx9HI', + created_at: '2022-02-24T15:00:05-05:00', + updated_at: '2022-02-25T04:48:01-05:00', + promoted_at: '2022-02-25T04:48:01-05:00', + width: 2714, + height: 3101, + color: '#d9d9d9', + blur_hash: 'LLIX{u8w.8RP_N%2Mw%2.7RO-Vxa', + description: 'Evening Standard on the day Russia invades the Ukraine', + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645732793864-70618c7f3174?ixid=MnwzMDUyNzZ8MHwxfGFsbHw0fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645732793864-70618c7f3174?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw0fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645732793864-70618c7f3174?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw0fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645732793864-70618c7f3174?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw0fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645732793864-70618c7f3174?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw0fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645732793864-70618c7f3174', + }, + links: { + self: 'https://api.unsplash.com/photos/vAE1Zcgx9HI', + html: 'https://unsplash.com/photos/vAE1Zcgx9HI', + download: + 'https://unsplash.com/photos/vAE1Zcgx9HI/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHw0fHx8fHx8Mnx8MTY0NTc4MzM0OQ', + download_location: + 'https://api.unsplash.com/photos/vAE1Zcgx9HI/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHw0fHx8fHx8Mnx8MTY0NTc4MzM0OQ', + }, + categories: [], + likes: 2, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'RyKw5QU8WbY', + updated_at: '2022-02-25T04:53:48-05:00', + username: 'john_cameron', + name: 'John Cameron', + first_name: 'John', + last_name: 'Cameron', + twitter_username: null, + portfolio_url: null, + bio: 'Bruce Wayne/Batman', + location: 'London / Malaga ', + links: { + self: 'https://api.unsplash.com/users/john_cameron', + html: 'https://unsplash.com/@john_cameron', + photos: 'https://api.unsplash.com/users/john_cameron/photos', + likes: 'https://api.unsplash.com/users/john_cameron/likes', + portfolio: 'https://api.unsplash.com/users/john_cameron/portfolio', + following: 'https://api.unsplash.com/users/john_cameron/following', + followers: 'https://api.unsplash.com/users/john_cameron/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1569249522831-999b6a2795e1image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1569249522831-999b6a2795e1image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1569249522831-999b6a2795e1image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'goodgollyitsdolly', + total_collections: 55, + total_likes: 108, + total_photos: 654, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: 'goodgollyitsdolly', + portfolio_url: null, + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: 'j42hArK0y98', + created_at: '2021-11-16T04:48:13-05:00', + updated_at: '2022-02-25T04:40:01-05:00', + promoted_at: '2022-02-25T04:40:01-05:00', + width: 2736, + height: 4104, + color: '#f3d9d9', + blur_hash: 'LVKToX0fD%X8%%%2a0bXu3VZJ7%1', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1637056005716-03d7a4d62c7a?ixid=MnwzMDUyNzZ8MHwxfGFsbHw1fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1637056005716-03d7a4d62c7a?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw1fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1637056005716-03d7a4d62c7a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw1fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1637056005716-03d7a4d62c7a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw1fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1637056005716-03d7a4d62c7a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw1fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1637056005716-03d7a4d62c7a', + }, + links: { + self: 'https://api.unsplash.com/photos/j42hArK0y98', + html: 'https://unsplash.com/photos/j42hArK0y98', + download: + 'https://unsplash.com/photos/j42hArK0y98/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHw1fHx8fHx8Mnx8MTY0NTc4MzM0OQ', + download_location: + 'https://api.unsplash.com/photos/j42hArK0y98/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHw1fHx8fHx8Mnx8MTY0NTc4MzM0OQ', + }, + categories: [], + likes: 7, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: '5PZpi1nS1WA', + updated_at: '2022-02-25T04:58:49-05:00', + username: 'jennie_ra', + name: 'Jennie Razumnaya', + first_name: 'Jennie', + last_name: 'Razumnaya', + twitter_username: null, + portfolio_url: 'https://www.behance.net/eugenia_razumnaya', + bio: null, + location: 'New York', + links: { + self: 'https://api.unsplash.com/users/jennie_ra', + html: 'https://unsplash.com/@jennie_ra', + photos: 'https://api.unsplash.com/users/jennie_ra/photos', + likes: 'https://api.unsplash.com/users/jennie_ra/likes', + portfolio: 'https://api.unsplash.com/users/jennie_ra/portfolio', + following: 'https://api.unsplash.com/users/jennie_ra/following', + followers: 'https://api.unsplash.com/users/jennie_ra/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1637671419944-e3060e5fb8adimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1637671419944-e3060e5fb8adimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1637671419944-e3060e5fb8adimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'jennie_ra', + total_collections: 0, + total_likes: 9, + total_photos: 24, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: 'jennie_ra', + portfolio_url: 'https://www.behance.net/eugenia_razumnaya', + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: 'A5E-ym6WyGM', + created_at: '2018-08-15T13:18:24-04:00', + updated_at: '2022-02-24T15:28:28-05:00', + promoted_at: '2021-06-19T04:18:01-04:00', + width: 3840, + height: 5760, + color: '#d9d9d9', + blur_hash: 'LYLqIXD%MxWB~qRPayjtIUt8xubH', + description: null, + alt_description: 'gray and black laptop computer on brown wooden table', + urls: { + raw: 'https://images.unsplash.com/photo-1534353436294-0dbd4bdac845?ixid=MnwzMDUyNzZ8MXwxfGFsbHw2fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1534353436294-0dbd4bdac845?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHw2fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1534353436294-0dbd4bdac845?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHw2fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1534353436294-0dbd4bdac845?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHw2fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1534353436294-0dbd4bdac845?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHw2fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1534353436294-0dbd4bdac845', + }, + links: { + self: 'https://api.unsplash.com/photos/A5E-ym6WyGM', + html: 'https://unsplash.com/photos/A5E-ym6WyGM', + download: + 'https://unsplash.com/photos/A5E-ym6WyGM/download?ixid=MnwzMDUyNzZ8MXwxfGFsbHw2fHx8fHx8Mnx8MTY0NTc4MzM0OQ', + download_location: + 'https://api.unsplash.com/photos/A5E-ym6WyGM/download?ixid=MnwzMDUyNzZ8MXwxfGFsbHw2fHx8fHx8Mnx8MTY0NTc4MzM0OQ', + }, + categories: [], + likes: 2804, + liked_by_user: false, + current_user_collections: [], + sponsorship: { + impression_urls: [ + 'https://ad.doubleclick.net/ddm/trackimpi/N1224323.3286893UNSPLASH/B25600467.324550585;dc_trk_aid=517316273;dc_trk_cid=157532779;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=;ltd=?', + 'https://secure.insightexpressai.com/adServer/adServerESI.aspx?script=false&bannerID=10082949&rnd=[timestamp]&redir=https://secure.insightexpressai.com/adserver/1pixel.gif', + ], + tagline: 'For Growing Businesses', + tagline_url: + 'https://ad.doubleclick.net/ddm/trackclk/N1224323.3286893UNSPLASH/B25600467.324550585;dc_trk_aid=517316273;dc_trk_cid=157532779;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=;ltd=', + sponsor: { + id: 'D-bxv1Imc-o', + updated_at: '2022-02-24T14:23:15-05:00', + username: 'mailchimp', + name: 'Mailchimp', + first_name: 'Mailchimp', + last_name: null, + twitter_username: 'Mailchimp', + portfolio_url: 'https://mailchimp.com/', + bio: 'The all-in-one Marketing Platform built for growing businesses.', + location: null, + links: { + self: 'https://api.unsplash.com/users/mailchimp', + html: 'https://unsplash.com/@mailchimp', + photos: 'https://api.unsplash.com/users/mailchimp/photos', + likes: 'https://api.unsplash.com/users/mailchimp/likes', + portfolio: 'https://api.unsplash.com/users/mailchimp/portfolio', + following: 'https://api.unsplash.com/users/mailchimp/following', + followers: 'https://api.unsplash.com/users/mailchimp/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1609545740442-928866556c38image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1609545740442-928866556c38image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1609545740442-928866556c38image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'mailchimp', + total_collections: 0, + total_likes: 19, + total_photos: 0, + accepted_tos: false, + for_hire: false, + social: { + instagram_username: 'mailchimp', + portfolio_url: 'https://mailchimp.com/', + twitter_username: 'Mailchimp', + paypal_email: null, + }, + }, + }, + topic_submissions: { + interiors: { + status: 'approved', + approved_on: '2020-05-11T07:49:50-04:00', + }, + }, + user: { + id: 'yyTnjxfxgLw', + updated_at: '2022-02-25T02:02:50-05:00', + username: 'camylla93', + name: 'Camylla Battani', + first_name: 'Camylla', + last_name: 'Battani', + twitter_username: null, + portfolio_url: 'http://westwavephoto.com/', + bio: "If you can't tell, I love dogs. Photographing them brings me so much joy! I also take photos of other things too. I hope you find something you like in my collection!", + location: 'Georgia', + links: { + self: 'https://api.unsplash.com/users/camylla93', + html: 'https://unsplash.com/@camylla93', + photos: 'https://api.unsplash.com/users/camylla93/photos', + likes: 'https://api.unsplash.com/users/camylla93/likes', + portfolio: 'https://api.unsplash.com/users/camylla93/portfolio', + following: 'https://api.unsplash.com/users/camylla93/following', + followers: 'https://api.unsplash.com/users/camylla93/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1534348121140-71ba5518c01d?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1534348121140-71ba5518c01d?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1534348121140-71ba5518c01d?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'mrsbattani', + total_collections: 0, + total_likes: 0, + total_photos: 41, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'mrsbattani', + portfolio_url: 'http://westwavephoto.com/', + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: 'Ql3K8aUqQ88', + created_at: '2022-02-24T06:29:57-05:00', + updated_at: '2022-02-25T04:32:03-05:00', + promoted_at: '2022-02-25T04:32:01-05:00', + width: 3712, + height: 5568, + color: '#0c2640', + blur_hash: 'LBAJ=]Ot9u-p0L%2-;kD4-n$#*Ip', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645701180616-064464cd2254?ixid=MnwzMDUyNzZ8MHwxfGFsbHw3fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645701180616-064464cd2254?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw3fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645701180616-064464cd2254?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw3fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645701180616-064464cd2254?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw3fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645701180616-064464cd2254?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw3fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645701180616-064464cd2254', + }, + links: { + self: 'https://api.unsplash.com/photos/Ql3K8aUqQ88', + html: 'https://unsplash.com/photos/Ql3K8aUqQ88', + download: + 'https://unsplash.com/photos/Ql3K8aUqQ88/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHw3fHx8fHx8Mnx8MTY0NTc4MzM0OQ', + download_location: + 'https://api.unsplash.com/photos/Ql3K8aUqQ88/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHw3fHx8fHx8Mnx8MTY0NTc4MzM0OQ', + }, + categories: [], + likes: 2, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'YdsTagGWsuU', + updated_at: '2022-02-25T04:48:44-05:00', + username: 'matreding', + name: 'Mathias P.R. Reding', + first_name: 'Mathias P.R.', + last_name: 'Reding', + twitter_username: 'matreding', + portfolio_url: 'https://linktr.ee/matreding', + bio: "Hey, I'm French Photographer I share my best photo here ;)\r\n If you use my images and want to say thanks, feel free to buy me a coffee! 😊 buymeacoff.ee/matreding ", + location: 'Paris', + links: { + self: 'https://api.unsplash.com/users/matreding', + html: 'https://unsplash.com/@matreding', + photos: 'https://api.unsplash.com/users/matreding/photos', + likes: 'https://api.unsplash.com/users/matreding/likes', + portfolio: 'https://api.unsplash.com/users/matreding/portfolio', + following: 'https://api.unsplash.com/users/matreding/following', + followers: 'https://api.unsplash.com/users/matreding/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1641063720084-ddcc9d019594image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1641063720084-ddcc9d019594image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1641063720084-ddcc9d019594image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'matreding', + total_collections: 24, + total_likes: 15964, + total_photos: 5976, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'matreding', + portfolio_url: 'https://linktr.ee/matreding', + twitter_username: 'matreding', + paypal_email: null, + }, + }, + }, + { + id: 'yDEeRo9ocgc', + created_at: '2022-02-24T18:03:45-05:00', + updated_at: '2022-02-25T04:25:21-05:00', + promoted_at: '2022-02-25T04:24:01-05:00', + width: 4160, + height: 6240, + color: '#594026', + blur_hash: 'LGH-fA?H?u9Z_2~qR*t7ELtR?Hxu', + description: 'Homewithus.co.uk', + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645743714183-8317e6bef2b5?ixid=MnwzMDUyNzZ8MHwxfGFsbHw4fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645743714183-8317e6bef2b5?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw4fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645743714183-8317e6bef2b5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw4fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645743714183-8317e6bef2b5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw4fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645743714183-8317e6bef2b5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw4fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645743714183-8317e6bef2b5', + }, + links: { + self: 'https://api.unsplash.com/photos/yDEeRo9ocgc', + html: 'https://unsplash.com/photos/yDEeRo9ocgc', + download: + 'https://unsplash.com/photos/yDEeRo9ocgc/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHw4fHx8fHx8Mnx8MTY0NTc4MzM0OQ', + download_location: + 'https://api.unsplash.com/photos/yDEeRo9ocgc/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHw4fHx8fHx8Mnx8MTY0NTc4MzM0OQ', + }, + categories: [], + likes: 3, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: '5nCHnlzCxSk', + updated_at: '2022-02-25T04:58:44-05:00', + username: 'rumanamin', + name: 'Rumman Amin', + first_name: 'Rumman', + last_name: 'Amin', + twitter_username: 'rumantweets', + portfolio_url: 'http://instagram.com/rumanamin', + bio: '📸 Fujifilm X-T4 + XF 23mm f2\r\nHomewithus.co.uk', + location: 'London', + links: { + self: 'https://api.unsplash.com/users/rumanamin', + html: 'https://unsplash.com/@rumanamin', + photos: 'https://api.unsplash.com/users/rumanamin/photos', + likes: 'https://api.unsplash.com/users/rumanamin/likes', + portfolio: 'https://api.unsplash.com/users/rumanamin/portfolio', + following: 'https://api.unsplash.com/users/rumanamin/following', + followers: 'https://api.unsplash.com/users/rumanamin/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1562247288783-41cc6650cf23?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1562247288783-41cc6650cf23?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1562247288783-41cc6650cf23?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'rumanamin', + total_collections: 0, + total_likes: 5, + total_photos: 335, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'rumanamin', + portfolio_url: 'http://instagram.com/rumanamin', + twitter_username: 'rumantweets', + paypal_email: null, + }, + }, + }, + { + id: 'A_Rufg-QtnU', + created_at: '2022-02-24T14:19:07-05:00', + updated_at: '2022-02-25T05:00:09-05:00', + promoted_at: '2022-02-25T04:16:01-05:00', + width: 2832, + height: 4256, + color: '#597340', + blur_hash: 'LCC%vQY-6ME%LKIB%Lt6LeJQiK%0', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645730235827-64ff5e6e1047?ixid=MnwzMDUyNzZ8MHwxfGFsbHw5fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645730235827-64ff5e6e1047?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw5fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645730235827-64ff5e6e1047?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw5fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645730235827-64ff5e6e1047?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw5fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645730235827-64ff5e6e1047?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHw5fHx8fHx8Mnx8MTY0NTc4MzM0OQ&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645730235827-64ff5e6e1047', + }, + links: { + self: 'https://api.unsplash.com/photos/A_Rufg-QtnU', + html: 'https://unsplash.com/photos/A_Rufg-QtnU', + download: + 'https://unsplash.com/photos/A_Rufg-QtnU/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHw5fHx8fHx8Mnx8MTY0NTc4MzM0OQ', + download_location: + 'https://api.unsplash.com/photos/A_Rufg-QtnU/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHw5fHx8fHx8Mnx8MTY0NTc4MzM0OQ', + }, + categories: [], + likes: 1, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'mqJu76Xv8w4', + updated_at: '2022-02-25T04:58:50-05:00', + username: 'bambydiagne', + name: 'Bamby Diagne', + first_name: 'Bamby', + last_name: 'Diagne', + twitter_username: null, + portfolio_url: 'http://Bambydiagne.com', + bio: "Hi ! I'm Bamby Diagne !\r\nFirst, if you'd like to support my work, feel free to donate to my PayPal & follow me on Instagram ! I specialize in portraits but I also love landscapes. Some of my work is here but the is on my website !", + location: null, + links: { + self: 'https://api.unsplash.com/users/bambydiagne', + html: 'https://unsplash.com/@bambydiagne', + photos: 'https://api.unsplash.com/users/bambydiagne/photos', + likes: 'https://api.unsplash.com/users/bambydiagne/likes', + portfolio: 'https://api.unsplash.com/users/bambydiagne/portfolio', + following: 'https://api.unsplash.com/users/bambydiagne/following', + followers: 'https://api.unsplash.com/users/bambydiagne/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1637040899753-7801b9ab8c9fimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1637040899753-7801b9ab8c9fimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1637040899753-7801b9ab8c9fimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'bambydiagne_', + total_collections: 21, + total_likes: 91, + total_photos: 19, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'bambydiagne_', + portfolio_url: 'http://Bambydiagne.com', + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: 'Cy6AGN8Awno', + created_at: '2022-02-24T19:57:39-05:00', + updated_at: '2022-02-25T04:22:56-05:00', + promoted_at: '2022-02-25T04:08:01-05:00', + width: 3024, + height: 4032, + color: '#d9d9c0', + blur_hash: 'LuG+EpoyM|oe01WBafWBxtWBxtt6', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645750646327-8c560ef5cb8f?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645750646327-8c560ef5cb8f?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645750646327-8c560ef5cb8f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645750646327-8c560ef5cb8f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645750646327-8c560ef5cb8f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645750646327-8c560ef5cb8f', + }, + links: { + self: 'https://api.unsplash.com/photos/Cy6AGN8Awno', + html: 'https://unsplash.com/photos/Cy6AGN8Awno', + download: + 'https://unsplash.com/photos/Cy6AGN8Awno/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMHx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/Cy6AGN8Awno/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMHx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 5, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: '-myGpytHnPo', + updated_at: '2022-02-25T04:58:50-05:00', + username: 'jontyson', + name: 'Jon Tyson', + first_name: 'Jon', + last_name: 'Tyson', + twitter_username: 'jontyson', + portfolio_url: 'http://primalpath.co', + bio: 'My cup overflows. \r\nwww.fathers.co \r\nwww.church.nyc', + location: 'New York City', + links: { + self: 'https://api.unsplash.com/users/jontyson', + html: 'https://unsplash.com/@jontyson', + photos: 'https://api.unsplash.com/users/jontyson/photos', + likes: 'https://api.unsplash.com/users/jontyson/likes', + portfolio: 'https://api.unsplash.com/users/jontyson/portfolio', + following: 'https://api.unsplash.com/users/jontyson/following', + followers: 'https://api.unsplash.com/users/jontyson/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1642794791806-e774ac38b187image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1642794791806-e774ac38b187image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1642794791806-e774ac38b187image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'jontyson', + total_collections: 0, + total_likes: 131, + total_photos: 4491, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: 'jontyson', + portfolio_url: 'http://primalpath.co', + twitter_username: 'jontyson', + paypal_email: null, + }, + }, + }, + { + id: 'bsy0-z5RTfk', + created_at: '2021-12-27T11:35:01-05:00', + updated_at: '2022-02-24T22:29:58-05:00', + promoted_at: null, + width: 6000, + height: 4000, + color: '#735940', + blur_hash: 'LDE{kJ{a_1_Mv}TKERxbt5o#NeOt', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1640622843377-6b5af9417e70?ixid=MnwzMDUyNzZ8MXwxfGFsbHwxMXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1640622843377-6b5af9417e70?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwxMXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1640622843377-6b5af9417e70?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwxMXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1640622843377-6b5af9417e70?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwxMXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1640622843377-6b5af9417e70?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwxMXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1640622843377-6b5af9417e70', + }, + links: { + self: 'https://api.unsplash.com/photos/bsy0-z5RTfk', + html: 'https://unsplash.com/photos/bsy0-z5RTfk', + download: + 'https://unsplash.com/photos/bsy0-z5RTfk/download?ixid=MnwzMDUyNzZ8MXwxfGFsbHwxMXx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/bsy0-z5RTfk/download?ixid=MnwzMDUyNzZ8MXwxfGFsbHwxMXx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 98, + liked_by_user: false, + current_user_collections: [], + sponsorship: { + impression_urls: [ + 'https://secure.insightexpressai.com/adServer/adServerESI.aspx?script=false&bannerID=9710774&rnd=[timestamp]&redir=https://secure.insightexpressai.com/adserver/1pixel.gif', + ], + tagline: 'Make the most of your 365', + tagline_url: 'https://www.microsoft.com/en-us/microsoft-365', + sponsor: { + id: 'VKlg9Ffk2GE', + updated_at: '2022-02-25T02:18:15-05:00', + username: 'microsoft365', + name: 'Microsoft 365', + first_name: 'Microsoft', + last_name: '365', + twitter_username: 'Microsoft365', + portfolio_url: 'https://www.microsoft.com/en-us/microsoft-365', + bio: 'Microsoft 365 is designed to help you achieve more across work and life with innovative Office apps, intelligent cloud services, and world-class security.', + location: null, + links: { + self: 'https://api.unsplash.com/users/microsoft365', + html: 'https://unsplash.com/@microsoft365', + photos: 'https://api.unsplash.com/users/microsoft365/photos', + likes: 'https://api.unsplash.com/users/microsoft365/likes', + portfolio: 'https://api.unsplash.com/users/microsoft365/portfolio', + following: 'https://api.unsplash.com/users/microsoft365/following', + followers: 'https://api.unsplash.com/users/microsoft365/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1605642019416-f1f5d5d75bfbimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1605642019416-f1f5d5d75bfbimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1605642019416-f1f5d5d75bfbimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: null, + total_collections: 0, + total_likes: 0, + total_photos: 9, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: null, + portfolio_url: 'https://www.microsoft.com/en-us/microsoft-365', + twitter_username: 'Microsoft365', + paypal_email: null, + }, + }, + }, + topic_submissions: {}, + user: { + id: 'VKlg9Ffk2GE', + updated_at: '2022-02-25T02:18:15-05:00', + username: 'microsoft365', + name: 'Microsoft 365', + first_name: 'Microsoft', + last_name: '365', + twitter_username: 'Microsoft365', + portfolio_url: 'https://www.microsoft.com/en-us/microsoft-365', + bio: 'Microsoft 365 is designed to help you achieve more across work and life with innovative Office apps, intelligent cloud services, and world-class security.', + location: null, + links: { + self: 'https://api.unsplash.com/users/microsoft365', + html: 'https://unsplash.com/@microsoft365', + photos: 'https://api.unsplash.com/users/microsoft365/photos', + likes: 'https://api.unsplash.com/users/microsoft365/likes', + portfolio: 'https://api.unsplash.com/users/microsoft365/portfolio', + following: 'https://api.unsplash.com/users/microsoft365/following', + followers: 'https://api.unsplash.com/users/microsoft365/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1605642019416-f1f5d5d75bfbimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1605642019416-f1f5d5d75bfbimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1605642019416-f1f5d5d75bfbimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: null, + total_collections: 0, + total_likes: 0, + total_photos: 9, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: null, + portfolio_url: 'https://www.microsoft.com/en-us/microsoft-365', + twitter_username: 'Microsoft365', + paypal_email: null, + }, + }, + }, + { + id: 'vlG-_WWpW4s', + created_at: '2022-02-19T15:14:22-05:00', + updated_at: '2022-02-25T04:00:01-05:00', + promoted_at: '2022-02-25T04:00:01-05:00', + width: 2700, + height: 3500, + color: '#595959', + blur_hash: 'L4A,wY?HX9W?00RjxaM{~qxu-pV@', + description: + 'Modeling :3dsmax 2022\nRender motor: vray5.2\nPostpro: photoshop', + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645301565223-9ad770d06a16?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645301565223-9ad770d06a16?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645301565223-9ad770d06a16?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645301565223-9ad770d06a16?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645301565223-9ad770d06a16?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645301565223-9ad770d06a16', + }, + links: { + self: 'https://api.unsplash.com/photos/vlG-_WWpW4s', + html: 'https://unsplash.com/photos/vlG-_WWpW4s', + download: + 'https://unsplash.com/photos/vlG-_WWpW4s/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMnx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/vlG-_WWpW4s/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxMnx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 32, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: { + interiors: { + status: 'approved', + approved_on: '2022-02-21T10:29:57-05:00', + }, + wallpapers: { + status: 'rejected', + }, + architecture: { + status: 'rejected', + }, + '3d-renders': { + status: 'approved', + approved_on: '2022-02-21T09:26:51-05:00', + }, + 'arts-culture': { + status: 'rejected', + }, + }, + user: { + id: 'KVQjf8aUVtg', + updated_at: '2022-02-25T04:48:44-05:00', + username: 'alimoradii__', + name: 'Ali Moradi', + first_name: 'Ali', + last_name: 'Moradi', + twitter_username: null, + portfolio_url: null, + bio: '⚜Architectural Engineer⚜\r\n🏛interiordesign 3Dartist', + location: 'Iran,tehran', + links: { + self: 'https://api.unsplash.com/users/alimoradii__', + html: 'https://unsplash.com/@alimoradii__', + photos: 'https://api.unsplash.com/users/alimoradii__/photos', + likes: 'https://api.unsplash.com/users/alimoradii__/likes', + portfolio: 'https://api.unsplash.com/users/alimoradii__/portfolio', + following: 'https://api.unsplash.com/users/alimoradii__/following', + followers: 'https://api.unsplash.com/users/alimoradii__/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1645302559912-7b57c9c32cd3image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1645302559912-7b57c9c32cd3image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1645302559912-7b57c9c32cd3image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'Alimoradii__', + total_collections: 0, + total_likes: 914, + total_photos: 12, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'Alimoradii__', + portfolio_url: null, + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: 'wNeHybP7xgQ', + created_at: '2022-02-20T15:46:07-05:00', + updated_at: '2022-02-25T04:21:22-05:00', + promoted_at: '2022-02-25T03:56:01-05:00', + width: 4160, + height: 6240, + color: '#a68c73', + blur_hash: 'LMGawK~BEjNH-:Nbs9sS9^IpRjWV', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645389770504-d3ad0838cce2?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxM3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645389770504-d3ad0838cce2?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxM3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645389770504-d3ad0838cce2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxM3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645389770504-d3ad0838cce2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxM3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645389770504-d3ad0838cce2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxM3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645389770504-d3ad0838cce2', + }, + links: { + self: 'https://api.unsplash.com/photos/wNeHybP7xgQ', + html: 'https://unsplash.com/photos/wNeHybP7xgQ', + download: + 'https://unsplash.com/photos/wNeHybP7xgQ/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxM3x8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/wNeHybP7xgQ/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxM3x8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 5, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'ansy8qJnFdg', + updated_at: '2022-02-25T04:58:50-05:00', + username: 'ayushk9', + name: 'ayush kumar', + first_name: 'ayush', + last_name: 'kumar', + twitter_username: null, + portfolio_url: null, + bio: null, + location: null, + links: { + self: 'https://api.unsplash.com/users/ayushk9', + html: 'https://unsplash.com/@ayushk9', + photos: 'https://api.unsplash.com/users/ayushk9/photos', + likes: 'https://api.unsplash.com/users/ayushk9/likes', + portfolio: 'https://api.unsplash.com/users/ayushk9/portfolio', + following: 'https://api.unsplash.com/users/ayushk9/following', + followers: 'https://api.unsplash.com/users/ayushk9/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/placeholder-avatars/extra-large.jpg?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/placeholder-avatars/extra-large.jpg?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/placeholder-avatars/extra-large.jpg?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'ayushk9', + total_collections: 0, + total_likes: 2, + total_photos: 73, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'ayushk9', + portfolio_url: null, + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: '4bO67d-douk', + created_at: '2022-02-22T10:12:06-05:00', + updated_at: '2022-02-25T03:48:01-05:00', + promoted_at: '2022-02-25T03:48:01-05:00', + width: 3546, + height: 5210, + color: '#f3f3f3', + blur_hash: 'LpK1qARj_NWV?Ij[D%WB.8t7V@f6', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645542702511-f34c8a5e6bcf?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645542702511-f34c8a5e6bcf?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645542702511-f34c8a5e6bcf?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645542702511-f34c8a5e6bcf?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645542702511-f34c8a5e6bcf?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645542702511-f34c8a5e6bcf', + }, + links: { + self: 'https://api.unsplash.com/photos/4bO67d-douk', + html: 'https://unsplash.com/photos/4bO67d-douk', + download: + 'https://unsplash.com/photos/4bO67d-douk/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNHx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/4bO67d-douk/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNHx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 3, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'oxq4H15Ml_o', + updated_at: '2022-02-25T04:58:50-05:00', + username: 'olimpiaborodiunsplash', + name: 'olimpia campean', + first_name: 'olimpia', + last_name: 'campean', + twitter_username: null, + portfolio_url: null, + bio: null, + location: null, + links: { + self: 'https://api.unsplash.com/users/olimpiaborodiunsplash', + html: 'https://unsplash.com/@olimpiaborodiunsplash', + photos: 'https://api.unsplash.com/users/olimpiaborodiunsplash/photos', + likes: 'https://api.unsplash.com/users/olimpiaborodiunsplash/likes', + portfolio: + 'https://api.unsplash.com/users/olimpiaborodiunsplash/portfolio', + following: + 'https://api.unsplash.com/users/olimpiaborodiunsplash/following', + followers: + 'https://api.unsplash.com/users/olimpiaborodiunsplash/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/placeholder-avatars/extra-large.jpg?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/placeholder-avatars/extra-large.jpg?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/placeholder-avatars/extra-large.jpg?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: null, + total_collections: 0, + total_likes: 618, + total_photos: 24, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: null, + portfolio_url: null, + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: 'fFvVB39xsGI', + created_at: '2021-08-19T08:02:30-04:00', + updated_at: '2022-02-25T03:40:02-05:00', + promoted_at: '2022-02-25T03:40:02-05:00', + width: 3556, + height: 5334, + color: '#262626', + blur_hash: 'LLCPkk_3~W%g%h-;-;%Mt6NHofRk', + description: null, + alt_description: 'person in blue denim jeans and black leather shoes', + urls: { + raw: 'https://images.unsplash.com/photo-1629374356063-d55c2e371fc7?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1629374356063-d55c2e371fc7?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1629374356063-d55c2e371fc7?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1629374356063-d55c2e371fc7?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1629374356063-d55c2e371fc7?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1629374356063-d55c2e371fc7', + }, + links: { + self: 'https://api.unsplash.com/photos/fFvVB39xsGI', + html: 'https://unsplash.com/photos/fFvVB39xsGI', + download: + 'https://unsplash.com/photos/fFvVB39xsGI/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNXx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/fFvVB39xsGI/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxNXx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 7, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'vzZo4S29BQM', + updated_at: '2022-02-25T04:58:48-05:00', + username: 'fillvlad', + name: 'Vladislav Filippov', + first_name: 'Vladislav', + last_name: 'Filippov', + twitter_username: null, + portfolio_url: null, + bio: 'Exploring the Crimea,\r\nOutdoor photo, Instagram: @fillvlad', + location: 'Crimea', + links: { + self: 'https://api.unsplash.com/users/fillvlad', + html: 'https://unsplash.com/@fillvlad', + photos: 'https://api.unsplash.com/users/fillvlad/photos', + likes: 'https://api.unsplash.com/users/fillvlad/likes', + portfolio: 'https://api.unsplash.com/users/fillvlad/portfolio', + following: 'https://api.unsplash.com/users/fillvlad/following', + followers: 'https://api.unsplash.com/users/fillvlad/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1623527510588-6e00f1de54caimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1623527510588-6e00f1de54caimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1623527510588-6e00f1de54caimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'fillvlad', + total_collections: 1, + total_likes: 7, + total_photos: 75, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'fillvlad', + portfolio_url: null, + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: 'va8f_vOiukY', + created_at: '2021-12-07T16:50:16-05:00', + updated_at: '2022-02-25T01:27:04-05:00', + promoted_at: null, + width: 7511, + height: 5008, + color: '#d9c0a6', + blur_hash: 'LCLg5~I@0K^g~o?Frs.800?ZNG%M', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1638913665258-ddd2bceafb30?ixid=MnwzMDUyNzZ8MXwxfGFsbHwxNnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1638913665258-ddd2bceafb30?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwxNnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1638913665258-ddd2bceafb30?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwxNnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1638913665258-ddd2bceafb30?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwxNnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1638913665258-ddd2bceafb30?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwxNnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1638913665258-ddd2bceafb30', + }, + links: { + self: 'https://api.unsplash.com/photos/va8f_vOiukY', + html: 'https://unsplash.com/photos/va8f_vOiukY', + download: + 'https://unsplash.com/photos/va8f_vOiukY/download?ixid=MnwzMDUyNzZ8MXwxfGFsbHwxNnx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/va8f_vOiukY/download?ixid=MnwzMDUyNzZ8MXwxfGFsbHwxNnx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 75, + liked_by_user: false, + current_user_collections: [], + sponsorship: { + impression_urls: [ + 'https://secure.insightexpressai.com/adServer/adServerESI.aspx?script=false&bannerID=9606363&rnd=[timestamp]&redir=https://secure.insightexpressai.com/adserver/1pixel.gif', + ], + tagline: 'Designed to evolve. Built to empower', + tagline_url: + 'https://tezos.com/?utm_campaign=_evergreen_contextual_reach_gl_&utm_source=&utm_medium=&utm_content=contextual_image_unsplash_v1_T1714', + sponsor: { + id: 'JpoSTNq74MM', + updated_at: '2022-02-25T04:23:52-05:00', + username: 'tezos', + name: 'Tezos', + first_name: 'Tezos', + last_name: null, + twitter_username: 'tezos', + portfolio_url: 'https://tezos.com/', + bio: 'Tezos is a self-upgradable and energy-efficient Proof of Stake blockchain with a proven record of security and scalability. Tezos seamlessly adopts innovations without disruption. For more information, please visit tezos.com.', + location: null, + links: { + self: 'https://api.unsplash.com/users/tezos', + html: 'https://unsplash.com/@tezos', + photos: 'https://api.unsplash.com/users/tezos/photos', + likes: 'https://api.unsplash.com/users/tezos/likes', + portfolio: 'https://api.unsplash.com/users/tezos/portfolio', + following: 'https://api.unsplash.com/users/tezos/following', + followers: 'https://api.unsplash.com/users/tezos/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1634227720022-77e396999fc8image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1634227720022-77e396999fc8image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1634227720022-77e396999fc8image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: null, + total_collections: 0, + total_likes: 0, + total_photos: 108, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: null, + portfolio_url: 'https://tezos.com/', + twitter_username: 'tezos', + paypal_email: null, + }, + }, + }, + topic_submissions: { + 'business-work': { + status: 'approved', + approved_on: '2021-12-17T10:14:21-05:00', + }, + }, + user: { + id: 'JpoSTNq74MM', + updated_at: '2022-02-25T04:23:52-05:00', + username: 'tezos', + name: 'Tezos', + first_name: 'Tezos', + last_name: null, + twitter_username: 'tezos', + portfolio_url: 'https://tezos.com/', + bio: 'Tezos is a self-upgradable and energy-efficient Proof of Stake blockchain with a proven record of security and scalability. Tezos seamlessly adopts innovations without disruption. For more information, please visit tezos.com.', + location: null, + links: { + self: 'https://api.unsplash.com/users/tezos', + html: 'https://unsplash.com/@tezos', + photos: 'https://api.unsplash.com/users/tezos/photos', + likes: 'https://api.unsplash.com/users/tezos/likes', + portfolio: 'https://api.unsplash.com/users/tezos/portfolio', + following: 'https://api.unsplash.com/users/tezos/following', + followers: 'https://api.unsplash.com/users/tezos/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1634227720022-77e396999fc8image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1634227720022-77e396999fc8image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1634227720022-77e396999fc8image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: null, + total_collections: 0, + total_likes: 0, + total_photos: 108, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: null, + portfolio_url: 'https://tezos.com/', + twitter_username: 'tezos', + paypal_email: null, + }, + }, + }, + { + id: 'o3TEZhOy2jc', + created_at: '2022-02-24T04:02:26-05:00', + updated_at: '2022-02-25T03:32:02-05:00', + promoted_at: '2022-02-25T03:32:02-05:00', + width: 2072, + height: 3684, + color: '#40260c', + blur_hash: 'LME{I4M|9aRn_LofIBa}NL%Laeoc', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645693090799-14da56d807c1?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxN3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645693090799-14da56d807c1?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxN3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645693090799-14da56d807c1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxN3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645693090799-14da56d807c1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxN3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645693090799-14da56d807c1?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxN3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645693090799-14da56d807c1', + }, + links: { + self: 'https://api.unsplash.com/photos/o3TEZhOy2jc', + html: 'https://unsplash.com/photos/o3TEZhOy2jc', + download: + 'https://unsplash.com/photos/o3TEZhOy2jc/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxN3x8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/o3TEZhOy2jc/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxN3x8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 3, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'qeZHDQAL4Tg', + updated_at: '2022-02-25T04:58:47-05:00', + username: 'fchristiaans', + name: 'Floris Christiaans', + first_name: 'Floris', + last_name: 'Christiaans', + twitter_username: null, + portfolio_url: null, + bio: 'Winners have a plan, I have my camera', + location: 'Amsterdam', + links: { + self: 'https://api.unsplash.com/users/fchristiaans', + html: 'https://unsplash.com/@fchristiaans', + photos: 'https://api.unsplash.com/users/fchristiaans/photos', + likes: 'https://api.unsplash.com/users/fchristiaans/likes', + portfolio: 'https://api.unsplash.com/users/fchristiaans/portfolio', + following: 'https://api.unsplash.com/users/fchristiaans/following', + followers: 'https://api.unsplash.com/users/fchristiaans/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1629411557007-c9234690d874image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1629411557007-c9234690d874image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1629411557007-c9234690d874image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'Fchristiaans', + total_collections: 0, + total_likes: 24, + total_photos: 29, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'Fchristiaans', + portfolio_url: null, + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: 'Wzp6dzBNwTg', + created_at: '2022-02-24T12:19:47-05:00', + updated_at: '2022-02-25T03:24:02-05:00', + promoted_at: '2022-02-25T03:24:02-05:00', + width: 6484, + height: 4323, + color: '#8c8c8c', + blur_hash: 'L6D,7foe00R-jXogogV@oIM{M{-:', + description: + 'Unity Creativity Beauty on a brutalist monument in Sofia, Bulgaria', + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645723012234-7f1dcc6ea311?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645723012234-7f1dcc6ea311?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645723012234-7f1dcc6ea311?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645723012234-7f1dcc6ea311?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645723012234-7f1dcc6ea311?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645723012234-7f1dcc6ea311', + }, + links: { + self: 'https://api.unsplash.com/photos/Wzp6dzBNwTg', + html: 'https://unsplash.com/photos/Wzp6dzBNwTg', + download: + 'https://unsplash.com/photos/Wzp6dzBNwTg/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOHx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/Wzp6dzBNwTg/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOHx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 2, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'ut8gL70yXw0', + updated_at: '2022-02-25T04:23:03-05:00', + username: 'tijsvl', + name: 'Tijs van Leur', + first_name: 'Tijs', + last_name: 'van Leur', + twitter_username: 'tijsvl', + portfolio_url: 'https://tijsvl.net', + bio: 'Open for new assignments! Originally a touring concert photographer, but not afraid to use my cameras elsewhere.\r\nInstagram: @tijsvl @lookwhatiso', + location: 'Sofia 🇧🇬 // Nijmegen 🇳🇱', + links: { + self: 'https://api.unsplash.com/users/tijsvl', + html: 'https://unsplash.com/@tijsvl', + photos: 'https://api.unsplash.com/users/tijsvl/photos', + likes: 'https://api.unsplash.com/users/tijsvl/likes', + portfolio: 'https://api.unsplash.com/users/tijsvl/portfolio', + following: 'https://api.unsplash.com/users/tijsvl/following', + followers: 'https://api.unsplash.com/users/tijsvl/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1619970902996-8a47669bff17image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1619970902996-8a47669bff17image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1619970902996-8a47669bff17image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'lookwhatiso', + total_collections: 4, + total_likes: 51, + total_photos: 35, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'lookwhatiso', + portfolio_url: 'https://tijsvl.net', + twitter_username: 'tijsvl', + paypal_email: null, + }, + }, + }, + { + id: '7RUDVKZe_ag', + created_at: '2022-02-23T18:04:23-05:00', + updated_at: '2022-02-25T04:30:05-05:00', + promoted_at: '2022-02-25T03:16:01-05:00', + width: 2832, + height: 4240, + color: '#262626', + blur_hash: 'LACZX|oe9GbI0fM_ogbI%%n$WBof', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645656817797-86c37adfea59?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645656817797-86c37adfea59?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645656817797-86c37adfea59?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645656817797-86c37adfea59?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645656817797-86c37adfea59?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645656817797-86c37adfea59', + }, + links: { + self: 'https://api.unsplash.com/photos/7RUDVKZe_ag', + html: 'https://unsplash.com/photos/7RUDVKZe_ag', + download: + 'https://unsplash.com/photos/7RUDVKZe_ag/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOXx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/7RUDVKZe_ag/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwxOXx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 12, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'plx1zgl86Bc', + updated_at: '2022-02-25T04:48:44-05:00', + username: 'joshhild', + name: 'Josh Hild', + first_name: 'Josh', + last_name: 'Hild', + twitter_username: null, + portfolio_url: 'https://www.instagram.com/joshhild', + bio: 'Any donations are appreciated!\r\nJoshhild.com for Prints', + location: 'Minneapolis', + links: { + self: 'https://api.unsplash.com/users/joshhild', + html: 'https://unsplash.com/@joshhild', + photos: 'https://api.unsplash.com/users/joshhild/photos', + likes: 'https://api.unsplash.com/users/joshhild/likes', + portfolio: 'https://api.unsplash.com/users/joshhild/portfolio', + following: 'https://api.unsplash.com/users/joshhild/following', + followers: 'https://api.unsplash.com/users/joshhild/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1534444770498-421ec361dce5?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1534444770498-421ec361dce5?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1534444770498-421ec361dce5?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'joshhild', + total_collections: 0, + total_likes: 8, + total_photos: 468, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'joshhild', + portfolio_url: 'https://www.instagram.com/joshhild', + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: 'Dgo6whZ_2BM', + created_at: '2022-02-20T15:40:57-05:00', + updated_at: '2022-02-25T03:08:02-05:00', + promoted_at: '2022-02-25T03:08:01-05:00', + width: 3533, + height: 4711, + color: '#262626', + blur_hash: 'LLDlp7s:9Gnh_NkCe-Rj%~t7RPM{', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645389412524-1669f01e57a7?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645389412524-1669f01e57a7?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645389412524-1669f01e57a7?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645389412524-1669f01e57a7?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645389412524-1669f01e57a7?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645389412524-1669f01e57a7', + }, + links: { + self: 'https://api.unsplash.com/photos/Dgo6whZ_2BM', + html: 'https://unsplash.com/photos/Dgo6whZ_2BM', + download: + 'https://unsplash.com/photos/Dgo6whZ_2BM/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMHx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/Dgo6whZ_2BM/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMHx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 2, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'KDR8srk_NsU', + updated_at: '2022-02-25T04:58:49-05:00', + username: 'gaspo3', + name: 'Gaspar Zaldo', + first_name: 'Gaspar', + last_name: 'Zaldo', + twitter_username: 'GasparZaldo', + portfolio_url: 'https://www.instagram.com/gaspo3/?hl=es-la', + bio: 'I am an Argentine photographer from a small town located in the province of Chubut. if you like my work, support me via donate.', + location: 'Cordoba', + links: { + self: 'https://api.unsplash.com/users/gaspo3', + html: 'https://unsplash.com/@gaspo3', + photos: 'https://api.unsplash.com/users/gaspo3/photos', + likes: 'https://api.unsplash.com/users/gaspo3/likes', + portfolio: 'https://api.unsplash.com/users/gaspo3/portfolio', + following: 'https://api.unsplash.com/users/gaspo3/following', + followers: 'https://api.unsplash.com/users/gaspo3/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1640416368135-c6785bb8800aimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1640416368135-c6785bb8800aimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1640416368135-c6785bb8800aimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'gaspo3', + total_collections: 0, + total_likes: 0, + total_photos: 1536, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'gaspo3', + portfolio_url: 'https://www.instagram.com/gaspo3/?hl=es-la', + twitter_username: 'GasparZaldo', + paypal_email: null, + }, + }, + }, + { + id: 'TFH8e9Lmp0s', + created_at: '2021-12-27T11:29:32-05:00', + updated_at: '2022-02-24T23:27:47-05:00', + promoted_at: null, + width: 5464, + height: 8192, + color: '#d9f3f3', + blur_hash: 'LTLq-0_NWVn~?b9Et7s:%$RPxZM{', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1640622302099-f10b18de7b16?ixid=MnwzMDUyNzZ8MXwxfGFsbHwyMXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1640622302099-f10b18de7b16?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwyMXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1640622302099-f10b18de7b16?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwyMXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1640622302099-f10b18de7b16?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwyMXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1640622302099-f10b18de7b16?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwyMXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1640622302099-f10b18de7b16', + }, + links: { + self: 'https://api.unsplash.com/photos/TFH8e9Lmp0s', + html: 'https://unsplash.com/photos/TFH8e9Lmp0s', + download: + 'https://unsplash.com/photos/TFH8e9Lmp0s/download?ixid=MnwzMDUyNzZ8MXwxfGFsbHwyMXx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/TFH8e9Lmp0s/download?ixid=MnwzMDUyNzZ8MXwxfGFsbHwyMXx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 71, + liked_by_user: false, + current_user_collections: [], + sponsorship: { + impression_urls: [ + 'https://secure.insightexpressai.com/adServer/adServerESI.aspx?script=false&bannerID=9710724&rnd=[timestamp]&redir=https://secure.insightexpressai.com/adserver/1pixel.gif', + ], + tagline: 'Original by design', + tagline_url: + 'https://www.microsoft.com/surface?ocid=UnsplashFY22_soc_pmc_sur_', + sponsor: { + id: 'N-JSeSTCz68', + updated_at: '2022-02-25T04:23:54-05:00', + username: 'surface', + name: 'Surface', + first_name: 'Surface', + last_name: null, + twitter_username: 'surface', + portfolio_url: 'http://surface.com', + bio: 'Follow us @Surface. #OriginalByDesign', + location: null, + links: { + self: 'https://api.unsplash.com/users/surface', + html: 'https://unsplash.com/@surface', + photos: 'https://api.unsplash.com/users/surface/photos', + likes: 'https://api.unsplash.com/users/surface/likes', + portfolio: 'https://api.unsplash.com/users/surface/portfolio', + following: 'https://api.unsplash.com/users/surface/following', + followers: 'https://api.unsplash.com/users/surface/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1587651800415-20eed2ec0209image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1587651800415-20eed2ec0209image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1587651800415-20eed2ec0209image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'surface', + total_collections: 6, + total_likes: 0, + total_photos: 210, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: 'surface', + portfolio_url: 'http://surface.com', + twitter_username: 'surface', + paypal_email: null, + }, + }, + }, + topic_submissions: {}, + user: { + id: 'N-JSeSTCz68', + updated_at: '2022-02-25T04:23:54-05:00', + username: 'surface', + name: 'Surface', + first_name: 'Surface', + last_name: null, + twitter_username: 'surface', + portfolio_url: 'http://surface.com', + bio: 'Follow us @Surface. #OriginalByDesign', + location: null, + links: { + self: 'https://api.unsplash.com/users/surface', + html: 'https://unsplash.com/@surface', + photos: 'https://api.unsplash.com/users/surface/photos', + likes: 'https://api.unsplash.com/users/surface/likes', + portfolio: 'https://api.unsplash.com/users/surface/portfolio', + following: 'https://api.unsplash.com/users/surface/following', + followers: 'https://api.unsplash.com/users/surface/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1587651800415-20eed2ec0209image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1587651800415-20eed2ec0209image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1587651800415-20eed2ec0209image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'surface', + total_collections: 6, + total_likes: 0, + total_photos: 210, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: 'surface', + portfolio_url: 'http://surface.com', + twitter_username: 'surface', + paypal_email: null, + }, + }, + }, + { + id: 'kw2lg3GB4NQ', + created_at: '2022-02-24T16:13:53-05:00', + updated_at: '2022-02-25T05:00:10-05:00', + promoted_at: '2022-02-25T03:00:01-05:00', + width: 3456, + height: 5184, + color: '#262626', + blur_hash: 'L98:k+xb0#$%jqNHI;xFEJskxBI;', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645736594095-b9a4cabc1a7c?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645736594095-b9a4cabc1a7c?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645736594095-b9a4cabc1a7c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645736594095-b9a4cabc1a7c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645736594095-b9a4cabc1a7c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645736594095-b9a4cabc1a7c', + }, + links: { + self: 'https://api.unsplash.com/photos/kw2lg3GB4NQ', + html: 'https://unsplash.com/photos/kw2lg3GB4NQ', + download: + 'https://unsplash.com/photos/kw2lg3GB4NQ/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMnx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/kw2lg3GB4NQ/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyMnx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 2, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: '-VMeUM1QmAw', + updated_at: '2022-02-25T04:20:54-05:00', + username: 'nepsec', + name: 'Dellon Thomas', + first_name: 'Dellon', + last_name: 'Thomas', + twitter_username: 'elsimage', + portfolio_url: 'https://elsimage.com', + bio: null, + location: 'Brooklyn NY', + links: { + self: 'https://api.unsplash.com/users/nepsec', + html: 'https://unsplash.com/@nepsec', + photos: 'https://api.unsplash.com/users/nepsec/photos', + likes: 'https://api.unsplash.com/users/nepsec/likes', + portfolio: 'https://api.unsplash.com/users/nepsec/portfolio', + following: 'https://api.unsplash.com/users/nepsec/following', + followers: 'https://api.unsplash.com/users/nepsec/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1643922178549-3c4b87649d1aimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1643922178549-3c4b87649d1aimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1643922178549-3c4b87649d1aimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'elsimage', + total_collections: 0, + total_likes: 7, + total_photos: 12, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'elsimage', + portfolio_url: 'https://elsimage.com', + twitter_username: 'elsimage', + paypal_email: null, + }, + }, + }, + { + id: 'YIdwWm4b4pA', + created_at: '2022-02-24T16:44:30-05:00', + updated_at: '2022-02-25T02:56:02-05:00', + promoted_at: '2022-02-25T02:56:01-05:00', + width: 4912, + height: 7360, + color: '#f3f3f3', + blur_hash: 'LPQ9=wMxX8M{?b%Mt7WV?wNHIUxt', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645738964408-f922186c6025?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyM3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645738964408-f922186c6025?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyM3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645738964408-f922186c6025?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyM3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645738964408-f922186c6025?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyM3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645738964408-f922186c6025?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyM3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645738964408-f922186c6025', + }, + links: { + self: 'https://api.unsplash.com/photos/YIdwWm4b4pA', + html: 'https://unsplash.com/photos/YIdwWm4b4pA', + download: + 'https://unsplash.com/photos/YIdwWm4b4pA/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyM3x8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/YIdwWm4b4pA/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyM3x8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 1, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: { + 'current-events': { + status: 'unevaluated', + }, + }, + user: { + id: 'r-7a3pv5t5U', + updated_at: '2022-02-25T04:58:50-05:00', + username: 'allecgomes', + name: 'Allec Gomes', + first_name: 'Allec', + last_name: 'Gomes', + twitter_username: 'AllecGomes', + portfolio_url: 'https://www.instagram.com/allecgomes/', + bio: 'Photographer & Tech Designer.\r\nMinimalism, colors, textures and poetries are my passions.', + location: 'Goiânia, Brazil', + links: { + self: 'https://api.unsplash.com/users/allecgomes', + html: 'https://unsplash.com/@allecgomes', + photos: 'https://api.unsplash.com/users/allecgomes/photos', + likes: 'https://api.unsplash.com/users/allecgomes/likes', + portfolio: 'https://api.unsplash.com/users/allecgomes/portfolio', + following: 'https://api.unsplash.com/users/allecgomes/following', + followers: 'https://api.unsplash.com/users/allecgomes/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1590413354417-c1befb996909image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1590413354417-c1befb996909image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1590413354417-c1befb996909image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'allecgomes', + total_collections: 2, + total_likes: 992, + total_photos: 423, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'allecgomes', + portfolio_url: 'https://www.instagram.com/allecgomes/', + twitter_username: 'AllecGomes', + paypal_email: null, + }, + }, + }, + { + id: 'xO8kmONtTDk', + created_at: '2022-02-24T16:57:23-05:00', + updated_at: '2022-02-25T02:48:01-05:00', + promoted_at: '2022-02-25T02:48:01-05:00', + width: 4142, + height: 2761, + color: '#a6c0d9', + blur_hash: 'LSGb@tD$KlMx%go#V@oy0MV?xZae', + description: 'Oatmeal Breakfast Bowl with Apples', + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645739840979-0226a7ac7163?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645739840979-0226a7ac7163?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645739840979-0226a7ac7163?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645739840979-0226a7ac7163?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645739840979-0226a7ac7163?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645739840979-0226a7ac7163', + }, + links: { + self: 'https://api.unsplash.com/photos/xO8kmONtTDk', + html: 'https://unsplash.com/photos/xO8kmONtTDk', + download: + 'https://unsplash.com/photos/xO8kmONtTDk/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNHx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/xO8kmONtTDk/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNHx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 1, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'RhraSHxeoR8', + updated_at: '2022-02-25T04:05:57-05:00', + username: 'thurstontl', + name: 'Travis', + first_name: 'Travis', + last_name: null, + twitter_username: null, + portfolio_url: '', + bio: 'Creative in Europe', + location: 'Wiesbaden, Germany', + links: { + self: 'https://api.unsplash.com/users/thurstontl', + html: 'https://unsplash.com/@thurstontl', + photos: 'https://api.unsplash.com/users/thurstontl/photos', + likes: 'https://api.unsplash.com/users/thurstontl/likes', + portfolio: 'https://api.unsplash.com/users/thurstontl/portfolio', + following: 'https://api.unsplash.com/users/thurstontl/following', + followers: 'https://api.unsplash.com/users/thurstontl/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1636565218422-a4f80db118b0?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1636565218422-a4f80db118b0?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1636565218422-a4f80db118b0?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'tvieso', + total_collections: 0, + total_likes: 39, + total_photos: 32, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: 'tvieso', + portfolio_url: '', + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: '4FZfSa5UIv0', + created_at: '2022-02-24T18:02:05-05:00', + updated_at: '2022-02-25T04:30:06-05:00', + promoted_at: '2022-02-25T02:40:02-05:00', + width: 5184, + height: 3456, + color: '#262626', + blur_hash: 'L48z[Pt601a$kCa#xuay01t7%LM{', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645743705820-adf8356be3c8?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645743705820-adf8356be3c8?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645743705820-adf8356be3c8?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645743705820-adf8356be3c8?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645743705820-adf8356be3c8?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645743705820-adf8356be3c8', + }, + links: { + self: 'https://api.unsplash.com/photos/4FZfSa5UIv0', + html: 'https://unsplash.com/photos/4FZfSa5UIv0', + download: + 'https://unsplash.com/photos/4FZfSa5UIv0/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNXx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/4FZfSa5UIv0/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyNXx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 11, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'djzHc3LB6Ps', + updated_at: '2022-02-25T04:38:49-05:00', + username: 'ashford_marx', + name: 'Ashford Marx', + first_name: 'Ashford', + last_name: 'Marx', + twitter_username: null, + portfolio_url: null, + bio: 'Aspiring photographer :)', + location: 'George, South Africa', + links: { + self: 'https://api.unsplash.com/users/ashford_marx', + html: 'https://unsplash.com/@ashford_marx', + photos: 'https://api.unsplash.com/users/ashford_marx/photos', + likes: 'https://api.unsplash.com/users/ashford_marx/likes', + portfolio: 'https://api.unsplash.com/users/ashford_marx/portfolio', + following: 'https://api.unsplash.com/users/ashford_marx/following', + followers: 'https://api.unsplash.com/users/ashford_marx/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1645743150302-12f673157b0e?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1645743150302-12f673157b0e?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1645743150302-12f673157b0e?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'ashfordmarxvisuals', + total_collections: 0, + total_likes: 0, + total_photos: 5, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: 'ashfordmarxvisuals', + portfolio_url: null, + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: '4yBeMayTYys', + created_at: '2021-12-27T11:33:13-05:00', + updated_at: '2022-02-25T00:27:57-05:00', + promoted_at: null, + width: 4000, + height: 6000, + color: '#d9d9d9', + blur_hash: 'LYE{Oj?^.7%L?H%Nx]t7M{RjRjWB', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1640622657946-9c6ef5849020?ixid=MnwzMDUyNzZ8MXwxfGFsbHwyNnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1640622657946-9c6ef5849020?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwyNnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1640622657946-9c6ef5849020?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwyNnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1640622657946-9c6ef5849020?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwyNnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1640622657946-9c6ef5849020?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MXwxfGFsbHwyNnx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1640622657946-9c6ef5849020', + }, + links: { + self: 'https://api.unsplash.com/photos/4yBeMayTYys', + html: 'https://unsplash.com/photos/4yBeMayTYys', + download: + 'https://unsplash.com/photos/4yBeMayTYys/download?ixid=MnwzMDUyNzZ8MXwxfGFsbHwyNnx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/4yBeMayTYys/download?ixid=MnwzMDUyNzZ8MXwxfGFsbHwyNnx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 80, + liked_by_user: false, + current_user_collections: [], + sponsorship: { + impression_urls: [ + 'https://secure.insightexpressai.com/adServer/adServerESI.aspx?script=false&bannerID=9710754&rnd=[timestamp]&redir=https://secure.insightexpressai.com/adserver/1pixel.gif', + ], + tagline: 'Closer to what you love', + tagline_url: + 'https://www.microsoft.com/windows/?ocid=UnsplashFY22_soc_pmc_win_', + sponsor: { + id: 'kSlnstJTnY8', + updated_at: '2022-02-25T04:23:49-05:00', + username: 'windows', + name: 'Windows', + first_name: 'Windows', + last_name: null, + twitter_username: 'windows', + portfolio_url: 'https://www.windows.com', + bio: 'Follow us @Windows. #DoGreatThings', + location: null, + links: { + self: 'https://api.unsplash.com/users/windows', + html: 'https://unsplash.com/@windows', + photos: 'https://api.unsplash.com/users/windows/photos', + likes: 'https://api.unsplash.com/users/windows/likes', + portfolio: 'https://api.unsplash.com/users/windows/portfolio', + following: 'https://api.unsplash.com/users/windows/following', + followers: 'https://api.unsplash.com/users/windows/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1633364056312-0319b9fc4586image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1633364056312-0319b9fc4586image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1633364056312-0319b9fc4586image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'windows', + total_collections: 1, + total_likes: 0, + total_photos: 162, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: 'windows', + portfolio_url: 'https://www.windows.com', + twitter_username: 'windows', + paypal_email: null, + }, + }, + }, + topic_submissions: {}, + user: { + id: 'kSlnstJTnY8', + updated_at: '2022-02-25T04:23:49-05:00', + username: 'windows', + name: 'Windows', + first_name: 'Windows', + last_name: null, + twitter_username: 'windows', + portfolio_url: 'https://www.windows.com', + bio: 'Follow us @Windows. #DoGreatThings', + location: null, + links: { + self: 'https://api.unsplash.com/users/windows', + html: 'https://unsplash.com/@windows', + photos: 'https://api.unsplash.com/users/windows/photos', + likes: 'https://api.unsplash.com/users/windows/likes', + portfolio: 'https://api.unsplash.com/users/windows/portfolio', + following: 'https://api.unsplash.com/users/windows/following', + followers: 'https://api.unsplash.com/users/windows/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1633364056312-0319b9fc4586image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1633364056312-0319b9fc4586image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1633364056312-0319b9fc4586image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'windows', + total_collections: 1, + total_likes: 0, + total_photos: 162, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: 'windows', + portfolio_url: 'https://www.windows.com', + twitter_username: 'windows', + paypal_email: null, + }, + }, + }, + { + id: 'MA3WfZwiHuo', + created_at: '2022-02-24T17:50:56-05:00', + updated_at: '2022-02-25T02:32:02-05:00', + promoted_at: '2022-02-25T02:32:01-05:00', + width: 6000, + height: 4000, + color: '#a6c0c0', + blur_hash: 'LSGv0FMc4mo}~VROoft9x]s,Wroe', + description: + 'Ukrainians In London gather outside Downing street demanding greater sanctions on Russian after they commence their invasion. Leader of the Scottish National Party in the House of Commons, Ian Blackford also turned up to talk and show his support.', + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645742858422-6f57c73ae877?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyN3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645742858422-6f57c73ae877?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyN3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645742858422-6f57c73ae877?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyN3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645742858422-6f57c73ae877?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyN3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645742858422-6f57c73ae877?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyN3x8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645742858422-6f57c73ae877', + }, + links: { + self: 'https://api.unsplash.com/photos/MA3WfZwiHuo', + html: 'https://unsplash.com/photos/MA3WfZwiHuo', + download: + 'https://unsplash.com/photos/MA3WfZwiHuo/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyN3x8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/MA3WfZwiHuo/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyN3x8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 4, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: { + 'current-events': { + status: 'unevaluated', + }, + }, + user: { + id: 'DGhEid0owbc', + updated_at: '2022-02-25T04:53:47-05:00', + username: 'theeastlondonphotographer', + name: 'Ehimetalor Akhere Unuabona', + first_name: 'Ehimetalor Akhere', + last_name: 'Unuabona', + twitter_username: 'TheEastLDNTog', + portfolio_url: 'https://www.theeastlondonphotographer.com/', + bio: 'Portrait & Street Documentary Photographer sharing Sociopolitical images, and more, that benefits and support your Content, Stories and Work.\r\n Instagram @theeastlondonphotographer. Donations paypal.me/mettyunuabona ', + location: 'London, UK', + links: { + self: 'https://api.unsplash.com/users/theeastlondonphotographer', + html: 'https://unsplash.com/@theeastlondonphotographer', + photos: + 'https://api.unsplash.com/users/theeastlondonphotographer/photos', + likes: 'https://api.unsplash.com/users/theeastlondonphotographer/likes', + portfolio: + 'https://api.unsplash.com/users/theeastlondonphotographer/portfolio', + following: + 'https://api.unsplash.com/users/theeastlondonphotographer/following', + followers: + 'https://api.unsplash.com/users/theeastlondonphotographer/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1602499837447-54090944da0bimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1602499837447-54090944da0bimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1602499837447-54090944da0bimage?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'TheEastLondonPhotographer', + total_collections: 0, + total_likes: 174, + total_photos: 642, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'TheEastLondonPhotographer', + portfolio_url: 'https://www.theeastlondonphotographer.com/', + twitter_username: 'TheEastLDNTog', + paypal_email: null, + }, + }, + }, + { + id: 'YdBmZ3NldLY', + created_at: '2022-02-20T14:48:56-05:00', + updated_at: '2022-02-25T02:24:02-05:00', + promoted_at: '2022-02-25T02:24:01-05:00', + width: 5259, + height: 3615, + color: '#8c7373', + blur_hash: 'L997Lofk4ooeniWCR*oL0LWB%Lj[', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645386449324-ada7e5b4ee6b?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645386449324-ada7e5b4ee6b?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645386449324-ada7e5b4ee6b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645386449324-ada7e5b4ee6b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645386449324-ada7e5b4ee6b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645386449324-ada7e5b4ee6b', + }, + links: { + self: 'https://api.unsplash.com/photos/YdBmZ3NldLY', + html: 'https://unsplash.com/photos/YdBmZ3NldLY', + download: + 'https://unsplash.com/photos/YdBmZ3NldLY/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOHx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/YdBmZ3NldLY/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOHx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 3, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'LZiAVtiBtww', + updated_at: '2022-02-25T04:22:24-05:00', + username: 'ernest_', + name: 'Ernest Mazarekic', + first_name: 'Ernest', + last_name: 'Mazarekic', + twitter_username: null, + portfolio_url: 'https://ernestmazarekic.wixsite.com/mysite', + bio: "I'm a 30-year-old photography enthusiast, born and\r\nraised in Slavonski Brod, Croatia, currently living in Zagreb. ", + location: 'Zagreb', + links: { + self: 'https://api.unsplash.com/users/ernest_', + html: 'https://unsplash.com/@ernest_', + photos: 'https://api.unsplash.com/users/ernest_/photos', + likes: 'https://api.unsplash.com/users/ernest_/likes', + portfolio: 'https://api.unsplash.com/users/ernest_/portfolio', + following: 'https://api.unsplash.com/users/ernest_/following', + followers: 'https://api.unsplash.com/users/ernest_/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-fb-1644302096-aba0d171899c.jpg?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-fb-1644302096-aba0d171899c.jpg?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-fb-1644302096-aba0d171899c.jpg?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'ernestmazarekic/', + total_collections: 0, + total_likes: 1, + total_photos: 58, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'ernestmazarekic/', + portfolio_url: 'https://ernestmazarekic.wixsite.com/mysite', + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: 'aghklxx5RxM', + created_at: '2022-02-24T21:15:44-05:00', + updated_at: '2022-02-25T02:16:03-05:00', + promoted_at: '2022-02-25T02:16:03-05:00', + width: 4000, + height: 6000, + color: '#260c26', + blur_hash: 'LTHKX[ja0fS$?uEMa0-:ofNGslx[', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645755333279-64b47a301e75?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645755333279-64b47a301e75?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645755333279-64b47a301e75?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645755333279-64b47a301e75?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645755333279-64b47a301e75?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOXx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645755333279-64b47a301e75', + }, + links: { + self: 'https://api.unsplash.com/photos/aghklxx5RxM', + html: 'https://unsplash.com/photos/aghklxx5RxM', + download: + 'https://unsplash.com/photos/aghklxx5RxM/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOXx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/aghklxx5RxM/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwyOXx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 6, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'YEqa3xFo0Yg', + updated_at: '2022-02-25T04:19:18-05:00', + username: 'gringophoto', + name: 'Ibrahima Toure', + first_name: 'Ibrahima', + last_name: 'Toure', + twitter_username: null, + portfolio_url: + 'https://instagram.com/_el_gringo_photo_?utm_medium=copy_link', + bio: null, + location: 'Barcelona ', + links: { + self: 'https://api.unsplash.com/users/gringophoto', + html: 'https://unsplash.com/@gringophoto', + photos: 'https://api.unsplash.com/users/gringophoto/photos', + likes: 'https://api.unsplash.com/users/gringophoto/likes', + portfolio: 'https://api.unsplash.com/users/gringophoto/portfolio', + following: 'https://api.unsplash.com/users/gringophoto/following', + followers: 'https://api.unsplash.com/users/gringophoto/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1638155619725-c3bf2d35aeb3?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1638155619725-c3bf2d35aeb3?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1638155619725-c3bf2d35aeb3?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: null, + total_collections: 0, + total_likes: 1577, + total_photos: 244, + accepted_tos: true, + for_hire: false, + social: { + instagram_username: null, + portfolio_url: + 'https://instagram.com/_el_gringo_photo_?utm_medium=copy_link', + twitter_username: null, + paypal_email: null, + }, + }, + }, + { + id: 'zis_2e7uYxs', + created_at: '2022-02-24T23:58:37-05:00', + updated_at: '2022-02-25T02:08:02-05:00', + promoted_at: '2022-02-25T02:08:01-05:00', + width: 5472, + height: 3648, + color: '#f3f3f3', + blur_hash: 'LUN14C0K0J9G~WM{kXWA-=RingXT', + description: null, + alt_description: null, + urls: { + raw: 'https://images.unsplash.com/photo-1645764992327-589b28206219?ixid=MnwzMDUyNzZ8MHwxfGFsbHwzMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1', + full: 'https://images.unsplash.com/photo-1645764992327-589b28206219?crop=entropy&cs=srgb&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwzMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=85', + regular: + 'https://images.unsplash.com/photo-1645764992327-589b28206219?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwzMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=1080', + small: + 'https://images.unsplash.com/photo-1645764992327-589b28206219?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwzMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=400', + thumb: + 'https://images.unsplash.com/photo-1645764992327-589b28206219?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUyNzZ8MHwxfGFsbHwzMHx8fHx8fDJ8fDE2NDU3ODMzNDk&ixlib=rb-1.2.1&q=80&w=200', + small_s3: + 'https://s3.us-west-2.amazonaws.com/images.unsplash.com/small/photo-1645764992327-589b28206219', + }, + links: { + self: 'https://api.unsplash.com/photos/zis_2e7uYxs', + html: 'https://unsplash.com/photos/zis_2e7uYxs', + download: + 'https://unsplash.com/photos/zis_2e7uYxs/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwzMHx8fHx8fDJ8fDE2NDU3ODMzNDk', + download_location: + 'https://api.unsplash.com/photos/zis_2e7uYxs/download?ixid=MnwzMDUyNzZ8MHwxfGFsbHwzMHx8fHx8fDJ8fDE2NDU3ODMzNDk', + }, + categories: [], + likes: 2, + liked_by_user: false, + current_user_collections: [], + sponsorship: null, + topic_submissions: {}, + user: { + id: 'BbQLwsxVK4k', + updated_at: '2022-02-25T02:51:11-05:00', + username: 'kamyar_gc', + name: 'Kamyar Ghalamchi', + first_name: 'Kamyar', + last_name: 'Ghalamchi', + twitter_username: null, + portfolio_url: null, + bio: 'a natural light photographer from Iran | follow me instagram @KamyarGc', + location: null, + links: { + self: 'https://api.unsplash.com/users/kamyar_gc', + html: 'https://unsplash.com/@kamyar_gc', + photos: 'https://api.unsplash.com/users/kamyar_gc/photos', + likes: 'https://api.unsplash.com/users/kamyar_gc/likes', + portfolio: 'https://api.unsplash.com/users/kamyar_gc/portfolio', + following: 'https://api.unsplash.com/users/kamyar_gc/following', + followers: 'https://api.unsplash.com/users/kamyar_gc/followers', + }, + profile_image: { + small: + 'https://images.unsplash.com/profile-1585468600889-8b921a4b7ce8image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32', + medium: + 'https://images.unsplash.com/profile-1585468600889-8b921a4b7ce8image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64', + large: + 'https://images.unsplash.com/profile-1585468600889-8b921a4b7ce8image?ixlib=rb-1.2.1&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128', + }, + instagram_username: 'Kamyar_Gc', + total_collections: 0, + total_likes: 11, + total_photos: 21, + accepted_tos: true, + for_hire: true, + social: { + instagram_username: 'Kamyar_Gc', + portfolio_url: null, + twitter_username: null, + paypal_email: null, + }, + }, + }, +]; diff --git a/src/app/explore-container/explore-container.component.html b/src/app/explore-container/explore-container.component.html deleted file mode 100644 index bbadb7d..0000000 --- a/src/app/explore-container/explore-container.component.html +++ /dev/null @@ -1,4 +0,0 @@ -
- {{ name }} -

Explore UI Components

-
\ No newline at end of file diff --git a/src/app/explore-container/explore-container.component.scss b/src/app/explore-container/explore-container.component.scss deleted file mode 100644 index 8993e7c..0000000 --- a/src/app/explore-container/explore-container.component.scss +++ /dev/null @@ -1,27 +0,0 @@ -#container { - text-align: center; - - position: absolute; - left: 0; - right: 0; - top: 50%; - transform: translateY(-50%); -} - -#container strong { - font-size: 20px; - line-height: 26px; -} - -#container p { - font-size: 16px; - line-height: 22px; - - color: #8c8c8c; - - margin: 0; -} - -#container a { - text-decoration: none; -} \ No newline at end of file diff --git a/src/app/explore-container/explore-container.component.ts b/src/app/explore-container/explore-container.component.ts deleted file mode 100644 index 60554cb..0000000 --- a/src/app/explore-container/explore-container.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, OnInit, Input } from '@angular/core'; - -@Component({ - selector: 'app-explore-container', - templateUrl: './explore-container.component.html', - styleUrls: ['./explore-container.component.scss'], -}) -export class ExploreContainerComponent implements OnInit { - @Input() name: string; - - constructor() { } - - ngOnInit() {} - -} diff --git a/src/app/explore-container/explore-container.module.ts b/src/app/explore-container/explore-container.module.ts deleted file mode 100644 index 4376296..0000000 --- a/src/app/explore-container/explore-container.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; - -import { IonicModule } from '@ionic/angular'; - -import { ExploreContainerComponent } from './explore-container.component'; - -@NgModule({ - imports: [ CommonModule, FormsModule, IonicModule], - declarations: [ExploreContainerComponent], - exports: [ExploreContainerComponent] -}) -export class ExploreContainerComponentModule {} diff --git a/src/app/guards/auth.guard.ts b/src/app/guards/auth.guard.ts new file mode 100644 index 0000000..c1e17c9 --- /dev/null +++ b/src/app/guards/auth.guard.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { + ActivatedRouteSnapshot, + CanActivate, + Router, + RouterStateSnapshot, +} from '@angular/router'; +import { of } from 'rxjs'; +import { map, switchMap } from 'rxjs/operators'; +import { UserQuery } from '../store/user'; + +@Injectable() +export class AuthenticatedGuard implements CanActivate { + constructor(private userQuery: UserQuery, private router: Router) {} + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { + return this.userQuery.token().pipe( + switchMap((token) => { + if (token) { + return of(true); + } + this.router.navigate(['login']); + return of(false); + }) + ); + } +} diff --git a/src/app/guards/index.ts b/src/app/guards/index.ts new file mode 100644 index 0000000..b41e34a --- /dev/null +++ b/src/app/guards/index.ts @@ -0,0 +1 @@ +export * from './auth.guard'; diff --git a/src/app/interceptor/auth.interceptor.ts b/src/app/interceptor/auth.interceptor.ts new file mode 100644 index 0000000..0d9ace9 --- /dev/null +++ b/src/app/interceptor/auth.interceptor.ts @@ -0,0 +1,60 @@ +import { + HttpHandler, + HttpInterceptor, + HttpRequest, +} from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { of } from 'rxjs'; +import { switchMap, tap } from 'rxjs/operators'; +import { AuthService } from '../services/auth.service'; +import { UserService } from '../services/user.service'; +import { UserQuery, UserStore } from '../store/user'; + +const REFRESH_TOKEN_THRESHOLD = 600; + +@Injectable() +export class AuthInterceptor implements HttpInterceptor { + constructor( + private userQuery: UserQuery, + private userStore: UserStore, + private authService: AuthService + ) {} + + intercept(req: HttpRequest, next: HttpHandler) { + return this.userQuery.token().pipe( + switchMap((token) => { + const tokenIsExpired = + !!token && this.isTokenExpired(token.created_at, token.expires_in); + + if (tokenIsExpired) { + return this.refreshToken(token.refresh_token); + } + + return of(token); + }), + + switchMap((token) => { + if (token) { + req = req.clone({ + setHeaders: { Authorization: `Bearer ${token.access_token}` }, + }); + } + + return next.handle(req); + }) + ); + } + + private isTokenExpired(created_at: number, expires_in: number): boolean { + return ( + Math.round(new Date().getTime() / 1000) - created_at > + expires_in - REFRESH_TOKEN_THRESHOLD + ); + } + + private refreshToken(refresh_token: string) { + return this.authService + .refreshToken(refresh_token) + .pipe(tap((tokenData) => this.userStore.update({ tokenData }))); + } +} diff --git a/src/app/interceptor/index.ts b/src/app/interceptor/index.ts new file mode 100644 index 0000000..c59f58f --- /dev/null +++ b/src/app/interceptor/index.ts @@ -0,0 +1 @@ +export * from './auth.interceptor'; diff --git a/src/app/models/auth.ts b/src/app/models/auth.ts new file mode 100644 index 0000000..27369c7 --- /dev/null +++ b/src/app/models/auth.ts @@ -0,0 +1,7 @@ +export interface TokenData { + access_token: string; + token_type: string; + expires_in: number; + refresh_token: string; + created_at: number; +} diff --git a/src/app/models/index.ts b/src/app/models/index.ts new file mode 100644 index 0000000..a0032eb --- /dev/null +++ b/src/app/models/index.ts @@ -0,0 +1,2 @@ +export * from './auth'; +export * from './user'; diff --git a/src/app/models/user.ts b/src/app/models/user.ts new file mode 100644 index 0000000..e29111a --- /dev/null +++ b/src/app/models/user.ts @@ -0,0 +1,36 @@ +export interface Preferences { + view?: string; + archive?: boolean; +} + +export class IntercomInfo { + id: string; +} + +export class PersonId { + id: string; + title: string; + finished: boolean; + annuity_allowed: boolean; +} + +export interface User { + id: string; + email: string; + name_casual: string; + preferences: Preferences; + avatar: string; + created_at: string; + mailings: { [key: string]: boolean }; + notification_email: boolean; + notification_push: boolean; + notifications: any; + person: PersonId; + open_task_count: number; + open_critical_task_count: number; + unread_inbox_count: number; + intercom: IntercomInfo; + invitations: any; + total_deposit: string; + fee_percentage?: number; +} diff --git a/src/app/modules/accounts/accounts.component.html b/src/app/modules/accounts/accounts.component.html new file mode 100644 index 0000000..1f63657 --- /dev/null +++ b/src/app/modules/accounts/accounts.component.html @@ -0,0 +1,12 @@ + + + + + + Accounts + + + + + Go to detail + diff --git a/src/app/modules/accounts/accounts.component.ts b/src/app/modules/accounts/accounts.component.ts new file mode 100644 index 0000000..1eb2992 --- /dev/null +++ b/src/app/modules/accounts/accounts.component.ts @@ -0,0 +1,29 @@ +import { CommonModule, Location } from '@angular/common'; +import { ChangeDetectionStrategy, NgModule } from '@angular/core'; + +import { Component, OnInit } from '@angular/core'; +import { Router, RouterModule } from '@angular/router'; +import { IonicModule, NavController } from '@ionic/angular'; + +@Component({ + selector: 'app-accounts', + templateUrl: './accounts.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AccountsComponent { + constructor(private navController: NavController) {} + + back() { + this.navController.navigateBack('/tabs/tab1'); + } +} + +@NgModule({ + imports: [ + CommonModule, + IonicModule, + RouterModule.forChild([{ path: '', component: AccountsComponent }]), + ], + declarations: [AccountsComponent], +}) +export class AccountsModule {} diff --git a/src/app/modules/login/login-routing.module.ts b/src/app/modules/login/login-routing.module.ts new file mode 100644 index 0000000..29ef3a2 --- /dev/null +++ b/src/app/modules/login/login-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { LoginPage } from './login.page'; + +const routes: Routes = [ + { + path: '', + component: LoginPage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class LoginPageRoutingModule {} diff --git a/src/app/modules/login/login.module.ts b/src/app/modules/login/login.module.ts new file mode 100644 index 0000000..54912e0 --- /dev/null +++ b/src/app/modules/login/login.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { LoginPageRoutingModule } from './login-routing.module'; + +import { LoginPage } from './login.page'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + LoginPageRoutingModule, + ReactiveFormsModule, + ], + declarations: [LoginPage], +}) +export class LoginPageModule {} diff --git a/src/app/modules/login/login.page.html b/src/app/modules/login/login.page.html new file mode 100644 index 0000000..cd45546 --- /dev/null +++ b/src/app/modules/login/login.page.html @@ -0,0 +1,23 @@ + + + + + +
+ + Username + + + + Password + + +
+ Login +
diff --git a/src/app/tab1/tab1.page.scss b/src/app/modules/login/login.page.scss similarity index 100% rename from src/app/tab1/tab1.page.scss rename to src/app/modules/login/login.page.scss diff --git a/src/app/explore-container/explore-container.component.spec.ts b/src/app/modules/login/login.page.spec.ts similarity index 55% rename from src/app/explore-container/explore-container.component.spec.ts rename to src/app/modules/login/login.page.spec.ts index 77e2dd2..e6f9aac 100644 --- a/src/app/explore-container/explore-container.component.spec.ts +++ b/src/app/modules/login/login.page.spec.ts @@ -1,19 +1,19 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { IonicModule } from '@ionic/angular'; -import { ExploreContainerComponent } from './explore-container.component'; +import { LoginPage } from './login.page'; -describe('ExploreContainerComponent', () => { - let component: ExploreContainerComponent; - let fixture: ComponentFixture; +describe('LoginPage', () => { + let component: LoginPage; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ ExploreContainerComponent ], + declarations: [ LoginPage ], imports: [IonicModule.forRoot()] }).compileComponents(); - fixture = TestBed.createComponent(ExploreContainerComponent); + fixture = TestBed.createComponent(LoginPage); component = fixture.componentInstance; fixture.detectChanges(); })); diff --git a/src/app/modules/login/login.page.ts b/src/app/modules/login/login.page.ts new file mode 100644 index 0000000..9943ae8 --- /dev/null +++ b/src/app/modules/login/login.page.ts @@ -0,0 +1,74 @@ +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup } from '@angular/forms'; +import { Router } from '@angular/router'; +import { LoadingController, ToastController } from '@ionic/angular'; +import { map, switchMap, take } from 'rxjs/operators'; +import { TokenData, User } from 'src/app/models'; +import { AuthService } from 'src/app/services/auth.service'; +import { UserService } from 'src/app/services/user.service'; +import { UserQuery, UserStore } from 'src/app/store/user'; + +@Component({ + selector: 'app-login', + templateUrl: './login.page.html', + styleUrls: ['./login.page.scss'], +}) +export class LoginPage { + form = new FormGroup({ + username: new FormControl('anthony@semmie.nl'), + password: new FormControl('Ada161198..+'), + }); + + loading$ = this.userQuery.selectLoading(); + + constructor( + private loadingController: LoadingController, + private toast: ToastController, + private authService: AuthService, + private userService: UserService, + private userQuery: UserQuery, + private userStore: UserStore, + private router: Router + ) {} + + async login() { + if (this.form.invalid) { + return; + } + + this.userStore.setLoading(true); + + const loader = await this.loadingController.create({ animated: true }); + await loader.present(); + + const { username, password } = this.form.value; + this.authService + .login(username, password) + .pipe( + switchMap((token) => { + this.userStore.updateToken(token); + return this.userService.fetchCurrentUser(); + }), + take(1) + ) + .subscribe( + (user) => { + this.userStore.update({ user }); + loader.dismiss(); + this.userStore.setLoading(false); + this.router.navigate(['/tabs/tab1']); + }, + () => { + loader.dismiss(); + this.userStore.setLoading(false); + this.showErrorToast(); + } + ); + } + + async showErrorToast() { + await this.toast.create({ + message: 'There was an error when trying to Login', + }); + } +} diff --git a/src/app/modules/tab1/tab1-routing.module.ts b/src/app/modules/tab1/tab1-routing.module.ts new file mode 100644 index 0000000..80dfae9 --- /dev/null +++ b/src/app/modules/tab1/tab1-routing.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { Tab1Page } from './tab1.page'; + +const routes: Routes = [ + { + path: '', + component: Tab1Page, + }, + { + path: 'accounts', + loadChildren: () => + import('../accounts/accounts.component').then((m) => m.AccountsModule), + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class Tab1PageRoutingModule {} diff --git a/src/app/tab1/tab1.module.ts b/src/app/modules/tab1/tab1.module.ts similarity index 77% rename from src/app/tab1/tab1.module.ts rename to src/app/modules/tab1/tab1.module.ts index 135eeae..5fd5677 100644 --- a/src/app/tab1/tab1.module.ts +++ b/src/app/modules/tab1/tab1.module.ts @@ -3,7 +3,6 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { Tab1Page } from './tab1.page'; -import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; import { Tab1PageRoutingModule } from './tab1-routing.module'; @@ -12,7 +11,6 @@ import { Tab1PageRoutingModule } from './tab1-routing.module'; IonicModule, CommonModule, FormsModule, - ExploreContainerComponentModule, Tab1PageRoutingModule ], declarations: [Tab1Page] diff --git a/src/app/tab1/tab1.page.html b/src/app/modules/tab1/tab1.page.html similarity index 62% rename from src/app/tab1/tab1.page.html rename to src/app/modules/tab1/tab1.page.html index 22e11e4..41342dd 100644 --- a/src/app/tab1/tab1.page.html +++ b/src/app/modules/tab1/tab1.page.html @@ -1,8 +1,6 @@ - - Tab 1 - + Tab 1 @@ -13,5 +11,7 @@ - + Navigate to accounts diff --git a/src/app/tab2/tab2.page.scss b/src/app/modules/tab1/tab1.page.scss similarity index 100% rename from src/app/tab2/tab2.page.scss rename to src/app/modules/tab1/tab1.page.scss diff --git a/src/app/tab1/tab1.page.ts b/src/app/modules/tab1/tab1.page.ts similarity index 100% rename from src/app/tab1/tab1.page.ts rename to src/app/modules/tab1/tab1.page.ts diff --git a/src/app/tab2/tab2-routing.module.ts b/src/app/modules/tab2/tab2-routing.module.ts similarity index 100% rename from src/app/tab2/tab2-routing.module.ts rename to src/app/modules/tab2/tab2-routing.module.ts diff --git a/src/app/tab2/tab2.module.ts b/src/app/modules/tab2/tab2.module.ts similarity index 55% rename from src/app/tab2/tab2.module.ts rename to src/app/modules/tab2/tab2.module.ts index 153d07f..868d70a 100644 --- a/src/app/tab2/tab2.module.ts +++ b/src/app/modules/tab2/tab2.module.ts @@ -1,21 +1,21 @@ -import { IonicModule } from '@ionic/angular'; -import { RouterModule } from '@angular/router'; -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; -import { Tab2Page } from './tab2.page'; -import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; - +import { IonicModule } from '@ionic/angular'; +import { ModalWithNavigationModule } from 'src/app/components/modal-with-navigation/modal-with-navigation.component'; +import { ModalContentPageModule } from 'src/app/pages/modal-content/modal-content.module'; import { Tab2PageRoutingModule } from './tab2-routing.module'; +import { Tab2Page } from './tab2.page'; @NgModule({ imports: [ IonicModule, CommonModule, FormsModule, - ExploreContainerComponentModule, - Tab2PageRoutingModule + Tab2PageRoutingModule, + ModalWithNavigationModule, + ModalContentPageModule ], - declarations: [Tab2Page] + declarations: [Tab2Page], }) export class Tab2PageModule {} diff --git a/src/app/modules/tab2/tab2.page.html b/src/app/modules/tab2/tab2.page.html new file mode 100644 index 0000000..b30a63a --- /dev/null +++ b/src/app/modules/tab2/tab2.page.html @@ -0,0 +1,26 @@ + + + Tab 2 + + + + + + + Tab 2 + + + + Open Modal with Navigation + + Soft Vibration + + + 5 + 2000 + + diff --git a/src/app/tab3/tab3.page.scss b/src/app/modules/tab2/tab2.page.scss similarity index 100% rename from src/app/tab3/tab3.page.scss rename to src/app/modules/tab2/tab2.page.scss diff --git a/src/app/modules/tab2/tab2.page.ts b/src/app/modules/tab2/tab2.page.ts new file mode 100644 index 0000000..c033f7e --- /dev/null +++ b/src/app/modules/tab2/tab2.page.ts @@ -0,0 +1,36 @@ +import { Component } from '@angular/core'; +import { IonRouterOutlet, ModalController } from '@ionic/angular'; +import { ModalWithNavigationPage } from 'src/app/components/modal-with-navigation/modal-with-navigation.component'; +import { ModalContentPage } from 'src/app/pages/modal-content/modal-content.page'; +import { Haptics } from '@capacitor/haptics'; + +@Component({ + selector: 'app-tab2', + templateUrl: 'tab2.page.html', + styleUrls: ['tab2.page.scss'], +}) +export class Tab2Page { + duration = 50; + constructor( + private modalController: ModalController, + private routerOutlet: IonRouterOutlet + ) {} + + async openModal() { + const modal = await this.modalController.create({ + component: ModalWithNavigationPage, + componentProps: { + rootPage: ModalContentPage, + }, + }); + await modal.present(); + } + + vibrate() { + Haptics.vibrate({ duration: this.duration }); + } + + vibrateHard() { + Haptics.vibrate({ duration: 1000 }); + } +} diff --git a/src/app/tab3/tab3-routing.module.ts b/src/app/modules/tab3/tab3-routing.module.ts similarity index 100% rename from src/app/tab3/tab3-routing.module.ts rename to src/app/modules/tab3/tab3-routing.module.ts diff --git a/src/app/tab3/tab3.module.ts b/src/app/modules/tab3/tab3.module.ts similarity index 76% rename from src/app/tab3/tab3.module.ts rename to src/app/modules/tab3/tab3.module.ts index c45283d..5e1ea6a 100644 --- a/src/app/tab3/tab3.module.ts +++ b/src/app/modules/tab3/tab3.module.ts @@ -1,22 +1,21 @@ -import { IonicModule } from '@ionic/angular'; -import { RouterModule } from '@angular/router'; -import { NgModule } from '@angular/core'; +import { ScrollingModule } from '@angular/cdk/scrolling'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; -import { Tab3Page } from './tab3.page'; -import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; - +import { RouterModule } from '@angular/router'; +import { IonicModule } from '@ionic/angular'; import { Tab3PageRoutingModule } from './tab3-routing.module'; +import { Tab3Page } from './tab3.page'; @NgModule({ imports: [ IonicModule, CommonModule, FormsModule, - ExploreContainerComponentModule, RouterModule.forChild([{ path: '', component: Tab3Page }]), Tab3PageRoutingModule, + ScrollingModule, ], - declarations: [Tab3Page] + declarations: [Tab3Page], }) export class Tab3PageModule {} diff --git a/src/app/modules/tab3/tab3.page.html b/src/app/modules/tab3/tab3.page.html new file mode 100644 index 0000000..00e076e --- /dev/null +++ b/src/app/modules/tab3/tab3.page.html @@ -0,0 +1,22 @@ + + + Tab 3 + + + + + + + + + + + {{ item.title }} + + + + diff --git a/src/app/modules/tab3/tab3.page.scss b/src/app/modules/tab3/tab3.page.scss new file mode 100644 index 0000000..2a21aa0 --- /dev/null +++ b/src/app/modules/tab3/tab3.page.scss @@ -0,0 +1,4 @@ +cdk-virtual-scroll-viewport { + height: 100%; + width: 100%; +} diff --git a/src/app/modules/tab3/tab3.page.ts b/src/app/modules/tab3/tab3.page.ts new file mode 100644 index 0000000..e10799d --- /dev/null +++ b/src/app/modules/tab3/tab3.page.ts @@ -0,0 +1,17 @@ +import { HttpClient } from '@angular/common/http'; +import { Component } from '@angular/core'; +import { IMAGES } from 'src/app/contants/images'; +import { tap } from 'rxjs/operators'; + +@Component({ + selector: 'app-tab3', + templateUrl: 'tab3.page.html', + styleUrls: ['tab3.page.scss'], +}) +export class Tab3Page { + items$ = this.http + .get('https://jsonplaceholder.typicode.com/photos') + .pipe(tap(console.log)); + + constructor(private http: HttpClient) {} +} diff --git a/src/app/tab1/tab1-routing.module.ts b/src/app/modules/tab4/tab4-routing.module.ts similarity index 69% rename from src/app/tab1/tab1-routing.module.ts rename to src/app/modules/tab4/tab4-routing.module.ts index 8c1cf5b..ce8d6ef 100644 --- a/src/app/tab1/tab1-routing.module.ts +++ b/src/app/modules/tab4/tab4-routing.module.ts @@ -1,11 +1,11 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { Tab1Page } from './tab1.page'; +import { Tab4Page } from './tab4.page'; const routes: Routes = [ { path: '', - component: Tab1Page, + component: Tab4Page, } ]; @@ -13,4 +13,4 @@ const routes: Routes = [ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) -export class Tab1PageRoutingModule {} +export class Tab3PageRoutingModule {} diff --git a/src/app/modules/tab4/tab4.module.ts b/src/app/modules/tab4/tab4.module.ts new file mode 100644 index 0000000..71211ac --- /dev/null +++ b/src/app/modules/tab4/tab4.module.ts @@ -0,0 +1,20 @@ +import { IonicModule } from '@ionic/angular'; +import { RouterModule } from '@angular/router'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { Tab4Page } from './tab4.page'; + +import { Tab3PageRoutingModule } from './tab4-routing.module'; + +@NgModule({ + imports: [ + IonicModule, + CommonModule, + FormsModule, + RouterModule.forChild([{ path: '', component: Tab4Page }]), + Tab3PageRoutingModule, + ], + declarations: [Tab4Page], +}) +export class Tab4PageModule {} diff --git a/src/app/modules/tab4/tab4.page.html b/src/app/modules/tab4/tab4.page.html new file mode 100644 index 0000000..a660f71 --- /dev/null +++ b/src/app/modules/tab4/tab4.page.html @@ -0,0 +1,18 @@ + + + Tab 4 + + + + + Vertical Bar Chart + + + Number of Viewers per season for + Game of Thrones + + + + + + diff --git a/src/app/modules/tab4/tab4.page.scss b/src/app/modules/tab4/tab4.page.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/modules/tab4/tab4.page.ts b/src/app/modules/tab4/tab4.page.ts new file mode 100644 index 0000000..d121083 --- /dev/null +++ b/src/app/modules/tab4/tab4.page.ts @@ -0,0 +1,66 @@ +import { + AfterViewInit, + Component, + ElementRef, + OnInit, + ViewChild, +} from '@angular/core'; +import Chart from 'chart.js/auto'; + +@Component({ + selector: 'app-tab4', + templateUrl: 'tab4.page.html', + styleUrls: ['tab4.page.scss'], +}) +export class Tab4Page implements AfterViewInit { + @ViewChild('barChart') + barChart: ElementRef; + + bars: any; + colorArray: any; + + constructor() {} + + ngAfterViewInit(): void { + this.createBarChart(); + } + + createBarChart() { + this.bars = new Chart(this.barChart.nativeElement, { + type: 'bar', + data: { + labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'], + datasets: [ + { + label: '# of Votes', + data: [12, 19, 3, 5, 2, 3], + backgroundColor: [ + 'rgba(255, 99, 132, 0.2)', + 'rgba(54, 162, 235, 0.2)', + 'rgba(255, 206, 86, 0.2)', + 'rgba(75, 192, 192, 0.2)', + 'rgba(153, 102, 255, 0.2)', + 'rgba(255, 159, 64, 0.2)', + ], + borderColor: [ + 'rgba(255, 99, 132, 1)', + 'rgba(54, 162, 235, 1)', + 'rgba(255, 206, 86, 1)', + 'rgba(75, 192, 192, 1)', + 'rgba(153, 102, 255, 1)', + 'rgba(255, 159, 64, 1)', + ], + borderWidth: 1, + }, + ], + }, + options: { + scales: { + y: { + beginAtZero: false, + }, + }, + }, + }); + } +} diff --git a/src/app/modules/tab5/tab5-routing.module.ts b/src/app/modules/tab5/tab5-routing.module.ts new file mode 100644 index 0000000..3ff8d1e --- /dev/null +++ b/src/app/modules/tab5/tab5-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { Tab5Page } from './tab5.page'; + +const routes: Routes = [ + { + path: '', + component: Tab5Page, + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class Tab5PageRoutingModule {} diff --git a/src/app/modules/tab5/tab5.module.ts b/src/app/modules/tab5/tab5.module.ts new file mode 100644 index 0000000..efecf78 --- /dev/null +++ b/src/app/modules/tab5/tab5.module.ts @@ -0,0 +1,20 @@ +import { IonicModule } from '@ionic/angular'; +import { RouterModule } from '@angular/router'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { Tab5Page } from './tab5.page'; + +import { Tab5PageRoutingModule } from './tab5-routing.module'; + +@NgModule({ + imports: [ + IonicModule, + CommonModule, + FormsModule, + RouterModule.forChild([{ path: '', component: Tab5Page }]), + Tab5PageRoutingModule, + ], + declarations: [Tab5Page], +}) +export class Tab5PageModule {} diff --git a/src/app/tab3/tab3.page.html b/src/app/modules/tab5/tab5.page.html similarity index 57% rename from src/app/tab3/tab3.page.html rename to src/app/modules/tab5/tab5.page.html index 222333d..4fad272 100644 --- a/src/app/tab3/tab3.page.html +++ b/src/app/modules/tab5/tab5.page.html @@ -1,17 +1,13 @@ - - Tab 3 - + Tab 5 - Tab 3 + Tab 5 - - diff --git a/src/app/modules/tab5/tab5.page.scss b/src/app/modules/tab5/tab5.page.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/modules/tab5/tab5.page.ts b/src/app/modules/tab5/tab5.page.ts new file mode 100644 index 0000000..74ffaa3 --- /dev/null +++ b/src/app/modules/tab5/tab5.page.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-tab5', + templateUrl: 'tab5.page.html', + styleUrls: ['tab5.page.scss'] +}) +export class Tab5Page { + + constructor() {} + +} diff --git a/src/app/modules/tabs/tabs-routing.module.ts b/src/app/modules/tabs/tabs-routing.module.ts new file mode 100644 index 0000000..3328c12 --- /dev/null +++ b/src/app/modules/tabs/tabs-routing.module.ts @@ -0,0 +1,52 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { TabsPage } from './tabs.page'; + +const routes: Routes = [ + { + path: 'tabs', + component: TabsPage, + children: [ + { + path: 'tab1', + loadChildren: () => + import('../tab1/tab1.module').then((m) => m.Tab1PageModule), + }, + { + path: 'tab2', + loadChildren: () => + import('../tab2/tab2.module').then((m) => m.Tab2PageModule), + }, + { + path: 'tab3', + loadChildren: () => + import('../tab3/tab3.module').then((m) => m.Tab3PageModule), + }, + { + path: 'tab4', + loadChildren: () => + import('../tab4/tab4.module').then((m) => m.Tab4PageModule), + }, + { + path: 'tab5', + loadChildren: () => + import('../tab5/tab5.module').then((m) => m.Tab5PageModule), + }, + { + path: '', + redirectTo: '/tabs/tab1', + pathMatch: 'full', + }, + ], + }, + { + path: '', + redirectTo: '/tabs/tab1', + pathMatch: 'full', + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], +}) +export class TabsPageRoutingModule {} diff --git a/src/app/tabs/tabs.module.ts b/src/app/modules/tabs/tabs.module.ts similarity index 73% rename from src/app/tabs/tabs.module.ts rename to src/app/modules/tabs/tabs.module.ts index de4184a..d177b17 100644 --- a/src/app/tabs/tabs.module.ts +++ b/src/app/modules/tabs/tabs.module.ts @@ -8,12 +8,7 @@ import { TabsPageRoutingModule } from './tabs-routing.module'; import { TabsPage } from './tabs.page'; @NgModule({ - imports: [ - IonicModule, - CommonModule, - FormsModule, - TabsPageRoutingModule - ], - declarations: [TabsPage] + imports: [IonicModule, CommonModule, FormsModule, TabsPageRoutingModule], + declarations: [TabsPage], }) export class TabsPageModule {} diff --git a/src/app/modules/tabs/tabs.page.html b/src/app/modules/tabs/tabs.page.html new file mode 100644 index 0000000..e106c8f --- /dev/null +++ b/src/app/modules/tabs/tabs.page.html @@ -0,0 +1,26 @@ + + + + + Home + + + + + Magazine + + + + + Inbox + + + + Boosters + + + + Chat + + + diff --git a/src/app/tabs/tabs.page.scss b/src/app/modules/tabs/tabs.page.scss similarity index 100% rename from src/app/tabs/tabs.page.scss rename to src/app/modules/tabs/tabs.page.scss diff --git a/src/app/tabs/tabs.page.ts b/src/app/modules/tabs/tabs.page.ts similarity index 100% rename from src/app/tabs/tabs.page.ts rename to src/app/modules/tabs/tabs.page.ts diff --git a/src/app/pages/modal-content/modal-content-routing.module.ts b/src/app/pages/modal-content/modal-content-routing.module.ts new file mode 100644 index 0000000..7498321 --- /dev/null +++ b/src/app/pages/modal-content/modal-content-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { ModalContentPage } from './modal-content.page'; + +const routes: Routes = [ + { + path: '', + component: ModalContentPage + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class ModalContentPageRoutingModule {} diff --git a/src/app/pages/modal-content/modal-content.module.ts b/src/app/pages/modal-content/modal-content.module.ts new file mode 100644 index 0000000..9f4f1c2 --- /dev/null +++ b/src/app/pages/modal-content/modal-content.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { IonicModule } from '@ionic/angular'; + +import { ModalContentPageRoutingModule } from './modal-content-routing.module'; + +import { ModalContentPage } from './modal-content.page'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + IonicModule, + ModalContentPageRoutingModule + ], + declarations: [ModalContentPage] +}) +export class ModalContentPageModule {} diff --git a/src/app/pages/modal-content/modal-content.page.html b/src/app/pages/modal-content/modal-content.page.html new file mode 100644 index 0000000..ee71126 --- /dev/null +++ b/src/app/pages/modal-content/modal-content.page.html @@ -0,0 +1,58 @@ + + + + + + + + + My Modal Level: {{ level }} + + + + + + + + + ion-nav go back + + + + + + + + Go to level {{ level + 1 }} + + + + + + + Next Level from Code + + + + + + + Go to root + + + + + + + Go root from Code + + diff --git a/src/app/pages/modal-content/modal-content.page.scss b/src/app/pages/modal-content/modal-content.page.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/modal-content/modal-content.page.spec.ts b/src/app/pages/modal-content/modal-content.page.spec.ts new file mode 100644 index 0000000..e010d73 --- /dev/null +++ b/src/app/pages/modal-content/modal-content.page.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; + +import { ModalContentPage } from './modal-content.page'; + +describe('ModalContentPage', () => { + let component: ModalContentPage; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ ModalContentPage ], + imports: [IonicModule.forRoot()] + }).compileComponents(); + + fixture = TestBed.createComponent(ModalContentPage); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/modal-content/modal-content.page.ts b/src/app/pages/modal-content/modal-content.page.ts new file mode 100644 index 0000000..5247c5f --- /dev/null +++ b/src/app/pages/modal-content/modal-content.page.ts @@ -0,0 +1,28 @@ +import { Component, OnInit } from '@angular/core'; +import { ModalController, IonNav, Platform } from '@ionic/angular'; + +@Component({ + selector: 'app-modal-content', + templateUrl: './modal-content.page.html', + styleUrls: ['./modal-content.page.scss'], +}) +export class ModalContentPage implements OnInit { + level = 0; + nextPage = ModalContentPage; + + constructor(private modalController: ModalController, private nav: IonNav) {} + + ngOnInit() {} + + goForward() { + this.nav.push(this.nextPage, { level: this.level + 1 }); + } + + goRoot() { + this.nav.popToRoot(); + } + + close() { + this.modalController.dismiss(); + } +} diff --git a/src/app/services/auth.service.ts b/src/app/services/auth.service.ts new file mode 100644 index 0000000..fee0fea --- /dev/null +++ b/src/app/services/auth.service.ts @@ -0,0 +1,32 @@ +import { HttpClient } from '@angular/common/http'; +import { Inject, Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { TokenData } from '../models'; +import { API_ROOT_URL } from '../tokens'; + +@Injectable({ providedIn: 'root' }) +export class AuthService { + constructor( + @Inject(API_ROOT_URL) private baseUrl: string, + private http: HttpClient + ) {} + + public login(username: string, password: string) { + return this.http.post(`${this.baseUrl}/oauth/token`, { + grant_type: 'password', + username, + password, + client_id: environment.client_id_web, + client_secret: environment.client_secret_web, + }); + } + + public refreshToken(refresh_token:string) { + return this.http.post(`${this.baseUrl}/oauth/token`, { + grant_type: 'refresh_token', + refresh_token, + client_id: environment.client_id_web, + client_secret: environment.client_secret_web, + }); + } +} diff --git a/src/app/services/user.service.ts b/src/app/services/user.service.ts new file mode 100644 index 0000000..bda025d --- /dev/null +++ b/src/app/services/user.service.ts @@ -0,0 +1,17 @@ +import { HttpClient } from '@angular/common/http'; +import { Inject, Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { User } from '../models'; +import { API_ROOT_URL } from '../tokens'; + +@Injectable({ providedIn: 'root' }) +export class UserService { + constructor( + @Inject(API_ROOT_URL) private baseUrl: string, + private http: HttpClient + ) {} + + public fetchCurrentUser() { + return this.http.get(`${this.baseUrl}/user`); + } +} diff --git a/src/app/store/user/index.ts b/src/app/store/user/index.ts new file mode 100644 index 0000000..777a9ec --- /dev/null +++ b/src/app/store/user/index.ts @@ -0,0 +1,2 @@ +export * from './user.query'; +export * from './user.store'; diff --git a/src/app/store/user/user.query.ts b/src/app/store/user/user.query.ts new file mode 100644 index 0000000..4acad7d --- /dev/null +++ b/src/app/store/user/user.query.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { Query } from '@datorama/akita'; +import { UserState, UserStore } from './user.store'; + +@Injectable({ providedIn: 'root' }) +export class UserQuery extends Query { + constructor(protected store: UserStore) { + super(store); + } + + token() { + return this.select((state) => state.tokenData); + } +} diff --git a/src/app/store/user/user.store.ts b/src/app/store/user/user.store.ts new file mode 100644 index 0000000..c1ed929 --- /dev/null +++ b/src/app/store/user/user.store.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@angular/core'; +import { Store, StoreConfig } from '@datorama/akita'; +import { User } from 'src/app/models'; +import { TokenData } from '../../models/auth'; + +export interface UserState { + user?: User; + tokenData: TokenData | null; +} + +export const initialState = { + tokenData: JSON.parse(localStorage.getItem('onyxx')) ?? null, +}; + +@Injectable({ providedIn: 'root' }) +@StoreConfig({ name: 'user' }) +export class UserStore extends Store { + constructor() { + super(initialState); + } + + updateToken(tokenData: TokenData) { + this.update({ tokenData }); + localStorage.setItem('onyxx', JSON.stringify(tokenData)); + } +} diff --git a/src/app/tab1/tab1.page.spec.ts b/src/app/tab1/tab1.page.spec.ts deleted file mode 100644 index 1491a8d..0000000 --- a/src/app/tab1/tab1.page.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; -import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; - -import { Tab1Page } from './tab1.page'; - -describe('Tab1Page', () => { - let component: Tab1Page; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [Tab1Page], - imports: [IonicModule.forRoot(), ExploreContainerComponentModule] - }).compileComponents(); - - fixture = TestBed.createComponent(Tab1Page); - component = fixture.componentInstance; - fixture.detectChanges(); - })); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/tab2/tab2.page.html b/src/app/tab2/tab2.page.html deleted file mode 100644 index 38b153e..0000000 --- a/src/app/tab2/tab2.page.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - Tab 2 - - - - - - - - Tab 2 - - - - - diff --git a/src/app/tab2/tab2.page.spec.ts b/src/app/tab2/tab2.page.spec.ts deleted file mode 100644 index 9d6e342..0000000 --- a/src/app/tab2/tab2.page.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; -import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; - -import { Tab2Page } from './tab2.page'; - -describe('Tab2Page', () => { - let component: Tab2Page; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [Tab2Page], - imports: [IonicModule.forRoot(), ExploreContainerComponentModule] - }).compileComponents(); - - fixture = TestBed.createComponent(Tab2Page); - component = fixture.componentInstance; - fixture.detectChanges(); - })); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/tab2/tab2.page.ts b/src/app/tab2/tab2.page.ts deleted file mode 100644 index e14cad4..0000000 --- a/src/app/tab2/tab2.page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-tab2', - templateUrl: 'tab2.page.html', - styleUrls: ['tab2.page.scss'] -}) -export class Tab2Page { - - constructor() {} - -} diff --git a/src/app/tab3/tab3.page.spec.ts b/src/app/tab3/tab3.page.spec.ts deleted file mode 100644 index 228ae81..0000000 --- a/src/app/tab3/tab3.page.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; -import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; - -import { Tab3Page } from './tab3.page'; - -describe('Tab3Page', () => { - let component: Tab3Page; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [Tab3Page], - imports: [IonicModule.forRoot(), ExploreContainerComponentModule] - }).compileComponents(); - - fixture = TestBed.createComponent(Tab3Page); - component = fixture.componentInstance; - fixture.detectChanges(); - })); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/tab3/tab3.page.ts b/src/app/tab3/tab3.page.ts deleted file mode 100644 index 9ed0dae..0000000 --- a/src/app/tab3/tab3.page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-tab3', - templateUrl: 'tab3.page.html', - styleUrls: ['tab3.page.scss'] -}) -export class Tab3Page { - - constructor() {} - -} diff --git a/src/app/tabs/tabs-routing.module.ts b/src/app/tabs/tabs-routing.module.ts deleted file mode 100644 index 770e87e..0000000 --- a/src/app/tabs/tabs-routing.module.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { TabsPage } from './tabs.page'; - -const routes: Routes = [ - { - path: 'tabs', - component: TabsPage, - children: [ - { - path: 'tab1', - loadChildren: () => import('../tab1/tab1.module').then(m => m.Tab1PageModule) - }, - { - path: 'tab2', - loadChildren: () => import('../tab2/tab2.module').then(m => m.Tab2PageModule) - }, - { - path: 'tab3', - loadChildren: () => import('../tab3/tab3.module').then(m => m.Tab3PageModule) - }, - { - path: '', - redirectTo: '/tabs/tab1', - pathMatch: 'full' - } - ] - }, - { - path: '', - redirectTo: '/tabs/tab1', - pathMatch: 'full' - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], -}) -export class TabsPageRoutingModule {} diff --git a/src/app/tabs/tabs.page.html b/src/app/tabs/tabs.page.html deleted file mode 100644 index 0995c40..0000000 --- a/src/app/tabs/tabs.page.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - Tab 1 - - - - - Tab 2 - - - - - Tab 3 - - - - diff --git a/src/app/tabs/tabs.page.spec.ts b/src/app/tabs/tabs.page.spec.ts deleted file mode 100644 index 703f220..0000000 --- a/src/app/tabs/tabs.page.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { TabsPage } from './tabs.page'; - -describe('TabsPage', () => { - let component: TabsPage; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [TabsPage], - schemas: [CUSTOM_ELEMENTS_SCHEMA], - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(TabsPage); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/tokens.ts b/src/app/tokens.ts new file mode 100644 index 0000000..ef1695a --- /dev/null +++ b/src/app/tokens.ts @@ -0,0 +1,3 @@ +import { InjectionToken } from '@angular/core'; + +export const API_ROOT_URL = new InjectionToken('Base API Url'); diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 3612073..c31764d 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,3 +1,8 @@ export const environment = { - production: true + production: true, + baseUrl: 'https://api.staging.onyxx.io/v1', + client_id_web: + '1b3abeaf0d630790c58e45dcf101cb4cf25941f359790b72fa240ebe3232ccc5', + client_secret_web: + '6835239aef3c63ad08975e6da587d2b34fe8b3b105550ddb7857d2fd1e9a0f87', }; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 7b4f817..f1d5a92 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -3,7 +3,12 @@ // The list of file replacements can be found in `angular.json`. export const environment = { - production: false + production: false, + baseUrl: 'https://api.staging.onyxx.io/v1', + client_id_web: + '1b3abeaf0d630790c58e45dcf101cb4cf25941f359790b72fa240ebe3232ccc5', + client_secret_web: + '6835239aef3c63ad08975e6da587d2b34fe8b3b105550ddb7857d2fd1e9a0f87', }; /* diff --git a/src/global.scss b/src/global.scss index d854de8..46ec913 100644 --- a/src/global.scss +++ b/src/global.scss @@ -16,7 +16,7 @@ @import "~@ionic/angular/css/normalize.css"; @import "~@ionic/angular/css/structure.css"; @import "~@ionic/angular/css/typography.css"; -@import '~@ionic/angular/css/display.css'; +@import "~@ionic/angular/css/display.css"; /* Optional CSS utils that can be commented out */ @import "~@ionic/angular/css/padding.css"; @@ -24,3 +24,12 @@ @import "~@ionic/angular/css/text-alignment.css"; @import "~@ionic/angular/css/text-transformation.css"; @import "~@ionic/angular/css/flex-utils.css"; + +.splashscreen { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + background-color: black; +} diff --git a/src/index.html b/src/index.html index 3b0aae1..a339a4f 100644 --- a/src/index.html +++ b/src/index.html @@ -1,26 +1,29 @@ + + + Ionic App - - - Ionic App + - + + + + - - - - + - - - - - - - - - - + + + + + + +
+
+ diff --git a/src/theme/variables.scss b/src/theme/variables.scss index eae5925..4da316a 100644 --- a/src/theme/variables.scss +++ b/src/theme/variables.scss @@ -4,12 +4,12 @@ /** Ionic CSS Variables **/ :root { /** primary **/ - --ion-color-primary: #3880ff; - --ion-color-primary-rgb: 56, 128, 255; - --ion-color-primary-contrast: #ffffff; - --ion-color-primary-contrast-rgb: 255, 255, 255; - --ion-color-primary-shade: #3171e0; - --ion-color-primary-tint: #4c8dff; + --ion-color-primary: #000; + --ion-color-primary-rgb: 0,0,0; + --ion-color-primary-contrast: #ffffff; + --ion-color-primary-contrast-rgb: 255,255,255; + --ion-color-primary-shade: #000000; + --ion-color-primary-tint: #1a1a1a; /** secondary **/ --ion-color-secondary: #3dc2ff;