From 6a3de86588be1193c85005ef44e69b1919096e78 Mon Sep 17 00:00:00 2001 From: gram-incolo Date: Sun, 9 Jun 2024 23:56:21 +0300 Subject: [PATCH 01/11] fix error in the tests --- easel/test/extensions/size_extensions.dart | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/easel/test/extensions/size_extensions.dart b/easel/test/extensions/size_extensions.dart index d643d3ab2d..32a1375beb 100644 --- a/easel/test/extensions/size_extensions.dart +++ b/easel/test/extensions/size_extensions.dart @@ -7,21 +7,30 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:shared_preferences/shared_preferences.dart'; extension SetScreenSize on WidgetTester { - Future setScreenSize({double width = 480, double height = 965, double pixelDensity = 1}) async { + Future setScreenSize( + {double width = 480, + double height = 965, + double pixelDensity = 1}) async { final size = Size(width, height); await binding.setSurfaceSize(size); view.physicalSize = size; view.devicePixelRatio = pixelDensity; } - Future testAppForWidgetTesting(Widget child, {Duration duration = Duration.zero}) async { + Future testAppForWidgetTesting(Widget child, + {Duration duration = Duration.zero}) async { SharedPreferences.setMockInitialValues({}); await EasyLocalization.ensureInitialized(); return pumpWidget(Builder(builder: (context) { return EasyLocalization( - supportedLocales: const [Locale('en', 'US'), Locale('ru', 'RU'), Locale('es'), Locale('de')], + supportedLocales: const [ + Locale('en', 'US'), + Locale('ru', 'RU'), + Locale('es'), + Locale('de') + ], path: 'i18n', fallbackLocale: const Locale('en'), useOnlyLangCode: true, @@ -36,7 +45,8 @@ extension SetScreenSize on WidgetTester { builder: (context, widget) { ScreenUtil.init(context); return MediaQuery( - data: MediaQuery.of(context).copyWith(textScaler: TextScaler.noScaling), + data: MediaQuery.of(context) + .copyWith(textScaler: TextScaler.noScaling), child: widget!, ); }, @@ -45,6 +55,6 @@ extension SetScreenSize on WidgetTester { }, ), ); - }), duration); + })); } } From 3f265ec7eca77238d0095e5a2f5b9fda357517eb Mon Sep 17 00:00:00 2001 From: gram-incolo Date: Wed, 12 Jun 2024 23:24:20 +0300 Subject: [PATCH 02/11] fix deprecated error in detectable_text_field --- easel/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easel/pubspec.yaml b/easel/pubspec.yaml index 2d541ad5e5..3a5e462c73 100644 --- a/easel/pubspec.yaml +++ b/easel/pubspec.yaml @@ -36,7 +36,7 @@ dependencies: collection: ^1.16.0 cupertino_icons: ^1.0.2 dartz: ^0.10.0 - detectable_text_field: ^2.0.4 + detectable_text_field: ^3.0.2 device_preview: 1.1.0 dio: ^5.0.1 easy_localization: From 0cef1f50840e3d63613f44161a91e018a688aee3 Mon Sep 17 00:00:00 2001 From: gram-incolo Date: Wed, 3 Jul 2024 01:44:49 +0300 Subject: [PATCH 03/11] upgrade minimum version and fixed th crop image function incompatibility --- wallet/ios/Flutter/AppFrameworkInfo.plist | 2 +- wallet/ios/Runner.xcodeproj/project.pbxproj | 16 ++++++++-------- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- wallet/lib/pages/image_picker.dart | 11 ++++++++--- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/wallet/ios/Flutter/AppFrameworkInfo.plist b/wallet/ios/Flutter/AppFrameworkInfo.plist index 9625e105df..7c56964006 100644 --- a/wallet/ios/Flutter/AppFrameworkInfo.plist +++ b/wallet/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 11.0 + 12.0 diff --git a/wallet/ios/Runner.xcodeproj/project.pbxproj b/wallet/ios/Runner.xcodeproj/project.pbxproj index b2f6f33c71..e2447f6880 100644 --- a/wallet/ios/Runner.xcodeproj/project.pbxproj +++ b/wallet/ios/Runner.xcodeproj/project.pbxproj @@ -189,7 +189,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -435,7 +435,7 @@ ENABLE_BITCODE = NO; GOOGLE_SERVICE_PATH = ""; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -574,7 +574,7 @@ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; GOOGLE_SERVICE_PATH = ""; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -606,7 +606,7 @@ ENABLE_BITCODE = NO; GOOGLE_SERVICE_PATH = ""; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -692,7 +692,7 @@ ENABLE_BITCODE = NO; GOOGLE_SERVICE_PATH = "${SRCROOT}/Runner/Firebase/prod/GoogleService-Info.plist"; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -776,7 +776,7 @@ ENABLE_BITCODE = NO; GOOGLE_SERVICE_PATH = "${SRCROOT}/Runner/Firebase/prod/GoogleService-Info.plist"; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -862,7 +862,7 @@ ENABLE_BITCODE = NO; GOOGLE_SERVICE_PATH = "${SRCROOT}/Runner/Firebase/development/GoogleService-Info.plist"; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -946,7 +946,7 @@ ENABLE_BITCODE = NO; GOOGLE_SERVICE_PATH = "${SRCROOT}/Runner/Firebase/development/GoogleService-Info.plist"; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/wallet/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/wallet/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 4ba725f4c3..498aa0d19e 100644 --- a/wallet/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/wallet/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ pickImageFromGallery(double maxHeight, double maxWidth, int imageQuality, BuildContext context) async { - final pickImageEither = await GetIt.I.get().pickImageFromGallery(PickImageModel(maxHeight: maxHeight, maxWidth: maxWidth, imageQuality: imageQuality, imageSource: ImageSource.gallery)); +Future pickImageFromGallery(double maxHeight, double maxWidth, + int imageQuality, BuildContext context) async { + final pickImageEither = await GetIt.I.get().pickImageFromGallery( + PickImageModel( + maxHeight: maxHeight, + maxWidth: maxWidth, + imageQuality: imageQuality, + imageSource: ImageSource.gallery)); if (pickImageEither.isLeft()) { // ignore: use_build_context_synchronously @@ -36,7 +42,6 @@ Future pickImageFromGallery(double maxHeight, double maxWidth, int imageQ Future cropImage(String path) async { return ImageCropper().cropImage( sourcePath: path, - aspectRatioPresets: [CropAspectRatioPreset.square, CropAspectRatioPreset.ratio3x2, CropAspectRatioPreset.original, CropAspectRatioPreset.ratio4x3, CropAspectRatioPreset.ratio16x9], uiSettings: [ AndroidUiSettings( toolbarTitle: kStripeMerchantDisplayName, From a93f87f242ea447b0cff34d62a92c3e15ea77ea3 Mon Sep 17 00:00:00 2001 From: gram-incolo Date: Wed, 3 Jul 2024 03:13:43 +0300 Subject: [PATCH 04/11] fix a few issues that happen due to library upgrades --- wallet/lib/main_prod.dart | 19 +++++++++++----- wallet/lib/pages/stripe_screen.dart | 26 ++++++++++++++-------- wallet/pubspec.yaml | 34 ++++++++++++++--------------- 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/wallet/lib/main_prod.dart b/wallet/lib/main_prod.dart index 5fc79e3847..73b46aab92 100644 --- a/wallet/lib/main_prod.dart +++ b/wallet/lib/main_prod.dart @@ -17,7 +17,8 @@ import 'package:pylons_wallet/components/loading.dart'; import 'package:pylons_wallet/pylons_app.dart'; import 'package:pylons_wallet/utils/base_env.dart'; import 'package:pylons_wallet/utils/constants.dart'; -import 'package:pylons_wallet/utils/dependency_injection/dependency_injection.dart' as di; +import 'package:pylons_wallet/utils/dependency_injection/dependency_injection.dart' + as di; import 'package:pylons_wallet/utils/extension.dart'; import 'package:pylons_wallet/utils/types.dart'; @@ -31,7 +32,8 @@ Future main() async { await FlutterDownloader.initialize(ignoreSsl: true); await EasyLocalization.ensureInitialized(); await Firebase.initializeApp(); - await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(!kDebugMode); + await FirebaseCrashlytics.instance + .setCrashlyticsCollectionEnabled(!kDebugMode); PlatformDispatcher.instance.onError = (error, stack) { FirebaseCrashlytics.instance.recordError(error, stack, fatal: true); @@ -53,7 +55,8 @@ Future main() async { FirebaseAnalytics.instance.logEvent(name: event.getEventName()); }, onLogError: (exception, {bool fatal = false, StackTrace? stack}) { - FirebaseCrashlytics.instance.recordError(exception, stack, fatal: fatal); + FirebaseCrashlytics.instance + .recordError(exception, stack, fatal: fatal); }, onLogMessage: logMessage, ); @@ -86,14 +89,17 @@ Future main() async { } Future initializeAppCheck() async { - await FirebaseAppCheck.instance.activate(webRecaptchaSiteKey: 'recaptcha-v3-site-key'); + await FirebaseAppCheck.instance.activate( + webProvider: ReCaptchaV3Provider('recaptcha-v3-site-key'), + ); // FirebaseAppCheck when enforced would block incoming requests from Android and iOS in debug mode. // This kDebugMode check gets a android debug token from FirebaseAppCheck which can then be added on the Firebase console // iOS debug token from FirebaseAppCheck automatically get without method channel when run on debug mode which can then be added on the Firebase console // So that the application can be allowed to access to Firebase AppCheck token in debug mode. if (kDebugMode && Platform.isAndroid) { try { - const MethodChannel methodChannel = MethodChannel(kGetFirebaseAppCheckTokenMethodChannelKey); + const MethodChannel methodChannel = + MethodChannel(kGetFirebaseAppCheckTokenMethodChannelKey); await methodChannel.invokeMethod(kGetFirebaseAppCheckDebugTokenKey); } catch (e) { e.toString().show(); @@ -105,6 +111,7 @@ class MyHttpOverrides extends HttpOverrides { @override HttpClient createHttpClient(SecurityContext? context) { return super.createHttpClient(context) - ..badCertificateCallback = (X509Certificate cert, String host, int port) => true; + ..badCertificateCallback = + (X509Certificate cert, String host, int port) => true; } } diff --git a/wallet/lib/pages/stripe_screen.dart b/wallet/lib/pages/stripe_screen.dart index b104e69f3f..e5d8e7426b 100644 --- a/wallet/lib/pages/stripe_screen.dart +++ b/wallet/lib/pages/stripe_screen.dart @@ -48,10 +48,12 @@ class _StripeScreenState extends State { Future loadLoginLink() async { final loading = Loading()..showLoading(); - final account_response = await GetIt.I.get().handleStripeAccountLink(); + final account_response = + await GetIt.I.get().handleStripeAccountLink(); loading.dismiss(); account_response.fold((fail) => {fail.message.show()}, (accountlink) { - _controller.loadUrl(urlRequest: URLRequest(url: Uri.parse(accountlink))); + _controller.loadUrl( + urlRequest: URLRequest(url: WebUri.uri(Uri.parse(accountlink)))); }); return true; @@ -73,7 +75,8 @@ class _StripeScreenState extends State { top: 40.h, bottom: 0, child: InAppWebView( - initialUrlRequest: URLRequest(url: Uri.parse(widget.url)), + initialUrlRequest: + URLRequest(url: WebUri.uri(Uri.parse(widget.url))), onWebViewCreated: (InAppWebViewController webViewController) { _controller = webViewController; }, @@ -88,7 +91,8 @@ class _StripeScreenState extends State { getAccountLinkAndRedirect(); return NavigationActionPolicy.CANCEL; } - if (urlInString.contains(baseEnv.baseStripeCallbackRefreshUrl)) { + if (urlInString + .contains(baseEnv.baseStripeCallbackRefreshUrl)) { getAccountLinkAndRedirect(); return NavigationActionPolicy.CANCEL; } @@ -103,9 +107,11 @@ class _StripeScreenState extends State { } return NavigationActionPolicy.ALLOW; }, - androidOnPermissionRequest: - (InAppWebViewController controller, String origin, List resources) async { - return PermissionRequestResponse(resources: resources, action: PermissionRequestResponseAction.GRANT); + androidOnPermissionRequest: (InAppWebViewController controller, + String origin, List resources) async { + return PermissionRequestResponse( + resources: resources, + action: PermissionRequestResponseAction.GRANT); }, initialOptions: InAppWebViewGroupOptions( crossPlatform: InAppWebViewOptions( @@ -148,10 +154,12 @@ class _StripeScreenState extends State { Future getAccountLinkAndRedirect() async { final loading = Loading()..showLoading(); - final account_response = await GetIt.I.get().handleStripeAccountLink(); + final account_response = + await GetIt.I.get().handleStripeAccountLink(); loading.dismiss(); account_response.fold((fail) => {fail.message.show()}, (accountlink) { - _controller.loadUrl(urlRequest: URLRequest(url: Uri.parse(accountlink))); + _controller.loadUrl( + urlRequest: URLRequest(url: WebUri.uri(Uri.parse(accountlink)))); }); } } diff --git a/wallet/pubspec.yaml b/wallet/pubspec.yaml index 9d96950027..1173c6a9fc 100644 --- a/wallet/pubspec.yaml +++ b/wallet/pubspec.yaml @@ -11,41 +11,41 @@ dependencies: path: pkgs/pdf_viewer-master alan: path: pkgs/alan - audio_video_progress_bar: ^1.0.0 + audio_video_progress_bar: ^2.0.3 auto_size_text: ^3.0.0 backdrop: ^0.9.0 bottom_drawer: ^0.0.3 cached_network_image: - cloud_firestore: ^4.3.0 + cloud_firestore: ^5.0.2 cupertino_icons: ^1.0.3 dartz: ^0.10.1 decimal: ^2.3.0 - detectable_text_field: ^2.0.3 + detectable_text_field: ^3.0.2 dotted_border: ^2.0.0+2 easy_localization: ^3.0.1 equatable: ^2.0.5 expandable: ^5.0.1 firebase_analytics: - firebase_app_check: ^0.1.1+7 - firebase_core: ^2.4.0 - firebase_crashlytics: ^3.0.8 - firebase_dynamic_links: ^5.0.10 - firebase_messaging: ^14.2.0 - firebase_remote_config: ^3.0.8 + firebase_app_check: ^0.3.0+2 + firebase_core: ^3.1.1 + firebase_crashlytics: ^4.0.2 + firebase_dynamic_links: ^6.0.2 + firebase_messaging: ^15.0.2 + firebase_remote_config: ^5.0.2 fixnum: ^1.0.0 floor: ^1.3.0 flutter: sdk: flutter flutter_dotenv: ^5.0.2 flutter_downloader: ^1.9.1 - flutter_inappwebview: ^5.7.2+2 - flutter_local_notifications: ^13.0.0 + flutter_inappwebview: ^6.0.0 + flutter_local_notifications: ^17.2.1 flutter_localizations: sdk: flutter flutter_mobx: ^2.0.1 flutter_screenutil: ^5.5.4 flutter_secure_storage: ^8.0.0 - flutter_staggered_grid_view: ^0.6.2 + flutter_staggered_grid_view: ^0.7.0 flutter_sticky_header: ^0.6.0 flutter_stripe: flutter_svg: @@ -56,14 +56,14 @@ dependencies: focus_detector: ^2.0.1 get_it: ^7.2.0 google_sign_in: ^6.0.2 - googleapis: ^11.1.0 + googleapis: ^13.2.0 grpc: ^3.0.2 - home_widget: ^0.2.0+1 + home_widget: ^0.6.0 http: icloud_storage: ^2.0.0 image: ^4.0.12 image_cropper: - image_picker: ^0.8.5+3 + image_picker: ^1.1.2 in_app_purchase: ^3.0.7 internet_connection_checker: ^1.0.0+1 intl: @@ -71,11 +71,11 @@ dependencies: just_the_tooltip: 0.0.12 local_auth: ^2.1.2 mobx: ^2.0.3 - modal_bottom_sheet: ^2.0.0 + modal_bottom_sheet: ^3.0.0 model_viewer_plus: path: pkgs/model_viewer_plus.dart-master path_provider: ^2.0.11 - permission_handler: ^10.0.1 + permission_handler: ^11.3.1 provider: ^6.0.3 qr_flutter: ^4.0.0 From 3d4a9cbb58f3bb0cba463450027d346d2630c40c Mon Sep 17 00:00:00 2001 From: gram-incolo Date: Wed, 3 Jul 2024 23:06:09 +0300 Subject: [PATCH 05/11] version bump required in deployment target due to flutter upgrade --- wallet/ios/Runner.xcodeproj/project.pbxproj | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/wallet/ios/Runner.xcodeproj/project.pbxproj b/wallet/ios/Runner.xcodeproj/project.pbxproj index e2447f6880..e9eaeb3bd3 100644 --- a/wallet/ios/Runner.xcodeproj/project.pbxproj +++ b/wallet/ios/Runner.xcodeproj/project.pbxproj @@ -435,7 +435,7 @@ ENABLE_BITCODE = NO; GOOGLE_SERVICE_PATH = ""; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -574,7 +574,7 @@ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; GOOGLE_SERVICE_PATH = ""; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -606,7 +606,7 @@ ENABLE_BITCODE = NO; GOOGLE_SERVICE_PATH = ""; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -692,7 +692,7 @@ ENABLE_BITCODE = NO; GOOGLE_SERVICE_PATH = "${SRCROOT}/Runner/Firebase/prod/GoogleService-Info.plist"; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -776,7 +776,7 @@ ENABLE_BITCODE = NO; GOOGLE_SERVICE_PATH = "${SRCROOT}/Runner/Firebase/prod/GoogleService-Info.plist"; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -862,7 +862,7 @@ ENABLE_BITCODE = NO; GOOGLE_SERVICE_PATH = "${SRCROOT}/Runner/Firebase/development/GoogleService-Info.plist"; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -946,7 +946,7 @@ ENABLE_BITCODE = NO; GOOGLE_SERVICE_PATH = "${SRCROOT}/Runner/Firebase/development/GoogleService-Info.plist"; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", From 6e34b69cfdc0a2b0ce2146fa9065efdceec6a206 Mon Sep 17 00:00:00 2001 From: raviramnani Date: Fri, 5 Jul 2024 12:23:12 +0530 Subject: [PATCH 06/11] updated README.md and changes in AppDelegate.swift To run app in ios simulator --- wallet/README.md | 5 +++++ wallet/ios/Runner/AppDelegate.swift | 9 ++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/wallet/README.md b/wallet/README.md index 76871be19e..751ec35734 100644 --- a/wallet/README.md +++ b/wallet/README.md @@ -6,6 +6,11 @@ Pylons Wallet This project is a starting point for a Flutter application. +1) Req .prod_env file and place it in /wallet/env/ dir. +2) Req GoogleService-Info.plist file and place it in /wallet/ios/runner dir. +3) Req Google-services.json file and place it in /wallet/android/app dir. +4) Remove comments in AppDelegate.swift file to play in ios simulator +5) Req to add generated simulator Debug token to be added in firebase console>ios debug. diff --git a/wallet/ios/Runner/AppDelegate.swift b/wallet/ios/Runner/AppDelegate.swift index 3877d8faf8..b3b778ab1c 100644 --- a/wallet/ios/Runner/AppDelegate.swift +++ b/wallet/ios/Runner/AppDelegate.swift @@ -9,9 +9,12 @@ import flutter_downloader _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { - // Uncomment while using ios simulator -// let providerFactory = AppCheckDebugProviderFactory() -// AppCheck.setAppCheckProviderFactory(providerFactory) + // Uncomment while using ios simulator + + let providerFactory = AppCheckDebugProviderFactory() + AppCheck.setAppCheckProviderFactory(providerFactory) + FirebaseApp.configure() + // Register Flutter plugins GeneratedPluginRegistrant.register(with: self) FlutterDownloaderPlugin.setPluginRegistrantCallback(registerPlugins) return super.application(application, didFinishLaunchingWithOptions: launchOptions) From c7714101089dc279ec2d45b856a878a76d3692c5 Mon Sep 17 00:00:00 2001 From: Raviramnani1 Date: Fri, 5 Jul 2024 13:24:56 +0530 Subject: [PATCH 07/11] updated main_prod.dart to show debug token to run in ios simulator --- wallet/lib/main_prod.dart | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/wallet/lib/main_prod.dart b/wallet/lib/main_prod.dart index 73b46aab92..b81c7517fe 100644 --- a/wallet/lib/main_prod.dart +++ b/wallet/lib/main_prod.dart @@ -32,6 +32,8 @@ Future main() async { await FlutterDownloader.initialize(ignoreSsl: true); await EasyLocalization.ensureInitialized(); await Firebase.initializeApp(); + await FirebaseAppCheck.instance.activate( + appleProvider: AppleProvider.debug,); await FirebaseCrashlytics.instance .setCrashlyticsCollectionEnabled(!kDebugMode); @@ -96,15 +98,7 @@ Future initializeAppCheck() async { // This kDebugMode check gets a android debug token from FirebaseAppCheck which can then be added on the Firebase console // iOS debug token from FirebaseAppCheck automatically get without method channel when run on debug mode which can then be added on the Firebase console // So that the application can be allowed to access to Firebase AppCheck token in debug mode. - if (kDebugMode && Platform.isAndroid) { - try { - const MethodChannel methodChannel = - MethodChannel(kGetFirebaseAppCheckTokenMethodChannelKey); - await methodChannel.invokeMethod(kGetFirebaseAppCheckDebugTokenKey); - } catch (e) { - e.toString().show(); - } - } + } class MyHttpOverrides extends HttpOverrides { From 5d847658411806beb57e09473f308d233573d66a Mon Sep 17 00:00:00 2001 From: Raviramnani1 <64575750+Raviramnani1@users.noreply.github.com> Date: Fri, 5 Jul 2024 13:43:25 +0530 Subject: [PATCH 08/11] Update main_prod.dart --- wallet/lib/main_prod.dart | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/wallet/lib/main_prod.dart b/wallet/lib/main_prod.dart index b81c7517fe..bc5c2d44ad 100644 --- a/wallet/lib/main_prod.dart +++ b/wallet/lib/main_prod.dart @@ -98,7 +98,15 @@ Future initializeAppCheck() async { // This kDebugMode check gets a android debug token from FirebaseAppCheck which can then be added on the Firebase console // iOS debug token from FirebaseAppCheck automatically get without method channel when run on debug mode which can then be added on the Firebase console // So that the application can be allowed to access to Firebase AppCheck token in debug mode. - +if (kDebugMode && Platform.isAndroid) { + try { + const MethodChannel methodChannel = + MethodChannel(kGetFirebaseAppCheckTokenMethodChannelKey); + await methodChannel.invokeMethod(kGetFirebaseAppCheckDebugTokenKey); + } catch (e) { + e.toString().show(); + } + } } class MyHttpOverrides extends HttpOverrides { From 830e0ac5221c26947e6fd2ddb02676feca774f5a Mon Sep 17 00:00:00 2001 From: Raviramnani1 <64575750+Raviramnani1@users.noreply.github.com> Date: Wed, 17 Jul 2024 16:40:18 +0530 Subject: [PATCH 09/11] Update README.md --- wallet/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wallet/README.md b/wallet/README.md index 751ec35734..784552d8e6 100644 --- a/wallet/README.md +++ b/wallet/README.md @@ -9,8 +9,7 @@ This project is a starting point for a Flutter application. 1) Req .prod_env file and place it in /wallet/env/ dir. 2) Req GoogleService-Info.plist file and place it in /wallet/ios/runner dir. 3) Req Google-services.json file and place it in /wallet/android/app dir. -4) Remove comments in AppDelegate.swift file to play in ios simulator -5) Req to add generated simulator Debug token to be added in firebase console>ios debug. +4) Req to add generated simulator Debug token to be added in firebase console>ios debug. From 2d62309b757980e68622d736b595e2e93da182ce Mon Sep 17 00:00:00 2001 From: Raviramnani1 <64575750+Raviramnani1@users.noreply.github.com> Date: Wed, 17 Jul 2024 16:42:01 +0530 Subject: [PATCH 10/11] Update AppDelegate.swift --- wallet/ios/Runner/AppDelegate.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wallet/ios/Runner/AppDelegate.swift b/wallet/ios/Runner/AppDelegate.swift index b3b778ab1c..ce807f935c 100644 --- a/wallet/ios/Runner/AppDelegate.swift +++ b/wallet/ios/Runner/AppDelegate.swift @@ -11,9 +11,11 @@ import flutter_downloader ) -> Bool { // Uncomment while using ios simulator + #if DEBUG let providerFactory = AppCheckDebugProviderFactory() AppCheck.setAppCheckProviderFactory(providerFactory) FirebaseApp.configure() + #endif // Register Flutter plugins GeneratedPluginRegistrant.register(with: self) FlutterDownloaderPlugin.setPluginRegistrantCallback(registerPlugins) From b80741d4b71f147e09e6b9b3c46e32eb18666949 Mon Sep 17 00:00:00 2001 From: gram-incolo Date: Thu, 18 Jul 2024 18:10:52 +0300 Subject: [PATCH 11/11] remove the old webapp backend code base as its not used anymore --- .github/dependabot.yml | 4 - big-dipper-backend/.dockerignore | 6 - big-dipper-backend/.eslintrc.json | 156 - big-dipper-backend/.gitignore | 8 - .../.meteor/.finished-upgraders | 19 - big-dipper-backend/.meteor/.gitignore | 1 - big-dipper-backend/.meteor/.id | 7 - big-dipper-backend/.meteor/packages | 39 - big-dipper-backend/.meteor/platforms | 2 - big-dipper-backend/.meteor/release | 1 - big-dipper-backend/.meteor/versions | 101 - .../.well-known/apple-app-site-association | 14 - big-dipper-backend/API_DOCS.md | 167 - big-dipper-backend/CHANGELOG.md | 177 - big-dipper-backend/CODE_OF_CONDUCT.md | 76 - big-dipper-backend/CONTRIBUTING.md | 19 - big-dipper-backend/Dockerfile | 21 - big-dipper-backend/LICENSE | 201 - big-dipper-backend/README.md | 110 - big-dipper-backend/SECURITY.md | 12 - big-dipper-backend/both/document.html | 34 - big-dipper-backend/both/i18n/en-us.i18n.yml | 308 - big-dipper-backend/both/i18n/es-es.i18n.yml | 238 - big-dipper-backend/both/i18n/it-IT.i18n.yml | 237 - big-dipper-backend/both/i18n/pl-PL.i18n.yml | 237 - big-dipper-backend/both/i18n/pt-BR.i18n.yml | 236 - big-dipper-backend/both/i18n/ru-RU.i18n.yml | 252 - big-dipper-backend/both/i18n/zh-hans.i18n.yml | 238 - big-dipper-backend/both/i18n/zh-hant.i18n.yml | 238 - big-dipper-backend/both/utils/coins.js | 72 - big-dipper-backend/both/utils/loader.js | 6 - big-dipper-backend/both/utils/time.js | 4 - big-dipper-backend/cloudbuild.yaml | 56 - big-dipper-backend/default_settings.json | 125 - .../big-dipper-dev/network/managed-cert.yaml | 7 - .../pylons-big-dipper/Chart.yaml | 5 - .../pylons-big-dipper/templates/_helpers.tpl | 86 - .../templates/configmap.yaml | 12 - .../templates/deployment.yaml | 54 - .../pylons-big-dipper/templates/ingress.yaml | 15 - .../pylons-big-dipper/templates/service.yaml | 15 - .../pylons-big-dipper/values.yaml | 37 - .../big-dipper-prod/api-node/.helmignore | 23 - .../big-dipper-prod/api-node/Chart.yaml | 24 - .../api-node/templates/NOTES.txt | 22 - .../api-node/templates/_helpers.tpl | 62 - .../api-node/templates/deployment.yaml | 61 - .../api-node/templates/hpa.yaml | 28 - .../api-node/templates/ingress.yaml | 61 - .../api-node/templates/service.yaml | 15 - .../api-node/templates/serviceaccount.yaml | 12 - .../templates/tests/test-connection.yaml | 15 - .../big-dipper-prod/api-node/values.yaml | 82 - .../big-dipper-prod/network/managed-cert.yaml | 7 - .../pylons-big-dipper/Chart.yaml | 5 - .../pylons-big-dipper/templates/_helpers.tpl | 86 - .../templates/configmap.yaml | 12 - .../templates/deployment.yaml | 60 - .../pylons-big-dipper/templates/ingress.yaml | 15 - .../pylons-big-dipper/templates/service.yaml | 15 - .../pylons-big-dipper/values.yaml | 37 - .../deploy/network/managed-cert.yaml | 7 - .../deploy/pylons-big-dipper/Chart.yaml | 5 - .../pylons-big-dipper/templates/_helpers.tpl | 86 - .../templates/configmap.yaml | 12 - .../templates/deployment.yaml | 54 - .../pylons-big-dipper/templates/ingress.yaml | 15 - .../pylons-big-dipper/templates/service.yaml | 15 - .../deploy/pylons-big-dipper/values.yaml | 37 - big-dipper-backend/docker-compose.yml | 27 - big-dipper-backend/i18n/en-us.i18n.yml | 281 - big-dipper-backend/i18n/es-es.i18n.yml | 238 - big-dipper-backend/i18n/it-IT.i18n.yml | 237 - big-dipper-backend/i18n/pl-PL.i18n.yml | 237 - big-dipper-backend/i18n/pt-BR.i18n.yml | 236 - big-dipper-backend/i18n/ru-RU.i18n.yml | 252 - big-dipper-backend/i18n/zh-hans.i18n.yml | 238 - big-dipper-backend/i18n/zh-hant.i18n.yml | 238 - .../imports/api/accounts/server/methods.js | 236 - .../imports/api/actions/actions.js | 3 - .../imports/api/actions/server/methods.js | 357 -- .../api/actions/server/publications.js | 10 - big-dipper-backend/imports/api/admin.js | 8 - .../imports/api/analytics/analytics.js | 10 - .../imports/api/analytics/server/methods.js | 482 -- .../api/analytics/server/publications.js | 9 - big-dipper-backend/imports/api/api.js | 4 - .../imports/api/blocks/blocks.js | 23 - .../imports/api/blocks/server/methods.js | 744 --- .../imports/api/blocks/server/publications.js | 47 - big-dipper-backend/imports/api/chain/chain.js | 11 - .../imports/api/chain/server/methods.js | 239 - .../imports/api/chain/server/publications.js | 36 - big-dipper-backend/imports/api/codec.js | 15 - .../imports/api/coin-stats/coin-stats.js | 3 - .../imports/api/coin-stats/server/methods.js | 88 - .../imports/api/cookbooks/cookbooks.js | 3 - .../imports/api/cookbooks/server/methods.js | 99 - .../api/cookbooks/server/publications.js | 12 - .../imports/api/delegations/delegations.js | 3 - .../imports/api/delegations/server/methods.js | 40 - .../api/delegations/server/publications.js | 0 .../imports/api/evidences/evidences.js | 3 - .../imports/api/evidences/server/methods.js | 0 .../api/evidences/server/publications.js | 0 .../imports/api/fcmtoken/fcmtoken.js | 3 - .../imports/api/fcmtoken/server/methods.js | 138 - .../imports/api/ledger/server/methods.js | 65 - big-dipper-backend/imports/api/nfts/nfts.js | 3 - .../imports/api/nfts/server/methods.js | 129 - .../imports/api/nfts/server/publications.js | 12 - .../api/notifications/notifications.js | 4 - .../api/notifications/server/methods.js | 184 - .../imports/api/proposals/proposals.js | 3 - .../imports/api/proposals/server/methods.js | 197 - .../api/proposals/server/publications.js | 12 - .../imports/api/recipes/publications.js | 12 - .../imports/api/recipes/recipes.js | 3 - .../imports/api/recipes/server/methods.js | 133 - .../api/recipes/server/publications.js | 16 - .../imports/api/records/records.js | 21 - .../imports/api/records/server/methods.js | 368 -- .../api/records/server/publications.js | 69 - big-dipper-backend/imports/api/res.js | 36 - .../imports/api/status/server/publications.js | 8 - .../imports/api/status/status.js | 3 - .../api/transactions/server/methods.js | 113 - .../api/transactions/server/publications.js | 130 - .../imports/api/transactions/transactions.js | 10 - big-dipper-backend/imports/api/utils.js | 29 - .../api/validator-sets/server/publications.js | 6 - .../api/validator-sets/validator-sets.js | 3 - .../imports/api/validators/server/methods.js | 104 - .../api/validators/server/publications.js | 72 - .../imports/api/validators/validators.js | 28 - .../imports/api/voting-power/history.js | 3 - .../api/voting-power/server/publications.js | 0 .../imports/startup/both/index.js | 2 - .../imports/startup/client/index.js | 3 - .../imports/startup/client/routes.js | 5 - .../imports/startup/server/create-indexes.js | 70 - .../imports/startup/server/genesis.js | 7 - .../imports/startup/server/index.js | 371 -- .../imports/startup/server/read-genesis.js | 4 - .../imports/startup/server/register-api.js | 50 - .../imports/startup/server/util.js | 125 - .../imports/startup/server/websocket.js | 16 - big-dipper-backend/package.json | 84 - big-dipper-backend/private/README.md | 3 - big-dipper-backend/private/version | 1 - .../.well-known/apple-app-site-association | 14 - .../public/.well-known/assetlinks.json | 1 - .../public/img/big-dipper-icon-light.svg | 4 - .../public/img/big-dipper-logo-light.svg | 1 - big-dipper-backend/public/img/big-dipper.png | Bin 2812 -> 0 bytes big-dipper-backend/public/img/bluetooth.svg | 49 - big-dipper-backend/public/img/btc.svg | 21 - big-dipper-backend/public/img/btnbg.png | Bin 635 -> 0 bytes big-dipper-backend/public/img/buy_icon.png | Bin 1307 -> 0 bytes big-dipper-backend/public/img/buybg.png | Bin 11003 -> 0 bytes big-dipper-backend/public/img/check.svg | 14 - big-dipper-backend/public/img/detail.svg | 4 - big-dipper-backend/public/img/easel.png | Bin 1088 -> 0 bytes big-dipper-backend/public/img/eeur.svg | 5 - big-dipper-backend/public/img/expand.svg | 4 - big-dipper-backend/public/img/external.svg | 3 - big-dipper-backend/public/img/eye.svg | 4 - big-dipper-backend/public/img/favicon.png | Bin 1088 -> 0 bytes big-dipper-backend/public/img/frame.png | Bin 53227 -> 0 bytes big-dipper-backend/public/img/googleapp.png | Bin 45579 -> 0 bytes big-dipper-backend/public/img/history.svg | 3 - big-dipper-backend/public/img/ico_artwork.png | Bin 18701 -> 0 bytes .../public/img/ico_battleresult.png | Bin 20688 -> 0 bytes .../public/img/ico_constuction.png | Bin 19225 -> 0 bytes big-dipper-backend/public/img/ico_quest.png | Bin 20934 -> 0 bytes big-dipper-backend/public/img/ico_sold.png | Bin 18137 -> 0 bytes big-dipper-backend/public/img/likes.svg | 3 - big-dipper-backend/public/img/line.svg | 3 - big-dipper-backend/public/img/minimize.svg | 3 - big-dipper-backend/public/img/no-image.png | Bin 121355 -> 0 bytes big-dipper-backend/public/img/pylon_logo.svg | 11 - big-dipper-backend/public/img/pylons.svg | 9 - big-dipper-backend/public/img/trophy.svg | 5 - big-dipper-backend/public/img/uatom.svg | 11 - big-dipper-backend/public/img/urun.svg | 6 - big-dipper-backend/public/img/usb.svg | 51 - big-dipper-backend/public/img/ust.svg | 9 - big-dipper-backend/public/img/ustripeusd.svg | 4 - big-dipper-backend/public/img/wallet.png | Bin 2206 -> 0 bytes big-dipper-backend/scripts/build.sh | 10 - big-dipper-backend/scripts/genversion.sh | 7 - big-dipper-backend/scripts/post_build.sh | 6 - big-dipper-backend/scss-config.json | 6 - big-dipper-backend/server/main.js | 376 -- big-dipper-backend/settings.json | 125 - big-dipper-backend/yarn.lock | 5226 ----------------- 196 files changed, 17651 deletions(-) delete mode 100644 big-dipper-backend/.dockerignore delete mode 100644 big-dipper-backend/.eslintrc.json delete mode 100644 big-dipper-backend/.gitignore delete mode 100644 big-dipper-backend/.meteor/.finished-upgraders delete mode 100644 big-dipper-backend/.meteor/.gitignore delete mode 100644 big-dipper-backend/.meteor/.id delete mode 100644 big-dipper-backend/.meteor/packages delete mode 100644 big-dipper-backend/.meteor/platforms delete mode 100644 big-dipper-backend/.meteor/release delete mode 100644 big-dipper-backend/.meteor/versions delete mode 100644 big-dipper-backend/.well-known/apple-app-site-association delete mode 100644 big-dipper-backend/API_DOCS.md delete mode 100644 big-dipper-backend/CHANGELOG.md delete mode 100644 big-dipper-backend/CODE_OF_CONDUCT.md delete mode 100644 big-dipper-backend/CONTRIBUTING.md delete mode 100644 big-dipper-backend/Dockerfile delete mode 100644 big-dipper-backend/LICENSE delete mode 100644 big-dipper-backend/README.md delete mode 100644 big-dipper-backend/SECURITY.md delete mode 100644 big-dipper-backend/both/document.html delete mode 100644 big-dipper-backend/both/i18n/en-us.i18n.yml delete mode 100644 big-dipper-backend/both/i18n/es-es.i18n.yml delete mode 100644 big-dipper-backend/both/i18n/it-IT.i18n.yml delete mode 100644 big-dipper-backend/both/i18n/pl-PL.i18n.yml delete mode 100644 big-dipper-backend/both/i18n/pt-BR.i18n.yml delete mode 100644 big-dipper-backend/both/i18n/ru-RU.i18n.yml delete mode 100644 big-dipper-backend/both/i18n/zh-hans.i18n.yml delete mode 100644 big-dipper-backend/both/i18n/zh-hant.i18n.yml delete mode 100644 big-dipper-backend/both/utils/coins.js delete mode 100644 big-dipper-backend/both/utils/loader.js delete mode 100644 big-dipper-backend/both/utils/time.js delete mode 100644 big-dipper-backend/cloudbuild.yaml delete mode 100644 big-dipper-backend/default_settings.json delete mode 100644 big-dipper-backend/deploy/big-dipper-dev/network/managed-cert.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/Chart.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/_helpers.tpl delete mode 100644 big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/configmap.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/deployment.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/ingress.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/service.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/values.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/api-node/.helmignore delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/api-node/Chart.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/api-node/templates/NOTES.txt delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/api-node/templates/_helpers.tpl delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/api-node/templates/deployment.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/api-node/templates/hpa.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/api-node/templates/ingress.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/api-node/templates/service.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/api-node/templates/serviceaccount.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/api-node/templates/tests/test-connection.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/api-node/values.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/network/managed-cert.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/Chart.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/_helpers.tpl delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/configmap.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/deployment.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/ingress.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/service.yaml delete mode 100644 big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/values.yaml delete mode 100644 big-dipper-backend/deploy/network/managed-cert.yaml delete mode 100644 big-dipper-backend/deploy/pylons-big-dipper/Chart.yaml delete mode 100644 big-dipper-backend/deploy/pylons-big-dipper/templates/_helpers.tpl delete mode 100644 big-dipper-backend/deploy/pylons-big-dipper/templates/configmap.yaml delete mode 100644 big-dipper-backend/deploy/pylons-big-dipper/templates/deployment.yaml delete mode 100644 big-dipper-backend/deploy/pylons-big-dipper/templates/ingress.yaml delete mode 100644 big-dipper-backend/deploy/pylons-big-dipper/templates/service.yaml delete mode 100644 big-dipper-backend/deploy/pylons-big-dipper/values.yaml delete mode 100644 big-dipper-backend/docker-compose.yml delete mode 100644 big-dipper-backend/i18n/en-us.i18n.yml delete mode 100644 big-dipper-backend/i18n/es-es.i18n.yml delete mode 100644 big-dipper-backend/i18n/it-IT.i18n.yml delete mode 100644 big-dipper-backend/i18n/pl-PL.i18n.yml delete mode 100644 big-dipper-backend/i18n/pt-BR.i18n.yml delete mode 100644 big-dipper-backend/i18n/ru-RU.i18n.yml delete mode 100644 big-dipper-backend/i18n/zh-hans.i18n.yml delete mode 100644 big-dipper-backend/i18n/zh-hant.i18n.yml delete mode 100644 big-dipper-backend/imports/api/accounts/server/methods.js delete mode 100644 big-dipper-backend/imports/api/actions/actions.js delete mode 100644 big-dipper-backend/imports/api/actions/server/methods.js delete mode 100644 big-dipper-backend/imports/api/actions/server/publications.js delete mode 100644 big-dipper-backend/imports/api/admin.js delete mode 100644 big-dipper-backend/imports/api/analytics/analytics.js delete mode 100644 big-dipper-backend/imports/api/analytics/server/methods.js delete mode 100644 big-dipper-backend/imports/api/analytics/server/publications.js delete mode 100644 big-dipper-backend/imports/api/api.js delete mode 100644 big-dipper-backend/imports/api/blocks/blocks.js delete mode 100644 big-dipper-backend/imports/api/blocks/server/methods.js delete mode 100644 big-dipper-backend/imports/api/blocks/server/publications.js delete mode 100644 big-dipper-backend/imports/api/chain/chain.js delete mode 100644 big-dipper-backend/imports/api/chain/server/methods.js delete mode 100644 big-dipper-backend/imports/api/chain/server/publications.js delete mode 100644 big-dipper-backend/imports/api/codec.js delete mode 100644 big-dipper-backend/imports/api/coin-stats/coin-stats.js delete mode 100644 big-dipper-backend/imports/api/coin-stats/server/methods.js delete mode 100644 big-dipper-backend/imports/api/cookbooks/cookbooks.js delete mode 100644 big-dipper-backend/imports/api/cookbooks/server/methods.js delete mode 100644 big-dipper-backend/imports/api/cookbooks/server/publications.js delete mode 100644 big-dipper-backend/imports/api/delegations/delegations.js delete mode 100644 big-dipper-backend/imports/api/delegations/server/methods.js delete mode 100644 big-dipper-backend/imports/api/delegations/server/publications.js delete mode 100644 big-dipper-backend/imports/api/evidences/evidences.js delete mode 100644 big-dipper-backend/imports/api/evidences/server/methods.js delete mode 100644 big-dipper-backend/imports/api/evidences/server/publications.js delete mode 100644 big-dipper-backend/imports/api/fcmtoken/fcmtoken.js delete mode 100644 big-dipper-backend/imports/api/fcmtoken/server/methods.js delete mode 100644 big-dipper-backend/imports/api/ledger/server/methods.js delete mode 100644 big-dipper-backend/imports/api/nfts/nfts.js delete mode 100644 big-dipper-backend/imports/api/nfts/server/methods.js delete mode 100644 big-dipper-backend/imports/api/nfts/server/publications.js delete mode 100644 big-dipper-backend/imports/api/notifications/notifications.js delete mode 100644 big-dipper-backend/imports/api/notifications/server/methods.js delete mode 100644 big-dipper-backend/imports/api/proposals/proposals.js delete mode 100644 big-dipper-backend/imports/api/proposals/server/methods.js delete mode 100644 big-dipper-backend/imports/api/proposals/server/publications.js delete mode 100644 big-dipper-backend/imports/api/recipes/publications.js delete mode 100644 big-dipper-backend/imports/api/recipes/recipes.js delete mode 100644 big-dipper-backend/imports/api/recipes/server/methods.js delete mode 100644 big-dipper-backend/imports/api/recipes/server/publications.js delete mode 100644 big-dipper-backend/imports/api/records/records.js delete mode 100644 big-dipper-backend/imports/api/records/server/methods.js delete mode 100644 big-dipper-backend/imports/api/records/server/publications.js delete mode 100644 big-dipper-backend/imports/api/res.js delete mode 100644 big-dipper-backend/imports/api/status/server/publications.js delete mode 100644 big-dipper-backend/imports/api/status/status.js delete mode 100644 big-dipper-backend/imports/api/transactions/server/methods.js delete mode 100644 big-dipper-backend/imports/api/transactions/server/publications.js delete mode 100644 big-dipper-backend/imports/api/transactions/transactions.js delete mode 100644 big-dipper-backend/imports/api/utils.js delete mode 100644 big-dipper-backend/imports/api/validator-sets/server/publications.js delete mode 100644 big-dipper-backend/imports/api/validator-sets/validator-sets.js delete mode 100644 big-dipper-backend/imports/api/validators/server/methods.js delete mode 100644 big-dipper-backend/imports/api/validators/server/publications.js delete mode 100644 big-dipper-backend/imports/api/validators/validators.js delete mode 100644 big-dipper-backend/imports/api/voting-power/history.js delete mode 100644 big-dipper-backend/imports/api/voting-power/server/publications.js delete mode 100644 big-dipper-backend/imports/startup/both/index.js delete mode 100644 big-dipper-backend/imports/startup/client/index.js delete mode 100644 big-dipper-backend/imports/startup/client/routes.js delete mode 100644 big-dipper-backend/imports/startup/server/create-indexes.js delete mode 100644 big-dipper-backend/imports/startup/server/genesis.js delete mode 100644 big-dipper-backend/imports/startup/server/index.js delete mode 100644 big-dipper-backend/imports/startup/server/read-genesis.js delete mode 100644 big-dipper-backend/imports/startup/server/register-api.js delete mode 100644 big-dipper-backend/imports/startup/server/util.js delete mode 100644 big-dipper-backend/imports/startup/server/websocket.js delete mode 100644 big-dipper-backend/package.json delete mode 100644 big-dipper-backend/private/README.md delete mode 100644 big-dipper-backend/private/version delete mode 100644 big-dipper-backend/public/.well-known/apple-app-site-association delete mode 100644 big-dipper-backend/public/.well-known/assetlinks.json delete mode 100644 big-dipper-backend/public/img/big-dipper-icon-light.svg delete mode 100644 big-dipper-backend/public/img/big-dipper-logo-light.svg delete mode 100644 big-dipper-backend/public/img/big-dipper.png delete mode 100644 big-dipper-backend/public/img/bluetooth.svg delete mode 100644 big-dipper-backend/public/img/btc.svg delete mode 100644 big-dipper-backend/public/img/btnbg.png delete mode 100644 big-dipper-backend/public/img/buy_icon.png delete mode 100644 big-dipper-backend/public/img/buybg.png delete mode 100644 big-dipper-backend/public/img/check.svg delete mode 100644 big-dipper-backend/public/img/detail.svg delete mode 100644 big-dipper-backend/public/img/easel.png delete mode 100644 big-dipper-backend/public/img/eeur.svg delete mode 100644 big-dipper-backend/public/img/expand.svg delete mode 100644 big-dipper-backend/public/img/external.svg delete mode 100644 big-dipper-backend/public/img/eye.svg delete mode 100644 big-dipper-backend/public/img/favicon.png delete mode 100644 big-dipper-backend/public/img/frame.png delete mode 100644 big-dipper-backend/public/img/googleapp.png delete mode 100644 big-dipper-backend/public/img/history.svg delete mode 100644 big-dipper-backend/public/img/ico_artwork.png delete mode 100644 big-dipper-backend/public/img/ico_battleresult.png delete mode 100644 big-dipper-backend/public/img/ico_constuction.png delete mode 100644 big-dipper-backend/public/img/ico_quest.png delete mode 100644 big-dipper-backend/public/img/ico_sold.png delete mode 100644 big-dipper-backend/public/img/likes.svg delete mode 100644 big-dipper-backend/public/img/line.svg delete mode 100644 big-dipper-backend/public/img/minimize.svg delete mode 100644 big-dipper-backend/public/img/no-image.png delete mode 100644 big-dipper-backend/public/img/pylon_logo.svg delete mode 100644 big-dipper-backend/public/img/pylons.svg delete mode 100644 big-dipper-backend/public/img/trophy.svg delete mode 100644 big-dipper-backend/public/img/uatom.svg delete mode 100644 big-dipper-backend/public/img/urun.svg delete mode 100644 big-dipper-backend/public/img/usb.svg delete mode 100644 big-dipper-backend/public/img/ust.svg delete mode 100644 big-dipper-backend/public/img/ustripeusd.svg delete mode 100644 big-dipper-backend/public/img/wallet.png delete mode 100644 big-dipper-backend/scripts/build.sh delete mode 100644 big-dipper-backend/scripts/genversion.sh delete mode 100644 big-dipper-backend/scripts/post_build.sh delete mode 100644 big-dipper-backend/scss-config.json delete mode 100644 big-dipper-backend/server/main.js delete mode 100644 big-dipper-backend/settings.json delete mode 100644 big-dipper-backend/yarn.lock diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6ba7c70267..c9d8bd47f4 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -24,10 +24,6 @@ updates: schedule: interval: daily open-pull-requests-limit: 10 - - package-ecosystem: npm - directory: "/big-dipper-backend" - schedule: - interval: daily - package-ecosystem: pub directory: "/dart_sdk" schedule: diff --git a/big-dipper-backend/.dockerignore b/big-dipper-backend/.dockerignore deleted file mode 100644 index 7efb511e90..0000000000 --- a/big-dipper-backend/.dockerignore +++ /dev/null @@ -1,6 +0,0 @@ -/node_modules -/.meteor/local -/.github -.git -.envrc -package-lock.json \ No newline at end of file diff --git a/big-dipper-backend/.eslintrc.json b/big-dipper-backend/.eslintrc.json deleted file mode 100644 index bfde7f1a5a..0000000000 --- a/big-dipper-backend/.eslintrc.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "env": { - "browser": true, - "es6": true, - "node": true - }, - "extends": [ - "eslint:recommended", - "plugin:react/recommended", - "plugin:import/errors", - "plugin:import/warnings", - "@meteorjs/eslint-config-meteor" - ], - "globals": { - "Atomics": "readonly", - "SharedArrayBuffer": "readonly" - }, - "parserOptions": { - "ecmaFeatures": { - "jsx": true - }, - "ecmaVersion": 6, - "sourceType": "module" - }, - "plugins": [ - "import", - "meteor", - "react" - ], - "rules": { - "indent": ["warn", 4], - - "array-bracket-spacing": "off", - "array-callback-return": "off", - "arrow-body-style": "off", - "arrow-parens": "off", - "arrow-spacing": "off", - "block-spacing": "off", - "brace-style": "off", - "class-methods-use-this": "off", - "comma-dangle": "off", - "comma-spacing": "off", - "comma-style": "off", - "consistent-return": "off", - "curly": "off", - "default-case": "off", - "dot-notation": "off", - "eol-last": "off", - "eqeqeq": "off", - "function-paren-newline": "off", - "global-require": "off", - "guard-for-in": "off", - "implicit-arrow-linebreak": "off", - "import/newline-after-import": "off", - "import/no-cycle": "off", - "import/no-duplicates": "off", - "import/no-unresolved": "off", - "import/no-useless-path-segments": "off", - "import/order": "off", - "import/prefer-default-export": "off", - "jsx-a11y/alt-text": "off", - "jsx-a11y/anchor-is-valid": "off", - "jsx-a11y/click-events-have-key-events": "off", - "jsx-a11y/heading-has-content": "off", - "jsx-a11y/no-static-element-interactions": "off", - "jsx-quotes": "off", - "key-spacing": "off", - "keyword-spacing": "off", - "linebreak-style": "off", - "lines-between-class-members": "off", - "max-len": "off", - "meteor/audit-argument-checks": "off", - "no-bitwise": "off", - "no-case-declarations": "off", - "no-console": "off", - "no-continue": "off", - "no-else-return": "off", - "no-empty": "off", - "no-eval": "off", - "no-extra-semi": "off", - "no-fallthrough": "off", - "no-lonely-if": "off", - "no-multi-spaces": "off", - "no-multiple-empty-lines": "off", - "no-nested-ternary": "off", - "no-param-reassign": "off", - "no-plusplus": "off", - "no-prototype-builtins": "off", - "no-restricted-globals": "off", - "no-restricted-syntax": "off", - "no-return-assign": "off", - "no-self-assign": "off", - "no-sequences": "off", - "no-shadow": "off", - "no-throw-literal": "off", - "no-trailing-spaces": "off", - "no-undef": "off", - "no-underscore-dangle": "off", - "no-unneeded-ternary": "off", - "no-unreachable": "off", - "no-unused-expressions": "off", - "no-unused-vars": "off", - "no-use-before-define": "off", - "no-useless-constructor": "off", - "no-var": "off", - "nonblock-statement-body-position": "off", - "object-curly-newline": "off", - "object-curly-spacing": "off", - "object-property-newline": "off", - "object-shorthand": "off", - "one-var": "off", - "one-var-declaration-per-line": "off", - "operator-assignment": "off", - "operator-linebreak": "off", - "option.": "off", - "padded-blocks": "off", - "prefer-const": "off", - "prefer-destructuring": "off", - "prefer-template": "off", - "quote-props": "off", - "quotes": "off", - "radix": "off", - "react/destructuring-assignment": "off", - "react/forbid-prop-types": "off", - "react/jsx-boolean-value": "off", - "react/jsx-closing-bracket-location": "off", - "react/jsx-closing-tag-location": "off", - "react/jsx-curly-spacing": "off", - "react/jsx-first-prop-new-line": "off", - "react/jsx-indent": "off", - "react/jsx-indent-props": "off", - "react/jsx-max-props-per-line": "off", - "react/jsx-no-target-blank": "off", - "react/jsx-no-undef": "off", - "react/jsx-one-expression-per-line": "off", - "react/jsx-props-no-multi-spaces": "off", - "react/jsx-tag-spacing": "off", - "react/jsx-wrap-multilines": "off", - "react/no-access-state-in-setstate": "off", - "react/no-array-index-key": "off", - "react/no-did-update-set-state": "off", - "react/no-unescaped-entities": "off", - "react/no-unused-state": "off", - "react/prefer-stateless-function": "off", - "react/prop-types": "off", - "react/require-default-props": "off", - "react/self-closing-comp": "off", - "react/sort-comp": "off", - "semi": "off", - "semi-spacing": "off", - "space-before-blocks": "off", - "space-in-parens": "off", - "space-infix-ops": "off", - "spaced-comment": "off" - } -} diff --git a/big-dipper-backend/.gitignore b/big-dipper-backend/.gitignore deleted file mode 100644 index 6b1a3e131a..0000000000 --- a/big-dipper-backend/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -.DS_Store -node_modules/ -.vscode -output/ -.envrc -ali-scripts.txt -firebase.json - diff --git a/big-dipper-backend/.meteor/.finished-upgraders b/big-dipper-backend/.meteor/.finished-upgraders deleted file mode 100644 index c07b6ff75a..0000000000 --- a/big-dipper-backend/.meteor/.finished-upgraders +++ /dev/null @@ -1,19 +0,0 @@ -# This file contains information which helps Meteor properly upgrade your -# app when you run 'meteor update'. You should check it into version control -# with your project. - -notices-for-0.9.0 -notices-for-0.9.1 -0.9.4-platform-file -notices-for-facebook-graph-api-2 -1.2.0-standard-minifiers-package -1.2.0-meteor-platform-split -1.2.0-cordova-changes -1.2.0-breaking-changes -1.3.0-split-minifiers-package -1.4.0-remove-old-dev-bundle-link -1.4.1-add-shell-server-package -1.4.3-split-account-service-packages -1.5-add-dynamic-import-package -1.7-split-underscore-from-meteor-base -1.8.3-split-jquery-from-blaze diff --git a/big-dipper-backend/.meteor/.gitignore b/big-dipper-backend/.meteor/.gitignore deleted file mode 100644 index 4083037423..0000000000 --- a/big-dipper-backend/.meteor/.gitignore +++ /dev/null @@ -1 +0,0 @@ -local diff --git a/big-dipper-backend/.meteor/.id b/big-dipper-backend/.meteor/.id deleted file mode 100644 index f872189792..0000000000 --- a/big-dipper-backend/.meteor/.id +++ /dev/null @@ -1,7 +0,0 @@ -# This file contains a token that is unique to your project. -# Check it into your repository along with the rest of this directory. -# It can be used for purposes such as: -# - ensuring you don't accidentally deploy one app on top of another -# - providing package authors with aggregated statistics - -kkzd2ruogx6j.v70fzzjrhvff diff --git a/big-dipper-backend/.meteor/packages b/big-dipper-backend/.meteor/packages deleted file mode 100644 index 4676390b27..0000000000 --- a/big-dipper-backend/.meteor/packages +++ /dev/null @@ -1,39 +0,0 @@ -# Meteor packages used by this project, one per line. -# Check this file (and the other files in this directory) into your repository. -# -# 'meteor add' and 'meteor remove' will edit this file for you, -# but you can also edit it by hand. - -meteor-base@1.5.1 # Packages every Meteor app needs to have -mobile-experience@1.1.0 # Packages for a great mobile UX -mongo@1.15.0 # The database Meteor supports right now -reactive-var@1.0.11 # Reactive variable for tracker -tracker@1.2.0 # Meteor's client-side reactive programming library - -standard-minifier-css@1.8.1 # CSS minifier run for production mode -standard-minifier-js@2.8.0 # JS minifier run for production mode -es5-shim@4.8.0 # ECMAScript 5 compatibility for older browsers -ecmascript@0.16.2 # Enable ECMAScript2015+ syntax in app code -shell-server@0.5.0 # Server-side component of the `meteor shell` command - -less@2.8.0 # Leaner CSS language - -meteortesting:mocha # A package for writing and running your meteor app and package tests with mocha -johanbrook:publication-collector # Test a Meteor publication by collecting its output -static-html@1.3.2 -react-meteor-data -bkruse:pace -dburles:collection-helpers -http@1.4.2 -reywood:publish-composite -jquery -universe:i18n -fourseven:scss -kadira:dochead -check@1.3.1 -ostrio:flow-router-meta -ostrio:flow-router-extra -server-render@0.4.0 -nimble:restivus -meteorhacks:async -webapp diff --git a/big-dipper-backend/.meteor/platforms b/big-dipper-backend/.meteor/platforms deleted file mode 100644 index efeba1b50c..0000000000 --- a/big-dipper-backend/.meteor/platforms +++ /dev/null @@ -1,2 +0,0 @@ -server -browser diff --git a/big-dipper-backend/.meteor/release b/big-dipper-backend/.meteor/release deleted file mode 100644 index 66dd7b6647..0000000000 --- a/big-dipper-backend/.meteor/release +++ /dev/null @@ -1 +0,0 @@ -METEOR@2.7.3 diff --git a/big-dipper-backend/.meteor/versions b/big-dipper-backend/.meteor/versions deleted file mode 100644 index 7f0b3c408e..0000000000 --- a/big-dipper-backend/.meteor/versions +++ /dev/null @@ -1,101 +0,0 @@ -accounts-base@2.2.3 -accounts-password@2.3.1 -allow-deny@1.1.1 -autoupdate@1.8.0 -babel-compiler@7.9.0 -babel-runtime@1.5.1 -base64@1.0.12 -binary-heap@1.0.11 -bkruse:pace@0.5.1 -blaze-tools@1.1.3 -boilerplate-generator@1.7.1 -caching-compiler@1.2.2 -caching-html-compiler@1.2.1 -callback-hook@1.4.0 -check@1.3.1 -coffeescript@1.0.17 -dburles:collection-helpers@1.1.0 -ddp@1.4.0 -ddp-client@2.5.0 -ddp-common@1.4.0 -ddp-rate-limiter@1.1.0 -ddp-server@2.5.0 -diff-sequence@1.1.1 -dynamic-import@0.7.2 -ecmascript@0.16.2 -ecmascript-runtime@0.8.0 -ecmascript-runtime-client@0.12.1 -ecmascript-runtime-server@0.11.0 -ejson@1.1.2 -email@2.2.1 -es5-shim@4.8.0 -fetch@0.1.1 -fourseven:scss@4.15.0 -geojson-utils@1.0.10 -hot-code-push@1.0.4 -html-tools@1.1.3 -htmljs@1.1.1 -http@1.4.4 -id-map@1.1.1 -inter-process-messaging@0.1.1 -johanbrook:publication-collector@1.1.0 -jquery@3.0.0 -kadira:dochead@1.5.0 -launch-screen@1.3.0 -less@2.8.0 -lmieulet:meteor-coverage@3.2.0 -localstorage@1.2.0 -logging@1.3.1 -meteor@1.10.0 -meteor-base@1.5.1 -meteorhacks:async@1.0.0 -meteortesting:browser-tests@1.3.5 -meteortesting:mocha@1.1.5 -meteortesting:mocha-core@7.0.1 -minifier-css@1.6.0 -minifier-js@2.7.4 -minimongo@1.8.0 -mobile-experience@1.1.0 -mobile-status-bar@1.1.0 -modern-browsers@0.1.8 -modules@0.18.0 -modules-runtime@0.13.0 -mongo@1.15.0 -mongo-decimal@0.1.3 -mongo-dev-server@1.1.0 -mongo-id@1.0.8 -nimble:restivus@0.8.13 -npm-mongo@4.3.1 -ordered-dict@1.1.0 -ostrio:flow-router-extra@3.8.1 -ostrio:flow-router-meta@2.1.2 -ostrio:flow-router-title@3.2.2 -promise@0.12.0 -random@1.2.0 -rate-limit@1.0.9 -react-fast-refresh@0.2.3 -react-meteor-data@2.5.1 -reactive-dict@1.3.0 -reactive-var@1.0.11 -reload@1.3.1 -retry@1.1.0 -reywood:publish-composite@1.7.3 -routepolicy@1.1.1 -server-render@0.4.0 -service-configuration@1.3.0 -sha@1.0.9 -shell-server@0.5.0 -simple:json-routes@2.1.0 -socket-stream-client@0.5.0 -spacebars-compiler@1.3.1 -standard-minifier-css@1.8.1 -standard-minifier-js@2.8.0 -static-html@1.3.2 -templating-tools@1.2.2 -tracker@1.2.0 -typescript@4.5.4 -underscore@1.0.10 -universe:i18n@1.32.6 -url@1.3.2 -webapp@1.13.1 -webapp-hashing@1.1.0 diff --git a/big-dipper-backend/.well-known/apple-app-site-association b/big-dipper-backend/.well-known/apple-app-site-association deleted file mode 100644 index 43b3dc46a7..0000000000 --- a/big-dipper-backend/.well-known/apple-app-site-association +++ /dev/null @@ -1,14 +0,0 @@ -{ - "applinks": { - "details": [{ - "appIDs": ["QV67PMQ8H3.xyz.pylons.wallet"], - "components": [{ - "/": "*", - "comment": "" - }] - }] - }, - "webcredentials": { - "apps": ["QV67PMQ8H3.xyz.pylons.wallet"] - } -} \ No newline at end of file diff --git a/big-dipper-backend/API_DOCS.md b/big-dipper-backend/API_DOCS.md deleted file mode 100644 index da4504546e..0000000000 --- a/big-dipper-backend/API_DOCS.md +++ /dev/null @@ -1,167 +0,0 @@ -# API DOCUMENTATION - -## Why APIs in Meteor? -Meteor provides us a package containing both the frontend and the backend. The Web frontend consumes Meteor Methods, but there is no way a Mobile frontend can interact with Meteor other than REST APIs. So, we have added the APIs here using RESTIVUS to make it possible for the mobile side to access the required data. - -## Endpoints - -### 1. Like an NFT -###### Description -This endpoint lets the end user to like or unlike a specific nft. It toggles a user's like i.e. on hitting once the user adds their like, and on hitting again, the user removes their like. The error response mentioned below will be received if any of the arguments is non-string type or is empty. -###### URL -`/api/actions/likes/:cookbookId/:recipeId` -###### Method -`POST` -###### Parameters -`cookbookId` :warning: MUST be a non-empty string -

-`recipeId` :warning: MUST be a non-empty string -###### Body -``` -{ - "userId": "a non-empty string" -} -``` -###### Success Response -``` -{ - "Code": 200, - "Message": "Successful", - "Data": { - "liked": true, - "totalLikes": 7 - } -} -``` -###### Error Response -``` -{ - "Code": 400, - "Message": "invalid request", - "Data": null -} -``` - -### 2. Get Likes on an NFT -###### URL -`/api/actions/likes/:cookbookId/:recipeId` -###### Method -`GET` -###### Parameters -`cookbookId` :warning: MUST be a non-empty string -

-`recipeId` :warning: MUST be a non-empty string -###### Success Response -``` -{ - "Code": 200, - "Message": "Successful", - "Data": { - "totalLikes": 7 - } -} -``` -###### Error Response -``` -{ - "Code": 400, - "Message": "invalid request", - "Data": null -} -``` - -### 3. View an NFT -###### Description -This endpoint lets the end user to view a specific nft. It upserts a user's view i.e. on hitting once the user adds their view, and the same user hitting again won't increment the views of the nft. The error response mentioned below will be received if any of the arguments is non-string type or is empty. -###### URL -`/api/actions/views/:cookbookId/:recipeId` -###### Method -`POST` -###### Parameters -`cookbookId` :warning: MUST be a non-empty string -

-`recipeId` :warning: MUST be a non-empty string -###### Body -``` -{ - "userId": "a non-empty string" -} -``` -###### Success Response -``` -{ - "Code": 200, - "Message": "Successful", - "Data": { - "views": true, - "totalViews": 7 - } -} -``` -###### Error Response -``` -{ - "Code": 400, - "Message": "invalid request", - "Data": null -} -``` - -### 4. Get Views on an NFT -###### URL -`/api/actions/views/:cookbookId/:recipeId` -###### Method -`GET` -###### Parameters -`cookbookId` :warning: MUST be a non-empty string -

-`recipeId` :warning: MUST be a non-empty string -###### Success Response -``` -{ - "Code": 200, - "Message": "Successful", - "Data": { - "totalViews": 7 - } -} -``` -###### Error Response -``` -{ - "Code": 400, - "Message": "invalid request", - "Data": null -} -``` - -### 5. Get Like Status -###### URL -`/api/actions/likes/:userId/:cookbookId/:recipeId` -###### Method -`GET` -###### Parameters -`recipeId` :warning: MUST be a non-empty string -

-`cookbookId` :warning: MUST be a non-empty string -

-`recipeId` :warning: MUST be a non-empty string -###### Success Response -``` -{ - "Code": 200, - "Message": "Successful", - "Data": { - "liked": true - } -} -``` -###### Error Response -``` -{ - "Code": 400, - "Message": "invalid request", - "Data": null -} -``` - diff --git a/big-dipper-backend/CHANGELOG.md b/big-dipper-backend/CHANGELOG.md deleted file mode 100644 index 69dc847cf2..0000000000 --- a/big-dipper-backend/CHANGELOG.md +++ /dev/null @@ -1,177 +0,0 @@ -# Changelog -## [v0.41.x-14.3] -* Added Apple app associate file. - -## [v0.41.x-14.2] -* Fixes Ledger WebUSB + Chrome 91.x issue (https://github.com/LedgerHQ/ledgerjs/issues/607) - -## v0.41.x-14.1 -* [#426] Updated proposal tally result, added activeVotingPower value to active proposal collection. -* [#524] Added `noreferrer` to Banner links - -## v0.41.x-14 -* [#488] Updated missing proposer address in proposals. -* [#486] Fixed delegators voting power display on gov proposals -* [#493] Fixed validators address showing as undefined in links. -* [#491] Fixed query that are called when the gov module is active. -* [#522] Fixed validator commission tx with correct validator operator address when signing with Ledger. - -## v0.41.x-13 -* [#484] Replaced delegation list displayed under validator page with total number of delegations. -* [#509] Added display list of addresses available for user to login with when connecting the Ledger. -* [#497] Fetch keybase with timer settings -* [#403] Unified token display to show stake denom with 6 decimal places (abandon displaying values in mint denom) and improved the txs by adding gas caluclations before broadcasting the tx to ensure the message will not fail due to insufficient funds to cover the fees. - -## v0.41.x-12 -* [#387] Added Bluetooth Ledger support -* Fix transaction simulation bug - -## v0.41.x-11 -* Replaced Random Validators and Chart components with Latest Blocks and Latest Transactions components on homepage -* Update meta data to align with setting values - -## v0.41.x-10 -* Bump Meteor to v2.2 -## v0.41.x-9 -* Added banner support. Banner settings are loading remotely from the url defined in settings. - -## v0.41.x-8 - -* [#487] Fixed typo in the query which make validator power change tx lookup failed. -* Fixed an issue on displaying individual transaction. -* Updated Ledger app name checking so that it will follows the value defined in settings. -* [#213] Updated `@ledgerhq/hw-transport-webusb` pkg to v5.49.0 to fix Ledger errors on Windows10 - -## v0.41.x-7 (Stargate compatible) - -* [#472] Fix missing transactions -* [#449] Migrate API to gRPC gateway -* [#360] Update validator info correctly -* [#311] Update validator status to display validators correctly -* [#321] Enable module related components which will display 0 or hide the components when the Cosmos SDK modules are not implemented -* [#485] Query proposal tally results correctly -* Update transaction skeletons for Ledger to work properly -* Config correct Ledger app and app version - -## v0.39.x-7 - -* [#452] Fix VP Chart not being shown - -## v0.39.x-6 - -* Index transactions with timer settings - -## v0.39.x-5 - -* [#444] Fetch keybase in async function with query interval contolled by settings -* Fix missing value in VP distribution - -## v0.39.x-4 - -* [#436] Index transactions in a separate process -* Update to Meteor 1.12 -* [#435] Show inflation as 0% if there is no inflation (no minting module integrated) -* [#433] Create tx index for MsgCreateValidator -* Use react-json-view instead of JSONPretty -* Update uptime with signing info -* [#280] Remove reading genesis file -* Remove plural denom -* Simplify validator storing -* Get data and show proposal based on enabled modules -* Calculate validator uptime in async -* Update validator status - -## v0.39.x-3 - -* [#431] Create correct index for trasaction events - -## v0.39.x-2 - -* [#392] Fixed account page not rendering when the account is empty -* [#413] Fixed validator page error after logging in with Ledger - -## v0.39.x-1 - -* [#425] Fixed `commission_rates` might not exists in `validator.commission` object - -## v0.39.x - -* [#420] Update brand font -* [#418] Fix avatar at delegation pane -* [#404] Replace "casted" with "cast" -* [#421] Fix NaN on account delegation pane -* [#417] Fix NaN on account total value -* [#416] Add version number to UI -* Bump Meteor to v1.11.1 and update some dependency pcakges with security issues -* Dockerize big-dipper -* [#306] Display errors with SDK v0.38 format -* [#301] Using Jazzicon as avatar if no Keybase avatar exists -* [#297] Prettify unrecognized JSON messages -* [#294] Fixed cloneDeep typo in Account section for case-sensitve filesystems. -* [#284] Support Tendermint v0.33 block format -* [#346] Changed "Governanza" typo to "Gobernanza" in Spanish Translation -* [#375] Fixed the Commission Value Calculations that caused Account Page to break -* [#372] Fixed Redelegation List showing on all account pages - -## v0.37.x-patch-11 - -* [#303] Fixed wrong validator display in unjail message -* [#294] Fixed cloneDeep typo in Account section for case-sensitve filesystems. -* [#298] Fixed NaN values for Rewards and Commissions that were displayed after clicking Withdrawal Button -* [#288] Add Secp256p1 validator pubkey type. A new paramemter in public setting is added to control whether the validator pubkey is seck256p1 or default ed25519. If `secp256k1` in `settings.json` is set to `true`, it will see all validator pubkeys in Secp256k1 format. -* Fixed Commission bug in AccountTooltip to read rates from validator.commission.commission_rates.rate & validator.commission.rate -* Added Russian transation -* Fixed Unjail message with a correct account address. -* [#323] Display rewards amount in activities list. -* [#327] Fixed error in Proposals section to accept String and Number as a value in Changes table -* Hide Italian it-IT Translation -* Fixed hash overflow on mobile in Transaction Section (Added scroller) - -## v0.37.x-patch-10.1 - -* Fixed a display bug when there is no denom value in the tx fee - -## v0.37.x-patch-10 - -### Release Date: 24 Feb 2020 - -* Changed the structure of `coins.js` utility and `settings.json`. Information of multiple denoms can be defined in `settings.json`. A `bondDenom` should be defined and coins information is defined in `coins` array. `powerReduction` is the `token / power` ratio which is set to be `1,000,000` by default in the `staking` module. The display value of coins should be set correctly in the `coins` array. An example is as below. - - ```json - "bondDenom": "umuon", - "powerReduction": 1000000, - "coins": [ - { - "denom": "umuon", - "displayName": "Muon", - "displayNamePlural": "Muons", - "fraction": 1000000 - } - ], - ``` - -* Update Meteor to v1.9 -* [#267] Fixed Fee Decimal Places -* [#263] Fixed Tx fee to be displayed in Minting or Staking Denom depending on the fee amount -* [#262] Fixed Validator Popover in Account Section -* [#260] Fixed Token unit to display the correct Denom Name/Type -* [#227] Added additional info to be displayed for Parameter Change Proposal and Community Pool Spend Proposal -* [#276] Added Coin Selection Dropdown in Account Section to support multiple denomination -* [#289] Updated Coin Selection Dropdown to display the denom as the display (Staking) denom and only show when more than one type of Coin is available. - -## v0.37.x-patch-9 - -### Release Date: 22 Jan 2020 - -* Added features to disable `gov` and `mint` modules if they don't exist -* [#254] Fixed the delegation order in delegation panel -* [#253] Fixed total delegation became wrong after adding rewards -* Added Polish transation -* Added Spanish translation -* [#240] Fixed commission sorting -* [#239] Fixed Coin untilty. Now it shows coins from the chain matching with the `settings.json` if configuration exist. Please note there is a new `coins` object in the [`settings.json`](https://github.com/forbole/big_dipper/blob/master/default_settings.json#L17) to define the display parameters of each coin -* [#238] Styled the tooltip not to block the validator info -* [#230] Removed the delegation shares in account's delegation panel -* [#229] Fixed the account address display -* [#228] Added rewards column to account's delegation panel -* Added memo button in each transaction diff --git a/big-dipper-backend/CODE_OF_CONDUCT.md b/big-dipper-backend/CODE_OF_CONDUCT.md deleted file mode 100644 index 517857313c..0000000000 --- a/big-dipper-backend/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,76 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at referral@forbole.com. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq diff --git a/big-dipper-backend/CONTRIBUTING.md b/big-dipper-backend/CONTRIBUTING.md deleted file mode 100644 index 06491c1523..0000000000 --- a/big-dipper-backend/CONTRIBUTING.md +++ /dev/null @@ -1,19 +0,0 @@ -Big Dipper is always free and open. We welcome everyone to contribute to the Big Dipper as in contributing to the Cosmos Network. - -You can contribute in the following ways: - -## Submit issues -If you find any errors, bugs, questions, feature requests when you are using the Big Dipper (on [Cosmos](https://cosmos.bigdipper.live), [IRIS](https://iris.bigdipper.live), etc.), please do not hestitate to submit any [issues](https://github.com/forbole/big_dipper/issues). Any bug report and comments are welcome. We are always open to learn more about how this application can help Cosmos users. - -## Create Pull Request -If you are generous enough and can resolve some issues the Big Dipper is experiencing, please build everything in your own branch and create a Pull Request to us. We will review and merge if necessary. - -If it's just some simple errors like typo or missing a variable, etc, please create a Pull Request directly. If it's a feature change or some severe issues, please create an issue before creating a Pull Request. - -There are some code conventions to follow: - -1. App-wise constants are in **ALL CAPITAL LETTERS**, eg. `RPC`, `LCD` -2. Variables are in **camelCase** unless specified otherwise, eg. `bulkProposals`, `averageBlockTime` -3. Backend methods are in the format of **{scope}.{methodName}**, eg. `Validators.getAllDelegations`, `'Transactions.findDelegation'` - -If you have any question, do not hestiate to ping [Kwun](https://github.com/kwunyeung). diff --git a/big-dipper-backend/Dockerfile b/big-dipper-backend/Dockerfile deleted file mode 100644 index e64f36ab5b..0000000000 --- a/big-dipper-backend/Dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM geoffreybooth/meteor-base:2.7.3 - -COPY . app/ - -RUN bash app/scripts/build.sh - -FROM node:14.19.3-alpine - -RUN apk --no-cache add \ - bash \ - g++ \ - make - - -COPY --from=0 output/bundle app/bundle/ -COPY --from=0 app/scripts app/scripts - -RUN bash app/scripts/post_build.sh - -CMD ["node","--max-old-space-size=4096", "app/bundle/main.js"] - diff --git a/big-dipper-backend/LICENSE b/big-dipper-backend/LICENSE deleted file mode 100644 index e9bc737ead..0000000000 --- a/big-dipper-backend/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018 Forbole Limited - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/big-dipper-backend/README.md b/big-dipper-backend/README.md deleted file mode 100644 index b580ca6114..0000000000 --- a/big-dipper-backend/README.md +++ /dev/null @@ -1,110 +0,0 @@ -# Big Dipper :sparkles: - -Built on Pylons - -## Projects running on mainnets - -[Explore Akash with Big Dipper](https://akash.bigdipper.live/) - -[Explore Band Protocol with Big Dipper](https://band.bigdipper.live/) - -[Explore Cosmos Hub with Big Dipper](https://cosmos.bigdipper.live) - -[Explore e-Money with Big Dipper](https://e-money.network/) - -[Explore IRISnet with Big Dipper](https://iris.bigdipper.live) - -[Explore IOV with Big Dipper](https://big-dipper.iov-mainnet-2.iov.one/) - -[Explore Kava with Big Dipper](https://kava.bigdipper.live/) - -[Explore LikeCoin Chain with Big Dipper](http://likecoin.bigdipper.live/) - -## Projects with testnets - -[Agoric](https://explorer.testnet.agoric.com/) - -[Desmos Network](https://morpheus.desmos.network/) - -[Persistence](https://explorer.persistence.one/) - -[Regen Network](https://explorer.regen.vitwit.com/) - -[Sentinel](https://explorer.sentinel.co/) - -## How to run The Big Dipper - -1. Copy `default_settings.json` to `settings.json`. -2. Update the RPC and API URLs -3. Update Bech32 address prefixes -4. Add coins settings -5. Update Ledger settings - -### Requirements - -- [Meteor v2.x](https://www.meteor.com/install) - -### Run in local - -```sh -meteor npm install --save -meteor --settings settings.json -``` - -### Run via docker-compose - -```sh -METEOR_SETTINGS=$(cat settings.json) docker-compose up -``` - -### Run in production - -```sh -./scripts/build.sh -``` - -It will create a packaged Node JS tarball in `Linux x86_64` architecture at `../output`. Deploy that packaged Node JS project with process manager like [PM2](https://github.com/Unitech/pm2) or [Phusion Passenger](https://www.phusionpassenger.com/library/walkthroughs/basics/nodejs/fundamental_concepts.html). - -You will need to have [MongoDB >= 4.x](https://docs.mongodb.com/manual/administration/install-on-linux/) installed and [setup environment variables](https://guide.meteor.com/deployment.html#environment) correctly in order run in production. For more details on how to deploy a Meteor application, please refer to the offical documentation on [Custom Deployment](https://guide.meteor.com/deployment.html#custom-deployment). - -### Docker builds - -big-dipper docker image is a multi stage build that is based on [disney/meteor-base](https://github.com/disney/meteor-base/). When you change the meteor or node version, change the lines `FROM geoffreybooth/meteor-base:2` and `FROM node:12.16.1-alpine` respectively. When running the image follow the same [environment variable principles](https://guide.meteor.com/deployment.html#environment) mentioned above. If you get an `non-zero exit (137)` error during the build phase, increase docker container memory and swap limit. Ideally you can set up [remote docker host](https://www.digitalocean.com/community/tutorials/how-to-provision-and-manage-remote-docker-hosts-with-docker-machine-on-ubuntu-18-04) to prevent your computer's fan going brrrrrr. - - -#### passing configs as .env -json configs can be passed as .env in docker-compose as such - -``` -... -environment: - ROOT_URL: ${APP_ROOT_URL:-http://localhost} - MONGO_URL: mongodb://mongo:27017/meteor - PORT: 3000 - METEOR_SETTINGS: ${METEOR_SETTINGS} - FIREBASE_CONFIG: ${FIREBASE_CONFIG} - -... -``` -.env file - -``` -FIREBASE_CONFIG= -ROOT_URL=https: -MONGO_URL=mongodb://127.0.0.1:3001 -METEOR_SETTINGS= - -``` - - ---- - -## Donations :pray: - -The Big Dipper is always free and open. Anyone can use to monitor available Cosmos hub or zones, or port to your own chain built with Cosmos SDK. We welcome any supports to help us improve this project. - -ATOM: `cosmos1n67vdlaejpj3uzswr9qapeg76zlkusj5k875ma`\ -BTC: `bc1qye4k27zsn5nehzded6jwsvzg8qd6kgvxyhckts`\ -ETH: `0x8CAb9F3fC6bBBD819050365627FC6B79d0ea73e6` - -And by downloading and using [Brave](https://brave.com/big517). diff --git a/big-dipper-backend/SECURITY.md b/big-dipper-backend/SECURITY.md deleted file mode 100644 index 47794cdae7..0000000000 --- a/big-dipper-backend/SECURITY.md +++ /dev/null @@ -1,12 +0,0 @@ -# Security Policy - -## Supported Versions - -| Version | Supported | -| -------- | ------------------ | -| 0.37.x | :white_check_mark: | -| 0.38.x | :white_check_mark: | - -## Reporting a Vulnerability - -Please report any security issues via email to . diff --git a/big-dipper-backend/both/document.html b/big-dipper-backend/both/document.html deleted file mode 100644 index db0134fc37..0000000000 --- a/big-dipper-backend/both/document.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - Big Dipper | Built on Pylons - - - - - - - - - - - -
- diff --git a/big-dipper-backend/both/i18n/en-us.i18n.yml b/big-dipper-backend/both/i18n/en-us.i18n.yml deleted file mode 100644 index f8e507855b..0000000000 --- a/big-dipper-backend/both/i18n/en-us.i18n.yml +++ /dev/null @@ -1,308 +0,0 @@ -_locale: 'en-US' -_namespace: '' - -common: - height: 'Height' - voter: 'Voter' - votingPower: 'Voting Power' - addresses: 'Addresses' - amounts: 'Amounts' - delegators: 'delegators' - block: 'block' - blocks: 'blocks' - precommit: 'precommit' - precommits: 'precommits' - last: 'last' - backToList: 'Back to List' - collapse: 'Collapse' - information: 'Information' - time: 'Time' - hash: 'Hash' - more: 'More' - fullStop: '.' - searchPlaceholder: 'Search with tx hash / block height / address' - cancel: 'Cancel' - ok: 'Ok' - retry: 'Retry' - rewards: 'Rewards' - bondedTokens: 'Bonded Tokens' - totalNumOfDelegations: 'Total Number of Delegations' - signIn: 'Sign In' - generatingAddresses: 'Generating addresses' - selectAddress: 'Select address to log in with from the list below:' - defaultAddressMessage: 'Your default address is account 0.' - back: 'Back' - next: 'Next' - txOutOfGasMessage: 'Unable to broadcast the transaction due to insufficient balance. Ensure you have enough funds available on your account to cover the transaction fees.' - estimatedGasPrice: 'Estimated gas price is {$gasPrice}.' -navbar: - siteName: 'BIG DIPPER' - version: '-' - validators: 'Validators' - blocks: 'Blocks' - transactions: 'Transactions' - art_sales: 'Art Sales' - activity_feed: 'Activity Feed' - proposals: 'Proposals' - votingPower: 'Voting Power' - lang: "ENG" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - russian: "Русский" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: 'LICENSE' - forkMe: 'Fork me!' -consensus: - consensusState: 'Consensus State' - round: 'Round' - step: 'Step' -chainStates: - price: 'Price' - marketCap: 'Market Cap' - inflation: 'Inflation' - communityPool: 'Community Pool' -chainStatus: - startMessage: 'The chain is going to start in' - stopWarning: 'The chain appears to be stopped for {$time}! Feed me with new blocks 😭!' - latestHeight: 'Latest Block Height' - averageBlockTime: 'Average Block Time' - all: 'All' - now: 'Now' - allTime: 'All Time' - lastMinute: 'Last Minute' - lastHour: 'Last Hour' - lastDay: 'Last Day' - seconds: 'seconds' - activeValidators: 'Active Validators' - outOfValidators: 'out of {$totalValidators} validators' - onlineVotingPower: 'Online Voting Power' - fromTotalStakes: '{$percent} from {$totalStakes} {$denomPlural}' -analytics: - blockTimeHistory: 'Block Time History' - averageBlockTime: 'Average Block Time' - blockInterval: 'Block Interval' - noOfValidators: 'No. of Validators' -validators: - randomValidators: 'Random Validators' - moniker: 'Moniker' - uptime: 'Uptime' - selfPercentage: 'Self%' - commission: 'Commission' - lastSeen: 'Last Seen' - status: 'Status' - jailed: 'Jailed' - navActive: 'Active' - navInactive: 'Inactive' - active: 'Active Validators' - inactive: 'Inactive Validators' - listOfActive: 'Here is a list of active validators.' - listOfInactive: 'Here is a list of inactive validators.' - validatorDetails: 'Validator Details' - lastNumBlocks: 'Last {$numBlocks} blocks' - validatorInfo: 'Validator Info' - operatorAddress: 'Operator Address' - selfDelegationAddress: 'Self-Delegate Address' - deeplinks: 'Deeplinks' - commissionRate: 'Commission Rate' - maxRate: 'Max Rate' - maxChangeRate: 'Max Change Rate' - selfDelegationRatio: 'Self Delegation Ratio' - proposerPriority: 'Proposer Priority' - delegatorShares: 'Delegator Shares' - userDelegateShares: 'Shares Delegated by you' - tokens: 'Tokens' - unbondingHeight: 'Unbonding Height' - unbondingTime: 'Unbonding Time' - jailedUntil: 'Jailed Until' - powerChange: 'Power Change' - delegations: 'Delegations' - transactions: 'Transactions' - validatorNotExists: 'Validator does not exist.' - backToValidator: 'Back to Validator' - missedBlocks: 'Missed Blocks' - missedPrecommits: 'Missed Precommits' - missedBlocksTitle: 'Missed blocks of {$moniker}' - totalMissed: 'Total missed' - block: 'Block' - missedCount: 'Miss Count' - iDontMiss: 'I do not miss ' - lastSyncTime: 'Last sync time' - delegator: 'Delegator' - amount: 'Amount' -blocks: - block: 'Block' - proposer: 'Proposer' - latestBlocks: 'Latest blocks' - noBlock: 'No block.' - numOfTxs: 'No. of Txs' - numOfTransactions: 'No. of Transactions' - notFound: 'No such block found.' -nfts: - id: 'ID' - purchase_nfts: 'Purchased NFTs' - notFound: 'No Nfts data found.' - residual: 'Residual' - quanitiy: 'Quantity' - noBlock: 'No block.' - name: 'Title' - nft_rul: 'NFT_URL' - description: 'Description' - resalelink: 'Resalelink' -transactions: - transaction: 'Transaction' - transactions: 'Transactions' - notFound: 'No transaction found.' - activities: 'Activities' - txHash: 'Tx Hash' - valid: 'Valid' - fee: 'Fee' - noFee: 'No fee' - gasUsedWanted: 'Gas (used / wanted)' - noTxFound: 'No such transaction found.' - noValidatorTxsFound: 'No transaction related to this validator was found.' - memo: 'Memo' - transfer: 'Transfer' - staking: 'Staking' - distribution: 'Distribution' - governance: 'Governance' - slashing: 'Slashing' -proposals: - notFound: 'No proposal found.' - listOfProposals: 'Here is a list of governance proposals.' - proposer: 'Proposer' - proposal: 'proposal' - proposals: 'Proposals' - proposalID: 'Proposal ID' - title: 'Title' - status: 'Status' - submitTime: 'Submit Time' - depositEndTime: 'Deposit End Time' - votingStartTime: 'Voting Start Time' - votingEndTime: 'End Voting Time' - totalDeposit: 'Total Deposit' - description: 'Description' - proposalType: 'Proposal Type' - proposalStatus: 'Proposal Status' - notStarted: 'not started' - final: 'final' - deposit: 'Deposit' - tallyResult: 'Tally Result' - yes: 'Yes' - abstain: 'Abstain' - no: 'No' - noWithVeto: 'No with Veto' - percentageVoted: '{$percent} of online voting power has been voted.' - validMessage: 'This proposal is {$tentative}valid.' - invalidMessage: 'Less than {$quorum} of voting power is voted. This proposal is invalid.' - moreVoteMessage: 'It will be a valid proposal once {$moreVotes} more votes are cast.' - key: 'Key' - value: 'Value' - amount: 'Amount' - recipient: 'Recipient' - changes: 'Changes' - subspace: 'Subspace' -recipes: - purchase_message: 'Please use the Pylons app to purchase!' - notFound: 'No Recipe data found.' - listOfRecipes: 'Here is a list of recipes.' - listOfItems: 'Here is a list of items for sale.' - recipe: 'Recipe' - recipes: 'Recipes' - snapshots: 'Snapshots' - recipeID: 'Recipe ID' - cookbook: 'Cookbook' - cookbooks: 'Cookbooks' - cookbookID: 'Cookbook ID' - cookbookowner: 'Cookbook Owner' - price: 'Price' - artist: 'Artist' - copies: 'Copies' - total_copies: 'Total Copies' - name: 'Name' - blockInterval: 'BlockInterval' - title: 'Title' - status: 'Status' - submitTime: 'Submit Time' - depositEndTime: 'Deposit End Time' - votingStartTime: 'Voting Start Time' - votingEndTime: 'End Voting Time' - totalDeposit: 'Total Deposit' - description: 'Description' - sender: 'Sender' - email: 'SupportEmail' - developer: 'Developer' - deeplinks: 'DeepLinks' - disabled: 'Disabled' - yes: 'Yes' - no: 'No' - key: 'Key' - value: 'Value' - amount: 'Amount' - recipient: 'Recipient' - changes: 'Changes' - subspace: 'Subspace' -votingPower: - distribution: 'Voting Power Distribution' - pareto: 'Pareto Principle (20/80 rule)' - minValidators34: 'Min no. of validators hold 34%+ power' -accounts: - accountDetails: 'Account Details' - available: 'Available' - delegated: 'Delegated' - unbonding: 'Unbonding' - rewards: 'Rewards' - total: 'Total' - notFound: 'This account does not exist. Are you looking for a wrong address?' - validators: 'Validators' - shares: 'Shares' - mature: 'Mature' - no: 'No ' - none: 'No ' - delegation: 'Delegation' - plural: 's' - signOut: 'Sign out' - signInText: 'You are signed in as ' - toLoginAs: 'To log in as' - signInWithLedger: 'Sign In With Ledger' - signInWarning: 'Please make sure your Ledger device is turned on and {$network} App {$version} or above is opened.' - pleaseAccept: 'please accept in your Ledger device.' - noRewards: 'No Rewards' - BLESupport: 'Bluetooth connection is currently only supported on Google Chrome Browser.' -activities: - single: 'A' - happened: 'happened.' - senders: 'The following sender(s)' - sent: 'sent' - receivers: 'to the following receipient(s)' - received: 'received' - failedTo: 'failed to ' - to: 'to' - from: 'from' - operatingAt: 'operating at' - withMoniker: 'with moniker' - withTitle: 'with title' - withA: 'with a' - withAmount: 'with {$amount}' -messageTypes: - send: 'Send' - cookbooks: 'Cookbooks' - createAccount: 'CreateAccount' - multiSend: 'Multi Send' - createValidator: 'Create Validator' - editValidator: 'Edit Validator' - delegate: 'Delegate' - undelegate: 'Undelegate' - redelegate: 'Redelegate' - submitProposal: 'Submit Proposal' - deposit: 'Deposit' - vote: 'Vote' - withdrawComission: 'Withdraw Commission' - withdrawReward: 'Withdraw Reward' - modifyWithdrawAddress: 'Modify Withdraw Address' - unjail: 'Unjail' - IBCTransfer: 'IBC Transfer' - IBCReceive: 'IBC Receive' diff --git a/big-dipper-backend/both/i18n/es-es.i18n.yml b/big-dipper-backend/both/i18n/es-es.i18n.yml deleted file mode 100644 index 2b28751041..0000000000 --- a/big-dipper-backend/both/i18n/es-es.i18n.yml +++ /dev/null @@ -1,238 +0,0 @@ -_locale: 'es-ES' -_namespace: '' - -common: - height: 'Altura' - voter: 'Votante' - votingPower: 'Poder de votación' - addresses: 'Direcciones' - amounts: 'Cantidades' - delegators: 'delegadores' - block: 'bloque' - blocks: 'bloques' - precommit: 'precommit' - precommits: 'precommits' - last: 'último' - backToList: 'Volver a la lista' - information: 'Información' - time: 'Tiempo' - hash: 'Hash' - more: 'Más' - fullStop: '.' - searchPlaceholder: 'Buscar con el tx hash / altura de bloque / dirección' - cancel: 'Cancelar' - retry: 'Reintentar' -navbar: - siteName: 'BIG DIPPER' - validators: 'Validadores' - blocks: 'Bloques' - transactions: 'Transacciones' - activity_feed: 'Activity Feed' - art_sales: 'Art Sales' - proposals: 'Propuestas' - votingPower: 'Poder de voto' - lang: 'ES' - english: 'English' - spanish: 'Español' - italian: 'Italiano' - polish: 'Polski' - russian: 'Русский' - chinese: '中文(繁)' - simChinese: '中文(简)' - portuguese: 'Português' - license: 'LICENCIA' - forkMe: 'Fork me!' -consensus: - consensusState: 'Estado de consenso' - round: 'Ronda' - step: 'Paso' -chainStates: - price: 'Precio' - marketCap: 'Capitalización de mercado' - inflation: 'Inflación' - communityPool: 'Community Pool' -chainStatus: - startMessage: 'La cadena comenzará en' - stopWarning: 'La cadena parece estar parada por {$time}! Dame de comer nuevos bloques 😭!' - latestHeight: 'Última altura de bloque' - averageBlockTime: 'Tiempo medio de bloque' - all: 'Todo' - now: 'Ahora' - allTime: 'Todo el tiempo' - lastMinute: 'Último minuto' - lastHour: 'Última hora' - lastDay: 'Último día' - seconds: 'segundos' - activeValidators: 'Validadores activos' - outOfValidators: 'fuera de {$totalValidators} validadores' - onlineVotingPower: 'Poder de voto en línea' - fromTotalStakes: '{$percent} de {$totalStakes} {$denomPlural}' -analytics: - blockTimeHistory: 'Historial de tiempo de bloque' - averageBlockTime: 'Tiempo medio de bloque' - blockInterval: 'Intervalo de bloque' - noOfValidators: 'No. de validadores' -validators: - randomValidators: 'Validadores aleatorios' - moniker: 'Moniker' - uptime: 'Tiempo de funcionamiento' - selfPercentage: 'Self%' - commission: 'Comisión' - lastSeen: 'Última vez visto' - status: 'Estado' - jailed: 'Encarcelado' - navActive: 'Activo' - navInactive: 'Inactivo' - active: 'Validadores activos' - inactive: 'Validadores inactivos' - listOfActive: 'Esta es una lista de los validadores activos.' - listOfInactive: 'Esta es una lista de los validadores inactivos.' - validatorDetails: 'Detalles del validador' - lastNumBlocks: 'Último {$numBlocks} bloques' - validatorInfo: 'Información del validador' - operatorAddress: 'Dirección de operador' - selfDelegationAddress: 'Dirección de autodelegación' - deeplinks: 'Deeplinks' - commissionRate: 'Ratio de comisión' - maxRate: 'Ratio máximo' - maxChangeRate: 'Ratio máximo de cambio' - selfDelegationRatio: 'Ratio de autodelegación' - proposerPriority: '' - delegatorShares: 'Acciones del delegador' - userDelegateShares: 'Acciones delegadas por ti' - tokens: 'Tokens' - unbondingHeight: 'Altura ' - unbondingTime: 'Tiempo para desvincularse' - powerChange: 'Power Change' - delegations: 'Delegaciones' - transactions: 'Transacciones' - validatorNotExists: 'El validador no existe.' - backToValidator: 'Volver al validador' - missedBlocks: 'Bloques perdidos' - missedPrecommits: 'Precommits perdidos' - missedBlocksTitle: 'Bloques perdidos de {$moniker}' - totalMissed: 'Total perdido' - block: 'Bloque' - missedCount: 'Perdidos' - iDontMiss: 'No he perdido ' - lastSyncTime: 'Último tiempo de sincronización' - delegator: 'Delegador' - amount: 'Cantidad' -blocks: - block: 'Bloque' - proposer: 'Proposer' - latestBlocks: 'Últimos bloques' - noBlock: 'No bloque.' - numOfTxs: 'No. de txs' - numOfTransactions: 'No. de transacciones' - notFound: 'No se ha encontrado tal bloque.' -transactions: - transaction: 'Transacción' - transactions: 'Transacciones' - notFound: 'No se encuentra la transacción.' - activities: 'Movimientos' - txHash: 'Tx Hash' - valid: 'Validez' - fee: 'Comisión' - noFee: 'No fee' - gasUsedWanted: 'Gas (usado / deseado)' - noTxFound: 'No se encontró ninguna transacción de este tipo.' - noValidatorTxsFound: 'No se encontró ninguna transaccion relacionada con este validador.' - memo: 'Memo' - transfer: 'Transferencia' - staking: 'Participación' - distribution: 'Distribución' - governance: 'Gobernanza' - slashing: 'Recorte' -proposals: - notFound: 'No se ha encontrado el proposal.' - listOfProposals: 'Here is a list of governance proposals.' - proposer: 'Proposer' - proposal: 'propuesta' - proposals: 'Propuestas' - proposalID: 'ID de la propuesta' - title: 'Título' - status: 'Estado' - submitTime: 'Plazo de entrega' - depositEndTime: 'Final del tiempo de depósito' - votingStartTime: 'Hora de inicio de la votación' - votingEndTime: 'Fin del tiempo de votación' - totalDeposit: 'Depósito total' - description: 'Descripción' - proposalType: 'Tipo de propuesta' - proposalStatus: 'Estado de la propuesta' - notStarted: 'no iniciado' - final: 'final' - deposit: 'Depósito' - tallyResult: 'Resultado del recuento' - yes: 'Si' - abstain: 'Abstención' - no: 'No' - none: 'None' - noWithVeto: 'No con Veto' - percentageVoted: '{$percent} del poder de voto online ha votado.' - validMessage: 'Este proposal es {$tentative}valido.' - invalidMessage: 'Menos del {$quorum} del poder de voto ha votado. Este proposal es invalido.' - moreVoteMessage: 'Será una propuesta válida una vez que {$moreVotes} más votos se emitan.' - key: 'Key' - value: 'Value' - amount: 'Amount' - recipient: 'Recipient' - changes: 'Changes' - subspace: 'Subspace' -votingPower: - distribution: 'Distribución del poder de Voto' - pareto: 'Pareto Principle (20/80 rule)' - minValidators34: 'Min no. of validators hold 34%+ power' -accounts: - accountDetails: 'Detalles de la cuenta' - available: 'Disponible' - delegated: 'Delegado' - unbonding: 'Unbonding' - rewards: 'Rewards' - total: 'Total' - notFound: 'Esta cuenta no existe. ¿Estas buscando una dirección equivocada?' - validators: 'Validadores' - shares: 'Shares' - mature: 'Mature' - no: 'No ' - delegation: 'Delegación' - plural: 's' - signOut: 'Cerrar sesión' - signInText: 'Estas registrado como ' - toLoginAs: 'Para conectarse como' - signInWithLedger: 'Registrarse con Ledger' - signInWarning: 'Por favor, asegúrese de que su dispositivo Ledger esté conectado y la App de Cosmos con la version 1.5.0 o superior esta abierta.' - pleaseAccept: 'por favor, acepta en tu dispositivo Ledger.' - noRewards: 'No Rewards' -activities: - single: 'A' - happened: 'sucedió.' - senders: 'Los siguientes remitentes' - sent: 'enviado a' - receivers: 'al siguiente destinatario' - received: 'recibido' - failedTo: 'failed to ' - to: 'a' - from: 'desde' - operatingAt: 'operando en' - withMoniker: 'con el moniker' - withTitle: 'con el título' - withA: 'con' -messageTypes: - send: 'Enviar' - multiSend: 'Multi Envío' - createValidator: 'Crear validador' - editValidator: 'Editar validador' - delegate: 'Delegar' - undelegate: 'Undelegar' - redelegate: 'Redelegar' - submitProposal: 'Enviar Proposal' - deposit: 'Depositar' - vote: 'Voto' - withdrawComission: 'Enviar comisión' - withdrawReward: 'Retirar recompensa' - modifyWithdrawAddress: 'Modificar la dirección de envío' - unjail: 'Unjail' - IBCTransfer: 'IBC Transfer' - IBCReceive: 'IBC Receive' diff --git a/big-dipper-backend/both/i18n/it-IT.i18n.yml b/big-dipper-backend/both/i18n/it-IT.i18n.yml deleted file mode 100644 index 1e57c837f6..0000000000 --- a/big-dipper-backend/both/i18n/it-IT.i18n.yml +++ /dev/null @@ -1,237 +0,0 @@ -_locale: 'it-IT' -_namespace: '' - -common: - height: 'Altezza' - voter: 'Votante' - votingPower: 'Potere di voto' - addresses: 'Indirizzi' - amounts: 'Importi' - delegators: 'delegatori' - block: 'blocco' - blocks: 'blocchi' - precommit: 'precommit' - precommits: 'precommit' - last: 'ultimo' - backToList: 'Torna alla Lista' - information: 'Informazioni' - time: 'Tempo' - hash: 'Hash' - more: 'Di più' - fullStop: '.' - searchPlaceholder: 'Cerca hash transazione / altezza blocco / indirizzo' - cancel: 'Annulla' - retry: 'Riprova' - rewards: 'Reward' -navbar: - siteName: 'BIG DIPPER' - validators: 'Validatori' - blocks: 'Blocchi' - transactions: 'Transazioni' - proposals: 'Proposte' - votingPower: 'Potere di Voto' - lang: "IT" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - russian: "Русский" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: 'LICENZA' - forkMe: 'Forkami!' -consensus: - consensusState: 'Stato del consenso' - round: 'Round' - step: 'Step' -chainStates: - price: 'Prezzo' - marketCap: 'Market Cap' - inflation: 'Inflazione' - communityPool: 'Community Pool' -chainStatus: - startMessage: 'The chain partirà tra' - stopWarning: 'La chain sembra essersi fermata per {$time}! Dammi nuovi blocchi 😭!' - latestHeight: 'Ultima Altezza di Blocco' - averageBlockTime: 'Tempo di Blocco Medio' - all: 'Tutti' - now: 'Ora' - allTime: 'Tutti i tempi' - lastMinute: 'Ultimo Minuto' - lastHour: 'Ultima ora' - lastDay: 'Ultimo giorno' - seconds: 'secondi' - activeValidators: 'Validatori Attivi' - outOfValidators: 'di {$totalValidators} validatori' - onlineVotingPower: 'Voting Power Attivo' - fromTotalStakes: '{$percent} di {$totalStakes} {$denomPlural}' -analytics: - blockTimeHistory: 'Storia Tempo di Blocco' - averageBlockTime: 'Tempo di Blocco Medio' - blockInterval: 'Intervallo di Blocco' - noOfValidators: 'N. Validatori' -validators: - randomValidators: 'Validatori random' - moniker: 'Moniker' - uptime: 'Uptime' - selfPercentage: '% autodelegata' - commission: 'Commissioni' - lastSeen: 'Visto per ultimo' - status: 'Stato' - jailed: 'Jailato' - navActive: 'Attivo' - navInactive: 'Inattivo' - active: 'Tutti i Validatori' - inactive: 'Validatori inattivi' - listOfActive: 'Ecco una lista di validatori attivi.' - listOfInactive: 'Ecco una lista di validatori inattivi.' - validatorDetails: 'Dettagli validatore' - lastNumBlocks: 'Utlimi {$numBlocks} blocchi' - validatorInfo: 'Info Validatore' - operatorAddress: 'Indirizzo Operatore' - selfDelegationAddress: 'Indirizzo di Auto-Delega' - deeplinks: 'Deeplinks' - commissionRate: 'Tasso di commissioni' - maxRate: 'Tasso massima' - maxChangeRate: 'Cambiamento del tasso massimo' - selfDelegationRatio: 'Tasso di Auto Delega' - proposerPriority: 'Priorità del proponente' - delegatorShares: 'Percentuale dei delegati' - userDelegateShares: 'Percentuale delega personale' - tokens: 'Token' - unbondingHeight: 'Altezza di unbond' - unbondingTime: 'Tempo di unbond' - powerChange: 'Modifica del potere' - delegations: 'Delegazioni' - transactions: 'Transazioni' - validatorNotExists: 'Validatore inesistente' - backToValidator: 'Torna al validatore' - missedBlocks: 'Blocchi mancanti' - missedPrecommits: 'Precommit mancati' - missedBlocksTitle: 'Manca il blocco: {$moniker}' - totalMissed: 'Totale perso' - block: 'Blocco' - missedCount: 'Mancato conteggio' - iDontMiss: 'Non mi manca' - lastSyncTime: 'Ultima sincronizzazione ora' - delegator: 'Delegante' - amount: 'Importo' -blocks: - block: 'Blocco' - proposer: 'Proponente' - latestBlocks: 'Ultimi blocchi' - noBlock: 'Nessun blocco' - numOfTxs: 'N. Txs' - numOfTransactions: 'N. di transazioni' - notFound: 'Nessun blocco trovato.' -transactions: - transaction: 'Transazione' - transactions: 'Transazioni' - notFound: 'Nessuna transazione trovata' - activities: 'Attività' - txHash: 'Hash Tx' - valid: 'Valido' - fee: 'Fee' - noFee: 'Nessuna fee' - gasUsedWanted: 'Gas (usato / voluto)' - noTxFound: 'Nessuna transazione trovata.' - noValidatorTxsFound: 'Nessuna transazione relativa a questo validatore trovata' - memo: 'Memo' - transfer: 'Trasferimento' - staking: 'Staking' - distribution: 'Distribuzione' - governance: 'Governance' - slashing: 'Slashing' -proposals: - notFound: 'Nessuna proposta trovata.' - listOfProposals: 'Questa è la lista delle proposte di governance' - proposer: 'Proponente' - proposal: 'Proposta' - proposals: 'Proposte' - proposalID: 'ID Proposta' - title: 'Titolo' - status: 'Stato' - submitTime: 'Ora invio' - depositEndTime: 'Ora di fine deposito' - votingStartTime: 'Ora di inizio votazione' - votingEndTime: 'Ora di fine votazione' - totalDeposit: 'Deposito totale' - description: 'Descrizione' - proposalType: 'Tipo di proposta' - proposalStatus: 'Stato della proposta' - notStarted: 'Non iniziato' - final: 'Finale' - deposit: 'Deposito' - tallyResult: 'Risultato conteggio' - yes: 'Sì' - abstain: 'Astenersi' - no: 'No' - noWithVeto: 'No con Veto' - percentageVoted: '{$percent} di voti raccolti tra i votanti attivi.' - validMessage: 'Questa proposta è {$tentative}valida.' - invalidMessage: 'Sono stati raccolti meno del {$quorum} di voti. Questa proposta è invalida.' - moreVoteMessage: 'Sarà una proposta valida quando {$moreVotes} più voti di ora saranno raccolti.' - key: 'Key' - value: 'Value' - amount: 'Amount' - recipient: 'Recipient' - changes: 'Changes' - subspace: 'Subspace' -votingPower: - distribution: 'Distribuzione del potere di voto' - pareto: 'Principio di Pareto (regola 20/80)' - minValidators34: 'Min n. di validatori che possiede il 34%+ di potere' -accounts: - accountDetails: 'Dettagli account' - available: 'Disponibile' - delegated: 'Delegati' - unbonding: 'Unbonding' - rewards: 'Rewards' - total: 'Totale' - notFound: "Questo account non esiste. Forse hai inserito l'indirizzo sbagliato?" - validators: 'Validatori' - shares: 'Share' - mature: 'Maturo' - no: 'No ' - none: 'Nessuno' - delegation: 'Delega' - plural: '' - signOut: 'Esci' - signInText: 'Registrati come' - toLoginAs: 'Accedi come' - signInWithLedger: 'Registrati con un Ledger' - signInWarning: 'Per favore assicurati che il tuo Ledger sia connesso e {$network} App {$version} or above che sia aperto.' - pleaseAccept: 'Per favore accetta nel tuo Ledger' - noRewards: 'Nessun reward' -activities: - single: 'Un (male), una (female)' - happened: 'è accaduto.' - senders: 'I seguenti mittenti' - sent: 'Inviato' - receivers: 'I seguenti destinatati' - received: 'Ricevuto' - failedTo: 'Ha fallito a ' - to: 'A' - from: 'Da' - operatingAt: 'che operano presso' - withMoniker: 'con moniker' - withTitle: 'con titolo' - withA: 'con un (male) / una (female)' -messageTypes: - send: 'Invia' - multiSend: 'Invio multipo' - createValidator: 'Crea un validatore' - editValidator: 'Modifica un validatore' - delegate: 'Delega' - undelegate: 'Rimuovi delega' - redelegate: 'Ridelega' - submitProposal: 'Invia proposta' - deposit: 'Deposita' - vote: 'Vota' - withdrawComission: 'Ritira una commissione' - withdrawReward: 'Ottieni un reward' - modifyWithdrawAddress: 'Modifica indirizzo di ritiro' - unjail: 'Unjail' - IBCTransfer: 'Trasferisci IBC' - IBCReceive: 'Ricevi IBC' diff --git a/big-dipper-backend/both/i18n/pl-PL.i18n.yml b/big-dipper-backend/both/i18n/pl-PL.i18n.yml deleted file mode 100644 index 86d344f869..0000000000 --- a/big-dipper-backend/both/i18n/pl-PL.i18n.yml +++ /dev/null @@ -1,237 +0,0 @@ -_locale: 'pl-PL' -_namespace: '' - -common: - height: 'Wysokość' - voter: 'Głosujący' - votingPower: 'Siła Głosu' - addresses: 'Adres' - amounts: 'Kwota' - delegators: 'Delegatorzy' - block: 'blok' - blocks: 'bloki' - precommit: 'precommit' - precommits: 'precommits' - last: 'ostatni' - backToList: 'Powrtót do Listy' - information: 'Informacje' - time: 'Czas' - hash: 'Hash' - more: 'Więcej' - fullStop: '.' - searchPlaceholder: 'Wyszukaj adres / transakcję / wysokość bloku' - cancel: 'Anuluj' - retry: 'Spróbuj ponownie' - rewards: 'Nagrody' -navbar: - siteName: 'Wielki Wóz' - validators: 'Walidatorzy' - blocks: 'Bloki' - transactions: 'Transakcje' - proposals: 'Propozycje' - votingPower: 'Siła Głosu' - lang: "PL" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - russian: "Русский" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: 'LICENCJA' - forkMe: 'Fork me!' -consensus: - consensusState: 'Status Konsensusu' - round: 'Runda' - step: 'Etap' -chainStates: - price: 'Cena' - marketCap: 'Kapitalizacja rynkowa' - inflation: 'Inflacja' - communityPool: 'Zasoby Społeczności' -chainStatus: - startMessage: 'Łańcuch bloków danych rozpocznie działanie za ' - topWarning: 'Wygląda na to że, łańcuch bloków danych zatrzymał się na {$time}! Odśwież stronę i nakarm mnie nowymi blokami 😭!' - latestHeight: 'Ostatnia wysokość bloku' - averageBlockTime: 'Średni Czas Bloku' - all: 'Całość' - now: 'Teraz' - allTime: 'Cały Czas' - lastMinute: 'Ostatnia Minuta' - lastHour: 'Ostatnia Godzina' - lastDay: 'Ostatni Dzień' - seconds: 'sekund' - activeValidators: 'Aktywni Walidatorzy' - outOfValidators: 'z grona {$totalValidators} walidatorów' - onlineVotingPower: 'Siła Głosu Online' - fromTotalStakes: '{$percent} spośród {$totalStakes} {$denomPlural}' -analytics: - blockTimeHistory: 'Czas Bloków' - averageBlockTime: 'Średni Czas Bloku' - blockInterval: 'Interwał Bloku' - noOfValidators: 'Liczba Walidatorów' -validators: - randomValidators: 'Losowo Wybrani Walidatorzy' - moniker: 'Moniker' - uptime: 'Dyspozycyjność' - selfPercentage: 'Self%' - commission: 'Prowizja' - lastSeen: 'Ostatnio widziany' - status: 'Status' - jailed: 'Jailed' - navActive: 'Aktywni' - navInactive: 'Nieaktywni' - active: 'Aktywni Walidatorzy' - inactive: 'Nieaktywni Walidatorzy' - listOfActive: 'Lista aktywnych Walidatorów' - listOfInactive: 'Lista nieaktywnych Walidatorów' - validatorDetails: 'Szczegóły Walidatora' - lastNumBlocks: 'Ostatnie {$numBlocks} bloków' - validatorInfo: 'Szczegóły Walidatora' - operatorAddress: 'Adres Operatora' - selfDelegationAddress: 'Adres Delegacji Self' - deeplinks: 'Deeplinks' - commissionRate: 'Wysokość prowizji' - maxRate: 'Maksymalna Stawka' - maxChangeRate: 'Maksymalna Stawka Zmiany Prowizji' - selfDelegationRatio: 'Proporcja Delegacji Self' - proposerPriority: 'Piorytet Propozycji' - delegatorShares: 'Akcje Delegującego' - userDelegateShares: 'Akcje Oddelegowane przez Ciebie' - tokens: 'Tokeny' - unbondingHeight: 'Wysokość Unbonding' - unbondingTime: 'Czas Unbonding' - powerChange: 'Zmiana Siły Głosu' - delegations: 'Delegacje' - transactions: 'Transakcje' - validatorNotExists: 'Walidator nie istnieje.' - backToValidator: 'Powrtót do Walidatora' - missedBlocks: 'Pominięte Bloki' - missedPrecommits: 'Pominięte Precommits' - missedBlocksTitle: ‘Pominięte Bloki od {$moniker}' - totalMissed: 'Łącznie pominięto' - block: 'Blok' - missedCount: 'Liczba pominiętych' - iDontMiss: 'Żadne bloki nie zostały pominięte' - lastSyncTime: 'Ostatni czas synch' - delegator: 'Delegujący' - amount: 'Kwota' -blocks: - block: 'Blok' - proposer: 'Autor Propozycji' - latestBlocks: 'Ostatnie Bloki' - noBlock: 'Ilość Bloków' - numOfTxs: 'Liczba Txs' - numOfTransactions: 'Liczba Transakcji' - notFound: 'Nie znaleziono bloku.' -transactions: - transaction: 'Transakcja' - transactions: 'Transakcje' - notFound: 'Nie znaleziono transakcji.' - activities: 'Aktywność' - txHash: 'Tx Hash' - valid: 'Ważna' - fee: 'Opłata' - noFee: 'Bezpłatnie' - gasUsedWanted: 'Gaz (użyty/ wymagany)' - noTxFound: 'Nie znaleziono podanej transakcji.' - noValidatorTxsFound: 'Nie znaleziono żadnej transakcji dla podanego Walidatora' - memo: 'Memo' - transfer: 'Wysłane' - staking: 'Udziały' - distribution: 'Dystrybucja' - governance: 'Administracja' - slashing: 'Cięcia' -proposals: - notFound: Nie znaleziono propozycji.' - listOfProposals: 'Poniżej znajduje się lista propozycji administracyjnych.' - proposer: 'Autor Propozycji' - proposal: 'propozycja' - proposals: 'Propozycje' - proposalID: 'ID Propozycji' - title: 'Tytuł' - status: 'Status' - submitTime: 'Czas Wysłania' - depositEndTime: 'Czas Końcowy dla Skladania Depozytu' - votingStartTime: 'Czas Rozpoczęcia Głosowania' - votingEndTime: 'Czas Końcowy Głosowania' - totalDeposit: 'Kwota Depozytu' - description: 'Szczegóły' - proposalType: 'Typ Propozycji' - proposalStatus: 'Status Propozycji' - notStarted: 'nie rozpoczęto' - final: 'końcowy' - deposit: 'Depozyt' - tallyResult: 'Wyniki Tally' - yes: 'Tak' - abstain: 'Wstrzymaj się od Głosu' - no: 'Nie' - noWithVeto: 'Nie z Veto' - percentageVoted: '{$percent} Głosów Online zostalo oddanych' - validMessage: 'Podana propozycja jest {$tentative}ważna.' - invalidMessage: 'Mniej niż {$quorum} głosów zostało oddanych. Podana propozycja jest nieważna.' - moreVoteMessage: 'Propozycja zostanie uznana za ważną jeśli {$moreVotes} lub więcej głosów zostanie oddanych.' - key: 'Key' - value: 'Value' - amount: 'Kwota' - recipient: 'Odbiorca' - changes: 'Zmiany' - subspace: 'Subspace' -votingPower: - distribution: 'Podział Siły Głosu' - pareto: 'Zasada Pareta (zasada 20/80)' - minValidators34: 'Co najmniej 34% Walidatorów ma prawo do głosowania.' -accounts: - accountDetails: 'Szczegóły Konta' - available: 'Dostępe' - delegated: 'Oddelegowane' - unbonding: 'Unbonding' - rewards: 'Nagrody' - total: 'Łącznie' - notFound: 'Konto nie istnieje. Sprawdź, czy adres odbiorcy został prawidłowo wpisany.' - validators: 'Walidatorzy' - shares: 'Akcje' - mature: 'Dojrzały' - no: 'Nie ' - none: 'Brak ' - delegation: 'Delegacja' - plural: '' - signOut: 'Wyloguj' - signInText: 'Zalogowany jako ' - toLoginAs: 'Aby zalogować się jako ' - signInWithLedger: 'Zaloguj się z Ledgerem' - signInWarning: 'Upewnij się, że Twój Ledger jest podłączony do komputera oraz aplikacja {$network} App {$version} lub nowsza jest uruchomiona.' - pleaseAccept: 'zaakceptuj połączenie na Twoim Ledgerze.' - noRewards: 'Brak Nagród' -activities: - single: ' ' - happened: 'został wykonany' - senders: 'Nadawca' - sent: 'wysłał' - receivers: 'do podanych odbiorców/cy' - received: 'otrzymał' - failedTo: 'Nie udało się' - to: 'do' - from: 'od' - operatingAt: 'operujący pod adresem' - withMoniker: 'z monikerem' - withTitle: 'pod tytułem' - withA: 'razem z' -messageTypes: - send: 'Wysłał' - multiSend: 'Wysłał Multi' - createValidator: 'Utwórz Walidatora' - editValidator: 'Edytuj Walidatora' - delegate: 'Oddelegował' - undelegate: 'Wycofał Oddelegowane Tokeny' - redelegate: 'Oddelegował Ponownie' - submitProposal: 'Wyśłał Propozycję' - deposit: 'Wpłacił Depozyt' - vote: 'Zagłosował' - withdrawComission: 'Wypłacił Prowizję' - withdrawReward: 'Wypłacił Nagrody' - modifyWithdrawAddress: 'Zmienił adres do wypłaty' - unjail: 'Unjail' - IBCTransfer: 'Wyślij IBC' - IBCReceive: 'Odbierz IBC' diff --git a/big-dipper-backend/both/i18n/pt-BR.i18n.yml b/big-dipper-backend/both/i18n/pt-BR.i18n.yml deleted file mode 100644 index 7f881f93ed..0000000000 --- a/big-dipper-backend/both/i18n/pt-BR.i18n.yml +++ /dev/null @@ -1,236 +0,0 @@ -_locale: 'pt-BR' -_namespace: '' - -common: - height: 'Altura' - voter: 'Eleitor' - votingPower: 'Poder de voto' - addresses: 'Endereços' - amounts: 'Quantidades' - delegators: 'delegadores' - block: 'bloco' - blocks: 'blocos' - precommit: 'precommit' - precommits: 'precommits' - last: 'último' - backToList: 'Voltar para lista' - information: 'Informação' - time: 'Data e hora' - hash: 'Hash' - more: 'Mais' - fullStop: '.' - searchPlaceholder: 'Pesquise por tx hash / altura do bloco / endereço' - cancel: 'Cancelar' - retry: 'Tentar novamente' - rewards: 'Recompensas' -navbar: - siteName: 'BIG DIPPER' - validators: 'Validadores' - blocks: 'Blocos' - transactions: 'Transações' - proposals: 'Propostas' - votingPower: 'Poder de voto' - lang: "pt-BR" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: 'LICENÇA' - forkMe: 'Fork me!' -consensus: - consensusState: 'Estado de consenso' - round: 'Rodada' - step: 'Etapa' -chainStates: - price: 'Preço' - marketCap: 'Valor de mercado' - inflation: 'Inflação' - communityPool: 'Pool da comunidade' -chainStatus: - startMessage: 'A cadeia vai começar em' - stopWarning: 'A cadeia parece ter parado por {$time}! Alimente-me com novos blocos 😭!' - latestHeight: 'Última altura de bloco' - averageBlockTime: 'Tempo médio de bloco' - all: 'Tudo' - now: 'Agora' - allTime: 'Todo tempo' - lastMinute: 'Último minuto' - lastHour: 'Última hora' - lastDay: 'Último dia' - seconds: 'segundos' - activeValidators: 'Validadores ativos' - outOfValidators: 'de {$totalValidators} validadores' - onlineVotingPower: 'Poder de votação online' - fromTotalStakes: '{$percent} de {$totalStakes} {$denomPlural}' -analytics: - blockTimeHistory: 'Histórico de tempo de bloco' - averageBlockTime: 'Tempo médio de bloco' - blockInterval: 'Intervalo de bloco' - noOfValidators: 'Nº de validadores' -validators: - randomValidators: 'Validadores aleatórios' - moniker: 'Apelido' - uptime: 'Tempo de atividade' - selfPercentage: 'Self%' - commission: 'Comissão' - lastSeen: 'Visto pela última vez' - status: 'Status' - jailed: 'Engaiolado' - navActive: 'Ativo' - navInactive: 'Inativo' - active: 'Validadores Ativos' - inactive: 'Validadores Inativos' - listOfActive: 'Aqui está uma lista de validadores ativos.' - listOfInactive: 'Aqui está uma lista de validadores inativos.' - validatorDetails: 'Detalhes do validador' - lastNumBlocks: 'Últimos {$numBlocks} blocos' - validatorInfo: 'Informação do validador' - operatorAddress: 'Endereço do operador' - selfDelegationAddress: 'Endereço de auto-delegação' - deeplinks: 'Deeplinks' - commissionRate: 'Taxa de Comissão' - maxRate: 'Taxa máxima' - maxChangeRate: 'Taxa máxima de alteração' - selfDelegationRatio: 'Razão de auto-delegação' - proposerPriority: 'Prioridade do proponente' - delegatorShares: 'Ações do delegador' - userDelegateShares: 'Ações delegadas por você' - tokens: 'Tokens' - unbondingHeight: 'Altura de desvinculação' - unbondingTime: 'Tempo de desvinculação' - powerChange: 'Mudança de poder' - delegations: 'Delegações' - transactions: 'Transações' - validatorNotExists: 'O validador não existe.' - backToValidator: 'Voltar para validador' - missedBlocks: 'Blocos perdidos' - missedPrecommits: 'Precommits perdidos' - missedBlocksTitle: 'Blocos perdidos por {$moniker}' - totalMissed: 'Total perdido' - block: 'Bloco' - missedCount: 'Contagem de perdidos' - iDontMiss: 'Não há perdidos ' - lastSyncTime: 'Última sincronização' - delegator: 'Delegador' - amount: 'Quantidade' -blocks: - block: 'Bloco' - proposer: 'Proponente' - latestBlocks: 'Últimos Blocos' - noBlock: 'Sem bloco.' - numOfTxs: 'No. de Txs' - numOfTransactions: 'Nº de transações' - notFound: 'Nenhum bloco encontrado.' -transactions: - transaction: 'Transação' - transactions: 'Transações' - notFound: 'Nenhuma transação encontrada.' - activities: 'Atividades' - txHash: 'Tx Hash' - valid: 'Validade' - fee: 'Taxa' - noFee: 'Sem taxa' - gasUsedWanted: 'Gas (usado / desejado)' - noTxFound: 'Nenhuma transação encontrada.' - noValidatorTxsFound: 'Nenhuma transação relacionada a este validador foi encontrada.' - memo: 'Memo' - transfer: 'Transferência' - staking: 'Participação' - distribution: 'Distribuição' - governance: 'Governança' - slashing: 'Cortando' -proposals: - notFound: 'Nenhuma proposta encontrada.' - listOfProposals: 'Aqui está uma lista de propostas de governança.' - proposer: 'Proponente' - proposal: 'proposta' - proposals: 'Propostas' - proposalID: 'ID da proposta' - title: 'Título' - status: 'Status' - submitTime: 'Tempo de envio' - depositEndTime: 'Fim do tempo de depósito' - votingStartTime: 'Hora do início da votação' - votingEndTime: 'Fim do tempo de votação' - totalDeposit: 'Depósito Total' - description: 'Descrição' - proposalType: 'Tipo de proposta' - proposalStatus: 'Status da proposta' - notStarted: 'não iniciado' - final: 'final' - deposit: 'Depósito' - tallyResult: 'Resultado da contagem' - yes: 'Sim' - abstain: 'Abstenção' - no: 'Não' - noWithVeto: 'Não com Veto' - percentageVoted: '{$percent} do poder de voto já votou.' - validMessage: 'Esta proposta é {$tentative}válida.' - invalidMessage: 'Menos de {$ quorum} do poder de voto foi votado. Esta proposta é inválida..' - moreVoteMessage: 'Será uma proposta válida uma vez que {$moreVotes} mais votos sejam enviados.' - key: 'Chave' - value: 'Valor' - amount: 'Quantidade' - recipient: 'Recebedor' - changes: 'Alterações' - subspace: 'Subespaço' -votingPower: - distribution: 'Distribuição do poder de voto' - pareto: 'Princípio de Pareto (regra 20/80)' - minValidators34: 'Número mínimo de validadores que detem 34%+ de poder' -accounts: - accountDetails: 'Detalhes da conta' - available: 'disponível' - delegated: 'delegado' - unbonding: 'desvinculação' - rewards: 'Recompensas' - total: 'Total' - notFound: 'Essa conta não existe. Você está informando o endereço correto?' - validators: 'Validadores' - shares: 'Ações' - mature: 'Mature' - no: 'Não ' - none: 'Sem ' - delegation: 'delegação' - plural: 's' - signOut: 'Sair' - signInText: 'Você está conectado como ' - toLoginAs: 'Para entrar como' - signInWithLedger: 'Entrar com Ledger' - signInWarning: 'Certifique-se de que seu dispositivo Ledger esteja conectado e o {$network} App {$version} ou superior esteja aberto.' - pleaseAccept: 'por favor, aceite em seu dispositivo Ledger.' - noRewards: 'Sem recompensas' -activities: - single: 'A' - happened: 'aconteceu.' - senders: 'O(s) seguinte(s) remetente(s)' - sent: 'enviado' - receivers: 'para o(s) seguinte(s) destinatário(s)' - received: 'recebido' - failedTo: 'falhou em' - to: 'para' - from: 'de' - operatingAt: 'operado por' - withMoniker: 'com o apelido' - withTitle: 'com o título' - withA: 'com' -messageTypes: - send: 'Enviou' - multiSend: 'Envio múltiplo' - createValidator: 'Criar Validador' - editValidator: 'Editar Validador' - delegate: 'Delegar' - undelegate: 'Undelegar' - redelegate: 'Redelegar' - submitProposal: 'Enviar proposta' - deposit: 'Depósito' - vote: 'Vote' - withdrawComission: 'Retirar Comissão' - withdrawReward: 'Retirar Recompensa' - modifyWithdrawAddress: 'Modificar Endereço de Retirada' - unjail: 'Sair da jaula' - IBCTransfer: 'IBC transferido' - IBCReceive: 'IBC recebido' diff --git a/big-dipper-backend/both/i18n/ru-RU.i18n.yml b/big-dipper-backend/both/i18n/ru-RU.i18n.yml deleted file mode 100644 index 02b681ace2..0000000000 --- a/big-dipper-backend/both/i18n/ru-RU.i18n.yml +++ /dev/null @@ -1,252 +0,0 @@ -_locale: 'ru-RU' -_namespace: '' - -common: - height: 'Высота Блока' - voter: 'Избиратель' - votingPower: 'Право Голоса' - addresses: 'Адреса' - amounts: 'Суммы' - delegators: 'Делегаторы' - block: 'Блок' - blocks: 'Блоки' - precommit: 'Прекоммит' - precommits: 'Прекоммиты' - last: 'Последний' - backToList: 'Назад к списку' - information: 'Информация' - time: 'Время' - hash: 'Хэш' - more: 'Дальше' - fullStop: '.' - searchPlaceholder: 'Поиск по хэшу сделки / высоте блока / адресу' - cancel: 'Отмена' - retry: 'Повторить попытку' - rewards: 'Награды' - bondedTokens: 'Bonded Tokens' - totalNumOfDelegations: 'Всего Делегирований' - signIn: 'Войти' - generatingAddresses: 'Генерация адресов' - selectAddress: 'Выберите адрес, с которым хотите авторизоваться, из списка ниже:' - defaultAddressMessage: 'Ваш адрес по умолчанию это счет 0.' - back: 'Назад' - next: 'Вперед' - txOutOfGasMessage: 'Транзакция не осуществлена: недостаточный баланс. Убедитесь, что вашего баланса достаточно, чтобы покрыть комиссию.' - estimatedGasPrice: 'Примерная цена газа {$gasPrice}.' -navbar: - siteName: 'BIG DIPPER' - version: '-' - validators: 'Валидаторы' - blocks: 'Блоки' - transactions: 'Транзакции' - proposals: 'Предложения' - votingPower: 'Право голоса' - lang: "RU" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - russian: "Русский" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: 'ЛИЦЕНЗИЯ' - forkMe: Форк!' -consensus: - consensusState: 'Состояние консенсуса' - round: 'Раунд' - step: 'Этап' -chainStates: - price: 'Цена' - marketCap: 'Рыночная капитализация' - inflation: 'Инфляция' - communityPool: 'Коммьюнити пул' -chainStatus: - startMessage: 'Чейн будет запущен в' - stopWarning: 'Чейн не запущен уже {$time}! Накорми меня новыми блоками 😭!' - latestHeight: 'Последняя Высота Блока' - averageBlockTime: 'Среднее Время Блока' - all: 'Всё' - now: 'Сейчас' - allTime: 'За Все Время' - lastMinute: 'За Последнюю Минуту' - lastHour: 'За Последний Час' - lastDay: 'За Последний День' - seconds: 'секунды' - activeValidators: 'Активные валидаторы' - outOfValidators: 'из {$totalValidators} валидаторов' - onlineVotingPower: 'Онлайн Право Голоса' - fromTotalStakes: '{$percent} из {$totalStakes} {$denomPlural}' -analytics: - blockTimeHistory: 'История Времени Блока' - averageBlockTime: 'Среднее Время Блока' - blockInterval: 'Интервал Блока' - noOfValidators: 'Количество валидаторов' -validators: - randomValidators: 'Случайные Валидаторы' - moniker: 'Название' - uptime: 'Аптайм' - selfPercentage: '% самоделегирования' - commission: 'Комиссия' - lastSeen: 'Последний раз был онлайн' - status: 'Статус' - jailed: 'Jailed' - navActive: 'Активный' - navInactive: 'Неактивный' - active: 'Активные Валидаторы' - inactive: 'Неактивные Валидаторы' - listOfActive: 'Вот список активных валидаторов.' - listOfInactive: 'Вот список неактивных валидаторов.' - validatorDetails: 'Детали Валидатора' - lastNumBlocks: 'Последние {$numBlocks} блоков' - validatorInfo: 'Информация О Валидаторе' - operatorAddress: 'Адрес Оператора' - selfDelegationAddress: 'Адрес Самоделегирования' - deeplinks: 'Deeplinks' - commissionRate: 'Ставка Комиссии' - maxRate: 'Максимальная Ставка' - maxChangeRate: 'Максимальная Ставка Изменения' - selfDelegationRatio: 'Коэффициент Самоделегирования' - proposerPriority: 'Приоритет предложения' - delegatorShares: 'Доли делегатора' - userDelegateShares: 'Доли, делегированные вами' - tokens: 'Токены' - unbondingHeight: 'Высота Un-Бондинг' - unbondingTime: 'Время Un-Бондинг' - jailedUntil: 'Jailed До' - powerChange: 'Изменение власти' - delegations: 'Делегации' - transactions: 'Транзакции' - validatorNotExists: 'Валидатора не существует.' - backToValidator: 'Назад К Валидатору' - missedBlocks: 'Пропущенные Блоки' - missedPrecommits: 'Пропущенные Прекоммиты' - missedBlocksTitle: 'Пропущенные блоки {$moniker}' - totalMissed: 'Всего пропущено' - block: 'Блок' - missedCount: 'Пропущено' - iDontMiss: "Я не пропускаю" - lastSyncTime: 'Последнее время синхронизации' - delegator: 'Делегатор' - amount: 'Сумма' -blocks: - block: 'Блок' - proposer: 'Предложение' - latestBlocks: 'Последние блоки' - noBlock: 'Нет блока.' - numOfTxs: 'Количество транзакций' - numOfTransactions: 'Количество транзакций' - notFound: 'Такого блока не найдено.' -transactions: - transaction: 'Транзакция' - transactions: 'Транзакции' - notFound: 'Транзакция не найдена.' - activities: 'Активность' - txHash: 'Хэш транзакции' - valid: 'Действительна' - fee: 'Комиссия' - noFee: 'Без комиссии' - gasUsedWanted: 'Газ (использовано / хотелось)' - noTxFound: 'Транзакция не найдена' - noValidatorTxsFound: 'Транзакция, связанная с этом валидатором, не найдена.' - memo: 'Комментарий' - transfer: 'Передача' - staking: 'Стейкать' - distribution: 'Распределение' - governance: 'Управление' - slashing: 'Slashing' -proposals: - notFound: 'Предложение не найдено.' - listOfProposals: 'Список предложений по управлению' - proposer: 'Предлагающий' - proposal: 'Предложение' - proposals: 'Предложения' - proposalID: 'ID предложения' - title: 'Название' - status: 'Статус' - submitTime: 'Время Отправки' - depositEndTime: 'Время Окончания Депозита' - votingStartTime: 'Время Начала Голосования' - votingEndTime: 'Время Окончания Голосования' - totalDeposit: 'Общий депозит' - description: 'Описание' - proposalType: 'Тип Предложения' - proposalStatus: 'Статус Предложения' - notStarted: 'не начался' - final: 'окончено' - deposit: 'Депозит' - tallyResult: 'Итог Подсчета' - yes: 'За' - abstain: Воздержался - no: 'Против' - noWithVeto: 'Против с правом Вето' - percentageVoted: '{$percent} от всех голосов онлайн проголосовало.' - validMessage: 'Это предложение {$tentative}действительное.' - invalidMessage: 'Меньше чем {$quorum} голосующих проголосовало. Это предложение недействительное.' - moreVoteMessage: 'Предложение будет действительным, если еще {$moreVotes} голосующих отдадут свой голос.' - key: 'Ключ' - value: 'Значение' - amount: 'Сумма' - recipient: 'Получатель' - changes: 'Изменения' - subspace: 'Подмножество' -votingPower: - distribution: 'Распределение Количества Голосов' - pareto: 'Принцип Парето (правило 20/80)' - minValidators34: 'Минимальное количество валидаторов c 34%+ количеством голосов' -accounts: - accountDetails: 'Детали счета' - available: 'Доступно' - delegated: 'Заделегировано' - unbonding: 'Un-Бондинг' - rewards: 'Награды' - total: 'Всего' - notFound: 'Такого счета не существует. Вы ищете неправильный адрес?' - validators: 'Валидаторы' - shares: 'Доли' - mature: 'Зрелые' - no: 'Нет' - none: 'Нет' - delegation: 'Делегация' - plural: '' - signOut: 'Выйти' - signInText: 'Вы вошли как' - toLoginAs: 'Войти как' - signInWithLedger: 'Войти, используя Ledger' - signInWarning: 'Пожалуйста, убедитесь, что устройство Ledger подключено и {$network} App {$version} или выше открыто.' - pleaseAccept: 'пожалуйста, примите в своем Ledger устройстве.' - noRewards: 'Нет Наград' - BLESupport: 'Bluetooth-соединение пока что поддерживается только в браузере Google Chrome.' -activities: - single: ' ' - happened: 'произошло.' - senders: 'Этот отправитель(и)' - sent: 'отправил' - receivers: 'этому получателю(ям)' - received: 'получил' - failedTo: 'не удалось' - to: 'к' - from: из' - operatingAt: 'работающих на' - withMoniker: 'с названием' - withTitle: 'с названием' - withA: 'с' - withAmount: 'с {$amount}' -messageTypes: - send: 'Отправить' - multiSend: 'Отправить Нескольким' - createValidator: 'Создать Валидатора' - editValidator: 'Редактировать Валидатора' - delegate: 'Делегировать' - undelegate: 'Разделегировать' - redelegate: 'Ре-делегировать' - submitProposal: 'Отправить Предложение' - deposit: 'Депозит' - vote: 'Голосовать' - withdrawComission: 'Вывести Комиссии' - withdrawReward: 'Вывести Награду' - modifyWithdrawAddress: 'Изменить Адрес Вывода' - unjail: 'Un-Джейл' - IBCTransfer: 'IBC Трансфер' - IBCReceive: 'IBC Получение' - diff --git a/big-dipper-backend/both/i18n/zh-hans.i18n.yml b/big-dipper-backend/both/i18n/zh-hans.i18n.yml deleted file mode 100644 index 4fb1658303..0000000000 --- a/big-dipper-backend/both/i18n/zh-hans.i18n.yml +++ /dev/null @@ -1,238 +0,0 @@ -_locale: 'zh-Hans' -_namespace: '' - -common: - height: '高度' - voter: '投票人' - votingPower: '投票权' - addresses: '地址' - amounts: '数量' - delegators: '委托人' - block: '区块' - blocks: '区块' - precommit: '建块前保证' - precommits: '建块前保证' - last: '最后' - backToList: '回到列表' - information: '资讯' - time: '时间' - hash: '哈希' - more: '更多' - fullStop: '。' - searchPlaceholder: '搜寻交易哈希 / 区块高度 / 地址' - cancel: '取消' - retry: '重试' - bondedTokens: '受委托量' -navbar: - siteName: '北斗' - validators: '验证人' - blocks: '区块' - transactions: '交易' - proposals: '治理提案' - votingPower: '投票权分布' - lang: "中文(简)" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - russian: "Русский" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: 'LICENSE' - forkMe: 'Fork me!' -consensus: - consensusState: '共识状态' - round: '轮数' - step: '阶数' -chainStates: - price: '价格' - marketCap: '市值' - inflation: '通胀率' - communityPool: '社区储备' -chainStatus: - startMessage: '这链将还有以下时间便会开始' - stopWarning: '这链似乎已经停了 {$time}! 请继续喂我吃新的区块 😭!' - latestHeight: '最新区块高度' - averageBlockTime: '平均区块时间' - all: '全部' - now: '现在' - allTime: '全部' - lastMinute: '前一分钟' - lastHour: '前一小时' - lastDay: '前一天' - seconds: '秒' - activeValidators: '有效验证人' - outOfValidators: '来自总共 {$totalValidators} 个验证人' - onlineVotingPower: '在线投票权' - fromTotalStakes: '为 {$totalStakes} 颗 {$denom} 的 {$percent}' -analytics: - blockTimeHistory: '在线投票权' - averageBlockTime: 'Average Block Time' - blockInterval: 'Block Interval' - noOfValidators: 'No. of Validators' -validators: - randomValidators: '随机验证人' - moniker: '验证人代号' - uptime: '上线时间比重' - selfPercentage: '自我委托%' - commission: '佣金' - lastSeen: '最后投票时间' - status: '状态' - jailed: '被禁制' - navActive: '有效' - navInactive: '无效' - active: '有效验证人' - inactive: '无效验证人' - listOfActive: '这名单显示所有有效验证人' - listOfInactive: '这名单显示所有无效验证人' - validatorDetails: '验证人详情' - lastNumBlocks: '最后 {$numBlocks} 个区块' - validatorInfo: '验证人资讯' - operatorAddress: '操作地址' - selfDelegationAddress: '自我委托地址' - deeplinks: 'Deeplinks' - commissionRate: '佣金' - maxRate: '最大佣金限制' - maxChangeRate: '每天最大佣金变化限制' - selfDelegationRatio: '自我委托比例' - proposerPriority: '建块优先权' - delegatorShares: '委托股数' - userDelegateShares: '你委托的股数' - tokens: '代币数量' - unbondingHeight: '解绑高度' - unbondingTime: '解绑时间' - jailedUntil: '被禁制至' - powerChange: '投票权变更' - delegations: '委托' - transactions: '交易' - validatorNotExists: '验证人不存在。' - backToValidator: '回到验证人页面' - missedBlocks: '错过了的区块' - missedPrecommits: '遗留了的建块前保证' - missedBlocksTitle: '错过了 {$moniker} 的区块' - totalMissed: '一共错过了' - block: '区块' - missedCount: '错过数量' - iDontMiss: '我不会错过任何一个' - lastSyncTime: '上一次同步时间' - delegator: '委托人' - amount: '数量' -blocks: - proposer: '建块人' - block: '区块' - latestBlocks: '最近区块' - noBlock: '没有区块。' - numOfTxs: '交易数量' - numOfTransactions: '交易数量' - notFound: '没有这个区块。' -transactions: - transaction: '交易' - transactions: '交易' - notFound: '沒有交易。' - activities: '活动' - txHash: '交易哈希' - valid: '有效' - fee: '费用' - noFee: 'No fee' - gasUsedWanted: '瓦斯 (已用 / 要求)' - noTxFound: '没有这笔交易。' - noValidatorTxsFound: '没有跟这个验证人有关的交易' - memo: '备忘录' - transfer: '代币转移' - staking: '委托' - distribution: '收益分配' - governance: '链上治理' - slashing: '削减' -proposals: - notFound: '没有治理提案' - listOfProposals: '这名单显示所有治理提案' - proposer: '提案人' - proposal: '治理提案' - proposals: '治理提案' - proposalID: '提案编号' - title: '主题' - status: '状态' - submitTime: '提案时间' - depositEndTime: '存入押金' - votingStartTime: '投票开始时间' - votingEndTime: '投票结束时间' - totalDeposit: '押金总额' - description: '详细内容' - proposalType: '提案类型' - proposalStatus: '提案状态' - notStarted: '未开始' - final: '最后结果' - deposit: '押金' - tallyResult: '投票结果' - yes: '赞成' - abstain: '弃权' - no: '反对' - noWithVeto: '强烈反对' - percentageVoted: '现时在线投票权的投票率是 {$percent}。' - validMessage: '这个提案 {$tentative} 有效.' - invalidMessage: '已投票的在线投票权少于 {$quorum}。这个提案 無效。' - moreVoteMessage: '当再有多 {$moreVotes} 投票权投了票的话,这个提案将会有效。' - key: 'Key' - value: 'Value' - amount: 'Amount' - recipient: 'Recipient' - changes: 'Changes' - subspace: 'Subspace' -votingPower: - distribution: '投票权分布' - pareto: '帕累托原则 (20/80 定率)' - minValidators34: '最少合共有超过 34% 投票权的验证人' -accounts: - accountDetails: '帐户详情' - available: '可用的' - delegated: '委托中' - unbonding: '解绑中' - rewards: '未取回收益' - total: '总共' - notFound: '这个帐户不存在。你是否在查看一个错误的地址?' - validators: '验证人' - shares: '股数' - mature: '成熟日期' - no: '没有' - none: '没有' - delegation: '委托' - plural: '' - signOut: '登出' - signInText: '你已登录以下帐户' - toLoginAs: '登录以下帐户' - signInWithLedger: '透过 Ledger 登录' - signInWarning: '请确定你已经连接 Ledger 设备,并已开启 Cosmos App 版本 1.5.0 或以上。' - pleaseAccept: '请从你的 Ledger 设备确认。' - noRewards: 'No Rewards' -activities: - single: '一个' - happened: '发生了' - senders: '以下的帐户' - sent: '发了' - receivers: '到以下的帐户' - received: '收到' - failedTo: '未能' - to: '到' - from: '从' - operatingAt: '操作地址为' - withMoniker: '而验证人代号为' - withTitle: '治理提案主题为' - withA: '投了' -messageTypes: - send: '发送' - multiSend: '多重发送' - createValidator: '建立验证人' - editValidator: '编辑验证人资料' - delegate: '委托' - undelegate: '解委托' - redelegate: '转委托' - submitProposal: '提交议案' - deposit: '存入' - vote: '投票' - withdrawComission: '提取手续费' - withdrawReward: '提取收益' - modifyWithdrawAddress: '更改收益取回地址' - unjail: '赦免' - IBCTransfer: 'IBC Transfer' - IBCReceive: 'IBC Receive' diff --git a/big-dipper-backend/both/i18n/zh-hant.i18n.yml b/big-dipper-backend/both/i18n/zh-hant.i18n.yml deleted file mode 100644 index c1e9ff7d15..0000000000 --- a/big-dipper-backend/both/i18n/zh-hant.i18n.yml +++ /dev/null @@ -1,238 +0,0 @@ -_locale: 'zh-Hant' -_namespace: '' - -common: - height: '高度' - voter: '投票人' - votingPower: '投票權' - addresses: '地址' - amounts: '數量' - delegators: '委托人' - block: '區塊' - blocks: '區塊' - precommit: '建塊前保證' - precommits: '建塊前保證' - last: '最後' - backToList: '回到列表' - information: '資訊' - time: '時間' - hash: '哈希' - more: '更多' - fullStop: '。' - searchPlaceholder: '搜尋交易哈希 / 區塊高度 / 地址' - cancel: '取消' - retry: '重試' - bondedTokens: '受委托量' -navbar: - siteName: '北斗' - validators: '驗證人' - blocks: '區塊' - transactions: '交易' - proposals: '治理提案' - votingPower: '投票權分佈' - lang: "中文(繁)" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - russian: "Русский" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: 'LICENSE' - forkMe: 'Fork me!' -consensus: - consensusState: '共識狀態' - round: '輪數' - step: '階數' -chainStates: - price: '價格' - marketCap: '市值' - inflation: '通漲率' - communityPool: '社區儲備' -chainStatus: - startMessage: '這鏈將還有以下時間便會開始' - stopWarning: '這鏈似乎已經停了 {$time}! 請繼續餵我吃新的區塊 😭!' - latestHeight: '最新區塊高度' - averageBlockTime: '平均區塊時間' - all: '全部' - now: '現在' - allTime: '全部' - lastMinute: '前一分鐘' - lastHour: '前一小時' - lastDay: '前一天' - seconds: '秒' - activeValidators: '有效驗證人' - outOfValidators: '來自總共 {$totalValidators} 個驗證人' - onlineVotingPower: '在線投票權' - fromTotalStakes: '為 {$totalStakes} 顆 {$denom} 的 {$percent}' -analytics: - blockTimeHistory: '在線投票權' - averageBlockTime: 'Average Block Time' - blockInterval: 'Block Interval' - noOfValidators: 'No. of Validators' -validators: - randomValidators: '隨機驗證人' - moniker: '驗證人代號' - uptime: '上線時間比重' - selfPercentage: '自我委托%' - commission: '佣金' - lastSeen: '最後投票時間' - status: '狀態' - jailed: '被禁制' - navActive: '有效' - navInactive: '無效' - active: '有效驗證人' - inactive: '無效驗證人' - listOfActive: '這名單顯示所有有效驗證人' - listOfInactive: '這名單顯示所有無效驗證人' - validatorDetails: '驗證人詳情' - lastNumBlocks: '最後 {$numBlocks} 個區塊' - validatorInfo: '驗證人資訊' - operatorAddress: '操作地址' - selfDelegationAddress: '自我委托地址' - deeplinks: 'Deeplinks' - commissionRate: '佣金' - maxRate: '最大佣金限制' - maxChangeRate: '每天最大佣金變化限制' - selfDelegationRatio: '自我委托比列' - proposerPriority: '建塊優先權' - delegatorShares: '委托股數' - userDelegateShares: '你委托的股數' - tokens: '代幣數量' - unbondingHeight: '解綁高度' - unbondingTime: '解綁時間' - jailedUntil: '被禁制至' - powerChange: '投票權變更' - delegations: '委托' - transactions: '交易' - validatorNotExists: '驗證人不存在。' - backToValidator: '回到驗證人頁面' - missedBlocks: '錯過了的區塊' - missedPrecommits: '遺留了的建塊前保證' - missedBlocksTitle: '錯過了 {$moniker} 的區塊' - totalMissed: '一共錯過了' - block: '區塊' - missedCount: '錯過數量' - iDontMiss: '我不會錯過任何一個' - lastSyncTime: '上一次同步時間' - delegator: '委托人' - amount: '數量' -blocks: - proposer: '建塊人' - block: '區塊' - latestBlocks: '最近區塊' - noBlock: '沒有區塊。' - numOfTxs: '交易數量' - numOfTransactions: '交易數量' - notFound: '沒有這個區塊。' -transactions: - transaction: '交易' - transactions: '交易' - notFound: '沒有交易。' - activities: '活動' - txHash: '交易哈希' - valid: '有效' - fee: '費用' - noFee: 'No fee' - gasUsedWanted: '瓦斯 (已用 / 要求)' - noTxFound: '沒有這筆交易。' - noValidatorTxsFound: '沒有跟這個驗證人有關的交易' - memo: '備忘錄' - transfer: '代幣轉移' - staking: '委托' - distribution: '收益分配' - governance: '鏈上治理' - slashing: '削減' -proposals: - notFound: '沒有治理提案' - listOfProposals: '這名單顯示所有治理提案' - proposer: '提案人' - proposal: '治理提案' - proposals: '治理提案' - proposalID: '提案編號' - title: '主題' - status: '狀態' - submitTime: '提案時間' - depositEndTime: '存入押金' - votingStartTime: '投票開始時間' - votingEndTime: '投票結束時間' - totalDeposit: '押金總額' - description: '詳細內容' - proposalType: '提案類型' - proposalStatus: '提案狀態' - notStarted: '未開始' - final: '最後結果' - deposit: '押金' - tallyResult: '投票結果' - yes: '贊成' - abstain: '棄權' - no: '反對' - none: '反對' - noWithVeto: '強烈反對' - percentageVoted: '現時在線投票權的投票率是 {$percent}。' - validMessage: '這個提案 {$tentative} 有效.' - invalidMessage: '已投票的在線投票權少於 {$quorum}。這個 無效。' - moreVoteMessage: '當再有多 {$moreVotes} 投票權投了票的話,這個提案將會有效。' - key: 'Key' - value: 'Value' - amount: 'Amount' - recipient: 'Recipient' - changes: 'Changes' - subspace: 'Subspace' -votingPower: - distribution: '投票權分佈' - pareto: '帕累托原則 (20/80 定率)' - minValidators34: '最少合共有超過 34% 投票權的驗證人' -accounts: - accountDetails: '帳戶詳情' - available: '可用的' - delegated: '委托中' - unbonding: '解綁中' - rewards: '未取回收益' - total: '總共' - notFound: '這個帳戶不存在。你是否在查看一個錯誤的地址?' - validators: '驗證人' - shares: '股數' - mature: '成熟日期' - no: '沒有' - delegation: '委托' - plural: '' - signOut: '登出' - signInText: '你已登入以下帳戶' - toLoginAs: '登入以下帳戶' - signInWithLedger: '透過 Ledger 登入' - signInWarning: '請確定你已經連接 Ledger 設備,並已開啓 Cosmos App 版本 1.5.0 或以上。' - pleaseAccept: '請從你的 Ledger 設備確認。' - noRewards: 'No Rewards' -activities: - single: '一個' - happened: '發生了' - senders: '以下的帳戶' - sent: '發了' - receivers: '到以下的帳戶' - received: '收到' - failedTo: '未能' - to: '到' - from: '從' - operatingAt: '操作地止為' - withMoniker: '而驗證人代號為' - withTitle: '治理提案主題為' - withA: '投了' -messageTypes: - send: '發送' - multiSend: '多重發送' - createValidator: '建立驗證人' - editValidator: '編輯驗證人資料' - delegate: '委托' - undelegate: '解委托' - redelegate: '轉委托' - submitProposal: '提交議案' - deposit: '存入' - vote: '投票' - withdrawComission: '提取手續費' - withdrawReward: '提取收益' - modifyWithdrawAddress: '更改收益取回地址' - unjail: '赦免' - IBCTransfer: 'IBC Transfer' - IBCReceive: 'IBC Receive' diff --git a/big-dipper-backend/both/utils/coins.js b/big-dipper-backend/both/utils/coins.js deleted file mode 100644 index 851b1dd0dc..0000000000 --- a/big-dipper-backend/both/utils/coins.js +++ /dev/null @@ -1,72 +0,0 @@ -/* eslint-disable no-tabs */ -import { Meteor } from 'meteor/meteor'; -import numbro from 'numbro'; - -autoformat = (value) => { - let formatter = '0,0.0000'; - value = Math.round(value * 1000) / 1000 - if (Math.round(value) === value) - formatter = '0,0' - else if (Math.round(value * 10) === value * 10) - formatter = '0,0.0' - else if (Math.round(value * 100) === value * 100) - formatter = '0,0.00' - else if (Math.round(value * 1000) === value * 1000) - formatter = '0,0.000' - return numbro(value).format(formatter) -} - -const coinList = Meteor.settings.public.coins; - -export default class Coin { - - static StakingCoin = (coinList == null) ? "" : coinList.find(coin => coin.denom === Meteor.settings.public.bondDenom); - static MinStake = (coinList == null) ? 0 : 1 / Number(Coin.StakingCoin.fraction); - - constructor(amount, denom = Meteor.settings.public.bondDenom) { - const lowerDenom = denom.toLowerCase(); - if (coinList == null) { - this._coin = null; - } else { - this._coin = coinList.find(coin => - coin.denom.toLowerCase() === lowerDenom || coin.displayName.toLowerCase() === lowerDenom - ); - } - - - if (this._coin) { - if (lowerDenom === this._coin.denom.toLowerCase()) { - this._amount = Number(amount); - } else if (lowerDenom === this._coin.displayName.toLowerCase()) { - this._amount = Number(amount) * this._coin.fraction; - } - } else { - this._coin = ""; - this._amount = Number(amount); - } - } - - get amount() { - return this._amount; - } - - get stakingAmount() { - return (this._coin) ? this._amount / this._coin.fraction : this._amount; - } - - toString(precision) { - // default to display in mint denom if it has more than 4 decimal places - let minStake = Coin.StakingCoin.fraction / (precision ? (10 ** precision) : 10000) - if (this.amount === 0) { - return `0 ${this._coin.displayName}` - } else if (this.amount < minStake) { - return `${numbro(this.amount).format('0,0.000000' )} ${this._coin.denom}`; - } else if (!this._coin.displayName) { - return `${this.stakingAmount ?? 0} ${Coin.StakingCoin.displayName}` - } else if (this.amount % 1 === 0) { - return `${this.stakingAmount} ${this._coin.displayName}` - } else { - return `${precision?numbro(this.stakingAmount).format('0,0.' + '0'.repeat(precision)):autoformat(this.stakingAmount)} ${this._coin.displayName}` - } - } -} \ No newline at end of file diff --git a/big-dipper-backend/both/utils/loader.js b/big-dipper-backend/both/utils/loader.js deleted file mode 100644 index f8852105b1..0000000000 --- a/big-dipper-backend/both/utils/loader.js +++ /dev/null @@ -1,6 +0,0 @@ -import React from 'react'; -import { DisappearedLoading } from 'react-loadingg'; - -const Loader = () =>
; - -export default Loader; \ No newline at end of file diff --git a/big-dipper-backend/both/utils/time.js b/big-dipper-backend/both/utils/time.js deleted file mode 100644 index 9c92ad5583..0000000000 --- a/big-dipper-backend/both/utils/time.js +++ /dev/null @@ -1,4 +0,0 @@ -export const goTimeToISOString = (time) => { - const millisecond = parseInt(time.seconds+time.nanos.toString().substring(0,3)); - return (new Date(millisecond)).toISOString() -} \ No newline at end of file diff --git a/big-dipper-backend/cloudbuild.yaml b/big-dipper-backend/cloudbuild.yaml deleted file mode 100644 index c66110c9c6..0000000000 --- a/big-dipper-backend/cloudbuild.yaml +++ /dev/null @@ -1,56 +0,0 @@ -timeout: 12000s -substitutions: - _CUSTOM_REGION: us-west2-a - _CUSTOM_CLUSTER: cluster-1 -steps: - - name: gcr.io/cloud-builders/docker - entrypoint: bash - args: - - '-c' - - >- - docker pull gcr.io/zinc-interface-241613/big-dipper-v1:latest - || exit 0 - - name: "gcr.io/cloud-builders/gcloud" - id: Write Secrets to Env - entrypoint: bash - args: - - -c - - | - sed -i "s#mongoUrlVal#$(gcloud beta secrets versions access --secret=mongourl latest)#g" ./deploy/pylons-big-dipper/values.yaml - - name: gcr.io/cloud-builders/docker - id: Build - args: - - build - - . - - -t - - gcr.io/zinc-interface-241613/big-dipper-v1 - - name: gcr.io/cloud-builders/docker - args: - - push - - 'gcr.io/zinc-interface-241613/big-dipper-v1' - id: PushLatest - - name: gcr.io/cloud-builders/kubectl - id: Configure kubectl - args: - - cluster-info - env: - - CLOUDSDK_COMPUTE_REGION=$_CUSTOM_REGION - - CLOUDSDK_CONTAINER_CLUSTER=$_CUSTOM_CLUSTER - - KUBECONFIG=/workspace/.kube/config - - - name: gcr.io/zinc-interface-241613/helm - id: Deploy chart - args: - - upgrade - - big-dipper-v1 - - ./deploy/pylons-big-dipper - - -f - - ./deploy/pylons-big-dipper/values.yaml - # - --set-file - # - applicationSettingsJson="default_settings.json" - env: - - KUBECONFIG=/workspace/.kube/config - - TILLERLESS=true -options: - logging: CLOUD_LOGGING_ONLY - machineType: 'E2_HIGHCPU_32' \ No newline at end of file diff --git a/big-dipper-backend/default_settings.json b/big-dipper-backend/default_settings.json deleted file mode 100644 index b622d29702..0000000000 --- a/big-dipper-backend/default_settings.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "public": { - "chainName": "Pylons", - "chainId": "pylons-testnet-3", - "gtm": "{Add your Google Tag Manager ID here}", - "slashingWindow": 10000, - "uptimeWindow": 250, - "initialPageSize": 30, - "secp256k1": false, - "bech32PrefixAccAddr": "pylo", - "bech32PrefixAccPub": "pylopub", - "bech32PrefixValAddr": "pylovaloper", - "bech32PrefixValPub": "pylovaloperpub", - "bech32PrefixConsAddr": "pylovalcons", - "bech32PrefixConsPub": "pylovalconspub", - "bondDenom": "uatom", - "powerReduction": 1000000, - "dynamicLink": { - "apn": "tech.pylons.wallet", - "ibi": "xyz.pylons.wallet", - "isi": "1598732789", - "oflPlay": "https://play.google.com/store/apps/details?id=tech.pylons.wallet&pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1", - "oflIOS": "https://apps.apple.com/us/app/pylons/id1598732789" - }, - "coins": [ - { - "denom": "uatom", - "displayName": "ATOM", - "fraction": 1000000 - }, - { - "denom": "ubedrock", - "displayName": "UBEDROCK", - "fraction": 1000000 - }, - { - "denom": "umuon", - "displayName": "MUON", - "fraction": 1000000 - }, - { - "denom": "ustripeusd", - "displayName": "STRIPEUSD", - "fraction": 1000000 - }, - { - "denom": "ujunox", - "displayName": "JUNO", - "fraction": 1000000 - }, - { - "denom": "upylon", - "displayName": "PYLON", - "fraction": 1000000 - }, - { - "denom": "uusd", - "displayName": "UST", - "fraction": 1000000 - }, - { - "denom": "urun", - "displayName": "RUN", - "fraction": 1000000 - }, - { - "denom": "ujunox", - "displayName": "JUNO", - "fraction": 1000000 - }, - { - "denom": "eeur", - "displayName": "EEUR", - "fraction": 1000000 - }, - { - "denom": "weth-wei", - "displayName": "WETH", - "fraction": 1000000 - } - ], - "ledger": { - "coinType": 118, - "appName": "Cosmos", - "appVersion": "2.16.0", - "gasPrice": 0.02 - }, - "modules": { - "bank": true, - "supply": true, - "minting": false, - "gov": true, - "distribution": false - }, - "banners": false, - "baseURL": "https://wallet.pylons.tech", - "cosmos_sdk": 43 - }, - "remote": { - "rpc": "https://rpc.pylons.tech", - "api": "https://lcd.pylons.tech" - }, - "debug": { - "startTimer": true - }, - "params": { - "startHeight": 0, - "defaultBlockTime": 10000, - "validatorUpdateWindow": 300, - "blockInterval": 10000, - "transactionsInterval": 1000, - "keybaseFetchingInterval": 1000000, - "consensusInterval": 1000, - "statusInterval": 7500, - "signingInfoInterval": 1800000, - "proposalInterval": 5000, - "recipeInterval": 5000, - "nftInterval": 5000, - "cookbookInterval": 5000, - "missedBlocksInterval": 60000, - "delegationInterval": 900000, - "sendNotifications": 0, - "collectNotificationsInterval": 10000 - } -} \ No newline at end of file diff --git a/big-dipper-backend/deploy/big-dipper-dev/network/managed-cert.yaml b/big-dipper-backend/deploy/big-dipper-dev/network/managed-cert.yaml deleted file mode 100644 index 8cfdb3211b..0000000000 --- a/big-dipper-backend/deploy/big-dipper-dev/network/managed-cert.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: networking.gke.io/v1 -kind: ManagedCertificate -metadata: - name: managed-cert -spec: - domains: - - wallet.pylons.tech \ No newline at end of file diff --git a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/Chart.yaml b/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/Chart.yaml deleted file mode 100644 index 014d58cd1b..0000000000 --- a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/Chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v2 -name: big-dipper-v1 -description: Pylons Big Dipper -version: 0.0.1 -appVersion: 0.0.1 diff --git a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/_helpers.tpl b/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/_helpers.tpl deleted file mode 100644 index 586045548b..0000000000 --- a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/_helpers.tpl +++ /dev/null @@ -1,86 +0,0 @@ -{{- define "ports.service" }} -{{- range $key, $value := .Values.ports }} -- port: {{ $v := $value | toString | splitList ":" }}{{$v | first}} - name: {{ $key }} - targetPort: {{ $v := $value | toString | splitList ":" }}{{$v | last}} -{{- end }} -{{- end }} - -{{- define "ports.pod" }} -{{- range $key, $value := .Values.ports }} - - containerPort: {{ $v := $value | toString | splitList ":" }}{{$v | last}} - name: {{ $key }} -{{- end }} -{{- end }} - -{{- define "chart.labels" }} -app.kubernetes.io/name: {{ .Chart.Name }} -helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/version: {{ .Chart.AppVersion }} -{{- if .Values.labels }}{{ toYaml .Values.labels}}{{- end }} -{{- end }} - -{{/* -Expand the name of the chart. -*/}} -{{- define "big-dipper-v1.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "big-dipper-v1.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "big-dipper-v1.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "big-dipper-v1.labels" -}} -helm.sh/chart: {{ include "big-dipper-v1.chart" . }} -{{ include "big-dipper-v1.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "big-dipper-v1.selectorLabels" -}} -app.kubernetes.io/name: {{ include "big-dipper-v1.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "big-dipper-v1.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "big-dipper-v1.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} diff --git a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/configmap.yaml b/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/configmap.yaml deleted file mode 100644 index 0a87591b4e..0000000000 --- a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/configmap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.settings }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ .Release.Name }}-archive - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | indent 4 }} -data: - settings.json: |- -{{ .Values.applicationSettingsJson | indent 4}} -{{- end }} diff --git a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/deployment.yaml b/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/deployment.yaml deleted file mode 100644 index bcc6757155..0000000000 --- a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/deployment.yaml +++ /dev/null @@ -1,54 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ .Release.Name }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | indent 4 }} -spec: - selector: - matchLabels: - {{- include "chart.labels" . | indent 6 }} - replicas: {{ .Values.replicas }} - template: - metadata: - annotations: - rollme: {{ randAlphaNum 5 | quote }} - labels: - {{- include "chart.labels" . | indent 8 }} - spec: - # volumes: - # - configMap: - # name: {{ .Release.Name }} - # name: {{ .Release.Name }} - hostAliases: - - ip: "34.105.11.201" - hostnames: - - "mongodb-1-servers-vm-0" - nodeSelector: -{{ toYaml .Values.nodeSelector | indent 8 }} - containers: - - name: {{ .Release.Name }} - image: {{ .Values.image }} - # volumeMounts: - # - name: {{ .Release.Name }} - # mountPath: /settings.json - # readOnly: false - imagePullPolicy: {{ .Values.imagePullPolicy }} - ports: -{{- include "ports.pod" . | indent 8 }} - env: - - name: ROOT_URL - value: http://wallet.pylons.tech - - name: MONGO_URL - value: {{ .Values.mongoURL }} - - name: PORT - value: "80" - - name: METEOR_SETTINGS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }} - key: settings.json - resources: -{{ toYaml .Values.resources | indent 12 }} - terminationGracePeriodSeconds: 10 \ No newline at end of file diff --git a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/ingress.yaml b/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/ingress.yaml deleted file mode 100644 index cdfe2d1007..0000000000 --- a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/ingress.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ .Release.Name }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | indent 4 }} - annotations: -{{ toYaml .Values.ingress.annotations | indent 4 }} -spec: - defaultBackend: - service: - name: {{ .Release.Name}} - port: - number: 80 \ No newline at end of file diff --git a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/service.yaml b/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/service.yaml deleted file mode 100644 index ce8d9a2806..0000000000 --- a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "big-dipper-v1.fullname" . }} - labels: - {{- include "big-dipper-v1.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: 80 - protocol: TCP - name: http - selector: - {{- include "big-dipper-v1.selectorLabels" . | nindent 4 }} \ No newline at end of file diff --git a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/values.yaml b/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/values.yaml deleted file mode 100644 index f047d4a896..0000000000 --- a/big-dipper-backend/deploy/big-dipper-dev/pylons-big-dipper/values.yaml +++ /dev/null @@ -1,37 +0,0 @@ -image: gcr.io/zinc-interface-241613/big-dipper-v1 -imagePullPolicy: Always - -replicas: 1 - -nodeSelector: {} - -service: - type: NodePort - port: 80 - -ingress: - enabled: true - className: gce - annotations: - kubernetes.io/ingress.global-static-ip-name: big-dipper-v1 - networking.gke.io/managed-certificates: managed-cert - kubernetes.io/ingress.class: "gce" - cert-manager.io/cluster-issuer: letsencrypt-prod - kubernetes.io/tls-acme: "true" - hosts: - - host: wallet.pylons.tech - paths: - - path: / - pathType: ImplementationSpecific - # tls: - # - secretName: chart-example-tls - # hosts: - # - wallet.pylons.tech - - -resources: {} - - - -host: wallet.pylons.tech -mongoURL: mongodb://devops:nKH.%3DXdYp%23-ECw%2C%3DgW@34.105.11.201:27017/test?serverSelectionTimeoutMS=5000&connectTimeoutMS=10000&authSource=admin&authMechanism=SCRAM-SHA-256 \ No newline at end of file diff --git a/big-dipper-backend/deploy/big-dipper-prod/api-node/.helmignore b/big-dipper-backend/deploy/big-dipper-prod/api-node/.helmignore deleted file mode 100644 index 0e8a0eb36f..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/api-node/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/big-dipper-backend/deploy/big-dipper-prod/api-node/Chart.yaml b/big-dipper-backend/deploy/big-dipper-prod/api-node/Chart.yaml deleted file mode 100644 index 6954269927..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/api-node/Chart.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v2 -name: api-node -description: A Helm chart for Kubernetes - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.16.0" diff --git a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/NOTES.txt b/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/NOTES.txt deleted file mode 100644 index 4ad903be9f..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/NOTES.txt +++ /dev/null @@ -1,22 +0,0 @@ -1. Get the application URL by running these commands: -{{- if .Values.ingress.enabled }} -{{- range $host := .Values.ingress.hosts }} - {{- range .paths }} - http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} - {{- end }} -{{- end }} -{{- else if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "api-node.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "api-node.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "api-node.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") - echo http://$SERVICE_IP:{{ .Values.service.port }} -{{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "api-node.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT -{{- end }} diff --git a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/_helpers.tpl b/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/_helpers.tpl deleted file mode 100644 index c39151f0bc..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/_helpers.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "api-node.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "api-node.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "api-node.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "api-node.labels" -}} -helm.sh/chart: {{ include "api-node.chart" . }} -{{ include "api-node.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "api-node.selectorLabels" -}} -app.kubernetes.io/name: {{ include "api-node.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "api-node.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "api-node.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} diff --git a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/deployment.yaml b/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/deployment.yaml deleted file mode 100644 index ce6f08167a..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/deployment.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "api-node.fullname" . }} - labels: - {{- include "api-node.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - selector: - matchLabels: - {{- include "api-node.selectorLabels" . | nindent 6 }} - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "api-node.selectorLabels" . | nindent 8 }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "api-node.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - name: http - containerPort: 80 - protocol: TCP - livenessProbe: - httpGet: - path: / - port: http - readinessProbe: - httpGet: - path: / - port: http - resources: - {{- toYaml .Values.resources | nindent 12 }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/hpa.yaml b/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/hpa.yaml deleted file mode 100644 index 6f3c860225..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/hpa.yaml +++ /dev/null @@ -1,28 +0,0 @@ -{{- if .Values.autoscaling.enabled }} -apiVersion: autoscaling/v2beta1 -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "api-node.fullname" . }} - labels: - {{- include "api-node.labels" . | nindent 4 }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "api-node.fullname" . }} - minReplicas: {{ .Values.autoscaling.minReplicas }} - maxReplicas: {{ .Values.autoscaling.maxReplicas }} - metrics: - {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} - {{- end }} - {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} - {{- end }} -{{- end }} diff --git a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/ingress.yaml b/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/ingress.yaml deleted file mode 100644 index b5b7e93f6a..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/ingress.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $fullName := include "api-node.fullname" . -}} -{{- $svcPort := .Values.service.port -}} -{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} - {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} - {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} - {{- end }} -{{- end }} -{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1 -{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1beta1 -{{- else -}} -apiVersion: extensions/v1beta1 -{{- end }} -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - {{- include "api-node.labels" . | nindent 4 }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} - ingressClassName: {{ .Values.ingress.className }} - {{- end }} - {{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range .paths }} - - path: {{ .path }} - {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} - pathType: {{ .pathType }} - {{- end }} - backend: - {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} - service: - name: {{ $fullName }} - port: - number: {{ $svcPort }} - {{- else }} - serviceName: {{ $fullName }} - servicePort: {{ $svcPort }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} diff --git a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/service.yaml b/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/service.yaml deleted file mode 100644 index 20c88d0758..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "api-node.fullname" . }} - labels: - {{- include "api-node.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: http - protocol: TCP - name: http - selector: - {{- include "api-node.selectorLabels" . | nindent 4 }} diff --git a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/serviceaccount.yaml b/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/serviceaccount.yaml deleted file mode 100644 index 72223148ff..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/serviceaccount.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "api-node.serviceAccountName" . }} - labels: - {{- include "api-node.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} diff --git a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/tests/test-connection.yaml b/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/tests/test-connection.yaml deleted file mode 100644 index cc01d732fc..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/api-node/templates/tests/test-connection.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: "{{ include "api-node.fullname" . }}-test-connection" - labels: - {{- include "api-node.labels" . | nindent 4 }} - annotations: - "helm.sh/hook": test -spec: - containers: - - name: wget - image: busybox - command: ['wget'] - args: ['{{ include "api-node.fullname" . }}:{{ .Values.service.port }}'] - restartPolicy: Never diff --git a/big-dipper-backend/deploy/big-dipper-prod/api-node/values.yaml b/big-dipper-backend/deploy/big-dipper-prod/api-node/values.yaml deleted file mode 100644 index 2722fb14b9..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/api-node/values.yaml +++ /dev/null @@ -1,82 +0,0 @@ -# Default values for api-node. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - -image: - repository: nginx - pullPolicy: IfNotPresent - # Overrides the image tag whose default is the chart appVersion. - tag: "" - -imagePullSecrets: [] -nameOverride: "" -fullnameOverride: "" - -serviceAccount: - # Specifies whether a service account should be created - create: true - # Annotations to add to the service account - annotations: {} - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "" - -podAnnotations: {} - -podSecurityContext: {} - # fsGroup: 2000 - -securityContext: {} - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 - -service: - type: LoadBalancer - port: 80 - -ingress: - enabled: false - className: "" - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - hosts: - - host: chart-example.local - paths: - - path: / - pathType: ImplementationSpecific - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -resources: {} - # We usually recommend not to specify default resources and to leave this as a conscious - # choice for the user. This also increases chances charts run on environments with little - # resources, such as Minikube. If you do want to specify resources, uncomment the following - # lines, adjust them as necessary, and remove the curly braces after 'resources:'. - # limits: - # cpu: 100m - # memory: 128Mi - # requests: - # cpu: 100m - # memory: 128Mi - -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 100 - targetCPUUtilizationPercentage: 80 - # targetMemoryUtilizationPercentage: 80 - -nodeSelector: {} - -tolerations: [] - -affinity: {} diff --git a/big-dipper-backend/deploy/big-dipper-prod/network/managed-cert.yaml b/big-dipper-backend/deploy/big-dipper-prod/network/managed-cert.yaml deleted file mode 100644 index 8cfdb3211b..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/network/managed-cert.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: networking.gke.io/v1 -kind: ManagedCertificate -metadata: - name: managed-cert -spec: - domains: - - wallet.pylons.tech \ No newline at end of file diff --git a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/Chart.yaml b/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/Chart.yaml deleted file mode 100644 index 014d58cd1b..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/Chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v2 -name: big-dipper-v1 -description: Pylons Big Dipper -version: 0.0.1 -appVersion: 0.0.1 diff --git a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/_helpers.tpl b/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/_helpers.tpl deleted file mode 100644 index 586045548b..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/_helpers.tpl +++ /dev/null @@ -1,86 +0,0 @@ -{{- define "ports.service" }} -{{- range $key, $value := .Values.ports }} -- port: {{ $v := $value | toString | splitList ":" }}{{$v | first}} - name: {{ $key }} - targetPort: {{ $v := $value | toString | splitList ":" }}{{$v | last}} -{{- end }} -{{- end }} - -{{- define "ports.pod" }} -{{- range $key, $value := .Values.ports }} - - containerPort: {{ $v := $value | toString | splitList ":" }}{{$v | last}} - name: {{ $key }} -{{- end }} -{{- end }} - -{{- define "chart.labels" }} -app.kubernetes.io/name: {{ .Chart.Name }} -helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/version: {{ .Chart.AppVersion }} -{{- if .Values.labels }}{{ toYaml .Values.labels}}{{- end }} -{{- end }} - -{{/* -Expand the name of the chart. -*/}} -{{- define "big-dipper-v1.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "big-dipper-v1.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "big-dipper-v1.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "big-dipper-v1.labels" -}} -helm.sh/chart: {{ include "big-dipper-v1.chart" . }} -{{ include "big-dipper-v1.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "big-dipper-v1.selectorLabels" -}} -app.kubernetes.io/name: {{ include "big-dipper-v1.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "big-dipper-v1.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "big-dipper-v1.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} diff --git a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/configmap.yaml b/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/configmap.yaml deleted file mode 100644 index 0a87591b4e..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/configmap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.settings }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ .Release.Name }}-archive - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | indent 4 }} -data: - settings.json: |- -{{ .Values.applicationSettingsJson | indent 4}} -{{- end }} diff --git a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/deployment.yaml b/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/deployment.yaml deleted file mode 100644 index 97150d5e78..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/deployment.yaml +++ /dev/null @@ -1,60 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ .Release.Name }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | indent 4 }} -spec: - selector: - matchLabels: - {{- include "chart.labels" . | indent 6 }} - replicas: {{ .Values.replicas }} - template: - metadata: - annotations: - rollme: {{ randAlphaNum 5 | quote }} - labels: - {{- include "chart.labels" . | indent 8 }} - spec: - # volumes: - # - configMap: - # name: {{ .Release.Name }} - # name: {{ .Release.Name }} - hostAliases: - - ip: "35.245.78.220" - hostnames: - - "mongodb-prod-servers-vm-0" - - ip: "34.94.131.148" - hostnames: - - "mongodb-2-servers-vm-0" - - ip: "35.236.51.89" - hostnames: - - "mongodb-2-servers-vm-1" - nodeSelector: -{{ toYaml .Values.nodeSelector | indent 8 }} - containers: - - name: {{ .Release.Name }} - image: {{ .Values.image }} - # volumeMounts: - # - name: {{ .Release.Name }} - # mountPath: /settings.json - # readOnly: false - imagePullPolicy: {{ .Values.imagePullPolicy }} - ports: -{{- include "ports.pod" . | indent 8 }} - env: - - name: ROOT_URL - value: http://wallet.pylons.tech - - name: MONGO_URL - value: {{ .Values.mongoURL }} - - name: PORT - value: "80" - - name: METEOR_SETTINGS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }} - key: settings.json - resources: -{{ toYaml .Values.resources | indent 12 }} - terminationGracePeriodSeconds: 10 \ No newline at end of file diff --git a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/ingress.yaml b/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/ingress.yaml deleted file mode 100644 index cdfe2d1007..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/ingress.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ .Release.Name }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | indent 4 }} - annotations: -{{ toYaml .Values.ingress.annotations | indent 4 }} -spec: - defaultBackend: - service: - name: {{ .Release.Name}} - port: - number: 80 \ No newline at end of file diff --git a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/service.yaml b/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/service.yaml deleted file mode 100644 index ce8d9a2806..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "big-dipper-v1.fullname" . }} - labels: - {{- include "big-dipper-v1.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: 80 - protocol: TCP - name: http - selector: - {{- include "big-dipper-v1.selectorLabels" . | nindent 4 }} \ No newline at end of file diff --git a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/values.yaml b/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/values.yaml deleted file mode 100644 index 80f3bbaf90..0000000000 --- a/big-dipper-backend/deploy/big-dipper-prod/pylons-big-dipper/values.yaml +++ /dev/null @@ -1,37 +0,0 @@ -image: gcr.io/zinc-interface-241613/big-dipper-v1 -imagePullPolicy: Always - -replicas: 1 - -nodeSelector: {} - -service: - type: LoadBalancer - port: 80 - -ingress: - enabled: false - className: gce - annotations: - kubernetes.io/ingress.global-static-ip-name: big-dipper-v1 - networking.gke.io/managed-certificates: managed-cert - kubernetes.io/ingress.class: "gce" - cert-manager.io/cluster-issuer: letsencrypt-prod - kubernetes.io/tls-acme: "true" - hosts: - - host: wallet.pylons.tech - paths: - - path: / - pathType: ImplementationSpecific - # tls: - # - secretName: chart-example-tls - # hosts: - # - wallet.pylons.tech - - -resources: {} - - - -host: wallet.pylons.tech -mongoURL: mongodb://104.156.226.17:27017/big-dipper-v1?serverSelectionTimeoutMS=5000&connectTimeoutMS=10000 \ No newline at end of file diff --git a/big-dipper-backend/deploy/network/managed-cert.yaml b/big-dipper-backend/deploy/network/managed-cert.yaml deleted file mode 100644 index 61f131f431..0000000000 --- a/big-dipper-backend/deploy/network/managed-cert.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: networking.gke.io/v1 -kind: ManagedCertificate -metadata: - name: managed-cert -spec: - domains: - - wallet.pylons.tech \ No newline at end of file diff --git a/big-dipper-backend/deploy/pylons-big-dipper/Chart.yaml b/big-dipper-backend/deploy/pylons-big-dipper/Chart.yaml deleted file mode 100644 index 014d58cd1b..0000000000 --- a/big-dipper-backend/deploy/pylons-big-dipper/Chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v2 -name: big-dipper-v1 -description: Pylons Big Dipper -version: 0.0.1 -appVersion: 0.0.1 diff --git a/big-dipper-backend/deploy/pylons-big-dipper/templates/_helpers.tpl b/big-dipper-backend/deploy/pylons-big-dipper/templates/_helpers.tpl deleted file mode 100644 index 586045548b..0000000000 --- a/big-dipper-backend/deploy/pylons-big-dipper/templates/_helpers.tpl +++ /dev/null @@ -1,86 +0,0 @@ -{{- define "ports.service" }} -{{- range $key, $value := .Values.ports }} -- port: {{ $v := $value | toString | splitList ":" }}{{$v | first}} - name: {{ $key }} - targetPort: {{ $v := $value | toString | splitList ":" }}{{$v | last}} -{{- end }} -{{- end }} - -{{- define "ports.pod" }} -{{- range $key, $value := .Values.ports }} - - containerPort: {{ $v := $value | toString | splitList ":" }}{{$v | last}} - name: {{ $key }} -{{- end }} -{{- end }} - -{{- define "chart.labels" }} -app.kubernetes.io/name: {{ .Chart.Name }} -helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/version: {{ .Chart.AppVersion }} -{{- if .Values.labels }}{{ toYaml .Values.labels}}{{- end }} -{{- end }} - -{{/* -Expand the name of the chart. -*/}} -{{- define "big-dipper-v1.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "big-dipper-v1.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "big-dipper-v1.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "big-dipper-v1.labels" -}} -helm.sh/chart: {{ include "big-dipper-v1.chart" . }} -{{ include "big-dipper-v1.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "big-dipper-v1.selectorLabels" -}} -app.kubernetes.io/name: {{ include "big-dipper-v1.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "big-dipper-v1.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "big-dipper-v1.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} diff --git a/big-dipper-backend/deploy/pylons-big-dipper/templates/configmap.yaml b/big-dipper-backend/deploy/pylons-big-dipper/templates/configmap.yaml deleted file mode 100644 index 0a87591b4e..0000000000 --- a/big-dipper-backend/deploy/pylons-big-dipper/templates/configmap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.settings }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ .Release.Name }}-archive - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | indent 4 }} -data: - settings.json: |- -{{ .Values.applicationSettingsJson | indent 4}} -{{- end }} diff --git a/big-dipper-backend/deploy/pylons-big-dipper/templates/deployment.yaml b/big-dipper-backend/deploy/pylons-big-dipper/templates/deployment.yaml deleted file mode 100644 index bcc6757155..0000000000 --- a/big-dipper-backend/deploy/pylons-big-dipper/templates/deployment.yaml +++ /dev/null @@ -1,54 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ .Release.Name }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | indent 4 }} -spec: - selector: - matchLabels: - {{- include "chart.labels" . | indent 6 }} - replicas: {{ .Values.replicas }} - template: - metadata: - annotations: - rollme: {{ randAlphaNum 5 | quote }} - labels: - {{- include "chart.labels" . | indent 8 }} - spec: - # volumes: - # - configMap: - # name: {{ .Release.Name }} - # name: {{ .Release.Name }} - hostAliases: - - ip: "34.105.11.201" - hostnames: - - "mongodb-1-servers-vm-0" - nodeSelector: -{{ toYaml .Values.nodeSelector | indent 8 }} - containers: - - name: {{ .Release.Name }} - image: {{ .Values.image }} - # volumeMounts: - # - name: {{ .Release.Name }} - # mountPath: /settings.json - # readOnly: false - imagePullPolicy: {{ .Values.imagePullPolicy }} - ports: -{{- include "ports.pod" . | indent 8 }} - env: - - name: ROOT_URL - value: http://wallet.pylons.tech - - name: MONGO_URL - value: {{ .Values.mongoURL }} - - name: PORT - value: "80" - - name: METEOR_SETTINGS - valueFrom: - configMapKeyRef: - name: {{ .Release.Name }} - key: settings.json - resources: -{{ toYaml .Values.resources | indent 12 }} - terminationGracePeriodSeconds: 10 \ No newline at end of file diff --git a/big-dipper-backend/deploy/pylons-big-dipper/templates/ingress.yaml b/big-dipper-backend/deploy/pylons-big-dipper/templates/ingress.yaml deleted file mode 100644 index fbd43ff688..0000000000 --- a/big-dipper-backend/deploy/pylons-big-dipper/templates/ingress.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ .Release.Name }} - namespace: {{ .Release.Namespace }} - labels: - {{- include "chart.labels" . | indent 4 }} - annotations: -{{ toYaml .Values.ingress.annotations | indent 4 }} -spec: - defaultBackend: - service: - name: {{ .Release.Name}} - port: - number: 80 \ No newline at end of file diff --git a/big-dipper-backend/deploy/pylons-big-dipper/templates/service.yaml b/big-dipper-backend/deploy/pylons-big-dipper/templates/service.yaml deleted file mode 100644 index ce8d9a2806..0000000000 --- a/big-dipper-backend/deploy/pylons-big-dipper/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "big-dipper-v1.fullname" . }} - labels: - {{- include "big-dipper-v1.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: 80 - protocol: TCP - name: http - selector: - {{- include "big-dipper-v1.selectorLabels" . | nindent 4 }} \ No newline at end of file diff --git a/big-dipper-backend/deploy/pylons-big-dipper/values.yaml b/big-dipper-backend/deploy/pylons-big-dipper/values.yaml deleted file mode 100644 index 41c3691cf3..0000000000 --- a/big-dipper-backend/deploy/pylons-big-dipper/values.yaml +++ /dev/null @@ -1,37 +0,0 @@ -image: gcr.io/zinc-interface-241613/big-dipper-v1 -imagePullPolicy: Always - -replicas: 1 - -nodeSelector: {} - -service: - type: NodePort - port: 80 - -ingress: - enabled: true - className: gce - annotations: - kubernetes.io/ingress.global-static-ip-name: big-dipper-v1 - networking.gke.io/managed-certificates: managed-cert - kubernetes.io/ingress.class: "gce" - cert-manager.io/cluster-issuer: letsencrypt-prod - kubernetes.io/tls-acme: "true" - hosts: - - host: wallet.pylons.tech - paths: - - path: / - pathType: ImplementationSpecific - # tls: - # - secretName: chart-example-tls - # hosts: - # - wallet.pylons.tech - - -resources: {} - - - -host: wallet.pylons.tech -mongoURL: mongoUrlVal \ No newline at end of file diff --git a/big-dipper-backend/docker-compose.yml b/big-dipper-backend/docker-compose.yml deleted file mode 100644 index 5db09f91ed..0000000000 --- a/big-dipper-backend/docker-compose.yml +++ /dev/null @@ -1,27 +0,0 @@ -version: '3' - -services: - app: - build: - context: . - dockerfile: Dockerfile - ports: - - '3080:3000' - depends_on: - - mongo - environment: - ROOT_URL: ${APP_ROOT_URL:-http://localhost} - MONGO_URL: mongodb://mongo:27017/meteor - PORT: 3000 - METEOR_SETTINGS: ${METEOR_SETTINGS} - FIREBASE_CONFIG: ${FIREBASE_CONFIG} - - mongo: - image: mongo:latest - command: - - --storageEngine=wiredTiger - volumes: - - data:/data/db - -volumes: - data: diff --git a/big-dipper-backend/i18n/en-us.i18n.yml b/big-dipper-backend/i18n/en-us.i18n.yml deleted file mode 100644 index e73d7eb36a..0000000000 --- a/big-dipper-backend/i18n/en-us.i18n.yml +++ /dev/null @@ -1,281 +0,0 @@ -_locale: 'en-US' -_namespace: '' - -common: - height: 'Height' - voter: 'Voter' - votingPower: 'Voting Power' - addresses: 'Addresses' - amounts: 'Amounts' - delegators: 'delegators' - block: 'block' - blocks: 'blocks' - precommit: 'precommit' - precommits: 'precommits' - last: 'last' - backToList: 'Back to List' - information: 'Information' - time: 'Time' - hash: 'Hash' - more: 'More' - fullStop: '.' - searchPlaceholder: 'Search with tx hash / block height / address' - cancel: 'Cancel' - retry: 'Retry' - rewards: 'Rewards' - bondedTokens: 'Bonded Tokens' - totalNumOfDelegations: 'Total Number of Delegations' - signIn: 'Sign In' - generatingAddresses: 'Generating addresses' - selectAddress: 'Select address to log in with from the list below:' - defaultAddressMessage: 'Your default address is account 0.' - back: 'Back' - next: 'Next' - txOutOfGasMessage: 'Unable to broadcast the transaction due to insufficient balance. Ensure you have enough funds available on your account to cover the transaction fees.' - estimatedGasPrice: 'Estimated gas price is {$gasPrice}.' -navbar: - siteName: 'BIG DIPPER' - version: '-' - validators: 'Validators' - blocks: 'Blocks' - transactions: 'Transactions' - activity_feed: 'Activity Feed' - art_sales: 'Art Sales' - proposals: 'Proposals' - votingPower: 'Voting Power' - lang: 'ENG' - english: 'English' - spanish: 'Español' - italian: 'Italiano' - polish: 'Polski' - russian: 'Русский' - chinese: '中文(繁)' - simChinese: '中文(简)' - portuguese: 'Português' - license: 'LICENSE' - forkMe: 'Fork me!' -consensus: - consensusState: 'Consensus State' - round: 'Round' - step: 'Step' -chainStates: - price: 'Price' - marketCap: 'Market Cap' - inflation: 'Inflation' - communityPool: 'Community Pool' -chainStatus: - startMessage: 'The chain is going to start in' - stopWarning: 'The chain appears to be stopped for {$time}! Feed me with new blocks 😭!' - latestHeight: 'Latest Block Height' - averageBlockTime: 'Average Block Time' - all: 'All' - now: 'Now' - allTime: 'All Time' - lastMinute: 'Last Minute' - lastHour: 'Last Hour' - lastDay: 'Last Day' - seconds: 'seconds' - activeValidators: 'Active Validators' - outOfValidators: 'out of {$totalValidators} validators' - onlineVotingPower: 'Online Voting Power' - fromTotalStakes: '{$percent} from {$totalStakes} {$denomPlural}' -analytics: - blockTimeHistory: 'Block Time History' - averageBlockTime: 'Average Block Time' - blockInterval: 'Block Interval' - noOfValidators: 'No. of Validators' -validators: - randomValidators: 'Random Validators' - moniker: 'Moniker' - uptime: 'Uptime' - selfPercentage: 'Self%' - commission: 'Commission' - lastSeen: 'Last Seen' - status: 'Status' - jailed: 'Jailed' - navActive: 'Active' - navInactive: 'Inactive' - active: 'Active Validators' - inactive: 'Inactive Validators' - listOfActive: 'Here is a list of active validators.' - listOfInactive: 'Here is a list of inactive validators.' - validatorDetails: 'Validator Details' - lastNumBlocks: 'Last {$numBlocks} blocks' - validatorInfo: 'Validator Info' - operatorAddress: 'Operator Address' - selfDelegationAddress: 'Self-Delegate Address' - deeplinks: 'Deeplinks' - commissionRate: 'Commission Rate' - maxRate: 'Max Rate' - maxChangeRate: 'Max Change Rate' - selfDelegationRatio: 'Self Delegation Ratio' - proposerPriority: 'Proposer Priority' - delegatorShares: 'Delegator Shares' - userDelegateShares: 'Shares Delegated by you' - tokens: 'Tokens' - unbondingHeight: 'Unbonding Height' - unbondingTime: 'Unbonding Time' - jailedUntil: 'Jailed Until' - powerChange: 'Power Change' - delegations: 'Delegations' - transactions: 'Transactions' - validatorNotExists: 'Validator does not exist.' - backToValidator: 'Back to Validator' - missedBlocks: 'Missed Blocks' - missedPrecommits: 'Missed Precommits' - missedBlocksTitle: 'Missed blocks of {$moniker}' - totalMissed: 'Total missed' - block: 'Block' - missedCount: 'Miss Count' - iDontMiss: 'I do not miss ' - lastSyncTime: 'Last sync time' - delegator: 'Delegator' - amount: 'Amount' -blocks: - block: 'Block' - proposer: 'Proposer' - latestBlocks: 'Latest blocks' - noBlock: 'No block.' - numOfTxs: 'No. of Txs' - numOfTransactions: 'No. of Transactions' - notFound: 'No such block found.' -transactions: - transaction: 'Transaction' - transactions: 'Transactions' - notFound: 'No transaction found.' - activities: 'Activities' - txHash: 'Tx Hash' - valid: 'Valid' - fee: 'Fee' - noFee: 'No fee' - gasUsedWanted: 'Gas (used / wanted)' - noTxFound: 'No such transaction found.' - noValidatorTxsFound: 'No transaction related to this validator was found.' - memo: 'Memo' - transfer: 'Transfer' - staking: 'Staking' - distribution: 'Distribution' - governance: 'Governance' - slashing: 'Slashing' -proposals: - notFound: 'No proposal found.' - listOfProposals: 'Here is a list of governance proposals.' - proposer: 'Proposer' - proposal: 'proposal' - proposals: 'Proposals' - proposalID: 'Proposal ID' - title: 'Title' - status: 'Status' - submitTime: 'Submit Time' - depositEndTime: 'Deposit End Time' - votingStartTime: 'Voting Start Time' - votingEndTime: 'End Voting Time' - totalDeposit: 'Total Deposit' - description: 'Description' - proposalType: 'Proposal Type' - proposalStatus: 'Proposal Status' - notStarted: 'not started' - final: 'final' - deposit: 'Deposit' - tallyResult: 'Tally Result' - yes: 'Yes' - abstain: 'Abstain' - no: 'No' - noWithVeto: 'No with Veto' - percentageVoted: '{$percent} of online voting power has been voted.' - validMessage: 'This proposal is {$tentative}valid.' - invalidMessage: 'Less than {$quorum} of voting power is voted. This proposal is invalid.' - moreVoteMessage: 'It will be a valid proposal once {$moreVotes} more votes are cast.' - key: 'Key' - value: 'Value' - amount: 'Amount' - recipient: 'Recipient' - changes: 'Changes' - subspace: 'Subspace' -recipes: - notFound: 'No Recipe data found.' - listOfRecipes: 'Here is a list of recipes.' - recipe: 'Recipe' - recipes: 'Recipes' - recipeID: 'Recipe ID' - name: 'Name' - blockInterval: 'BlockInterval' - title: 'Title' - status: 'Status' - submitTime: 'Submit Time' - depositEndTime: 'Deposit End Time' - votingStartTime: 'Voting Start Time' - votingEndTime: 'End Voting Time' - totalDeposit: 'Total Deposit' - cookbookID: 'Cookbook ID' - description: 'Description' - sender: 'Sender' - deeplinks: 'DeepLinks' - disabled: 'Disabled' - yes: 'Yes' - no: 'No' - key: 'Key' - value: 'Value' - amount: 'Amount' - recipient: 'Recipient' - changes: 'Changes' - subspace: 'Subspace' -votingPower: - distribution: 'Voting Power Distribution' - pareto: 'Pareto Principle (20/80 rule)' - minValidators34: 'Min no. of validators hold 34%+ power' -accounts: - accountDetails: 'Account Details' - available: 'Available' - delegated: 'Delegated' - unbonding: 'Unbonding' - rewards: 'Rewards' - total: 'Total' - notFound: 'This account does not exist. Are you looking for a wrong address?' - validators: 'Validators' - shares: 'Shares' - mature: 'Mature' - no: 'No ' - none: 'No ' - delegation: 'Delegation' - plural: 's' - signOut: 'Sign out' - signInText: 'You are signed in as ' - toLoginAs: 'To log in as' - signInWithLedger: 'Sign In With Ledger' - signInWarning: 'Please make sure your Ledger device is turned on and {$network} App {$version} or above is opened.' - pleaseAccept: 'please accept in your Ledger device.' - noRewards: 'No Rewards' - BLESupport: 'Bluetooth connection is currently only supported on Google Chrome Browser.' -activities: - single: 'A' - happened: 'happened.' - senders: 'The following sender(s)' - sent: 'sent' - receivers: 'to the following receipient(s)' - received: 'received' - failedTo: 'failed to ' - to: 'to' - from: 'from' - operatingAt: 'operating at' - withMoniker: 'with moniker' - withTitle: 'with title' - withA: 'with a' - withAmount: 'with {$amount}' -messageTypes: - send: 'Send' - multiSend: 'Multi Send' - createValidator: 'Create Validator' - editValidator: 'Edit Validator' - delegate: 'Delegate' - undelegate: 'Undelegate' - redelegate: 'Redelegate' - submitProposal: 'Submit Proposal' - deposit: 'Deposit' - vote: 'Vote' - withdrawComission: 'Withdraw Commission' - withdrawReward: 'Withdraw Reward' - modifyWithdrawAddress: 'Modify Withdraw Address' - unjail: 'Unjail' - IBCTransfer: 'IBC Transfer' - IBCReceive: 'IBC Receive' diff --git a/big-dipper-backend/i18n/es-es.i18n.yml b/big-dipper-backend/i18n/es-es.i18n.yml deleted file mode 100644 index 66ecd14d57..0000000000 --- a/big-dipper-backend/i18n/es-es.i18n.yml +++ /dev/null @@ -1,238 +0,0 @@ -_locale: "es-ES" -_namespace: "" - -common: - height: "Altura" - voter: "Votante" - votingPower: "Poder de votación" - addresses: "Direcciones" - amounts: "Cantidades" - delegators: "delegadores" - block: "bloque" - blocks: "bloques" - precommit: "precommit" - precommits: "precommits" - last: "último" - backToList: "Volver a la lista" - information: "Información" - time: "Tiempo" - hash: "Hash" - more: "Más" - fullStop: "." - searchPlaceholder: "Buscar con el tx hash / altura de bloque / dirección" - cancel: "Cancelar" - retry: "Reintentar" -navbar: - siteName: "BIG DIPPER" - validators: "Validadores" - blocks: "Bloques" - transactions: "Transacciones" - activity_feed: "Activity Feed" - art_sales: "Art Sales" - proposals: "Propuestas" - votingPower: "Poder de voto" - lang: "ES" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - russian: "Русский" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: "LICENCIA" - forkMe: "Fork me!" -consensus: - consensusState: "Estado de consenso" - round: "Ronda" - step: "Paso" -chainStates: - price: "Precio" - marketCap: "Capitalización de mercado" - inflation: "Inflación" - communityPool: "Community Pool" -chainStatus: - startMessage: "La cadena comenzará en" - stopWarning: "La cadena parece estar parada por {$time}! Dame de comer nuevos bloques 😭!" - latestHeight: "Última altura de bloque" - averageBlockTime: "Tiempo medio de bloque" - all: "Todo" - now: "Ahora" - allTime: "Todo el tiempo" - lastMinute: "Último minuto" - lastHour: "Última hora" - lastDay: "Último día" - seconds: "segundos" - activeValidators: "Validadores activos" - outOfValidators: "fuera de {$totalValidators} validadores" - onlineVotingPower: "Poder de voto en línea" - fromTotalStakes: "{$percent} de {$totalStakes} {$denomPlural}" -analytics: - blockTimeHistory: "Historial de tiempo de bloque" - averageBlockTime: "Tiempo medio de bloque" - blockInterval: "Intervalo de bloque" - noOfValidators: "No. de validadores" -validators: - randomValidators: "Validadores aleatorios" - moniker: "Moniker" - uptime: "Tiempo de funcionamiento" - selfPercentage: "Self%" - commission: "Comisión" - lastSeen: "Última vez visto" - status: "Estado" - jailed: "Encarcelado" - navActive: "Activo" - navInactive: "Inactivo" - active: "Validadores activos" - inactive: "Validadores inactivos" - listOfActive: "Esta es una lista de los validadores activos." - listOfInactive: "Esta es una lista de los validadores inactivos." - validatorDetails: "Detalles del validador" - lastNumBlocks: "Último {$numBlocks} bloques" - validatorInfo: "Información del validador" - operatorAddress: "Dirección de operador" - selfDelegationAddress: "Dirección de autodelegación" - deeplinks: "Deeplinks" - commissionRate: "Ratio de comisión" - maxRate: "Ratio máximo" - maxChangeRate: "Ratio máximo de cambio" - selfDelegationRatio: "Ratio de autodelegación" - proposerPriority: "" - delegatorShares: "Acciones del delegador" - userDelegateShares: "Acciones delegadas por ti" - tokens: "Tokens" - unbondingHeight: "Altura " - unbondingTime: "Tiempo para desvincularse" - powerChange: "Power Change" - delegations: "Delegaciones" - transactions: "Transacciones" - validatorNotExists: "El validador no existe." - backToValidator: "Volver al validador" - missedBlocks: "Bloques perdidos" - missedPrecommits: "Precommits perdidos" - missedBlocksTitle: "Bloques perdidos de {$moniker}" - totalMissed: "Total perdido" - block: "Bloque" - missedCount: "Perdidos" - iDontMiss: "No he perdido " - lastSyncTime: "Último tiempo de sincronización" - delegator: "Delegador" - amount: "Cantidad" -blocks: - block: "Bloque" - proposer: "Proposer" - latestBlocks: "Últimos bloques" - noBlock: "No bloque." - numOfTxs: "No. de txs" - numOfTransactions: "No. de transacciones" - notFound: "No se ha encontrado tal bloque." -transactions: - transaction: "Transacción" - transactions: "Transacciones" - notFound: "No se encuentra la transacción." - activities: "Movimientos" - txHash: "Tx Hash" - valid: "Validez" - fee: "Comisión" - noFee: "No fee" - gasUsedWanted: "Gas (usado / deseado)" - noTxFound: "No se encontró ninguna transacción de este tipo." - noValidatorTxsFound: "No se encontró ninguna transaccion relacionada con este validador." - memo: "Memo" - transfer: "Transferencia" - staking: "Participación" - distribution: "Distribución" - governance: "Gobernanza" - slashing: "Recorte" -proposals: - notFound: "No se ha encontrado el proposal." - listOfProposals: "Here is a list of governance proposals." - proposer: "Proposer" - proposal: "propuesta" - proposals: "Propuestas" - proposalID: "ID de la propuesta" - title: "Título" - status: "Estado" - submitTime: "Plazo de entrega" - depositEndTime: "Final del tiempo de depósito" - votingStartTime: "Hora de inicio de la votación" - votingEndTime: "Fin del tiempo de votación" - totalDeposit: "Depósito total" - description: "Descripción" - proposalType: "Tipo de propuesta" - proposalStatus: "Estado de la propuesta" - notStarted: "no iniciado" - final: "final" - deposit: "Depósito" - tallyResult: "Resultado del recuento" - yes: "Si" - abstain: "Abstención" - no: "No" - none: "None" - noWithVeto: "No con Veto" - percentageVoted: '{$percent} del poder de voto online ha votado.' - validMessage: "Este proposal es {$tentative}valido." - invalidMessage: "Menos del {$quorum} del poder de voto ha votado. Este proposal es invalido." - moreVoteMessage: 'Será una propuesta válida una vez que {$moreVotes} más votos se emitan.' - key: "Key" - value: "Value" - amount: "Amount" - recipient: "Recipient" - changes: "Changes" - subspace: "Subspace" -votingPower: - distribution: "Distribución del poder de Voto" - pareto: "Pareto Principle (20/80 rule)" - minValidators34: "Min no. of validators hold 34%+ power" -accounts: - accountDetails: "Detalles de la cuenta" - available: "Disponible" - delegated: "Delegado" - unbonding: "Unbonding" - rewards: "Rewards" - total: "Total" - notFound: "Esta cuenta no existe. ¿Estas buscando una dirección equivocada?" - validators: "Validadores" - shares: "Shares" - mature: "Mature" - no: "No " - delegation: "Delegación" - plural: "s" - signOut: "Cerrar sesión" - signInText: "Estas registrado como " - toLoginAs: "Para conectarse como" - signInWithLedger: "Registrarse con Ledger" - signInWarning: 'Por favor, asegúrese de que su dispositivo Ledger esté conectado y la App de Cosmos con la version 1.5.0 o superior esta abierta.' - pleaseAccept: "por favor, acepta en tu dispositivo Ledger." - noRewards: "No Rewards" -activities: - single: "A" - happened: "sucedió." - senders: "Los siguientes remitentes" - sent: "enviado a" - receivers: "al siguiente destinatario" - received: "recibido" - failedTo: "failed to " - to: "a" - from: "desde" - operatingAt: "operando en" - withMoniker: "con el moniker" - withTitle: "con el título" - withA: "con" -messageTypes: - send: "Enviar" - multiSend: "Multi Envío" - createValidator: "Crear validador" - editValidator: "Editar validador" - delegate: "Delegar" - undelegate: "Undelegar" - redelegate: "Redelegar" - submitProposal: "Enviar Proposal" - deposit: "Depositar" - vote: "Voto" - withdrawComission: "Enviar comisión" - withdrawReward: "Retirar recompensa" - modifyWithdrawAddress: "Modificar la dirección de envío" - unjail: "Unjail" - IBCTransfer: "IBC Transfer" - IBCReceive: "IBC Receive" diff --git a/big-dipper-backend/i18n/it-IT.i18n.yml b/big-dipper-backend/i18n/it-IT.i18n.yml deleted file mode 100644 index 1e57c837f6..0000000000 --- a/big-dipper-backend/i18n/it-IT.i18n.yml +++ /dev/null @@ -1,237 +0,0 @@ -_locale: 'it-IT' -_namespace: '' - -common: - height: 'Altezza' - voter: 'Votante' - votingPower: 'Potere di voto' - addresses: 'Indirizzi' - amounts: 'Importi' - delegators: 'delegatori' - block: 'blocco' - blocks: 'blocchi' - precommit: 'precommit' - precommits: 'precommit' - last: 'ultimo' - backToList: 'Torna alla Lista' - information: 'Informazioni' - time: 'Tempo' - hash: 'Hash' - more: 'Di più' - fullStop: '.' - searchPlaceholder: 'Cerca hash transazione / altezza blocco / indirizzo' - cancel: 'Annulla' - retry: 'Riprova' - rewards: 'Reward' -navbar: - siteName: 'BIG DIPPER' - validators: 'Validatori' - blocks: 'Blocchi' - transactions: 'Transazioni' - proposals: 'Proposte' - votingPower: 'Potere di Voto' - lang: "IT" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - russian: "Русский" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: 'LICENZA' - forkMe: 'Forkami!' -consensus: - consensusState: 'Stato del consenso' - round: 'Round' - step: 'Step' -chainStates: - price: 'Prezzo' - marketCap: 'Market Cap' - inflation: 'Inflazione' - communityPool: 'Community Pool' -chainStatus: - startMessage: 'The chain partirà tra' - stopWarning: 'La chain sembra essersi fermata per {$time}! Dammi nuovi blocchi 😭!' - latestHeight: 'Ultima Altezza di Blocco' - averageBlockTime: 'Tempo di Blocco Medio' - all: 'Tutti' - now: 'Ora' - allTime: 'Tutti i tempi' - lastMinute: 'Ultimo Minuto' - lastHour: 'Ultima ora' - lastDay: 'Ultimo giorno' - seconds: 'secondi' - activeValidators: 'Validatori Attivi' - outOfValidators: 'di {$totalValidators} validatori' - onlineVotingPower: 'Voting Power Attivo' - fromTotalStakes: '{$percent} di {$totalStakes} {$denomPlural}' -analytics: - blockTimeHistory: 'Storia Tempo di Blocco' - averageBlockTime: 'Tempo di Blocco Medio' - blockInterval: 'Intervallo di Blocco' - noOfValidators: 'N. Validatori' -validators: - randomValidators: 'Validatori random' - moniker: 'Moniker' - uptime: 'Uptime' - selfPercentage: '% autodelegata' - commission: 'Commissioni' - lastSeen: 'Visto per ultimo' - status: 'Stato' - jailed: 'Jailato' - navActive: 'Attivo' - navInactive: 'Inattivo' - active: 'Tutti i Validatori' - inactive: 'Validatori inattivi' - listOfActive: 'Ecco una lista di validatori attivi.' - listOfInactive: 'Ecco una lista di validatori inattivi.' - validatorDetails: 'Dettagli validatore' - lastNumBlocks: 'Utlimi {$numBlocks} blocchi' - validatorInfo: 'Info Validatore' - operatorAddress: 'Indirizzo Operatore' - selfDelegationAddress: 'Indirizzo di Auto-Delega' - deeplinks: 'Deeplinks' - commissionRate: 'Tasso di commissioni' - maxRate: 'Tasso massima' - maxChangeRate: 'Cambiamento del tasso massimo' - selfDelegationRatio: 'Tasso di Auto Delega' - proposerPriority: 'Priorità del proponente' - delegatorShares: 'Percentuale dei delegati' - userDelegateShares: 'Percentuale delega personale' - tokens: 'Token' - unbondingHeight: 'Altezza di unbond' - unbondingTime: 'Tempo di unbond' - powerChange: 'Modifica del potere' - delegations: 'Delegazioni' - transactions: 'Transazioni' - validatorNotExists: 'Validatore inesistente' - backToValidator: 'Torna al validatore' - missedBlocks: 'Blocchi mancanti' - missedPrecommits: 'Precommit mancati' - missedBlocksTitle: 'Manca il blocco: {$moniker}' - totalMissed: 'Totale perso' - block: 'Blocco' - missedCount: 'Mancato conteggio' - iDontMiss: 'Non mi manca' - lastSyncTime: 'Ultima sincronizzazione ora' - delegator: 'Delegante' - amount: 'Importo' -blocks: - block: 'Blocco' - proposer: 'Proponente' - latestBlocks: 'Ultimi blocchi' - noBlock: 'Nessun blocco' - numOfTxs: 'N. Txs' - numOfTransactions: 'N. di transazioni' - notFound: 'Nessun blocco trovato.' -transactions: - transaction: 'Transazione' - transactions: 'Transazioni' - notFound: 'Nessuna transazione trovata' - activities: 'Attività' - txHash: 'Hash Tx' - valid: 'Valido' - fee: 'Fee' - noFee: 'Nessuna fee' - gasUsedWanted: 'Gas (usato / voluto)' - noTxFound: 'Nessuna transazione trovata.' - noValidatorTxsFound: 'Nessuna transazione relativa a questo validatore trovata' - memo: 'Memo' - transfer: 'Trasferimento' - staking: 'Staking' - distribution: 'Distribuzione' - governance: 'Governance' - slashing: 'Slashing' -proposals: - notFound: 'Nessuna proposta trovata.' - listOfProposals: 'Questa è la lista delle proposte di governance' - proposer: 'Proponente' - proposal: 'Proposta' - proposals: 'Proposte' - proposalID: 'ID Proposta' - title: 'Titolo' - status: 'Stato' - submitTime: 'Ora invio' - depositEndTime: 'Ora di fine deposito' - votingStartTime: 'Ora di inizio votazione' - votingEndTime: 'Ora di fine votazione' - totalDeposit: 'Deposito totale' - description: 'Descrizione' - proposalType: 'Tipo di proposta' - proposalStatus: 'Stato della proposta' - notStarted: 'Non iniziato' - final: 'Finale' - deposit: 'Deposito' - tallyResult: 'Risultato conteggio' - yes: 'Sì' - abstain: 'Astenersi' - no: 'No' - noWithVeto: 'No con Veto' - percentageVoted: '{$percent} di voti raccolti tra i votanti attivi.' - validMessage: 'Questa proposta è {$tentative}valida.' - invalidMessage: 'Sono stati raccolti meno del {$quorum} di voti. Questa proposta è invalida.' - moreVoteMessage: 'Sarà una proposta valida quando {$moreVotes} più voti di ora saranno raccolti.' - key: 'Key' - value: 'Value' - amount: 'Amount' - recipient: 'Recipient' - changes: 'Changes' - subspace: 'Subspace' -votingPower: - distribution: 'Distribuzione del potere di voto' - pareto: 'Principio di Pareto (regola 20/80)' - minValidators34: 'Min n. di validatori che possiede il 34%+ di potere' -accounts: - accountDetails: 'Dettagli account' - available: 'Disponibile' - delegated: 'Delegati' - unbonding: 'Unbonding' - rewards: 'Rewards' - total: 'Totale' - notFound: "Questo account non esiste. Forse hai inserito l'indirizzo sbagliato?" - validators: 'Validatori' - shares: 'Share' - mature: 'Maturo' - no: 'No ' - none: 'Nessuno' - delegation: 'Delega' - plural: '' - signOut: 'Esci' - signInText: 'Registrati come' - toLoginAs: 'Accedi come' - signInWithLedger: 'Registrati con un Ledger' - signInWarning: 'Per favore assicurati che il tuo Ledger sia connesso e {$network} App {$version} or above che sia aperto.' - pleaseAccept: 'Per favore accetta nel tuo Ledger' - noRewards: 'Nessun reward' -activities: - single: 'Un (male), una (female)' - happened: 'è accaduto.' - senders: 'I seguenti mittenti' - sent: 'Inviato' - receivers: 'I seguenti destinatati' - received: 'Ricevuto' - failedTo: 'Ha fallito a ' - to: 'A' - from: 'Da' - operatingAt: 'che operano presso' - withMoniker: 'con moniker' - withTitle: 'con titolo' - withA: 'con un (male) / una (female)' -messageTypes: - send: 'Invia' - multiSend: 'Invio multipo' - createValidator: 'Crea un validatore' - editValidator: 'Modifica un validatore' - delegate: 'Delega' - undelegate: 'Rimuovi delega' - redelegate: 'Ridelega' - submitProposal: 'Invia proposta' - deposit: 'Deposita' - vote: 'Vota' - withdrawComission: 'Ritira una commissione' - withdrawReward: 'Ottieni un reward' - modifyWithdrawAddress: 'Modifica indirizzo di ritiro' - unjail: 'Unjail' - IBCTransfer: 'Trasferisci IBC' - IBCReceive: 'Ricevi IBC' diff --git a/big-dipper-backend/i18n/pl-PL.i18n.yml b/big-dipper-backend/i18n/pl-PL.i18n.yml deleted file mode 100644 index 86d344f869..0000000000 --- a/big-dipper-backend/i18n/pl-PL.i18n.yml +++ /dev/null @@ -1,237 +0,0 @@ -_locale: 'pl-PL' -_namespace: '' - -common: - height: 'Wysokość' - voter: 'Głosujący' - votingPower: 'Siła Głosu' - addresses: 'Adres' - amounts: 'Kwota' - delegators: 'Delegatorzy' - block: 'blok' - blocks: 'bloki' - precommit: 'precommit' - precommits: 'precommits' - last: 'ostatni' - backToList: 'Powrtót do Listy' - information: 'Informacje' - time: 'Czas' - hash: 'Hash' - more: 'Więcej' - fullStop: '.' - searchPlaceholder: 'Wyszukaj adres / transakcję / wysokość bloku' - cancel: 'Anuluj' - retry: 'Spróbuj ponownie' - rewards: 'Nagrody' -navbar: - siteName: 'Wielki Wóz' - validators: 'Walidatorzy' - blocks: 'Bloki' - transactions: 'Transakcje' - proposals: 'Propozycje' - votingPower: 'Siła Głosu' - lang: "PL" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - russian: "Русский" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: 'LICENCJA' - forkMe: 'Fork me!' -consensus: - consensusState: 'Status Konsensusu' - round: 'Runda' - step: 'Etap' -chainStates: - price: 'Cena' - marketCap: 'Kapitalizacja rynkowa' - inflation: 'Inflacja' - communityPool: 'Zasoby Społeczności' -chainStatus: - startMessage: 'Łańcuch bloków danych rozpocznie działanie za ' - topWarning: 'Wygląda na to że, łańcuch bloków danych zatrzymał się na {$time}! Odśwież stronę i nakarm mnie nowymi blokami 😭!' - latestHeight: 'Ostatnia wysokość bloku' - averageBlockTime: 'Średni Czas Bloku' - all: 'Całość' - now: 'Teraz' - allTime: 'Cały Czas' - lastMinute: 'Ostatnia Minuta' - lastHour: 'Ostatnia Godzina' - lastDay: 'Ostatni Dzień' - seconds: 'sekund' - activeValidators: 'Aktywni Walidatorzy' - outOfValidators: 'z grona {$totalValidators} walidatorów' - onlineVotingPower: 'Siła Głosu Online' - fromTotalStakes: '{$percent} spośród {$totalStakes} {$denomPlural}' -analytics: - blockTimeHistory: 'Czas Bloków' - averageBlockTime: 'Średni Czas Bloku' - blockInterval: 'Interwał Bloku' - noOfValidators: 'Liczba Walidatorów' -validators: - randomValidators: 'Losowo Wybrani Walidatorzy' - moniker: 'Moniker' - uptime: 'Dyspozycyjność' - selfPercentage: 'Self%' - commission: 'Prowizja' - lastSeen: 'Ostatnio widziany' - status: 'Status' - jailed: 'Jailed' - navActive: 'Aktywni' - navInactive: 'Nieaktywni' - active: 'Aktywni Walidatorzy' - inactive: 'Nieaktywni Walidatorzy' - listOfActive: 'Lista aktywnych Walidatorów' - listOfInactive: 'Lista nieaktywnych Walidatorów' - validatorDetails: 'Szczegóły Walidatora' - lastNumBlocks: 'Ostatnie {$numBlocks} bloków' - validatorInfo: 'Szczegóły Walidatora' - operatorAddress: 'Adres Operatora' - selfDelegationAddress: 'Adres Delegacji Self' - deeplinks: 'Deeplinks' - commissionRate: 'Wysokość prowizji' - maxRate: 'Maksymalna Stawka' - maxChangeRate: 'Maksymalna Stawka Zmiany Prowizji' - selfDelegationRatio: 'Proporcja Delegacji Self' - proposerPriority: 'Piorytet Propozycji' - delegatorShares: 'Akcje Delegującego' - userDelegateShares: 'Akcje Oddelegowane przez Ciebie' - tokens: 'Tokeny' - unbondingHeight: 'Wysokość Unbonding' - unbondingTime: 'Czas Unbonding' - powerChange: 'Zmiana Siły Głosu' - delegations: 'Delegacje' - transactions: 'Transakcje' - validatorNotExists: 'Walidator nie istnieje.' - backToValidator: 'Powrtót do Walidatora' - missedBlocks: 'Pominięte Bloki' - missedPrecommits: 'Pominięte Precommits' - missedBlocksTitle: ‘Pominięte Bloki od {$moniker}' - totalMissed: 'Łącznie pominięto' - block: 'Blok' - missedCount: 'Liczba pominiętych' - iDontMiss: 'Żadne bloki nie zostały pominięte' - lastSyncTime: 'Ostatni czas synch' - delegator: 'Delegujący' - amount: 'Kwota' -blocks: - block: 'Blok' - proposer: 'Autor Propozycji' - latestBlocks: 'Ostatnie Bloki' - noBlock: 'Ilość Bloków' - numOfTxs: 'Liczba Txs' - numOfTransactions: 'Liczba Transakcji' - notFound: 'Nie znaleziono bloku.' -transactions: - transaction: 'Transakcja' - transactions: 'Transakcje' - notFound: 'Nie znaleziono transakcji.' - activities: 'Aktywność' - txHash: 'Tx Hash' - valid: 'Ważna' - fee: 'Opłata' - noFee: 'Bezpłatnie' - gasUsedWanted: 'Gaz (użyty/ wymagany)' - noTxFound: 'Nie znaleziono podanej transakcji.' - noValidatorTxsFound: 'Nie znaleziono żadnej transakcji dla podanego Walidatora' - memo: 'Memo' - transfer: 'Wysłane' - staking: 'Udziały' - distribution: 'Dystrybucja' - governance: 'Administracja' - slashing: 'Cięcia' -proposals: - notFound: Nie znaleziono propozycji.' - listOfProposals: 'Poniżej znajduje się lista propozycji administracyjnych.' - proposer: 'Autor Propozycji' - proposal: 'propozycja' - proposals: 'Propozycje' - proposalID: 'ID Propozycji' - title: 'Tytuł' - status: 'Status' - submitTime: 'Czas Wysłania' - depositEndTime: 'Czas Końcowy dla Skladania Depozytu' - votingStartTime: 'Czas Rozpoczęcia Głosowania' - votingEndTime: 'Czas Końcowy Głosowania' - totalDeposit: 'Kwota Depozytu' - description: 'Szczegóły' - proposalType: 'Typ Propozycji' - proposalStatus: 'Status Propozycji' - notStarted: 'nie rozpoczęto' - final: 'końcowy' - deposit: 'Depozyt' - tallyResult: 'Wyniki Tally' - yes: 'Tak' - abstain: 'Wstrzymaj się od Głosu' - no: 'Nie' - noWithVeto: 'Nie z Veto' - percentageVoted: '{$percent} Głosów Online zostalo oddanych' - validMessage: 'Podana propozycja jest {$tentative}ważna.' - invalidMessage: 'Mniej niż {$quorum} głosów zostało oddanych. Podana propozycja jest nieważna.' - moreVoteMessage: 'Propozycja zostanie uznana za ważną jeśli {$moreVotes} lub więcej głosów zostanie oddanych.' - key: 'Key' - value: 'Value' - amount: 'Kwota' - recipient: 'Odbiorca' - changes: 'Zmiany' - subspace: 'Subspace' -votingPower: - distribution: 'Podział Siły Głosu' - pareto: 'Zasada Pareta (zasada 20/80)' - minValidators34: 'Co najmniej 34% Walidatorów ma prawo do głosowania.' -accounts: - accountDetails: 'Szczegóły Konta' - available: 'Dostępe' - delegated: 'Oddelegowane' - unbonding: 'Unbonding' - rewards: 'Nagrody' - total: 'Łącznie' - notFound: 'Konto nie istnieje. Sprawdź, czy adres odbiorcy został prawidłowo wpisany.' - validators: 'Walidatorzy' - shares: 'Akcje' - mature: 'Dojrzały' - no: 'Nie ' - none: 'Brak ' - delegation: 'Delegacja' - plural: '' - signOut: 'Wyloguj' - signInText: 'Zalogowany jako ' - toLoginAs: 'Aby zalogować się jako ' - signInWithLedger: 'Zaloguj się z Ledgerem' - signInWarning: 'Upewnij się, że Twój Ledger jest podłączony do komputera oraz aplikacja {$network} App {$version} lub nowsza jest uruchomiona.' - pleaseAccept: 'zaakceptuj połączenie na Twoim Ledgerze.' - noRewards: 'Brak Nagród' -activities: - single: ' ' - happened: 'został wykonany' - senders: 'Nadawca' - sent: 'wysłał' - receivers: 'do podanych odbiorców/cy' - received: 'otrzymał' - failedTo: 'Nie udało się' - to: 'do' - from: 'od' - operatingAt: 'operujący pod adresem' - withMoniker: 'z monikerem' - withTitle: 'pod tytułem' - withA: 'razem z' -messageTypes: - send: 'Wysłał' - multiSend: 'Wysłał Multi' - createValidator: 'Utwórz Walidatora' - editValidator: 'Edytuj Walidatora' - delegate: 'Oddelegował' - undelegate: 'Wycofał Oddelegowane Tokeny' - redelegate: 'Oddelegował Ponownie' - submitProposal: 'Wyśłał Propozycję' - deposit: 'Wpłacił Depozyt' - vote: 'Zagłosował' - withdrawComission: 'Wypłacił Prowizję' - withdrawReward: 'Wypłacił Nagrody' - modifyWithdrawAddress: 'Zmienił adres do wypłaty' - unjail: 'Unjail' - IBCTransfer: 'Wyślij IBC' - IBCReceive: 'Odbierz IBC' diff --git a/big-dipper-backend/i18n/pt-BR.i18n.yml b/big-dipper-backend/i18n/pt-BR.i18n.yml deleted file mode 100644 index 7f881f93ed..0000000000 --- a/big-dipper-backend/i18n/pt-BR.i18n.yml +++ /dev/null @@ -1,236 +0,0 @@ -_locale: 'pt-BR' -_namespace: '' - -common: - height: 'Altura' - voter: 'Eleitor' - votingPower: 'Poder de voto' - addresses: 'Endereços' - amounts: 'Quantidades' - delegators: 'delegadores' - block: 'bloco' - blocks: 'blocos' - precommit: 'precommit' - precommits: 'precommits' - last: 'último' - backToList: 'Voltar para lista' - information: 'Informação' - time: 'Data e hora' - hash: 'Hash' - more: 'Mais' - fullStop: '.' - searchPlaceholder: 'Pesquise por tx hash / altura do bloco / endereço' - cancel: 'Cancelar' - retry: 'Tentar novamente' - rewards: 'Recompensas' -navbar: - siteName: 'BIG DIPPER' - validators: 'Validadores' - blocks: 'Blocos' - transactions: 'Transações' - proposals: 'Propostas' - votingPower: 'Poder de voto' - lang: "pt-BR" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: 'LICENÇA' - forkMe: 'Fork me!' -consensus: - consensusState: 'Estado de consenso' - round: 'Rodada' - step: 'Etapa' -chainStates: - price: 'Preço' - marketCap: 'Valor de mercado' - inflation: 'Inflação' - communityPool: 'Pool da comunidade' -chainStatus: - startMessage: 'A cadeia vai começar em' - stopWarning: 'A cadeia parece ter parado por {$time}! Alimente-me com novos blocos 😭!' - latestHeight: 'Última altura de bloco' - averageBlockTime: 'Tempo médio de bloco' - all: 'Tudo' - now: 'Agora' - allTime: 'Todo tempo' - lastMinute: 'Último minuto' - lastHour: 'Última hora' - lastDay: 'Último dia' - seconds: 'segundos' - activeValidators: 'Validadores ativos' - outOfValidators: 'de {$totalValidators} validadores' - onlineVotingPower: 'Poder de votação online' - fromTotalStakes: '{$percent} de {$totalStakes} {$denomPlural}' -analytics: - blockTimeHistory: 'Histórico de tempo de bloco' - averageBlockTime: 'Tempo médio de bloco' - blockInterval: 'Intervalo de bloco' - noOfValidators: 'Nº de validadores' -validators: - randomValidators: 'Validadores aleatórios' - moniker: 'Apelido' - uptime: 'Tempo de atividade' - selfPercentage: 'Self%' - commission: 'Comissão' - lastSeen: 'Visto pela última vez' - status: 'Status' - jailed: 'Engaiolado' - navActive: 'Ativo' - navInactive: 'Inativo' - active: 'Validadores Ativos' - inactive: 'Validadores Inativos' - listOfActive: 'Aqui está uma lista de validadores ativos.' - listOfInactive: 'Aqui está uma lista de validadores inativos.' - validatorDetails: 'Detalhes do validador' - lastNumBlocks: 'Últimos {$numBlocks} blocos' - validatorInfo: 'Informação do validador' - operatorAddress: 'Endereço do operador' - selfDelegationAddress: 'Endereço de auto-delegação' - deeplinks: 'Deeplinks' - commissionRate: 'Taxa de Comissão' - maxRate: 'Taxa máxima' - maxChangeRate: 'Taxa máxima de alteração' - selfDelegationRatio: 'Razão de auto-delegação' - proposerPriority: 'Prioridade do proponente' - delegatorShares: 'Ações do delegador' - userDelegateShares: 'Ações delegadas por você' - tokens: 'Tokens' - unbondingHeight: 'Altura de desvinculação' - unbondingTime: 'Tempo de desvinculação' - powerChange: 'Mudança de poder' - delegations: 'Delegações' - transactions: 'Transações' - validatorNotExists: 'O validador não existe.' - backToValidator: 'Voltar para validador' - missedBlocks: 'Blocos perdidos' - missedPrecommits: 'Precommits perdidos' - missedBlocksTitle: 'Blocos perdidos por {$moniker}' - totalMissed: 'Total perdido' - block: 'Bloco' - missedCount: 'Contagem de perdidos' - iDontMiss: 'Não há perdidos ' - lastSyncTime: 'Última sincronização' - delegator: 'Delegador' - amount: 'Quantidade' -blocks: - block: 'Bloco' - proposer: 'Proponente' - latestBlocks: 'Últimos Blocos' - noBlock: 'Sem bloco.' - numOfTxs: 'No. de Txs' - numOfTransactions: 'Nº de transações' - notFound: 'Nenhum bloco encontrado.' -transactions: - transaction: 'Transação' - transactions: 'Transações' - notFound: 'Nenhuma transação encontrada.' - activities: 'Atividades' - txHash: 'Tx Hash' - valid: 'Validade' - fee: 'Taxa' - noFee: 'Sem taxa' - gasUsedWanted: 'Gas (usado / desejado)' - noTxFound: 'Nenhuma transação encontrada.' - noValidatorTxsFound: 'Nenhuma transação relacionada a este validador foi encontrada.' - memo: 'Memo' - transfer: 'Transferência' - staking: 'Participação' - distribution: 'Distribuição' - governance: 'Governança' - slashing: 'Cortando' -proposals: - notFound: 'Nenhuma proposta encontrada.' - listOfProposals: 'Aqui está uma lista de propostas de governança.' - proposer: 'Proponente' - proposal: 'proposta' - proposals: 'Propostas' - proposalID: 'ID da proposta' - title: 'Título' - status: 'Status' - submitTime: 'Tempo de envio' - depositEndTime: 'Fim do tempo de depósito' - votingStartTime: 'Hora do início da votação' - votingEndTime: 'Fim do tempo de votação' - totalDeposit: 'Depósito Total' - description: 'Descrição' - proposalType: 'Tipo de proposta' - proposalStatus: 'Status da proposta' - notStarted: 'não iniciado' - final: 'final' - deposit: 'Depósito' - tallyResult: 'Resultado da contagem' - yes: 'Sim' - abstain: 'Abstenção' - no: 'Não' - noWithVeto: 'Não com Veto' - percentageVoted: '{$percent} do poder de voto já votou.' - validMessage: 'Esta proposta é {$tentative}válida.' - invalidMessage: 'Menos de {$ quorum} do poder de voto foi votado. Esta proposta é inválida..' - moreVoteMessage: 'Será uma proposta válida uma vez que {$moreVotes} mais votos sejam enviados.' - key: 'Chave' - value: 'Valor' - amount: 'Quantidade' - recipient: 'Recebedor' - changes: 'Alterações' - subspace: 'Subespaço' -votingPower: - distribution: 'Distribuição do poder de voto' - pareto: 'Princípio de Pareto (regra 20/80)' - minValidators34: 'Número mínimo de validadores que detem 34%+ de poder' -accounts: - accountDetails: 'Detalhes da conta' - available: 'disponível' - delegated: 'delegado' - unbonding: 'desvinculação' - rewards: 'Recompensas' - total: 'Total' - notFound: 'Essa conta não existe. Você está informando o endereço correto?' - validators: 'Validadores' - shares: 'Ações' - mature: 'Mature' - no: 'Não ' - none: 'Sem ' - delegation: 'delegação' - plural: 's' - signOut: 'Sair' - signInText: 'Você está conectado como ' - toLoginAs: 'Para entrar como' - signInWithLedger: 'Entrar com Ledger' - signInWarning: 'Certifique-se de que seu dispositivo Ledger esteja conectado e o {$network} App {$version} ou superior esteja aberto.' - pleaseAccept: 'por favor, aceite em seu dispositivo Ledger.' - noRewards: 'Sem recompensas' -activities: - single: 'A' - happened: 'aconteceu.' - senders: 'O(s) seguinte(s) remetente(s)' - sent: 'enviado' - receivers: 'para o(s) seguinte(s) destinatário(s)' - received: 'recebido' - failedTo: 'falhou em' - to: 'para' - from: 'de' - operatingAt: 'operado por' - withMoniker: 'com o apelido' - withTitle: 'com o título' - withA: 'com' -messageTypes: - send: 'Enviou' - multiSend: 'Envio múltiplo' - createValidator: 'Criar Validador' - editValidator: 'Editar Validador' - delegate: 'Delegar' - undelegate: 'Undelegar' - redelegate: 'Redelegar' - submitProposal: 'Enviar proposta' - deposit: 'Depósito' - vote: 'Vote' - withdrawComission: 'Retirar Comissão' - withdrawReward: 'Retirar Recompensa' - modifyWithdrawAddress: 'Modificar Endereço de Retirada' - unjail: 'Sair da jaula' - IBCTransfer: 'IBC transferido' - IBCReceive: 'IBC recebido' diff --git a/big-dipper-backend/i18n/ru-RU.i18n.yml b/big-dipper-backend/i18n/ru-RU.i18n.yml deleted file mode 100644 index 02b681ace2..0000000000 --- a/big-dipper-backend/i18n/ru-RU.i18n.yml +++ /dev/null @@ -1,252 +0,0 @@ -_locale: 'ru-RU' -_namespace: '' - -common: - height: 'Высота Блока' - voter: 'Избиратель' - votingPower: 'Право Голоса' - addresses: 'Адреса' - amounts: 'Суммы' - delegators: 'Делегаторы' - block: 'Блок' - blocks: 'Блоки' - precommit: 'Прекоммит' - precommits: 'Прекоммиты' - last: 'Последний' - backToList: 'Назад к списку' - information: 'Информация' - time: 'Время' - hash: 'Хэш' - more: 'Дальше' - fullStop: '.' - searchPlaceholder: 'Поиск по хэшу сделки / высоте блока / адресу' - cancel: 'Отмена' - retry: 'Повторить попытку' - rewards: 'Награды' - bondedTokens: 'Bonded Tokens' - totalNumOfDelegations: 'Всего Делегирований' - signIn: 'Войти' - generatingAddresses: 'Генерация адресов' - selectAddress: 'Выберите адрес, с которым хотите авторизоваться, из списка ниже:' - defaultAddressMessage: 'Ваш адрес по умолчанию это счет 0.' - back: 'Назад' - next: 'Вперед' - txOutOfGasMessage: 'Транзакция не осуществлена: недостаточный баланс. Убедитесь, что вашего баланса достаточно, чтобы покрыть комиссию.' - estimatedGasPrice: 'Примерная цена газа {$gasPrice}.' -navbar: - siteName: 'BIG DIPPER' - version: '-' - validators: 'Валидаторы' - blocks: 'Блоки' - transactions: 'Транзакции' - proposals: 'Предложения' - votingPower: 'Право голоса' - lang: "RU" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - russian: "Русский" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: 'ЛИЦЕНЗИЯ' - forkMe: Форк!' -consensus: - consensusState: 'Состояние консенсуса' - round: 'Раунд' - step: 'Этап' -chainStates: - price: 'Цена' - marketCap: 'Рыночная капитализация' - inflation: 'Инфляция' - communityPool: 'Коммьюнити пул' -chainStatus: - startMessage: 'Чейн будет запущен в' - stopWarning: 'Чейн не запущен уже {$time}! Накорми меня новыми блоками 😭!' - latestHeight: 'Последняя Высота Блока' - averageBlockTime: 'Среднее Время Блока' - all: 'Всё' - now: 'Сейчас' - allTime: 'За Все Время' - lastMinute: 'За Последнюю Минуту' - lastHour: 'За Последний Час' - lastDay: 'За Последний День' - seconds: 'секунды' - activeValidators: 'Активные валидаторы' - outOfValidators: 'из {$totalValidators} валидаторов' - onlineVotingPower: 'Онлайн Право Голоса' - fromTotalStakes: '{$percent} из {$totalStakes} {$denomPlural}' -analytics: - blockTimeHistory: 'История Времени Блока' - averageBlockTime: 'Среднее Время Блока' - blockInterval: 'Интервал Блока' - noOfValidators: 'Количество валидаторов' -validators: - randomValidators: 'Случайные Валидаторы' - moniker: 'Название' - uptime: 'Аптайм' - selfPercentage: '% самоделегирования' - commission: 'Комиссия' - lastSeen: 'Последний раз был онлайн' - status: 'Статус' - jailed: 'Jailed' - navActive: 'Активный' - navInactive: 'Неактивный' - active: 'Активные Валидаторы' - inactive: 'Неактивные Валидаторы' - listOfActive: 'Вот список активных валидаторов.' - listOfInactive: 'Вот список неактивных валидаторов.' - validatorDetails: 'Детали Валидатора' - lastNumBlocks: 'Последние {$numBlocks} блоков' - validatorInfo: 'Информация О Валидаторе' - operatorAddress: 'Адрес Оператора' - selfDelegationAddress: 'Адрес Самоделегирования' - deeplinks: 'Deeplinks' - commissionRate: 'Ставка Комиссии' - maxRate: 'Максимальная Ставка' - maxChangeRate: 'Максимальная Ставка Изменения' - selfDelegationRatio: 'Коэффициент Самоделегирования' - proposerPriority: 'Приоритет предложения' - delegatorShares: 'Доли делегатора' - userDelegateShares: 'Доли, делегированные вами' - tokens: 'Токены' - unbondingHeight: 'Высота Un-Бондинг' - unbondingTime: 'Время Un-Бондинг' - jailedUntil: 'Jailed До' - powerChange: 'Изменение власти' - delegations: 'Делегации' - transactions: 'Транзакции' - validatorNotExists: 'Валидатора не существует.' - backToValidator: 'Назад К Валидатору' - missedBlocks: 'Пропущенные Блоки' - missedPrecommits: 'Пропущенные Прекоммиты' - missedBlocksTitle: 'Пропущенные блоки {$moniker}' - totalMissed: 'Всего пропущено' - block: 'Блок' - missedCount: 'Пропущено' - iDontMiss: "Я не пропускаю" - lastSyncTime: 'Последнее время синхронизации' - delegator: 'Делегатор' - amount: 'Сумма' -blocks: - block: 'Блок' - proposer: 'Предложение' - latestBlocks: 'Последние блоки' - noBlock: 'Нет блока.' - numOfTxs: 'Количество транзакций' - numOfTransactions: 'Количество транзакций' - notFound: 'Такого блока не найдено.' -transactions: - transaction: 'Транзакция' - transactions: 'Транзакции' - notFound: 'Транзакция не найдена.' - activities: 'Активность' - txHash: 'Хэш транзакции' - valid: 'Действительна' - fee: 'Комиссия' - noFee: 'Без комиссии' - gasUsedWanted: 'Газ (использовано / хотелось)' - noTxFound: 'Транзакция не найдена' - noValidatorTxsFound: 'Транзакция, связанная с этом валидатором, не найдена.' - memo: 'Комментарий' - transfer: 'Передача' - staking: 'Стейкать' - distribution: 'Распределение' - governance: 'Управление' - slashing: 'Slashing' -proposals: - notFound: 'Предложение не найдено.' - listOfProposals: 'Список предложений по управлению' - proposer: 'Предлагающий' - proposal: 'Предложение' - proposals: 'Предложения' - proposalID: 'ID предложения' - title: 'Название' - status: 'Статус' - submitTime: 'Время Отправки' - depositEndTime: 'Время Окончания Депозита' - votingStartTime: 'Время Начала Голосования' - votingEndTime: 'Время Окончания Голосования' - totalDeposit: 'Общий депозит' - description: 'Описание' - proposalType: 'Тип Предложения' - proposalStatus: 'Статус Предложения' - notStarted: 'не начался' - final: 'окончено' - deposit: 'Депозит' - tallyResult: 'Итог Подсчета' - yes: 'За' - abstain: Воздержался - no: 'Против' - noWithVeto: 'Против с правом Вето' - percentageVoted: '{$percent} от всех голосов онлайн проголосовало.' - validMessage: 'Это предложение {$tentative}действительное.' - invalidMessage: 'Меньше чем {$quorum} голосующих проголосовало. Это предложение недействительное.' - moreVoteMessage: 'Предложение будет действительным, если еще {$moreVotes} голосующих отдадут свой голос.' - key: 'Ключ' - value: 'Значение' - amount: 'Сумма' - recipient: 'Получатель' - changes: 'Изменения' - subspace: 'Подмножество' -votingPower: - distribution: 'Распределение Количества Голосов' - pareto: 'Принцип Парето (правило 20/80)' - minValidators34: 'Минимальное количество валидаторов c 34%+ количеством голосов' -accounts: - accountDetails: 'Детали счета' - available: 'Доступно' - delegated: 'Заделегировано' - unbonding: 'Un-Бондинг' - rewards: 'Награды' - total: 'Всего' - notFound: 'Такого счета не существует. Вы ищете неправильный адрес?' - validators: 'Валидаторы' - shares: 'Доли' - mature: 'Зрелые' - no: 'Нет' - none: 'Нет' - delegation: 'Делегация' - plural: '' - signOut: 'Выйти' - signInText: 'Вы вошли как' - toLoginAs: 'Войти как' - signInWithLedger: 'Войти, используя Ledger' - signInWarning: 'Пожалуйста, убедитесь, что устройство Ledger подключено и {$network} App {$version} или выше открыто.' - pleaseAccept: 'пожалуйста, примите в своем Ledger устройстве.' - noRewards: 'Нет Наград' - BLESupport: 'Bluetooth-соединение пока что поддерживается только в браузере Google Chrome.' -activities: - single: ' ' - happened: 'произошло.' - senders: 'Этот отправитель(и)' - sent: 'отправил' - receivers: 'этому получателю(ям)' - received: 'получил' - failedTo: 'не удалось' - to: 'к' - from: из' - operatingAt: 'работающих на' - withMoniker: 'с названием' - withTitle: 'с названием' - withA: 'с' - withAmount: 'с {$amount}' -messageTypes: - send: 'Отправить' - multiSend: 'Отправить Нескольким' - createValidator: 'Создать Валидатора' - editValidator: 'Редактировать Валидатора' - delegate: 'Делегировать' - undelegate: 'Разделегировать' - redelegate: 'Ре-делегировать' - submitProposal: 'Отправить Предложение' - deposit: 'Депозит' - vote: 'Голосовать' - withdrawComission: 'Вывести Комиссии' - withdrawReward: 'Вывести Награду' - modifyWithdrawAddress: 'Изменить Адрес Вывода' - unjail: 'Un-Джейл' - IBCTransfer: 'IBC Трансфер' - IBCReceive: 'IBC Получение' - diff --git a/big-dipper-backend/i18n/zh-hans.i18n.yml b/big-dipper-backend/i18n/zh-hans.i18n.yml deleted file mode 100644 index 4fb1658303..0000000000 --- a/big-dipper-backend/i18n/zh-hans.i18n.yml +++ /dev/null @@ -1,238 +0,0 @@ -_locale: 'zh-Hans' -_namespace: '' - -common: - height: '高度' - voter: '投票人' - votingPower: '投票权' - addresses: '地址' - amounts: '数量' - delegators: '委托人' - block: '区块' - blocks: '区块' - precommit: '建块前保证' - precommits: '建块前保证' - last: '最后' - backToList: '回到列表' - information: '资讯' - time: '时间' - hash: '哈希' - more: '更多' - fullStop: '。' - searchPlaceholder: '搜寻交易哈希 / 区块高度 / 地址' - cancel: '取消' - retry: '重试' - bondedTokens: '受委托量' -navbar: - siteName: '北斗' - validators: '验证人' - blocks: '区块' - transactions: '交易' - proposals: '治理提案' - votingPower: '投票权分布' - lang: "中文(简)" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - russian: "Русский" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: 'LICENSE' - forkMe: 'Fork me!' -consensus: - consensusState: '共识状态' - round: '轮数' - step: '阶数' -chainStates: - price: '价格' - marketCap: '市值' - inflation: '通胀率' - communityPool: '社区储备' -chainStatus: - startMessage: '这链将还有以下时间便会开始' - stopWarning: '这链似乎已经停了 {$time}! 请继续喂我吃新的区块 😭!' - latestHeight: '最新区块高度' - averageBlockTime: '平均区块时间' - all: '全部' - now: '现在' - allTime: '全部' - lastMinute: '前一分钟' - lastHour: '前一小时' - lastDay: '前一天' - seconds: '秒' - activeValidators: '有效验证人' - outOfValidators: '来自总共 {$totalValidators} 个验证人' - onlineVotingPower: '在线投票权' - fromTotalStakes: '为 {$totalStakes} 颗 {$denom} 的 {$percent}' -analytics: - blockTimeHistory: '在线投票权' - averageBlockTime: 'Average Block Time' - blockInterval: 'Block Interval' - noOfValidators: 'No. of Validators' -validators: - randomValidators: '随机验证人' - moniker: '验证人代号' - uptime: '上线时间比重' - selfPercentage: '自我委托%' - commission: '佣金' - lastSeen: '最后投票时间' - status: '状态' - jailed: '被禁制' - navActive: '有效' - navInactive: '无效' - active: '有效验证人' - inactive: '无效验证人' - listOfActive: '这名单显示所有有效验证人' - listOfInactive: '这名单显示所有无效验证人' - validatorDetails: '验证人详情' - lastNumBlocks: '最后 {$numBlocks} 个区块' - validatorInfo: '验证人资讯' - operatorAddress: '操作地址' - selfDelegationAddress: '自我委托地址' - deeplinks: 'Deeplinks' - commissionRate: '佣金' - maxRate: '最大佣金限制' - maxChangeRate: '每天最大佣金变化限制' - selfDelegationRatio: '自我委托比例' - proposerPriority: '建块优先权' - delegatorShares: '委托股数' - userDelegateShares: '你委托的股数' - tokens: '代币数量' - unbondingHeight: '解绑高度' - unbondingTime: '解绑时间' - jailedUntil: '被禁制至' - powerChange: '投票权变更' - delegations: '委托' - transactions: '交易' - validatorNotExists: '验证人不存在。' - backToValidator: '回到验证人页面' - missedBlocks: '错过了的区块' - missedPrecommits: '遗留了的建块前保证' - missedBlocksTitle: '错过了 {$moniker} 的区块' - totalMissed: '一共错过了' - block: '区块' - missedCount: '错过数量' - iDontMiss: '我不会错过任何一个' - lastSyncTime: '上一次同步时间' - delegator: '委托人' - amount: '数量' -blocks: - proposer: '建块人' - block: '区块' - latestBlocks: '最近区块' - noBlock: '没有区块。' - numOfTxs: '交易数量' - numOfTransactions: '交易数量' - notFound: '没有这个区块。' -transactions: - transaction: '交易' - transactions: '交易' - notFound: '沒有交易。' - activities: '活动' - txHash: '交易哈希' - valid: '有效' - fee: '费用' - noFee: 'No fee' - gasUsedWanted: '瓦斯 (已用 / 要求)' - noTxFound: '没有这笔交易。' - noValidatorTxsFound: '没有跟这个验证人有关的交易' - memo: '备忘录' - transfer: '代币转移' - staking: '委托' - distribution: '收益分配' - governance: '链上治理' - slashing: '削减' -proposals: - notFound: '没有治理提案' - listOfProposals: '这名单显示所有治理提案' - proposer: '提案人' - proposal: '治理提案' - proposals: '治理提案' - proposalID: '提案编号' - title: '主题' - status: '状态' - submitTime: '提案时间' - depositEndTime: '存入押金' - votingStartTime: '投票开始时间' - votingEndTime: '投票结束时间' - totalDeposit: '押金总额' - description: '详细内容' - proposalType: '提案类型' - proposalStatus: '提案状态' - notStarted: '未开始' - final: '最后结果' - deposit: '押金' - tallyResult: '投票结果' - yes: '赞成' - abstain: '弃权' - no: '反对' - noWithVeto: '强烈反对' - percentageVoted: '现时在线投票权的投票率是 {$percent}。' - validMessage: '这个提案 {$tentative} 有效.' - invalidMessage: '已投票的在线投票权少于 {$quorum}。这个提案 無效。' - moreVoteMessage: '当再有多 {$moreVotes} 投票权投了票的话,这个提案将会有效。' - key: 'Key' - value: 'Value' - amount: 'Amount' - recipient: 'Recipient' - changes: 'Changes' - subspace: 'Subspace' -votingPower: - distribution: '投票权分布' - pareto: '帕累托原则 (20/80 定率)' - minValidators34: '最少合共有超过 34% 投票权的验证人' -accounts: - accountDetails: '帐户详情' - available: '可用的' - delegated: '委托中' - unbonding: '解绑中' - rewards: '未取回收益' - total: '总共' - notFound: '这个帐户不存在。你是否在查看一个错误的地址?' - validators: '验证人' - shares: '股数' - mature: '成熟日期' - no: '没有' - none: '没有' - delegation: '委托' - plural: '' - signOut: '登出' - signInText: '你已登录以下帐户' - toLoginAs: '登录以下帐户' - signInWithLedger: '透过 Ledger 登录' - signInWarning: '请确定你已经连接 Ledger 设备,并已开启 Cosmos App 版本 1.5.0 或以上。' - pleaseAccept: '请从你的 Ledger 设备确认。' - noRewards: 'No Rewards' -activities: - single: '一个' - happened: '发生了' - senders: '以下的帐户' - sent: '发了' - receivers: '到以下的帐户' - received: '收到' - failedTo: '未能' - to: '到' - from: '从' - operatingAt: '操作地址为' - withMoniker: '而验证人代号为' - withTitle: '治理提案主题为' - withA: '投了' -messageTypes: - send: '发送' - multiSend: '多重发送' - createValidator: '建立验证人' - editValidator: '编辑验证人资料' - delegate: '委托' - undelegate: '解委托' - redelegate: '转委托' - submitProposal: '提交议案' - deposit: '存入' - vote: '投票' - withdrawComission: '提取手续费' - withdrawReward: '提取收益' - modifyWithdrawAddress: '更改收益取回地址' - unjail: '赦免' - IBCTransfer: 'IBC Transfer' - IBCReceive: 'IBC Receive' diff --git a/big-dipper-backend/i18n/zh-hant.i18n.yml b/big-dipper-backend/i18n/zh-hant.i18n.yml deleted file mode 100644 index c1e9ff7d15..0000000000 --- a/big-dipper-backend/i18n/zh-hant.i18n.yml +++ /dev/null @@ -1,238 +0,0 @@ -_locale: 'zh-Hant' -_namespace: '' - -common: - height: '高度' - voter: '投票人' - votingPower: '投票權' - addresses: '地址' - amounts: '數量' - delegators: '委托人' - block: '區塊' - blocks: '區塊' - precommit: '建塊前保證' - precommits: '建塊前保證' - last: '最後' - backToList: '回到列表' - information: '資訊' - time: '時間' - hash: '哈希' - more: '更多' - fullStop: '。' - searchPlaceholder: '搜尋交易哈希 / 區塊高度 / 地址' - cancel: '取消' - retry: '重試' - bondedTokens: '受委托量' -navbar: - siteName: '北斗' - validators: '驗證人' - blocks: '區塊' - transactions: '交易' - proposals: '治理提案' - votingPower: '投票權分佈' - lang: "中文(繁)" - english: "English" - spanish: "Español" - italian: "Italiano" - polish: "Polski" - russian: "Русский" - chinese: "中文(繁)" - simChinese: "中文(简)" - portuguese: "Português" - license: 'LICENSE' - forkMe: 'Fork me!' -consensus: - consensusState: '共識狀態' - round: '輪數' - step: '階數' -chainStates: - price: '價格' - marketCap: '市值' - inflation: '通漲率' - communityPool: '社區儲備' -chainStatus: - startMessage: '這鏈將還有以下時間便會開始' - stopWarning: '這鏈似乎已經停了 {$time}! 請繼續餵我吃新的區塊 😭!' - latestHeight: '最新區塊高度' - averageBlockTime: '平均區塊時間' - all: '全部' - now: '現在' - allTime: '全部' - lastMinute: '前一分鐘' - lastHour: '前一小時' - lastDay: '前一天' - seconds: '秒' - activeValidators: '有效驗證人' - outOfValidators: '來自總共 {$totalValidators} 個驗證人' - onlineVotingPower: '在線投票權' - fromTotalStakes: '為 {$totalStakes} 顆 {$denom} 的 {$percent}' -analytics: - blockTimeHistory: '在線投票權' - averageBlockTime: 'Average Block Time' - blockInterval: 'Block Interval' - noOfValidators: 'No. of Validators' -validators: - randomValidators: '隨機驗證人' - moniker: '驗證人代號' - uptime: '上線時間比重' - selfPercentage: '自我委托%' - commission: '佣金' - lastSeen: '最後投票時間' - status: '狀態' - jailed: '被禁制' - navActive: '有效' - navInactive: '無效' - active: '有效驗證人' - inactive: '無效驗證人' - listOfActive: '這名單顯示所有有效驗證人' - listOfInactive: '這名單顯示所有無效驗證人' - validatorDetails: '驗證人詳情' - lastNumBlocks: '最後 {$numBlocks} 個區塊' - validatorInfo: '驗證人資訊' - operatorAddress: '操作地址' - selfDelegationAddress: '自我委托地址' - deeplinks: 'Deeplinks' - commissionRate: '佣金' - maxRate: '最大佣金限制' - maxChangeRate: '每天最大佣金變化限制' - selfDelegationRatio: '自我委托比列' - proposerPriority: '建塊優先權' - delegatorShares: '委托股數' - userDelegateShares: '你委托的股數' - tokens: '代幣數量' - unbondingHeight: '解綁高度' - unbondingTime: '解綁時間' - jailedUntil: '被禁制至' - powerChange: '投票權變更' - delegations: '委托' - transactions: '交易' - validatorNotExists: '驗證人不存在。' - backToValidator: '回到驗證人頁面' - missedBlocks: '錯過了的區塊' - missedPrecommits: '遺留了的建塊前保證' - missedBlocksTitle: '錯過了 {$moniker} 的區塊' - totalMissed: '一共錯過了' - block: '區塊' - missedCount: '錯過數量' - iDontMiss: '我不會錯過任何一個' - lastSyncTime: '上一次同步時間' - delegator: '委托人' - amount: '數量' -blocks: - proposer: '建塊人' - block: '區塊' - latestBlocks: '最近區塊' - noBlock: '沒有區塊。' - numOfTxs: '交易數量' - numOfTransactions: '交易數量' - notFound: '沒有這個區塊。' -transactions: - transaction: '交易' - transactions: '交易' - notFound: '沒有交易。' - activities: '活動' - txHash: '交易哈希' - valid: '有效' - fee: '費用' - noFee: 'No fee' - gasUsedWanted: '瓦斯 (已用 / 要求)' - noTxFound: '沒有這筆交易。' - noValidatorTxsFound: '沒有跟這個驗證人有關的交易' - memo: '備忘錄' - transfer: '代幣轉移' - staking: '委托' - distribution: '收益分配' - governance: '鏈上治理' - slashing: '削減' -proposals: - notFound: '沒有治理提案' - listOfProposals: '這名單顯示所有治理提案' - proposer: '提案人' - proposal: '治理提案' - proposals: '治理提案' - proposalID: '提案編號' - title: '主題' - status: '狀態' - submitTime: '提案時間' - depositEndTime: '存入押金' - votingStartTime: '投票開始時間' - votingEndTime: '投票結束時間' - totalDeposit: '押金總額' - description: '詳細內容' - proposalType: '提案類型' - proposalStatus: '提案狀態' - notStarted: '未開始' - final: '最後結果' - deposit: '押金' - tallyResult: '投票結果' - yes: '贊成' - abstain: '棄權' - no: '反對' - none: '反對' - noWithVeto: '強烈反對' - percentageVoted: '現時在線投票權的投票率是 {$percent}。' - validMessage: '這個提案 {$tentative} 有效.' - invalidMessage: '已投票的在線投票權少於 {$quorum}。這個 無效。' - moreVoteMessage: '當再有多 {$moreVotes} 投票權投了票的話,這個提案將會有效。' - key: 'Key' - value: 'Value' - amount: 'Amount' - recipient: 'Recipient' - changes: 'Changes' - subspace: 'Subspace' -votingPower: - distribution: '投票權分佈' - pareto: '帕累托原則 (20/80 定率)' - minValidators34: '最少合共有超過 34% 投票權的驗證人' -accounts: - accountDetails: '帳戶詳情' - available: '可用的' - delegated: '委托中' - unbonding: '解綁中' - rewards: '未取回收益' - total: '總共' - notFound: '這個帳戶不存在。你是否在查看一個錯誤的地址?' - validators: '驗證人' - shares: '股數' - mature: '成熟日期' - no: '沒有' - delegation: '委托' - plural: '' - signOut: '登出' - signInText: '你已登入以下帳戶' - toLoginAs: '登入以下帳戶' - signInWithLedger: '透過 Ledger 登入' - signInWarning: '請確定你已經連接 Ledger 設備,並已開啓 Cosmos App 版本 1.5.0 或以上。' - pleaseAccept: '請從你的 Ledger 設備確認。' - noRewards: 'No Rewards' -activities: - single: '一個' - happened: '發生了' - senders: '以下的帳戶' - sent: '發了' - receivers: '到以下的帳戶' - received: '收到' - failedTo: '未能' - to: '到' - from: '從' - operatingAt: '操作地止為' - withMoniker: '而驗證人代號為' - withTitle: '治理提案主題為' - withA: '投了' -messageTypes: - send: '發送' - multiSend: '多重發送' - createValidator: '建立驗證人' - editValidator: '編輯驗證人資料' - delegate: '委托' - undelegate: '解委托' - redelegate: '轉委托' - submitProposal: '提交議案' - deposit: '存入' - vote: '投票' - withdrawComission: '提取手續費' - withdrawReward: '提取收益' - modifyWithdrawAddress: '更改收益取回地址' - unjail: '赦免' - IBCTransfer: 'IBC Transfer' - IBCReceive: 'IBC Receive' diff --git a/big-dipper-backend/imports/api/accounts/server/methods.js b/big-dipper-backend/imports/api/accounts/server/methods.js deleted file mode 100644 index 8eac995f18..0000000000 --- a/big-dipper-backend/imports/api/accounts/server/methods.js +++ /dev/null @@ -1,236 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { HTTP } from 'meteor/http'; -import { Validators } from '/imports/api/validators/validators.js'; -import { sanitizeUrl } from '@braintree/sanitize-url'; -const fetchFromUrl = (url) => { - try { - var url = sanitizeUrl(API + url) - let res = HTTP.get(url); - if (res.statusCode == 200) { - return res - }; - } catch (e) { - console.log(url); - console.log(e); - } -} - -Meteor.methods({ - 'accounts.getAccountDetail': function(address) { - this.unblock(); - let url = sanitizeUrl(API + '/auth/accounts/' + address); - - try { - let available = HTTP.get(url); - if (available.statusCode == 200) { - // return JSON.parse(available.content).account - let response = JSON.parse(available.content).result; - let account; - if ((response.type === 'cosmos-sdk/Account') || (response.type === 'cosmos-sdk/BaseAccount')) - account = response.value; - else if (response.type === 'cosmos-sdk/DelayedVestingAccount' || response.type === 'cosmos-sdk/ContinuousVestingAccount') - account = response.value.BaseVestingAccount.BaseAccount - - try { - url = sanitizeUrl(API + '/bank/balances/' + address); - response = HTTP.get(url); - let balances = JSON.parse(response.content).result; - account.coins = balances; - - if (account && account.account_number != null) - return account - return null - } catch (e) { - return null; - } - } - } catch (e) { - console.log(url); - console.log(e) - } - }, - 'accounts.getBalance': function(address) { - this.unblock(); - let balance = {} - - // get available atoms - let url = sanitizeUrl(API + '/cosmos/bank/v1beta1/balances/' + address); - try { - let available = HTTP.get(url); - if (available.statusCode == 200) { - balance.available = JSON.parse(available.content).balances; - - } - } catch (e) { - console.log(url); - console.log(e) - } - - // get delegated amnounts - url = sanitizeUrl(API + '/cosmos/staking/v1beta1/delegations/' + address); - try { - let delegations = HTTP.get(url); - if (delegations.statusCode == 200) { - balance.delegations = JSON.parse(delegations.content).delegation_responses; - } - } catch (e) { - console.log(url); - console.log(e); - } - // get unbonding - url = API + sanitizeUrl('/cosmos/staking/v1beta1/delegators/' + address + '/unbonding_delegations'); - try { - let unbonding = HTTP.get(url); - if (unbonding.statusCode == 200) { - balance.unbonding = JSON.parse(unbonding.content).unbonding_responses; - } - } catch (e) { - console.log(url); - console.log(e); - } - - // get rewards - url = sanitizeUrl(API + '/cosmos/distribution/v1beta1/delegators/' + address + '/rewards'); - try { - let rewards = HTTP.get(url); - if (rewards.statusCode == 200) { - //get seperate rewards value - balance.rewards = JSON.parse(rewards.content).rewards; - //get total rewards value - balance.total_rewards = JSON.parse(rewards.content).total; - - } - } catch (e) { - console.log(url); - console.log(e); - } - - // get commission - let validator = Validators.findOne({ $or: [{ operator_address: address }, { delegator_address: address }, { address: address }] }) - if (validator) { - let url = sanitizeUrl(API + '/cosmos/distribution/v1beta1/validators/' + validator.operator_address + '/commission'); - balance.operatorAddress = validator.operator_address; - try { - let rewards = HTTP.get(url); - if (rewards.statusCode == 200) { - let content = JSON.parse(rewards.content).commission; - if (content.commission && content.commission.length > 0) - balance.commission = content.commission; - - } - - } catch (e) { - console.log(url); - console.log(e) - } - } - - return balance; - }, - 'accounts.getDelegation' (address, validator) { - this.unblock(); - let url = `/cosmos/staking/v1beta1/validators/${validator}/delegations/${address}`; - let delegations = fetchFromUrl(url); - console.log(delegations); - delegations = delegations && delegations.data.delegation_response; - if (delegations && delegations.delegation.shares) - delegations.delegation.shares = parseFloat(delegations.delegation.shares); - - url = `/cosmos/staking/v1beta1/delegators/${address}/redelegations?dst_validator_addr=${validator}`; - let relegations = fetchFromUrl(url); - relegations = relegations && relegations.data.redelegation_responses; - let completionTime; - if (relegations) { - relegations.forEach((relegation) => { - let entries = relegation.entries - let time = new Date(entries[entries.length - 1].completion_time) - if (!completionTime || time > completionTime) - completionTime = time - }) - delegations.redelegationCompletionTime = completionTime; - } - - url = `/cosmos/staking/v1beta1/validators/${validator}/delegations/${address}/unbonding_delegation`; - let undelegations = fetchFromUrl(url); - undelegations = undelegations && undelegations.data.result; - if (undelegations) { - delegations.unbonding = undelegations.entries.length; - delegations.unbondingCompletionTime = undelegations.entries[0].completion_time; - } - return delegations; - }, - 'accounts.getAllDelegations' (address) { - this.unblock(); - let url = sanitizeUrl(API + '/cosmos/staking/v1beta1/delegators/' + address + '/delegations'); - - try { - let delegations = HTTP.get(url); - if (delegations.statusCode == 200) { - delegations = JSON.parse(delegations.content).result; - if (delegations && delegations.length > 0) { - delegations.forEach((delegation, i) => { - if (delegations[i] && delegations[i].shares) - delegations[i].shares = parseFloat(delegations[i].shares); - }) - } - - return delegations; - }; - } catch (e) { - console.log(url); - console.log(e); - } - }, - 'accounts.getAllUnbondings' (address) { - this.unblock(); - let url = sanitizeUrl(API + '/cosmos/staking/v1beta1/delegators/' + address + '/unbonding_delegations'); - - try { - let unbondings = HTTP.get(url); - if (unbondings.statusCode == 200) { - unbondings = JSON.parse(unbondings.content).result; - return unbondings; - }; - } catch (e) { - console.log(url); - console.log(e); - } - }, - 'accounts.getAllRedelegations' (address, validator) { - this.unblock(); - let url = `/cosmos/staking/v1beta1/v1beta1/delegators/${address}/redelegations&src_validator_addr=${validator}`; - try { - let result = fetchFromUrl(url); - if (result && result.data) { - let redelegations = {} - result.data.forEach((redelegation) => { - let entries = redelegation.entries; - redelegations[redelegation.validator_dst_address] = { - count: entries.length, - completionTime: entries[0].completion_time - } - }) - return redelegations - } - } catch (e) { - console.log(url); - console.log(e); - } - }, - 'accounts.getRedelegations' (address) { - this.unblock(); - let url = sanitizeUrl(API + '/cosmos/staking/v1beta1/v1beta1/delegators/' + address + '/redelegations'); - - try { - let userRedelegations = HTTP.get(url); - if (userRedelegations.statusCode == 200) { - userRedelegations = JSON.parse(userRedelegations.content).result; - - return userRedelegations; - }; - } catch (e) { - console.log(url); - console.log(e.response.content); - } - }, -}) \ No newline at end of file diff --git a/big-dipper-backend/imports/api/actions/actions.js b/big-dipper-backend/imports/api/actions/actions.js deleted file mode 100644 index 2615551c39..0000000000 --- a/big-dipper-backend/imports/api/actions/actions.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -export const Actions = new Mongo.Collection('actions'); \ No newline at end of file diff --git a/big-dipper-backend/imports/api/actions/server/methods.js b/big-dipper-backend/imports/api/actions/server/methods.js deleted file mode 100644 index 697bff1bef..0000000000 --- a/big-dipper-backend/imports/api/actions/server/methods.js +++ /dev/null @@ -1,357 +0,0 @@ -import {Meteor} from "meteor/meteor"; -import {Actions} from "../actions.js"; - -// Global API configuration -var Api = new Restivus({ - useDefaultAuth: true, - prettyJson: true -}) - -const StatusOk = 200 -const StatusInvalidInput = 400 -const Success = "Success" -const BadRequest = "Bad Request" -const ApiServerOkMessage = "Api server is up and running!" -const ActionTypeLike = "Like" -const ActionTypeView = "View" - -Api.addRoute('ping', {authRequired: false}, { - - get: function () { - - return { - Code: StatusOk, - Message: ApiServerOkMessage, - Data: "" - } - - }, - -}); - -Api.addRoute('actions/views/:cookbookId/:recipeId', {authRequired: false}, { - - //get the views on a specific nft - get: function () { - - if ( !Valid(this.urlParams.cookbookId) || !Valid(this.urlParams.recipeId) ){ - return { - Code: StatusInvalidInput, - Message: BadRequest, - Data: null - } - } - - var result = GetViews(this.urlParams.cookbookId, this.urlParams.recipeId) - - return { - Code: StatusOk, - Message: Success, - Data: {totalViews: result} - } - - }, - - //view a specific nft - post: function () { - - if ( !Valid(this.urlParams.cookbookId) || !Valid(this.urlParams.recipeId) || !Valid(this.bodyParams.userId) ){ - return { - Code: StatusInvalidInput, - Message: BadRequest, - Data: null - } - } - - var result = ViewNFT(this.urlParams.cookbookId, this.urlParams.recipeId, this.bodyParams.userId) - - return { - Code: StatusOk, - Message: Success, - Data: result - } - - } - -}); - -Api.addRoute('actions/likes/:cookbookId/:recipeId', {authRequired: false}, { - - //get the likes on a specific nft - get: function () { - - if ( !Valid(this.urlParams.cookbookId) || !Valid(this.urlParams.recipeId) ){ - return { - Code: StatusInvalidInput, - Message: BadRequest, - Data: null - } - } - - var result = GetLikes(this.urlParams.cookbookId, this.urlParams.recipeId) - - return { - Code: StatusOk, - Message: Success, - Data: {totalLikes: result} - } - - }, - - //like a specific nft - post: function () { - - if ( !Valid(this.urlParams.cookbookId) || !Valid(this.urlParams.recipeId) || !Valid(this.bodyParams.userId) ){ - return { - Code: StatusInvalidInput, - Message: BadRequest, - Data: null - } - } - - var result = ToggleLike(this.urlParams.cookbookId, this.urlParams.recipeId, this.bodyParams.userId) - - return { - Code: StatusOk, - Message: Success, - Data: result - } - - } - -}); - -Api.addRoute('actions/likes/:userId/:cookbookId/:recipeId', {authRequired: false}, { - - //check if the specified user has liked the specified nft or not - get: function () { - - if ( !Valid(this.urlParams.cookbookId) || !Valid(this.urlParams.recipeId) || !Valid(this.urlParams.userId) ){ - return { - Code: StatusInvalidInput, - Message: BadRequest, - Data: null - } - } - - var result = GetLikeStatus(this.urlParams.cookbookId, this.urlParams.recipeId, this.urlParams.userId) - - return { - Code: StatusOk, - Message: Success, - Data: result - } - - }, -}); - -Meteor.methods({ - - //to like a specific nft, by a specific user - "Actions.likeNft": function (cookbookId, recipeId, userId) { - this.unblock(); - - if ( !Valid(cookbookId) || !Valid(recipeId) || !Valid(userId) ){ - return { - Code: StatusInvalidInput, - Message: BadRequest, - Data: null - } - } - var result = ToggleLike(cookbookId, recipeId, userId) - return { - Code: StatusOk, - Message: Success, - Data: result - } - - }, - - //to view a specific nft, by a specific user - "Actions.viewNft": function (cookbookId, recipeId, userId) { - this.unblock(); - - if ( !Valid(cookbookId) || !Valid(recipeId) || !Valid(userId) ){ - return { - Code: StatusInvalidInput, - Message: BadRequest, - Data: null - } - } - var result = ViewNFT(cookbookId, recipeId, userId) - return { - Code: StatusOk, - Message: Success, - Data: result - } - }, - - //to get likes and view on an NFT - "Actions.getLikes": function (cookbookId, recipeId) { - this.unblock(); - - if ( !Valid(cookbookId) || !Valid(recipeId) ){ - return { - Code: StatusInvalidInput, - Message: BadRequest, - Data: null - } - } - //get likes on this nft - var likes = GetLikes(cookbookId, recipeId) - return { - Code: StatusOk, - Message: Success, - Data: { - totalLikes: likes - } - } - }, - "Actions.getViews": function (cookbookId, recipeId) { - this.unblock(); - - if ( !Valid(cookbookId) || !Valid(recipeId) ){ - return { - Code: StatusInvalidInput, - Message: BadRequest, - Data: null - } - } - //get views on this nft - var views = GetViews(cookbookId, recipeId) - return { - Code: StatusOk, - Message: Success, - Data: { - totalViews: views - } - } - }, - - //to check if a certain user has liked a specific nft or not - "Actions.getLikeStatus": function (cookbookId, recipeId, userId) { - this.unblock(); - - if ( !Valid(cookbookId) || !Valid(recipeId) || !Valid(userId) ){ - return { - Code: StatusInvalidInput, - Message: BadRequest, - Data: null - } - } - //get like status for this user - var result = GetLikeStatus(cookbookId, recipeId, userId) - return { - Code: StatusOk, - Message: Success, - Data: result - } - } - -}); - -function ToggleLike(cookbookId, recipeId, userId) { - - var action = { - cookbookId: cookbookId, - recipeId: recipeId, - actionType: ActionTypeLike, - from: userId - } - - //check if the specified user has liked the specified nft - var result = Actions.findOne(action) - var liked = false; - - // if user has not already liked the same nft - if (result == null) { - // add user's like - Actions.insert(action) - liked = true - } - else{ - //otherwise, remove the user's like - Actions.remove({ - _id: result._id - }); - } - - var newLikes = GetLikes(cookbookId, recipeId) - return { - liked: liked, - totalLikes: newLikes - } - -} - -function ViewNFT(cookbookId, recipeId, userId){ - var action = { - cookbookId: cookbookId, - recipeId: recipeId, - actionType: ActionTypeView, - from: userId - } - - /* - upsert a view action, so that the insertion of multiple - views on same nft and from same user is disallowed - */ - Actions.upsert(action, {$set: action}) - var views = GetViews(cookbookId, recipeId, userId) - - return { - viewed: true, - totalViews: views - } -} - -function GetLikes(cookbookId, recipeId) { - //get likes on the specified nft - return Actions.find({ - cookbookId: cookbookId, - recipeId: recipeId, - actionType: ActionTypeLike - }).count() -} - -function GetViews(cookbookId, recipeId) { - //get views on the specified nft - return Actions.find({ - cookbookId: cookbookId, - recipeId: recipeId, - actionType: ActionTypeView - }).count() -} - -function GetLikeStatus(cookbookId, recipeId, userId){ - - var likeStatus = false - //check if the specified user has liked the specified nft - var result = Actions.findOne({ - cookbookId: cookbookId, - recipeId: recipeId, - actionType: ActionTypeLike, - from: userId - }) - - //if a like is found, return true - if (result != null){ - likeStatus = true - } - - return { - liked: likeStatus - } - -} - -function Valid(parameter) { - if (typeof(parameter) != "string"){ - return false - } - if (parameter.length == 0){ - return false - } - return true -} - diff --git a/big-dipper-backend/imports/api/actions/server/publications.js b/big-dipper-backend/imports/api/actions/server/publications.js deleted file mode 100644 index d5ed5b8ca3..0000000000 --- a/big-dipper-backend/imports/api/actions/server/publications.js +++ /dev/null @@ -1,10 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Actions } from '../actions.js'; - -Meteor.publish('Actions.list', function() { - return Actions.find({}, { sort: { ID: 1 } }); -}); - -Meteor.publish('Actions.one', function(id) { - return Actions.find({ ID: id }); -}) \ No newline at end of file diff --git a/big-dipper-backend/imports/api/admin.js b/big-dipper-backend/imports/api/admin.js deleted file mode 100644 index 0eb3ac6d82..0000000000 --- a/big-dipper-backend/imports/api/admin.js +++ /dev/null @@ -1,8 +0,0 @@ -const admin = require('firebase-admin') -//const serviceAccount = require('../../firebase.json') -let serviceAccount = process.env.FIREBASE_CONFIG -serviceAccount = JSON.parse(serviceAccount) -admin.initializeApp({ - credential: admin.credential.cert(serviceAccount) -}) -module.exports.admin = admin diff --git a/big-dipper-backend/imports/api/analytics/analytics.js b/big-dipper-backend/imports/api/analytics/analytics.js deleted file mode 100644 index c83b1906bb..0000000000 --- a/big-dipper-backend/imports/api/analytics/analytics.js +++ /dev/null @@ -1,10 +0,0 @@ -import { Mongo } from 'meteor/mongo'; -import { Blockscon } from '../blocks/blocks.js'; - -export const Analytics = new Mongo.Collection('nft-analytics'); - -Analytics.helpers({ - block(){ - return Blockscon.findOne({height:this.height}); - } -}) \ No newline at end of file diff --git a/big-dipper-backend/imports/api/analytics/server/methods.js b/big-dipper-backend/imports/api/analytics/server/methods.js deleted file mode 100644 index 04134bac1a..0000000000 --- a/big-dipper-backend/imports/api/analytics/server/methods.js +++ /dev/null @@ -1,482 +0,0 @@ -import { Meteor } from 'meteor/meteor' -import { Analytics } from '../analytics.js' -import { Recipes } from '../../recipes/recipes.js' -import { Transactions } from '../../transactions/transactions.js' -import { sanitizeUrl } from '@braintree/sanitize-url' -import { HTTP } from 'meteor/http' -import { Notifications } from '../../notifications/notifications.js' -import { isNil } from 'lodash' - -const SalesAnalyticsDenom = 'upylon' -if (Meteor.isServer) { - Meteor.methods({ - 'Analytics.upsertSales': async function () { - this.unblock() - try { - // finding the transactions of sales type - const txns = Transactions.find( - { - 'tx_response.raw_log': /ExecuteRecipe/, - 'tx_response.logs.events.type': { $ne: 'burn' } - }, - { - sort: { 'tx_response.timestamp': -1 } - } - ).fetch() - - // looping through these transactions and extracting the required fields - for (let i = 0; i < txns.length; i++) { - // extracting the required fields - const recipeID = txns[i]?.tx?.body?.messages[0]?.recipe_id - const cookBookId = txns[i]?.tx?.body?.messages[0]?.cookbook_id - const recipe = getRecipe(cookBookId, recipeID) - const nftName = getNftName(recipe) - const nftUrl = getNftProperty(recipe, 'NFT_URL') - const nftFormat = getNftProperty(recipe, 'NFT_Format') - const amountString = getAmountString(txns[i]) - const amountVal = getAmount(amountString) - const coinDenom = getCoin(amountString) - const receiver = getReceiver(txns[i]) - const spender = getSpender(txns[i]) - - // constructing the sale object - const sale = { - txhash: txns[i]?.txhash, - type: 'Sale', - item_name: nftName, - item_img: nftUrl, - item_format: nftFormat, - amount: amountVal, - coin: coinDenom, - from: receiver, - to: spender, - time: txns[i]?.tx_response?.timestamp, - amountMinted: recipe?.entries?.item_outputs[0]?.amount_minted, - quantity: recipe?.entries?.item_outputs[0]?.quantity - } - - // inserting the extracted information in nft-analytics collection - Analytics.upsert({ txhash: txns[i].txhash }, { $set: sale }) - - // additional properties for notifications - const res = Notifications.findOne({ txhash: txns[i].txhash }) - - sale.settled = false - sale.read = false - const timestamp = Math.floor(new Date() / 1000) // in seconds - sale.created_at = timestamp - - // preserved values - if (res && 1) { - sale.settled = res.settled - sale.read = res.read - sale.created_at = res.created_at - } - - // updated values - sale.time = null - sale.updated_at = timestamp // in seconds - - // upserting info into Notifcations collection - Notifications.upsert({ txhash: txns[i].txhash }, { $set: sale }) - } - } catch (e) { - console.log('upsertSales error: ', e) - } - }, - 'Analytics.getAllRecords': async function (limitVal, offsetVal) { - // all listings with limit and starting from offset - const recordsList = Analytics.find( - {}, - { - sort: { time: -1 }, - limit: limitVal, - skip: offsetVal - } - ).fetch() - - for (let i = 0; i < recordsList.length; i++) { - const from = getUserNameInfo(recordsList[i]?.from) - const to = getUserNameInfo(recordsList[i].to) - recordsList[i].from = from?.username?.value - recordsList[i].to = to?.username?.value - } - - const counts = Analytics.find({}).count() - - return { - records: recordsList, - count: counts - } - }, - 'Analytics.upsertListings': async function () { - this.unblock() - try { - // finding the transactions of sales type - const txns = Transactions.find( - { 'tx_response.raw_log': /EventCreateRecipe/ }, - { sort: { 'tx_response.timestamp': -1 } } - ).fetch() - - for (let i = 0; i < txns.length; i++) { - const cookBookId = txns[i]?.tx?.body?.messages[0]?.cookbook_id - const recipeID = txns[i]?.tx?.body?.messages[0]?.id - const recipe = getRecipe(cookBookId, recipeID) - const nftName = getNftName(recipe) - const nftUrl = getNftProperty(recipe, 'NFT_URL') - const nftFormat = getNftProperty(recipe, 'NFT_Format') - const coinInvolved = - txns[i]?.tx?.body?.messages[0]?.coin_inputs[0]?.coins[0] - const creator = txns[i]?.tx?.body?.messages[0]?.creator - - // constructing the listing object - const listing = { - txhash: txns[i]?.txhash, - itemImg: nftUrl, - itemName: nftName, - itemFormat: nftFormat, - amount: parseFloat(coinInvolved?.amount), - coin: coinInvolved?.denom, - type: 'Listing', - from: creator, - to: '-', - time: txns[i]?.tx_response?.timestamp, - R: recipe - } - - // inserting the extracted information in nft-analytics collection - - Analytics.upsert({ txhash: txns[i]?.txhash }, { $set: listing }) - } - } catch (e) { - console.log('upserListing error: ', e) - } - }, - 'Analytics.getListings': async function (limitVal, offsetVal) { - // all listings with limit and starting from offset - const listings = Analytics.find( - { - type: 'Listing' - }, - { - sort: { time: -1 }, - limit: limitVal, - skip: offsetVal - } - ).fetch() - - for (let i = 0; i < listings.length; i++) { - const creatorUsername = getUserNameInfo(listings[i]?.from) - - listings[i].from = creatorUsername?.username?.value - } - - return listings - }, - 'Analytics.getCreatorOfAllTime': async function () { - const mongoListing = Analytics.rawCollection() - - const creatorOfAllTime = await mongoListing - .aggregate([ - { - $match: { - type: 'Listing' - } - }, - { - $group: { - _id: '$from', // grouping on from field - count: { $sum: 1 } - } - }, - { - $sort: { count: -1 } // sorting on the basis of count in descending order - }, - { - $limit: 1 // fetching the top-most document - } - ]) - .toArray() - - if (creatorOfAllTime[0] !== null && creatorOfAllTime[0] !== undefined) { - const creatorUsername = getUserNameInfo(creatorOfAllTime[0]._id) - creatorOfAllTime[0].from = creatorUsername?.username?.value - return creatorOfAllTime[0] - } - - return null - }, - 'Analytics.getCreatorOfTheDay': async function () { - // start of today - const start = new Date() - start.setHours(0, 0, 0, 0) - const startDate = getFormattedDate(start) - - // end of today - const end = new Date() - end.setDate(end.getDate() + 1) - end.setHours(0, 0, 0, 0) - const endDate = getFormattedDate(end) - - const mongoListing = Analytics.rawCollection() - const creatorOfTheDay = await mongoListing - .aggregate([ - { - $match: { - type: 'Listing', - time: { - $gte: startDate, // documents with time greater than or equal to startDate - $lt: endDate // and documents with time less than endDate - } - } - }, - { - $group: { - _id: '$from', // group the matching documents on from field - count: { $sum: 1 } // count the documents in each group - } - }, - { - $sort: { count: -1 } // sort the groups on count field in descending order - }, - { - $limit: 1 // get the top-most document - } - ]) - .toArray() - - if (creatorOfTheDay[0] !== null && creatorOfTheDay[0] !== undefined) { - const creatorUsername = getUserNameInfo(creatorOfTheDay[0]._id) - creatorOfTheDay[0].from = creatorUsername?.username?.value - return creatorOfTheDay[0] - } - return null - }, - 'Analytics.getSales': async function (limitVal, offsetVal) { - // all sales with limit and starting from offset - const sales = Analytics.find( - { - type: 'Sale' - }, - { - sort: { time: -1 }, - limit: limitVal, - skip: offsetVal - } - ).fetch() - - for (let i = 0; i < sales.length; i++) { - const buyerUsername = getUserNameInfo(sales[i]?.to) - const sellerUsername = getUserNameInfo(sales[i].from) - - sales[i].to = buyerUsername?.username?.value - sales[i].from = sellerUsername?.username?.value - } - return sales - }, - 'Analytics.getSaleOfAllTime': async function () { - // sale of all time - const sale = Analytics.find( - { - type: 'Sale', - coin: SalesAnalyticsDenom - }, - { - sort: { amount: -1, time: -1 }, - limit: 1 - } - ).fetch() - - return extractSaleFromSales(sale) - }, - 'Analytics.getSaleOfTheDay': async function () { - const start = new Date() - start.setDate(start.getDate() - 1) - start.setHours(0, 0, 0, 0) - const startDate = getFormattedDate(start) - - const end = new Date() - end.setDate(end.getDate() + 1) - end.setHours(0, 0, 0, 0) - const endDate = getFormattedDate(end) - - // sale of today - const sale = Analytics.find( - { - type: 'Sale', - coin: SalesAnalyticsDenom, - time: { $gte: startDate, $lt: endDate } - }, - { - sort: { amount: -1 }, - limit: 1 - } - ).fetch() - - return extractSaleFromSales(sale) - }, - 'Analytics.getSalesGraph': async function () { - const start = new Date() - const end = new Date() - start.setDate(start.getDate() - 7) - end.setDate(end.getDate() - 6) - - const graphData = [] - - for (let i = 0; i < 7; i++) { - start.setDate(start.getDate() + 1) - start.setHours(0, 0, 0, 0) - const startDate = getFormattedDate(start) - - end.setDate(end.getDate() + 1) - end.setHours(0, 0, 0, 0) - const endDate = getFormattedDate(end) - - // sales - const sales = Analytics.find({ - type: 'Sale', - time: { $gte: startDate, $lt: endDate } - }).fetch() - - graphData.push({ - date: startDate, - sales: sales?.length - }) - } - - return graphData - } - }) -} - -// getFormattedDate to get date in format (2022-04-12) -function getFormattedDate(date) { - let monthString = date.getMonth() + 1 + '' - if (monthString.length === 1) { - monthString = '0' + (date.getMonth() + 1) - } - - let dateString = date.getDate() + '' - if (dateString.length === 1) { - dateString = '0' + date.getDate() - } - - const formattedDate = - date.getFullYear() + '-' + monthString + '-' + dateString - return formattedDate -} - -function getNftProperty(recipe, property) { - let nftUrl = '' - const itemOutputs = recipe?.entries?.item_outputs - if (itemOutputs !== null && itemOutputs !== undefined) { - if (!isNil(itemOutputs[0])) { - const properties = itemOutputs[0].strings - for (let i = 0; i < properties.length; i++) { - if (properties[i].key === property) { - nftUrl = properties[i].value - break - } - } - } - } - return nftUrl -} - -// getting the nft name out of the recipe object -function getNftName(recipe) { - return recipe?.name -} - -// fetching username info -function getUserNameInfo(address) { - let result - const url = sanitizeUrl( - `${Meteor.settings.remote.api}/pylons/account/address/${address}` - ) - try { - const response = HTTP.get(url) - result = JSON.parse(response.content) - } catch (e) { - console.log('error getting userNameInfo: ', e) - } - return result -} - -// getting amountString from the executed transaction -function getAmountString(txn) { - return getAttributeFromEvent(txn, 'create_item', 'amount') -} - -// getting the receiver out of the transaction object -function getReceiver(txn) { - return getAttributeFromEvent(txn, 'create_item', 'receiver') -} - -// getting the spender object out of the transaction object -function getSpender(txn) { - return getAttributeFromEvent(txn, 'create_item', 'sender') -} - -function getAttributeFromEvent(txn, event, attribute) { - let Val = '' - const events = txn?.tx_response?.logs[0]?.events - - if (events !== null && events !== undefined) { - for (let i = 0; i < events.length; i++) { - if (events[i].type === event) { - const attributes = events[i].attributes - for (let j = 0; j < attributes.length; j++) { - if (attributes[j].key === attribute) { - Val = attributes[j].value - break - } - } - } - } - } - - return Val -} - -// separating amount from the amountString which is like '100000upylon' -function getAmount(amountString) { - const quantity = parseFloat(amountString.replace(/\D/g, '')) - return quantity -} - -// separating the coin from the amountString -function getCoin(amountString) { - const quantity = parseFloat(amountString.replace(/\D/g, '')) - const coin = amountString.replace(quantity, '') - return coin -} - -function extractSaleFromSales(sales) { - if (!isNil(sales[0])) { - const buyerUsername = getUserNameInfo(sales[0].to) - const sellerUsername = getUserNameInfo(sales[0].from) - - sales[0].to = buyerUsername?.username?.value - sales[0].from = sellerUsername?.username?.value - - return sales[0] - } - - return null -} - -function getRecipe(cookBookID, recipeID) { - let result - const url = sanitizeUrl( - `${Meteor.settings.remote.api}/pylons/recipe/${cookBookID}/${recipeID}` - ) - try { - const response = HTTP.get(url) - result = JSON.parse(response.content)?.recipe - } catch (e) { - console.log('error getting recipe from api: ', cookBookID, recipeID, url) - // Recipes.insert(result) - } - return result -} diff --git a/big-dipper-backend/imports/api/analytics/server/publications.js b/big-dipper-backend/imports/api/analytics/server/publications.js deleted file mode 100644 index 0d4530ceeb..0000000000 --- a/big-dipper-backend/imports/api/analytics/server/publications.js +++ /dev/null @@ -1,9 +0,0 @@ -import { Analytics } from '../analytics.js'; - -publishComposite('Analytics.list', function(limit = 30){ - return { - find(){ - return Analytics.find({}, { sort: { ID: 1 } }); - } - } -}); diff --git a/big-dipper-backend/imports/api/api.js b/big-dipper-backend/imports/api/api.js deleted file mode 100644 index fc43be1194..0000000000 --- a/big-dipper-backend/imports/api/api.js +++ /dev/null @@ -1,4 +0,0 @@ -export const API = new Restivus({ - useDefaultAuth: true, - prettyJson: true - }) diff --git a/big-dipper-backend/imports/api/blocks/blocks.js b/big-dipper-backend/imports/api/blocks/blocks.js deleted file mode 100644 index 7d812d81ad..0000000000 --- a/big-dipper-backend/imports/api/blocks/blocks.js +++ /dev/null @@ -1,23 +0,0 @@ -import { Mongo } from 'meteor/mongo'; -import { Validators } from '../validators/validators.js'; - -export const Blockscon = new Mongo.Collection('blocks'); - -Blockscon.helpers({ - proposer(){ - return Validators.findOne({address:this.proposerAddress}); - } -}); - -// Blockscon.helpers({ -// sorted(limit) { -// return Blockscon.find({}, {sort: {height:-1}, limit: limit}); -// } -// }); - - -// Meteor.setInterval(function() { -// Meteor.call('blocksUpdate', (error, result) => { -// console.log(result); -// }) -// }, 30000000); \ No newline at end of file diff --git a/big-dipper-backend/imports/api/blocks/server/methods.js b/big-dipper-backend/imports/api/blocks/server/methods.js deleted file mode 100644 index 652c7f2a2c..0000000000 --- a/big-dipper-backend/imports/api/blocks/server/methods.js +++ /dev/null @@ -1,744 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { HTTP } from 'meteor/http'; -import { Blockscon } from '/imports/api/blocks/blocks.js'; -import { Chain } from '/imports/api/chain/chain.js'; -import { ValidatorSets } from '/imports/api/validator-sets/validator-sets.js'; -import { Validators } from '/imports/api/validators/validators.js'; -import { ValidatorRecords, Analytics, VPDistributions} from '/imports/api/records/records.js'; -import { VotingPowerHistory } from '/imports/api/voting-power/history.js'; -import { Transactions } from '../../transactions/transactions.js'; -import { Evidences } from '../../evidences/evidences.js'; -import { sha256 } from 'js-sha256'; -// import { getAddress } from 'tendermint/lib/pubkey'; -import * as cheerio from 'cheerio'; -import { sanitizeUrl } from '@braintree/sanitize-url'; - - -getRemovedValidators = (prevValidators, validators) => { - // let removeValidators = []; - for (p in prevValidators){ - for (v in validators){ - if (prevValidators[p].address == validators[v].address){ - prevValidators.splice(p,1); - } - } - } - - return prevValidators; -} - - -getValidatorFromConsensusKey = (validators, consensusKey) => { - for (v in validators){ - try { - let pubkeyType = Meteor.settings.public.secp256k1?'tendermint/PubKeySecp256k1':'tendermint/PubKeyEd25519'; - let pubkey = Meteor.call('bech32ToPubkey', consensusKey, pubkeyType); - if (validators[v].pub_key.value == pubkey){ - return validators[v] - } - } - catch (e){ - console.log("Error converting pubkey: %o\n%o", consensusKey, e) - } - } - return null; -} - - -export const getValidatorProfileUrl = (identity) => { - console.log("Get validator avatar.") - if (identity.length == 16){ - var url = sanitizeUrl(`https://keybase.io/_/api/1.0/user/lookup.json?key_suffix=${identity}&fields=pictures`) - let response = HTTP.get() - if (response.statusCode == 200) { - let them = response?.data?.them - return them && them.length && them[0]?.pictures && them[0]?.pictures?.primary && them[0]?.pictures?.primary?.url; - } else { - console.log(JSON.stringify(response)) - } - } else if (identity.indexOf("keybase.io/team/")>0){ - let teamPage = HTTP.get(identity); - if (teamPage.statusCode == 200){ - let page = cheerio.load(teamPage.content); - return page(".kb-main-card img").attr('src'); - } else { - console.log(JSON.stringify(teamPage)) - } - } -} - - -getValidatorUptime = async (validatorSet) => { - - // get validator uptime - - let url = sanitizeUrl(`${API}/cosmos/slashing/v1beta1/params`); - let response = HTTP.get(url); - let slashingParams = JSON.parse(response.content) - - Chain.upsert({chainId:Meteor.settings.public.chainId}, {$set:{"slashing":slashingParams}}); - - for(let key in validatorSet){ - // console.log("Getting uptime validator: %o", validatorSet[key]); - try { - // console.log("=== Signing Info ===: %o", signingInfo) - - url = sanitizeUrl(`${API}/cosmos/slashing/v1beta1/signing_infos/${validatorSet[key].bech32ValConsAddress}`) - let response = HTTP.get(url); - let signingInfo = JSON.parse(response.content).val_signing_info; - if (signingInfo){ - let valData = validatorSet[key] - valData.tombstoned = signingInfo.tombstoned; - valData.jailed_until = signingInfo.jailed_until; - valData.index_offset = parseInt(signingInfo.index_offset); - valData.start_height = parseInt(signingInfo.start_height); - valData.uptime = (slashingParams.params.signed_blocks_window - parseInt(signingInfo.missed_blocks_counter))/slashingParams.params.signed_blocks_window * 100; - Validators.upsert({bech32ValConsAddress:validatorSet[key].bech32ValConsAddress}, {$set:valData}) - } - } - catch(e){ - console.log(url); - console.log("Getting signing info of %o: %o", validatorSet[key].bech32ValConsAddress, e); - } - } -} - -calculateVPDist = async (analyticsData, blockData) => { - console.log("===== calculate voting power distribution ====="); - let activeValidators = Validators.find({status:'BOND_STATUS_BONDED',jailed:false},{sort:{voting_power:-1}}).fetch(); - let numTopTwenty = Math.ceil(activeValidators.length*0.2); - let numBottomEighty = activeValidators.length - numTopTwenty; - - let topTwentyPower = 0; - let bottomEightyPower = 0; - - let numTopThirtyFour = 0; - let numBottomSixtySix = 0; - let topThirtyFourPercent = 0; - let bottomSixtySixPercent = 0; - - - - for (v in activeValidators){ - if (v < numTopTwenty){ - topTwentyPower += activeValidators[v].voting_power; - } - else{ - bottomEightyPower += activeValidators[v].voting_power; - } - - - if (topThirtyFourPercent < 0.34){ - topThirtyFourPercent += activeValidators[v].voting_power / analyticsData.voting_power; - numTopThirtyFour++; - } - } - - bottomSixtySixPercent = 1 - topThirtyFourPercent; - numBottomSixtySix = activeValidators.length - numTopThirtyFour; - - let vpDist = { - height: blockData.height, - numTopTwenty: numTopTwenty, - topTwentyPower: topTwentyPower, - numBottomEighty: numBottomEighty, - bottomEightyPower: bottomEightyPower, - numTopThirtyFour: numTopThirtyFour, - topThirtyFourPercent: topThirtyFourPercent, - numBottomSixtySix: numBottomSixtySix, - bottomSixtySixPercent: bottomSixtySixPercent, - numValidators: activeValidators.length, - totalVotingPower: analyticsData.voting_power, - blockTime: blockData.time, - createAt: new Date() - } - - console.log(vpDist); - - VPDistributions.insert(vpDist); -} - -// var filtered = [1, 2, 3, 4, 5].filter(notContainedIn([1, 2, 3, 5])); -// console.log(filtered); // [4] - -Meteor.methods({ - 'blocks.averageBlockTime'(address){ - this.unblock(); - let blocks = Blockscon.find({proposerAddress:address}).fetch(); - let heights = blocks.map((block) => { - return block.height; - }); - let blocksStats = Analytics.find({height:{$in:heights}}).fetch(); - // console.log(blocksStats); - - let totalBlockDiff = 0; - for (b in blocksStats){ - totalBlockDiff += blocksStats[b].timeDiff; - } - return totalBlockDiff/heights.length; - }, - 'blocks.getLatestHeight': function() { - this.unblock(); - let url = sanitizeUrl(RPC+'/status'); - try{ - let response = HTTP.get(url); - let status = JSON.parse(response.content); - return (status.result.sync_info.latest_block_height); - } - catch (e){ - return 0; - } - }, - 'blocks.getCurrentHeight': function() { - this.unblock(); - let currHeight = Blockscon.find({},{sort:{height:-1},limit:1}).fetch(); - // console.log("currentHeight:"+currHeight); - let startHeight = Meteor.settings.params.startHeight; - if (currHeight && currHeight.length == 1) { - let height = currHeight[0].height; - if (height > startHeight) - return height - } - return startHeight - }, - 'blocks.blocksUpdate': async function() { - this.unblock(); - if (SYNCING) - return "Syncing..."; - else console.log("start to sync"); - // Meteor.clearInterval(Meteor.timerHandle); - // get the latest height - let until = Meteor.call('blocks.getLatestHeight'); - // console.log(until); - // get the current height in db - let curr = Meteor.call('blocks.getCurrentHeight'); - console.log(curr); - // loop if there's update in db - if (until > curr) { - SYNCING = true; - - let validatorSet = []; - // get latest validator candidate information - - let url = sanitizeUrl(API + '/cosmos/staking/v1beta1/validators?status=BOND_STATUS_BONDED&pagination.limit=200&pagination.count_total=true'); - - try{ - let response = HTTP.get(url); - let result = JSON.parse(response.content).validators; - result.forEach((validator) => validatorSet[validator.consensus_pubkey.key] = validator); - } - catch(e){ - console.log(url); - console.log(e); - } - - try{ - url = sanitizeUrl(API + '/cosmos/staking/v1beta1/validators?status=BOND_STATUS_UNBONDING&pagination.limit=200&pagination.count_total=true'); - let response = HTTP.get(url); - let result = JSON.parse(response.content).validators; - result.forEach((validator) => validatorSet[validator.consensus_pubkey.key] = validator); - } - catch(e){ - console.log(url); - console.log(e); - } - - try{ - url = sanitizeUrl(API + '/cosmos/staking/v1beta1/validators?status=BOND_STATUS_UNBONDED&pagination.limit=200&pagination.count_total=true'); - let response = HTTP.get(url); - let result = JSON.parse(response.content).validators; - result.forEach((validator) => validatorSet[validator.consensus_pubkey.key] = validator); - } - catch(e){ - console.log(url); - console.log(e); - } - - // console.log("validaotor set: %o", validatorSet); - let totalValidators = Object.keys(validatorSet).length; - console.log("all validators: "+ totalValidators); - Chain.update({chainId:Meteor.settings.public.chainId}, {$set:{totalValidators:totalValidators}}); - - for (let height = curr+1 ; height <= until ; height++) { - let startBlockTime = new Date(); - // add timeout here? and outside this loop (for catched up and keep fetching)? - this.unblock(); - - url = sanitizeUrl(`${API}/blocks?height=${height}`); - let analyticsData = {}; - - const bulkValidators = Validators.rawCollection().initializeUnorderedBulkOp(); - const bulkUpdateLastSeen = Validators.rawCollection().initializeUnorderedBulkOp(); - const bulkValidatorRecords = ValidatorRecords.rawCollection().initializeUnorderedBulkOp(); - const bulkVPHistory = VotingPowerHistory.rawCollection().initializeUnorderedBulkOp(); - const bulkTransactions = Transactions.rawCollection().initializeUnorderedBulkOp(); - - console.log("Getting block at height: %o", height); - try{ - let startGetHeightTime = new Date(); - - let response = HTTP.get(url); - - // store height, hash, numtransaction and time in db - let blockData = {}; - let block = JSON.parse(response.content); - blockData.height = height; - blockData.hash = block.block_id.hash; - blockData.transNum = block.block.data.txs?block.block.data.txs.length:0; - blockData.time = block.block.header.time; - blockData.lastBlockHash = block.block.header.last_block_id.hash; - blockData.proposerAddress = block.block.header.proposer_address; - blockData.validators = []; - - - // save txs in database - if (block.block.data.txs && block.block.data.txs.length > 0){ - for (t in block.block.data.txs){ - bulkTransactions.insert({ - // hash has to be in uppercase - txhash: sha256(Buffer.from(block.block.data.txs[t], 'base64')).toUpperCase(), - height: parseInt(height), - processed: false - }) - } - - if (bulkTransactions.length > 0){ - bulkTransactions.execute((err, result) => { - if (err){ - console.log(err); - } - if (result){ - // console.log(result); - } - }); - } - } - - // save double sign evidences - if (block.block.evidence.evidenceList){ - Evidences.insert({ - height: height, - evidence: block.block.evidence.evidenceList - }); - } - - // console.log("signatures: %o", block.block.lastCommit.signaturesList) - - blockData.precommitsCount = block.block.last_commit.signatures.length; - - analyticsData.height = height; - - let endGetHeightTime = new Date(); - console.log("Get height time: "+((endGetHeightTime-startGetHeightTime)/1000)+"seconds."); - - - let startGetValidatorsTime = new Date(); - // update chain status - - let validators = [] - let page = 0; - // let nextKey = 0; - try { - let result; - - do { - let url = sanitizeUrl(RPC+`/validators?height=${height}&page=${++page}&per_page=100`); - let response = HTTP.get(url); - result = JSON.parse(response.content).result; - // console.log("========= validator result ==========: %o", result) - validators = [...validators, ...result.validators]; - - // console.log(validators.length); - // console.log(parseInt(result.total)); - } - while (validators.length < parseInt(result.total)) - - } - catch(e){ - console.log("Getting validator set at height %o: %o", height, e) - } - - let genesisTime; - - try { - let genesisResult; - - do { - let url = sanitizeUrl(RPC+`/genesis`); - let response = HTTP.get(url); - genesisResult = JSON.parse(response.content).result; - - // GenesisTime time at start of chain - console.log("========= genesis time ==========: %v", genesisResult.genesis.genesis_time) - genesisTime = genesisResult.genesis.genesis_time; - - - - } - while (!genesisTime) - - } - catch(e){ - console.log("Error getting genesisResult") - } - - // console.log(validators) - - ValidatorSets.insert({ - block_height: height, - validators: validators - }) - - blockData.validatorsCount = validators.length; - - // temporarily add bech32 concensus keys to the validator set list - let tempValidators = []; - for (let v in validators){ - validators[v].valconsAddress = Meteor.call('hexToBech32', validators[v].address, Meteor.settings.public.bech32PrefixConsAddr); - tempValidators[validators[v].address] = validators[v]; - } - console.log("hexToBech32 post"); - validators = tempValidators; - - //console.log("before comparing precommits: %o", validators); - - // Tendermint v0.33 start using "signatures" in last block instead of "precommits" - let precommits = block.block.last_commit.signatures; - if (precommits != null){ - // console.log(precommits); - for (let i=0; i 1){ - // record precommits and calculate uptime - // only record from block 2 - for (i in validators){ - let address = validators[i].address; - let record = { - height: height, - address: address, - exists: false, - voting_power: parseInt(validators[i].voting_power) - } - - for (j in precommits){ - if (precommits[j] != null){ - let precommitAddress = precommits[j].validator_address; - if (address == precommitAddress){ - record.exists = true; - bulkUpdateLastSeen.find({address:precommitAddress}).upsert().updateOne({$set:{lastSeen:blockData.time}}); - precommits.splice(j,1); - break; - } - } - } - - bulkValidatorRecords.insert(record); - // ValidatorRecords.update({height:height,address:record.address},record); - } - } - - let startBlockInsertTime = new Date(); - Blockscon.insert(blockData); - let endBlockInsertTime = new Date(); - console.log("Block insert time: "+((endBlockInsertTime-startBlockInsertTime)/1000)+"seconds."); - - let chainStatus = Chain.findOne({chainId:block.block.header.chain_id}); - let lastSyncedTime = chainStatus?chainStatus.lastSyncedTime:0; - let timeDiff; - let blockTime = Meteor.settings.params.defaultBlockTime; - if (lastSyncedTime){ - let dateLatest = new Date(blockData.time); - let dateLast = new Date(lastSyncedTime); - - // calculating time to generate average block time - let genesisTimeStamp = new Date(genesisTime); - timeDiff = Math.abs(dateLatest.getTime() - dateLast.getTime()); - blockTime = (dateLatest.getTime() - genesisTimeStamp.getTime()) / blockData.height; - } - - let endGetValidatorsTime = new Date(); - console.log("Get height validators time: "+((endGetValidatorsTime-startGetValidatorsTime)/1000)+"seconds."); - - Chain.update({chainId:block.block.header.chainId}, {$set:{lastSyncedTime:blockData.time, blockTime:blockTime}}); - - analyticsData.averageBlockTime = blockTime; - analyticsData.timeDiff = timeDiff; - - analyticsData.time = blockData.time; - - // initialize validator data at first block - // if (height == 1){ - // Validators.remove({}); - // } - - analyticsData.voting_power = 0; - - let startFindValidatorsNameTime = new Date(); - for (v in validatorSet){ - let valData = validatorSet[v]; - - valData.tokens = parseInt(valData.tokens); - valData.unbonding_height = parseInt(valData.unbonding_height) - - let valExist = Validators.findOne({"consensus_pubkey.key":v}); - - // console.log(valData); - - // console.log("===== voting power ======: %o", valData) - analyticsData.voting_power += valData.voting_power - - // console.log(analyticsData.voting_power); - if (!valExist && valData.consensus_pubkey){ - - // let val = getValidatorFromConsensusKey(validators, v); - // get the validator hex address and other bech32 addresses. - - valData.delegator_address = Meteor.call('getDelegator', valData.operator_address); - - // console.log("get hex address") - // valData.address = getAddress(valData.consensusPubkey); - console.log("get bech32 consensus pubkey"); - valData.bech32ConsensusPubKey = Meteor.call('pubkeyToBech32', valData.consensus_pubkey, Meteor.settings.public.bech32PrefixConsPub); - - - valData.address = Meteor.call('getAddressFromPubkey', valData.consensus_pubkey); - valData.bech32ValConsAddress = Meteor.call('hexToBech32', valData.address, Meteor.settings.public.bech32PrefixConsAddr); - - // assign back to the validator set so that we can use it to find the uptime - - if (validatorSet[v]) - validatorSet[v].bech32ValConsAddress = valData.bech32ValConsAddress; - - - // First time adding validator to the database. - // Fetch profile picture from Keybase - - if (valData.description && valData.description.identity){ - try{ - valData.profile_url = getValidatorProfileUrl(valData.description.identity) - } - catch (error){ - console.log("Error fetching keybase: %o", error) - } - } - - - valData.accpub = Meteor.call('pubkeyToBech32', valData.consensus_pubkey, Meteor.settings.public.bech32PrefixAccPub); - valData.operator_pubkey = Meteor.call('pubkeyToBech32', valData.consensus_pubkey, Meteor.settings.public.bech32PrefixValPub); - - // insert first power change history - - // valData.voting_power = validators[valData.consensusPubkey.value]?parseInt(validators[valData.consensusPubkey.value].votingPower):0; - valData.voting_power = validators[valData.address]?parseInt(validators[valData.address].voting_power):0; - valData.proposer_priority = validators[valData.address]?parseInt(validators[valData.address].proposer_priority):0; - - console.log("Validator not found. Insert first VP change record.") - - // console.log("first voting power: %o", valData.voting_power); - bulkVPHistory.insert({ - address: valData.address, - prev_voting_power: 0, - voting_power: valData.voting_power, - type: 'add', - height: blockData.height, - block_time: blockData.time - }); - // } - } - else{ - // console.log(valData); - valData.address = valExist.address; - - // assign to valData for getting self delegation - valData.delegator_address = valExist.delegator_address; - valData.bech32ValConsAddress = valExist.bech32ValConsAddress; - - if (validatorSet[v]){ - validatorSet[v].bech32ValConsAddress = valExist.bech32ValConsAddress; - } - // console.log(valExist); - // console.log(validators[valExist.address]) - // if (validators[valData.consensusPubkey.value]){ - if (validators[valExist.address]){ - // Validator exists and is in validator set, update voitng power. - // If voting power is different from before, add voting power history - valData.voting_power = parseInt(validators[valExist.address].voting_power); - valData.proposer_priority = parseInt(validators[valExist.address].proposer_priority); - let prevVotingPower = VotingPowerHistory.findOne({address:valExist.address}, {height:-1, limit:1}); - - console.log("Validator already in DB. Check if VP changed."); - if (prevVotingPower){ - if (prevVotingPower.voting_power != valData.voting_power){ - let changeType = (prevVotingPower.voting_power > valData.voting_power)?'down':'up'; - let changeData = { - address: valExist.address, - prev_voting_power: prevVotingPower.voting_power, - voting_power: valData.voting_power, - type: changeType, - height: blockData.height, - block_time: blockData.time - }; - bulkVPHistory.insert(changeData); - } - } - } - else{ - // Validator is not in the set and it has been removed. - // Set voting power to zero and add voting power history. - - valData.address = valExist.address; - valData.voting_power = 0; - valData.proposer_priority = 0; - - let prevVotingPower = VotingPowerHistory.findOne({address:valExist.address}, {height:-1, limit:1}); - - if (prevVotingPower && (prevVotingPower.voting_power > 0)){ - console.log("Validator is in DB but not in validator set now. Add remove VP change."); - bulkVPHistory.insert({ - address: valExist.address, - prev_voting_power: prevVotingPower, - voting_power: 0, - type: 'remove', - height: blockData.height, - block_time: blockData.time - }); - } - } - } - - // only update validator infor during start of crawling, end of crawling or every validator update window - if ((height == curr+1) || (height == Meteor.settings.params.startHeight+1) || (height == until) || (height % Meteor.settings.params.validatorUpdateWindow == 0)){ - if ((height == Meteor.settings.params.startHeight+1) || (height % Meteor.settings.params.validatorUpdateWindow == 0)){ - if (valData.status == 'BOND_STATUS_BONDED'){ - url = sanitizeUrl(`${API}/cosmos/staking/v1beta1/validators/${valData.operator_address}/delegations/${valData.delegator_address}`) - try{ - console.log("Getting self delegation"); - - let response = HTTP.get(url); - let selfDelegation = JSON.parse(response.content).delegation_response; - - valData.self_delegation = (selfDelegation.delegation && selfDelegation.delegation.shares)?parseFloat(selfDelegation.delegation.shares)/parseFloat(valData.delegator_shares):0; - - } - catch(e){ - console.log(url); - console.log("Getting self delegation: %o", e); - valData.self_delegation = 0; - - } - } - } - - console.log("Add validator upsert to bulk operations.") - bulkValidators.find({"address": valData.address}).upsert().updateOne({$set:valData}); - } - } - - // store valdiators exist records - // let existingValidators = Validators.find({address:{$exists:true}}).fetch(); - - // update uptime by the end of the crawl or update window - if ((height % Meteor.settings.params.validatorUpdateWindow == 0) || (height == until)){ - console.log("Update validator uptime.") - getValidatorUptime(validatorSet) - } - - - - let endFindValidatorsNameTime = new Date(); - console.log("Get validators name time: "+((endFindValidatorsNameTime-startFindValidatorsNameTime)/1000)+"seconds."); - - // record for analytics - let startAnayticsInsertTime = new Date(); - Analytics.insert(analyticsData); - let endAnalyticsInsertTime = new Date(); - console.log("Analytics insert time: "+((endAnalyticsInsertTime-startAnayticsInsertTime)/1000)+"seconds."); - - // calculate voting power distribution every 60 blocks ~ 5mins - - if (height % 60 == 1){ - calculateVPDist(analyticsData, blockData) - } - - let startVUpTime = new Date(); - if (bulkValidators.length > 0){ - console.log("############ Update validators ############"); - bulkValidators.execute((err, result) => { - if (err){ - console.log("Error while bulk insert validators: %o",err); - } - if (result) { - if (bulkUpdateLastSeen.length > 0) { - bulkUpdateLastSeen.execute((err, result) => { - if (err) { - console.log("Error while bulk update validator last seen: %o", err); - } - if (result) { - } - }) - } - } - }); - } - - let endVUpTime = new Date(); - console.log("Validator update time: "+((endVUpTime-startVUpTime)/1000)+"seconds."); - - let startVRTime = new Date(); - if (bulkValidatorRecords.length > 0){ - bulkValidatorRecords.execute((err) => { - if (err){ - console.log(err); - } - }); - } - - let endVRTime = new Date(); - console.log("Validator records update time: "+((endVRTime-startVRTime)/1000)+"seconds."); - - if (bulkVPHistory.length > 0){ - bulkVPHistory.execute((err) => { - if (err){ - console.log(err); - } - }); - } - - - // } - } - catch (e){ - console.log("Block syncing stopped: %o", e); - SYNCING = false; - return "Stopped"; - } - let endBlockTime = new Date(); - console.log("This block used: "+((endBlockTime-startBlockTime)/1000)+"seconds."); - } - SYNCING = false; - Chain.update({chainId:Meteor.settings.public.chainId}, {$set:{lastBlocksSyncedTime:new Date()}}); - } - - return until; - }, - 'addLimit': function(limit) { - // console.log(limit+10) - return (limit+10); - }, - 'hasMore': function(limit) { - if (limit > Meteor.call('getCurrentHeight')) { - return (false); - } else { - return (true); - } - } -}); diff --git a/big-dipper-backend/imports/api/blocks/server/publications.js b/big-dipper-backend/imports/api/blocks/server/publications.js deleted file mode 100644 index b1f948a752..0000000000 --- a/big-dipper-backend/imports/api/blocks/server/publications.js +++ /dev/null @@ -1,47 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Blockscon } from '../blocks.js'; -import { Validators } from '../../validators/validators.js'; -import { Transactions } from '../../transactions/transactions.js'; - -publishComposite('blocks.height', function(limit){ - return { - find(){ - return Blockscon.find({}, {limit: limit, sort: {height: -1}}) - }, - children: [ - { - find(block){ - return Validators.find( - {address:block.proposerAddress}, - {limit:1} - ) - } - } - ] - } -}); - -publishComposite('blocks.findOne', function(height){ - return { - find(){ - return Blockscon.find({height:height}) - }, - children: [ - { - find(block){ - return Transactions.find( - {height:block.height} - ) - } - }, - { - find(block){ - return Validators.find( - {address:block.proposerAddress}, - {limit:1} - ) - } - } - ] - } -}); diff --git a/big-dipper-backend/imports/api/chain/chain.js b/big-dipper-backend/imports/api/chain/chain.js deleted file mode 100644 index 382dab22be..0000000000 --- a/big-dipper-backend/imports/api/chain/chain.js +++ /dev/null @@ -1,11 +0,0 @@ -import { Mongo } from 'meteor/mongo'; -import { Validators } from '../validators/validators.js'; - -export const Chain = new Mongo.Collection('chain'); -export const ChainStates = new Mongo.Collection('chain_states') - -Chain.helpers({ - proposer(){ - return Validators.findOne({address:this.proposerAddress}); - } -}) \ No newline at end of file diff --git a/big-dipper-backend/imports/api/chain/server/methods.js b/big-dipper-backend/imports/api/chain/server/methods.js deleted file mode 100644 index d645d8a33d..0000000000 --- a/big-dipper-backend/imports/api/chain/server/methods.js +++ /dev/null @@ -1,239 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { HTTP } from 'meteor/http'; -import { Chain, ChainStates } from '../chain.js'; -import Coin from '../../../../both/utils/coins.js'; -import { sanitizeUrl } from '@braintree/sanitize-url'; - -findVotingPower = (validator, genValidators) => { - for (let v in genValidators){ - if (validator.pub_key.value == genValidators[v].pub_key.value){ - return parseInt(genValidators[v].power); - } - } -} - -Meteor.methods({ - 'chain.getConsensusState': function(){ - this.unblock(); - let url = sanitizeUrl(RPC+'/dump_consensus_state'); - try{ - let response = HTTP.get(url); - let consensus = JSON.parse(response.content); - consensus = consensus.result; - let height = consensus.round_state.height; - let round = consensus.round_state.round; - let step = consensus.round_state.step; - let votedPower = Math.round(parseFloat(consensus.round_state.votes[round].prevotes_bit_array.split(" ")[3])*100); - - Chain.update({chainId:Meteor.settings.public.chainId}, {$set:{ - votingHeight: height, - votingRound: round, - votingStep: step, - votedPower: votedPower, - proposerAddress: consensus.round_state.validators.proposer.address, - prevotes: consensus.round_state.votes[round].prevotes, - precommits: consensus.round_state.votes[round].precommits - }}); - } - catch(e){ - console.log(url); - console.log(e); - } - }, - 'chain.updateStatus': async function(){ - this.unblock(); - let url = ""; - try{ - url = sanitizeUrl(API + '/cosmos/base/tendermint/v1beta1/blocks/latest'); - let response = HTTP.get(url); - let latestBlock = JSON.parse(response.content); - - let chain = {}; - chain.chainId = latestBlock.block.header.chain_id; - chain.latestBlockHeight = parseInt(latestBlock.block.header.height); - chain.latestBlockTime = latestBlock.block.header.time; - let latestState = ChainStates.findOne({}, {sort: {height: -1}}) - if (latestState && latestState.height >= chain.latestBlockHeight) { - return `no updates (getting block ${chain.latestBlockHeight} at block ${latestState.height})` - } - - // Since Tendermint v0.33, validator page default set to return 30 validators. - // Query latest height with page 1 and 100 validators per page. - - // validators = validators.validatorsList; - // chain.validators = validators.length; - - let validators = [] - let page = 0; - - do { - url = sanitizeUrl(RPC+`/validators?page=${++page}&per_page=100`); - let response = HTTP.get(url); - result = JSON.parse(response.content).result; - validators = [...validators, ...result.validators]; - - } - while (validators.length < parseInt(result.total)) - - chain.validators = validators.length; - let activeVP = 0; - for (v in validators){ - activeVP += parseInt(validators[v].voting_power); - } - chain.activeVotingPower = activeVP; - - // update staking params - try { - url = sanitizeUrl(API + '/cosmos/staking/v1beta1/params'); - response = HTTP.get(url); - chain.staking = JSON.parse(response.content); - } - catch(e){ - console.log(e); - } - - // Get chain states - if (parseInt(chain.latestBlockHeight) > 0){ - let chainStates = {}; - chainStates.height = parseInt(chain.latestBlockHeight); - chainStates.time = new Date(chain.latestBlockTime); - - try{ - url = sanitizeUrl(API + '/cosmos/staking/v1beta1/pool'); - let response = HTTP.get(url); - let bonding = JSON.parse(response.content).pool; - chainStates.bondedTokens = parseInt(bonding.bonded_tokens); - chainStates.notBondedTokens = parseInt(bonding.not_bonded_tokens); - } - catch(e){ - console.log(e); - } - - if ( Coin.StakingCoin.denom ) { - if (Meteor.settings.public.modules.bank){ - try{ - url = sanitizeUrl(API + '/cosmos/bank/v1beta1/supply/by_denom?denom=' + Coin.StakingCoin.denom); - let response = HTTP.get(url); - let supply = JSON.parse(response.content); - chainStates.totalSupply = parseInt(supply.amount.amount); - } - catch(e){ - console.log(e); - } - - // update bank params - try { - url = sanitizeUrl(API + '/cosmos/bank/v1beta1/params'); - response = HTTP.get(url); - chain.bank = JSON.parse(response.content); - } - catch(e){ - console.log(e); - } - - } - - if (Meteor.settings.public.modules.distribution){ - try { - url = sanitizeUrl(API + '/cosmos/distribution/v1beta1/community_pool'); - let response = HTTP.get(url); - let pool = JSON.parse(response.content).pool; - if (pool && pool.length > 0){ - chainStates.communityPool = []; - pool.forEach((amount) => { - chainStates.communityPool.push({ - denom: amount.denom, - amount: parseFloat(amount.amount) - }) - }) - } - } - catch (e){ - console.log(e) - } - - // update distribution params - try { - url = sanitizeUrl(API + '/cosmos/distribution/v1beta1/params'); - response = HTTP.get(url); - chain.distribution = JSON.parse(response.content); - } - catch(e){ - console.log(e); - } - } - - if (Meteor.settings.public.modules.minting){ - try{ - url = sanitizeUrl(API + '/cosmos/mint/v1beta1/inflation'); - let response = HTTP.get(url); - let inflation = JSON.parse(response.content).inflation; - // response = HTTP.get(url); - // let inflation = JSON.parse(response.content).result; - if (inflation){ - chainStates.inflation = parseFloat(inflation) - } - } - catch(e){ - console.log(e); - } - - try{ - url = sanitizeUrl(API + '/cosmos/mint/v1beta1/annual_provisions'); - let response = HTTP.get(url); - let provisions = JSON.parse(response.content).annual_provisions; - console.log(provisions) - if (provisions){ - chainStates.annualProvisions = parseFloat(provisions) - } - } - catch(e){ - console.log(e); - } - - // update mint params - try { - url = sanitizeUrl(API + '/cosmos/mint/v1beta1/params'); - response = HTTP.get(url); - chain.mint = JSON.parse(response.content); - } - catch(e){ - console.log(e); - } - } - - if (Meteor.settings.public.modules.gov){ - // update gov params - try { - url = sanitizeUrl(API + '/cosmos/gov/v1beta1/params/tallying'); - response = HTTP.get(url); - chain.gov = JSON.parse(response.content); - } - catch(e){ - console.log(e); - } - } - } - - ChainStates.insert(chainStates); - } - - Chain.update({chainId:chain.chainId}, {$set:chain}, {upsert: true}); - - // chain.totalVotingPower = totalVP; - - // validators = Validators.find({}).fetch(); - // console.log(validators); - return chain.latestBlockHeight; - } - catch (e){ - console.log(url); - console.log(e); - return "Error getting chain status."; - } - }, - 'chain.getLatestStatus': function(){ - this.unblock(); - Chain.find().sort({created:-1}).limit(1); - }, -}) diff --git a/big-dipper-backend/imports/api/chain/server/publications.js b/big-dipper-backend/imports/api/chain/server/publications.js deleted file mode 100644 index 895139db0a..0000000000 --- a/big-dipper-backend/imports/api/chain/server/publications.js +++ /dev/null @@ -1,36 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Chain, ChainStates } from '../chain.js'; -import { CoinStats } from '../../coin-stats/coin-stats.js'; -import { Validators } from '../../validators/validators.js'; - -Meteor.publish('chainStates.latest', function () { - return [ - ChainStates.find({},{sort:{height:-1},limit:1}), - CoinStats.find({},{sort:{last_updated_at:-1},limit:1}) - ]; -}); - -publishComposite('chain.status', function(){ - return { - find(){ - return Chain.find({chainId:Meteor.settings.public.chainId}); - }, - children: [ - { - find(chain){ - return Validators.find( - {}, - {fields:{ - address:1, - description:1, - operatorAddress:1, - status:-1, - jailed:1, - profile_url:1 - }} - ) - } - } - ] - } -}); \ No newline at end of file diff --git a/big-dipper-backend/imports/api/codec.js b/big-dipper-backend/imports/api/codec.js deleted file mode 100644 index bf1e25f468..0000000000 --- a/big-dipper-backend/imports/api/codec.js +++ /dev/null @@ -1,15 +0,0 @@ -const StatusOk = 200 -const StatusInvalidInput = 400 -const Success = 'Success' -const BadRequest = 'Bad Request' -const InvalidID = 'Invalid Notification ID' -const Failed = 'Failed' - -export const Codec = { - StatusOk, - StatusInvalidInput, - Success, - BadRequest, - InvalidID, - Failed -} \ No newline at end of file diff --git a/big-dipper-backend/imports/api/coin-stats/coin-stats.js b/big-dipper-backend/imports/api/coin-stats/coin-stats.js deleted file mode 100644 index 4f1f32112d..0000000000 --- a/big-dipper-backend/imports/api/coin-stats/coin-stats.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -export const CoinStats = new Mongo.Collection('coin_stats'); diff --git a/big-dipper-backend/imports/api/coin-stats/server/methods.js b/big-dipper-backend/imports/api/coin-stats/server/methods.js deleted file mode 100644 index b9fa6411fc..0000000000 --- a/big-dipper-backend/imports/api/coin-stats/server/methods.js +++ /dev/null @@ -1,88 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { CoinStats } from '../coin-stats.js'; -import { HTTP } from 'meteor/http'; -import { Transactions } from '/imports/api/transactions/transactions.js'; -import { string } from 'prop-types'; - -Meteor.methods({ - 'coinStats.getCoinStats': function(){ - this.unblock(); - let transactionsHandle, transactions, transactionsExist; - let loading = true; - let coinId = Meteor.settings.public.coingeckoId; - if (coinId){ - try{ - let now = new Date(); - now.setMinutes(0); - - if (Meteor.isClient){ - transactionsHandle = Meteor.subscribe('transactions.validator', props.validator, props.delegator, props.limit); - loading = !transactionsHandle.ready(); - } - - if (Meteor.isServer || !loading){ - transactions = Transactions.find({}, {sort:{height:-1}}); - - if (Meteor.isServer){ - loading = false; - transactionsExist = !!transactions; - } - else{ - transactionsExist = !loading && !!transactions; - } - } - - if(!transactionsExist){ - return false; - } - let items = Transactions.find({ - $or: [ - {"tx.body.messages.@type":"/Pylonstech.pylons.pylons.QueryListItemByOwner"} - ] - }).fetch(); - - if (items.length > 0){ - let strings = items.Strings; - if(strings == null){ - return; - } - let price = 0.0, currency = "USD"; - for (i = 0; i < strings.length; i++) { - if(strings.Key == "Currency"){ - currency = strings.Value; - } - else if(strings.Key == "Price"){ - price = strings.Value; - } - } - if(currency == "pylon"){ - price = price * 100; - } - else{ - price = price / 100; - } - data = data[coinId]; - // console.log(coinStats); - return CoinStats.upsert({last_updated_at:data.last_updated_at}, {$set:data}); - } - } - catch(e){ - console.log(e); - } - } - else{ - return "No coingecko Id provided." - } - }, - 'coinStats.getStats': function(){ - this.unblock(); - let coinId = Meteor.settings.public.coingeckoId; - if (coinId){ - return (CoinStats.findOne({},{sort:{last_updated_at:-1}})); - } - else{ - return "No coingecko Id provided."; - } - - } -}) \ No newline at end of file diff --git a/big-dipper-backend/imports/api/cookbooks/cookbooks.js b/big-dipper-backend/imports/api/cookbooks/cookbooks.js deleted file mode 100644 index 439b390699..0000000000 --- a/big-dipper-backend/imports/api/cookbooks/cookbooks.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -export const Cookbooks = new Mongo.Collection('cookbooks'); \ No newline at end of file diff --git a/big-dipper-backend/imports/api/cookbooks/server/methods.js b/big-dipper-backend/imports/api/cookbooks/server/methods.js deleted file mode 100644 index 2e20ae8083..0000000000 --- a/big-dipper-backend/imports/api/cookbooks/server/methods.js +++ /dev/null @@ -1,99 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { HTTP } from 'meteor/http'; -import { Cookbooks } from '../cookbooks.js'; -import { Transactions } from '/imports/api/transactions/transactions.js'; - -Meteor.methods({ - 'cookbooks.getCookbooks': function() { - this.unblock(); - let transactionsHandle, transactions, transactionsExist; - let loading = true; - try { - - if (Meteor.isClient){ - transactionsHandle = Meteor.subscribe('transactions.validator', props.validator, props.delegator, props.limit); - loading = !transactionsHandle.ready(); - } - - if (Meteor.isServer || !loading){ - transactions = Transactions.find({}, {sort:{height:-1}}); - - if (Meteor.isServer){ - loading = false; - transactionsExist = !!transactions; - } - else{ - transactionsExist = !loading && !!transactions; - } - } - - if(!transactionsExist){ - return false; - } - let cookbooks = Transactions.find({ - $or: [ - {"tx.body.messages.@type":"/Pylonstech.pylons.pylons.MsgCreateCookbook"} - ] - }).fetch().map((p) => p.tx.body.messages[0]); - - let finishedCookbookIds = new Set(Cookbooks.find({}).fetch().map((p) => p.ID)); - - let activeCookbooks = finishedCookbookIds; - let cookbookIds = []; - if (cookbooks.length > 0) { - - const bulkCookbooks = Cookbooks.rawCollection().initializeUnorderedBulkOp(); - for (let i in cookbooks) { - let cookbook = cookbooks[i]; - - cookbookIds.push(cookbook.ID); - if (cookbook.NO != -1 && !finishedCookbookIds.has(cookbook.ID)) { - try { - let date = new Date(); - cookbook.NO = date.getFullYear() * 1000 * 360 * 24 * 30 * 12 + date.getMonth() * 1000 * 360 * 24 * 30 + date.getDay() * 1000 * 360 * 24 + date.getHours() * 1000 * 360 + date.getMinutes() * 1000 * 60 + date.getSeconds() * 1000 + date.getMilliseconds(); - cookbook.cookbookId = cookbook.NO; - if (activeCookbooks.has(cookbook.ID)) { - let validators = [] - let page = 0; - - } - - bulkCookbooks.find({ ID: cookbook.ID }).upsert().updateOne({ $set: cookbook }); - - } catch (e) { - bulkCookbooks.find({ ID: cookbook.ID }).upsert().updateOne({ $set: cookbook }); - } - } - } - - bulkCookbooks.find({ ID: { $nin: cookbookIds } }) - .update({ $set: { Level: "0" } }); - bulkCookbooks.execute(); - } - return true - } catch (e) { - console.log(e); - } - }, - 'cookbooks.getCookbookResults': function() { - this.unblock(); - let cookbooks = Cookbooks.find({}).fetch(); - if (cookbooks && (cookbooks.length > 0)) { - for (let i in cookbooks) { - if (cookbooks[i].ID != -1) { - let url = ""; - try { - let cookbook = { ID: cookbooks[i].ID }; - - //recipe.updatedAt = new Date(); - Cookbooks.update({ ID: cookbooks[i].ID }, { $set: cookbook }); - } catch (e) { - console.log(url); - console.log(e); - } - } - } - } - return true - } -}) \ No newline at end of file diff --git a/big-dipper-backend/imports/api/cookbooks/server/publications.js b/big-dipper-backend/imports/api/cookbooks/server/publications.js deleted file mode 100644 index ac330d6f80..0000000000 --- a/big-dipper-backend/imports/api/cookbooks/server/publications.js +++ /dev/null @@ -1,12 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Cookbooks } from '../cookbooks.js'; -import { check } from 'meteor/check' - -Meteor.publish('cookbooks.list', function() { - return Cookbooks.find({}, { sort: { ID: 1 } }); -}); - -Meteor.publish('cookbooks.one', function(cookbook_owner) { - //check(id, Number); - return Cookbooks.find({ Sender: cookbook_owner }); -}) \ No newline at end of file diff --git a/big-dipper-backend/imports/api/delegations/delegations.js b/big-dipper-backend/imports/api/delegations/delegations.js deleted file mode 100644 index 96fa3366af..0000000000 --- a/big-dipper-backend/imports/api/delegations/delegations.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -export const Delegations = new Mongo.Collection('delegations'); diff --git a/big-dipper-backend/imports/api/delegations/server/methods.js b/big-dipper-backend/imports/api/delegations/server/methods.js deleted file mode 100644 index b323d58ac5..0000000000 --- a/big-dipper-backend/imports/api/delegations/server/methods.js +++ /dev/null @@ -1,40 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Delegations } from '../delegations.js'; -import { Validators } from '../../validators/validators.js'; -import { sanitizeUrl } from '@braintree/sanitize-url'; - -Meteor.methods({ - 'delegations.getDelegations': async function(){ - this.unblock(); - let validators = Validators.find({}).fetch(); - let delegations = []; - console.log("=== Getting delegations ==="); - for (v in validators){ - if (validators[v].operator_address){ - let url = sanitizeUrl(API + '/cosmos/staking/v1beta1/validators/'+validators[v].operatorAddress+"/delegations"); - try{ - let response = HTTP.get(url); - if (response.statusCode == 200){ - let delegation = JSON.parse(response.content).result; - // console.log(delegation); - delegations = delegations.concat(delegation); - } - else{ - console.log(response.statusCode); - } - } - catch (e){ - // console.log(url); - console.log(e); - } - } - } - - let data = { - delegations: delegations, - createdAt: new Date(), - } - - return Delegations.insert(data); - } -}) \ No newline at end of file diff --git a/big-dipper-backend/imports/api/delegations/server/publications.js b/big-dipper-backend/imports/api/delegations/server/publications.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/big-dipper-backend/imports/api/evidences/evidences.js b/big-dipper-backend/imports/api/evidences/evidences.js deleted file mode 100644 index 5e1f04e43c..0000000000 --- a/big-dipper-backend/imports/api/evidences/evidences.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -export const Evidences = new Mongo.Collection('evidences'); diff --git a/big-dipper-backend/imports/api/evidences/server/methods.js b/big-dipper-backend/imports/api/evidences/server/methods.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/big-dipper-backend/imports/api/evidences/server/publications.js b/big-dipper-backend/imports/api/evidences/server/publications.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/big-dipper-backend/imports/api/fcmtoken/fcmtoken.js b/big-dipper-backend/imports/api/fcmtoken/fcmtoken.js deleted file mode 100644 index 49567f2d2a..0000000000 --- a/big-dipper-backend/imports/api/fcmtoken/fcmtoken.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -export const FCMToken = new Mongo.Collection('fcm-token'); diff --git a/big-dipper-backend/imports/api/fcmtoken/server/methods.js b/big-dipper-backend/imports/api/fcmtoken/server/methods.js deleted file mode 100644 index 0d6fb11189..0000000000 --- a/big-dipper-backend/imports/api/fcmtoken/server/methods.js +++ /dev/null @@ -1,138 +0,0 @@ -import { WebApp } from 'meteor/webapp' -import { FCMToken } from '../fcmtoken.js' -import { admin } from '../../admin.js' -import connectRoute from 'connect-route' -import { isString } from 'lodash' -// Global API configuration - -const StatusOk = 200 -const StatusInvalidInput = 400 -const Success = 'Success' -const Failed = 'Failed' -const BadRequest = 'Bad Request' -const AppCheckFailed = 'App Check Failed' - -WebApp.connectHandlers.use( - connectRoute(function (router) { - router.post('/fcmtoken/update/:address/:token', async function (req, res) { - // validate that params exist - if (!Valid(req.params.address) || !Valid(req.params.token)) { - res.writeHead(StatusOk, { - 'Content-Type': 'text/html' - }) - - res.end( - JSON.stringify({ - Code: StatusInvalidInput, - Message: BadRequest, - Data: null - }) - ) - } - - const h = req.headers - // app check header check - if (!h['x-firebase-appcheck']) { - res.writeHead(StatusOk, { - 'Content-Type': 'text/html' - }) - - res.end( - JSON.stringify({ - Code: StatusInvalidInput, - Message: AppCheckFailed, - Data: 'x-firebase-appcheck header missing' - }) - ) - } else { - // performing app check - const appCheckClaims = await verifyAppCheckToken( - h['x-firebase-appcheck'] - ) - - // app check failed - if (!appCheckClaims) { - res.writeHead(StatusOk, { - 'Content-Type': 'text/html' - }) - - res.end( - JSON.stringify({ - Code: StatusInvalidInput, - Message: AppCheckFailed, - Data: 'invalid x-firebase-appcheck header' - }) - ) - } - - const result = updateFCMToken(req.params.address, req.params.token) - - if (result === false) { - res.writeHead(400, { - 'Content-Type': 'text/html' - }) - - res.end( - JSON.stringify({ - Code: StatusInvalidInput, - Message: Failed, - Data: null - }) - ) - } - - res.writeHead(200, { - 'Content-Type': 'text/html' - }) - - res.end( - JSON.stringify({ - Code: StatusOk, - Message: Success, - Data: null - }) - ) - } - }) - }) -) - -function updateFCMToken (userAddress, fcmToken) { - try { - FCMToken.upsert( - { address: userAddress }, - { - $set: { - address: userAddress, - token: fcmToken - } - } - ) - } catch (error) { - console.log(error) - return false - } - return true -} - -function Valid (parameter) { - if (!isString(parameter)) { - return false - } - if (parameter.length === 0) { - return false - } - return true -} - -async function verifyAppCheckToken (appCheckToken) { - if (!appCheckToken) { - return null - } - try { - const res = await admin.appCheck().verifyToken(appCheckToken) - return res - } catch (err) { - return null - } -} diff --git a/big-dipper-backend/imports/api/ledger/server/methods.js b/big-dipper-backend/imports/api/ledger/server/methods.js deleted file mode 100644 index 2db90d7413..0000000000 --- a/big-dipper-backend/imports/api/ledger/server/methods.js +++ /dev/null @@ -1,65 +0,0 @@ -import { HTTP } from 'meteor/http'; -import { Validators } from '../../validators/validators'; - -Meteor.methods({ - 'transaction.submit': function(txInfo) { - this.unblock(); - const url = `${API}/txs`; - data = { - "tx": txInfo.value, - "mode": "sync" - } - const timestamp = new Date().getTime(); - console.log(`submitting transaction${timestamp} ${url} with data ${JSON.stringify(data)}`) - - let response = HTTP.post(url, {data}); - console.log(`response for transaction${timestamp} ${url}: ${JSON.stringify(response)}`) - if (response.statusCode == 200) { - let data = response.data - if (data.code) - throw new Meteor.Error(data.code, JSON.parse(data.raw_log).message) - return response.data.txhash; - } - }, - 'transaction.execute': function(body, path) { - this.unblock(); - const url = `${API}/${path}`; - data = { - "base_req": { - ...body, - "chain_id": Meteor.settings.public.chainId, - "simulate": false - } - }; - let response = HTTP.post(url, {data}); - if (response.statusCode == 200) { - return JSON.parse(response.content); - } - }, - 'transaction.simulate': function(txMsg, from, accountNumber, sequence, path, adjustment='1.2') { - this.unblock(); - const url = `${API}/${path}`; - console.log(txMsg); - data = {...txMsg, - "base_req": { - "from": from, - "chain_id": Meteor.settings.public.chainId, - "gas_adjustment": adjustment, - "account_number": accountNumber, - "sequence": sequence.toString(), - "simulate": true - } - }; - console.log(url); - console.log(data); - let response = HTTP.post(url, {data}); - if (response.statusCode == 200) { - return JSON.parse(response.content).gas_estimate; - } - }, - 'isValidator': function(address){ - this.unblock(); - let validator = Validators.findOne({delegator_address:address}) - return validator; - } -}) \ No newline at end of file diff --git a/big-dipper-backend/imports/api/nfts/nfts.js b/big-dipper-backend/imports/api/nfts/nfts.js deleted file mode 100644 index 8f0313e297..0000000000 --- a/big-dipper-backend/imports/api/nfts/nfts.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -export const Nfts = new Mongo.Collection('nfts'); \ No newline at end of file diff --git a/big-dipper-backend/imports/api/nfts/server/methods.js b/big-dipper-backend/imports/api/nfts/server/methods.js deleted file mode 100644 index 9e20ea555e..0000000000 --- a/big-dipper-backend/imports/api/nfts/server/methods.js +++ /dev/null @@ -1,129 +0,0 @@ -import {Meteor} from "meteor/meteor"; -import {HTTP} from "meteor/http"; -import {Nfts} from "../nfts.js"; -import {Transactions} from "/imports/api/transactions/transactions.js"; -import {sanitizeUrl} from "@braintree/sanitize-url"; - -Meteor.methods({ - "nfts.getNfts": function () { - this.unblock(); - - let transactionsHandle, transactions, transactionsExist; - let loading = true; - try { - if (Meteor.isClient) { - transactionsHandle = Meteor.subscribe( - "transactions.validator", - props.validator, - props.delegator, - props.limit - ); - loading = !transactionsHandle.ready(); - } - - if (Meteor.isServer || !loading) { - transactions = Transactions.find({}, { sort: { height: -1 } }); - - if (Meteor.isServer) { - loading = false; - transactionsExist = !!transactions; - } else { - transactionsExist = !loading && !!transactions; - } - } - - if (!transactionsExist) { - return false; - } - let trades = Transactions.find({ - $or: [ - { - "tx.body.messages.@type": - "/Pylonstech.pylons.pylons.MsgCreateTrade", - }, - ], - }) - .fetch() - .map((p) => p.tx.body.messages[0]); - - if (trades == null || trades.length == 0) { - return false; - } - - let finishedNftIds = new Set( - Nfts.find({}) - .fetch() - .map((p) => p.ID) - ); - - let nftIds = []; - - if (trades.length > 0) { - const bulkNfts = Nfts.rawCollection().initializeUnorderedBulkOp(); - for (let i in trades) { - let trade = trades[i]; - nftIds.push(trade.itemOutputs[0].itemID); - - if ( - finishedNftIds.NO != -1 && - !finishedNftIds.has(trade.itemOutputs[0].itemID) - ) { - try { - let response = HTTP.get( - sanitizeUrl(`${Meteor.settings.remote.api}/pylons/executions/item/${trade.itemOutputs[0].cookbookID}/${trade.itemOutputs[0].itemID}`) - ); - let executions = JSON.parse(response.content); - let item = executions.CompletedExecutions[0]; - if (item == undefined || item == null || item.length == 0) { - continue; - } - let date = new Date(); - item.NO = - date.getFullYear() * 1000 * 360 * 24 * 30 * 12 + - date.getMonth() * 1000 * 360 * 24 * 30 + - date.getDay() * 1000 * 360 * 24 + - date.getHours() * 1000 * 360 + - date.getMinutes() * 1000 * 60 + - date.getSeconds() * 1000 + - date.getMilliseconds(); - item.tradeable = true; - - item.resalelink = sanitizeUrl(`${Meteor.settings.public.baseURL}?action=resell_nft&recipe_id=${item.recipeID}&cookbook_id=${nft.cookbookID}`); - - bulkNfts.find({ ID: item.ID }).upsert().updateOne({ $set: item }); - } catch (e) { - } - } - } - - bulkNfts - .find({ ID: { $nin: nftIds }, tradeable: { $nin: [true, false] } }) - .update({ $set: { tradeable: true } }); - bulkNfts.execute(); - } - return true; - } catch (e) { - console.log(e); - } - }, - "nfts.getNftResults": function () { - this.unblock(); - let nfts = Nfts.find({ tradeable: { $nin: [true, false] } }).fetch(); - if (nfts && nfts.length > 0) { - for (let i in nfts) { - if (nfts[i].ID != -1) { - let url = ""; - try { - let nft = { ID: nfts[i].ID }; - - Nfts.update({ ID: nfts[i].ID }, { $set: nft }); - } catch (e) { - console.log(url); - console.log(e); - } - } - } - } - return true; - }, -}); diff --git a/big-dipper-backend/imports/api/nfts/server/publications.js b/big-dipper-backend/imports/api/nfts/server/publications.js deleted file mode 100644 index ce32acec37..0000000000 --- a/big-dipper-backend/imports/api/nfts/server/publications.js +++ /dev/null @@ -1,12 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Nfts } from '../nfts.js'; -import { check } from 'meteor/check' - -Meteor.publish('nfts.list', function() { - return Nfts.find({}, { sort: { ID: 1 } }); -}); - -Meteor.publish('nfts.one', function(id) { - //check(id, Number); - return Nfts.find({ ID: id }); -}) \ No newline at end of file diff --git a/big-dipper-backend/imports/api/notifications/notifications.js b/big-dipper-backend/imports/api/notifications/notifications.js deleted file mode 100644 index a6c5799e0c..0000000000 --- a/big-dipper-backend/imports/api/notifications/notifications.js +++ /dev/null @@ -1,4 +0,0 @@ -import { Mongo } from "meteor/mongo"; - - -export const Notifications = new Mongo.Collection("notifications"); diff --git a/big-dipper-backend/imports/api/notifications/server/methods.js b/big-dipper-backend/imports/api/notifications/server/methods.js deleted file mode 100644 index a478e81bab..0000000000 --- a/big-dipper-backend/imports/api/notifications/server/methods.js +++ /dev/null @@ -1,184 +0,0 @@ -import { Meteor } from 'meteor/meteor' -import { Notifications } from '../notifications.js' -import { FCMToken } from '../../fcmtoken/fcmtoken.js' -import { sanitizeUrl } from '@braintree/sanitize-url' -import { HTTP } from 'meteor/http' -import { admin } from '../../admin.js' - -import { Res } from '../../res.js' - -import { Utils } from '../../utils.js' - -import { Codec } from '../../codec.js' - -import { API } from '../../api.js' - -API.addRoute( - 'notifications/getAllNotifications/:address/:limit/:offset', - { - authRequired: false - }, - { - get: function () { - if ( - Utils.ValidateAddress(this.urlParams.address) && - this.urlParams.limit && - this.urlParams.offset - ) { - try { - const res = getNotifications( - this.urlParams.address, - this.urlParams.limit, - this.urlParams.offset - ) - - return Res.Success({ - results: res - }) - } catch (e) { - return Res.InValidInput(Codec.BadRequestMessage, null) - } - } - - return Res.InValidInput( - Codec.BadRequestMessage, - 'requires params /:address/:limit/:offset' - ) - } - } -) - -API.addRoute( - 'notifications/markread', - { - authRequired: false - }, - { - post: function () { - const notificationIDs = this.bodyParams.notificationIDs - if (notificationIDs && notificationIDs.length > 0) { - for (let index = 0; index < notificationIDs.length; index++) { - const id = notificationIDs[index] - // mark as Read - const result = markRead(id) - if (result !== 1) { - return Res.InValidInput( - Codec.InvalidIDMessage, - `notificationID ${id} is invalid` - ) - } - } - return Res.Success('notifications marked as Read') - } - return Res.InValidInput( - Codec.InvalidIDMessage, - 'notificationIDs list is missing or corrupt' - ) - } - } -) - -Meteor.methods({ - //send un settled notifications - 'Notifications.sendPushNotifications': function () { - this.unblock() - - const unSettled = Notifications.find({ settled: false }) - - unSettled.forEach((sale) => { - var sellerAddress = sale.from - var saleID = sale._id - var token - //get Firebase token for specified user address - try { - token = FCMToken.findOne({ address: sellerAddress }).token - } catch (e) { - return e - } - - const buyerUserName = getUserNameInfo(sale.to).username.value - const message = { - notification: { - title: 'NFT Sold', - body: `Your NFT ${sale.item_name} has been sold to ${buyerUserName}` - }, - data: { - type: 'NFT Sold' - } - } - quantity = parseInt(sale?.quantity, 10) - amountMinted = parseInt(sale?.amountMinted, 10) - totalSale = sale?.amount * amountMinted - let coins = Meteor.settings.public.coins - let totalProceeds = '0 USD' - coin = coins.find( - (coin) => coin?.denom?.toLowerCase() === sale?.coin?.toLowerCase() - ) - if (coin) { - totalProceeds = totalSale / coin?.fraction + ' ' + coin?.displayName - } - if (quantity > 0 && amountMinted === quantity) { - // All editions for [NFT Title] have been sold. Your total proceeds are [$XYZ USD] - message.notification.body = `All editions for ${sale.item_name} have been sold. Your total proceeds are ${totalProceeds}}` - } else if ( - quantity > 0 && - (amountMinted * 2 === quantity || amountMinted * 2 === quantity + 1) - ) { - message.notification.body = `Half of the editions for ${sale.item_name} have been sold. Your total proceeds are ${totalProceeds}}`; - } else { - message.notification.body = `Your NFT ${sale.item_name} have been sold. Your total proceeds are ${totalProceeds}}`; - } - const options = { - priority: 'high', - timeToLive: 86400 - } - - if (Meteor.settings.params.sendNotifications === 1) { - admin - .messaging() - .sendToDevice(token, message, options) - .then((n) => { - markSent(saleID) - console.log(n) - }) - .catch((e) => { - console.log('Notification not sent to ', token) - console.log(e) - }) - } - }) - } -}) - -function markRead(id) { - return Notifications.update({ _id: id }, { $set: { read: true } }) -} - -function markSent(id) { - Notifications.update({ _id: id }, { $set: { settled: true } }) - return Notifications.update({ _id: id }, { $set: { settled: true } }) -} -function getNotifications(address, limit, offset) { - return Notifications.find( - { from: address }, - { - sort: { created_at: -1 }, - limit: parseInt(limit), - skip: parseInt(offset) - } - ).fetch() -} - -function getUserNameInfo(address) { - let result - const url = sanitizeUrl( - `${Meteor.settings.remote.api}/pylons/account/address/${address}` - ) - try { - const response = HTTP.get(url) - result = JSON.parse(response.content) - } catch (e) { - console.log('error getting userNameInfo: ', e) - } - return result -} diff --git a/big-dipper-backend/imports/api/proposals/proposals.js b/big-dipper-backend/imports/api/proposals/proposals.js deleted file mode 100644 index bb14859ca8..0000000000 --- a/big-dipper-backend/imports/api/proposals/proposals.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -export const Proposals = new Mongo.Collection('proposals'); diff --git a/big-dipper-backend/imports/api/proposals/server/methods.js b/big-dipper-backend/imports/api/proposals/server/methods.js deleted file mode 100644 index 799b41d061..0000000000 --- a/big-dipper-backend/imports/api/proposals/server/methods.js +++ /dev/null @@ -1,197 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { HTTP } from 'meteor/http'; -import { Proposals } from '../proposals.js'; -import { Chain } from '../../chain/chain.js'; -import { Validators } from '../../validators/validators.js'; -import { sanitizeUrl } from '@braintree/sanitize-url'; - -Meteor.methods({ - 'proposals.getProposals': function(){ - this.unblock(); - - // get gov tally prarams - let url = sanitizeUrl(API + '/cosmos/gov/v1beta1/params/tallying'); - try{ - let response = HTTP.get(url); - let params = JSON.parse(response.content); - - Chain.update({chainId: Meteor.settings.public.chainId}, {$set:{"gov.tally_params":params.tally_params}}); - - url = sanitizeUrl(API + '/cosmos/gov/v1beta1/proposals'); - response = HTTP.get(url); - let proposals = JSON.parse(response.content).proposals; - // console.log(proposals); - - let finishedProposalIds = new Set(Proposals.find( - {"status":{$in:["PROPOSAL_STATUS_PASSED", "PROPOSAL_STATUS_REJECTED", "PROPOSAL_STATUS_REMOVED"]}} - ).fetch().map((p)=> p.proposalId)); - - let activeProposals = new Set(Proposals.find( - { "status": { $in: ["PROPOSAL_STATUS_VOTING_PERIOD"] } } - ).fetch().map((p) => p.proposalId)); - let proposalIds = []; - if (proposals.length > 0){ - // Proposals.upsert() - const bulkProposals = Proposals.rawCollection().initializeUnorderedBulkOp(); - for (let i in proposals){ - let proposal = proposals[i]; - proposal.proposalId = parseInt(proposal.proposal_id); - proposalIds.push(proposal.proposalId); - if (proposal.proposalId > 0 && !finishedProposalIds.has(proposal.proposalId)) { - try{ - url = sanitizeUrl(API + '/gov/proposals/'+proposal.proposalId+'/proposer'); - let response = HTTP.get(url); - if (response.statusCode == 200){ - let proposer = JSON.parse(response?.content)?.result; - if (proposer.proposal_id && (parseInt(proposer.proposal_id) == proposal.proposalId)){ - proposal.proposer = proposer?.proposer; - } - } - if (activeProposals.has(proposal.proposalId)){ - let validators = [] - let page = 0; - - do { - url = sanitizeUrl(RPC + `/validators?page=${++page}&per_page=100`); - let response = HTTP.get(url); - result = JSON.parse(response.content).result; - validators = [...validators, ...result.validators]; - - } - while (validators.length < parseInt(result.total)) - - let activeVotingPower = 0; - for (v in validators) { - activeVotingPower += parseInt(validators[v].voting_power); - } - proposal.activeVotingPower = activeVotingPower; - } - bulkProposals.find({proposalId: proposal.proposalId}).upsert().updateOne({$set:proposal}); - } - catch (e) { - bulkProposals.find({proposalId:proposal.proposalId}).upsert().updateOne({ $set: proposal}); - console.log(url); - console.log(e.response.content); - } - } - } - bulkProposals.find({proposalId:{$nin:proposalIds}, status:{$nin:["PROPOSAL_STATUS_VOTING_PERIOD", "PROPOSAL_STATUS_PASSED", "PROPOSAL_STATUS_REJECTED", "PROPOSAL_STATUS_REMOVED"]}}) - .update({$set: {"status": "PROPOSAL_STATUS_REMOVED"}}); - bulkProposals.execute(); - } - return true - } - catch (e){ - console.log(url); - console.log(e); - } - }, - 'proposals.getProposalResults': function(){ - this.unblock(); - let proposals = Proposals.find({"status":{$nin:["PROPOSAL_STATUS_PASSED", "PROPOSAL_STATUS_REJECTED", "PROPOSAL_STATUS_REMOVED"]}}).fetch(); - - if (proposals && (proposals.length > 0)){ - for (let i in proposals){ - if (parseInt(proposals[i].proposalId) > 0){ - let url = ""; - try{ - // get proposal deposits - url = API + sanitizeUrl('/cosmos/gov/v1beta1/proposals/'+proposals[i].proposalId+'/deposits?pagination.limit=2000&pagination.count_total=true'); - let response = HTTP.get(url); - let proposal = {proposalId: proposals[i].proposalId}; - if (response.statusCode == 200){ - let deposits = JSON.parse(response.content).deposits; - proposal.deposits = deposits; - } - - url = sanitizeUrl(API + '/cosmos/gov/v1beta1/proposals/'+proposals[i].proposalId+'/votes?pagination.limit=2000&pagination.count_total=true'); - response = HTTP.get(url); - if (response.statusCode == 200){ - let votes = JSON.parse(response.content).votes; - proposal.votes = getVoteDetail(votes); - } - - url = sanitizeUrl(API + '/cosmos/gov/v1beta1/proposals/'+proposals[i].proposalId+'/tally'); - response = HTTP.get(url); - if (response.statusCode == 200){ - let tally = JSON.parse(response.content).tally; - proposal.tally = tally; - } - - proposal.updatedAt = new Date(); - Proposals.update({proposalId: proposals[i].proposalId}, {$set:proposal}); - } - catch(e){ - console.log(url); - console.log(e); - } - } - } - } - return true - } -}) - -const getVoteDetail = (votes) => { - if (!votes) { - return []; - } - - let voters = votes.map((vote) => vote.voter); - let votingPowerMap = {}; - let validatorAddressMap = {}; - Validators.find({delegator_address: {$in: voters}}).forEach((validator) => { - votingPowerMap[validator.delegator_address] = { - moniker: validator.description.moniker, - address: validator.address, - tokens: parseFloat(validator.tokens), - delegatorShares: parseFloat(validator.delegator_shares), - deductedShares: parseFloat(validator.delegator_shares) - } - validatorAddressMap[validator.operator_address] = validator.delegator_address; - }); - voters.forEach((voter) => { - if (!votingPowerMap[voter]) { - // voter is not a validator - let url = sanitizeUrl(`${API}/cosmos/staking/v1beta1/delegations/${voter}`); - let delegations; - let votingPower = 0; - try{ - let response = HTTP.get(url); - if (response.statusCode == 200){ - delegations = JSON.parse(response.content).delegation_responses; - if (delegations && delegations.length > 0) { - delegations.forEach((delegation) => { - let shares = parseFloat(delegation.delegation.shares); - if (validatorAddressMap[delegation.delegation.validator_address]) { - // deduct delegated shareds from validator if a delegator votes - let validator = votingPowerMap[validatorAddressMap[delegation.delegation.validator_address]]; - validator.deductedShares -= shares; - if (parseFloat(validator.delegatorShares) != 0){ // avoiding division by zero - votingPower += (shares / parseFloat(validator.delegatorShares)) * parseFloat(validator.tokens); - } - - } else { - votingPower += shares - } - }); - } - } - } - catch (e){ - console.log(url); - console.log(e); - } - votingPowerMap[voter] = {votingPower: votingPower}; - } - }); - return votes.map((vote) => { - let voter = votingPowerMap[vote.voter]; - let votingPower = voter.votingPower; - if (votingPower == undefined) { - // voter is a validator - votingPower = voter.delegatorShares?((parseFloat(voter.deductedShares) / parseFloat(voter.delegatorShares)) * parseFloat(voter.tokens)):0; - } - return {...vote, votingPower}; - }); -} diff --git a/big-dipper-backend/imports/api/proposals/server/publications.js b/big-dipper-backend/imports/api/proposals/server/publications.js deleted file mode 100644 index 9ba2114bed..0000000000 --- a/big-dipper-backend/imports/api/proposals/server/publications.js +++ /dev/null @@ -1,12 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Proposals } from '../proposals.js'; -import { check } from 'meteor/check' - -Meteor.publish('proposals.list', function () { - return Proposals.find({}, {sort:{proposalId:-1}}); -}); - -Meteor.publish('proposals.one', function (id){ - check(id, Number); - return Proposals.find({proposalId:id}); -}) \ No newline at end of file diff --git a/big-dipper-backend/imports/api/recipes/publications.js b/big-dipper-backend/imports/api/recipes/publications.js deleted file mode 100644 index 7c235e0dec..0000000000 --- a/big-dipper-backend/imports/api/recipes/publications.js +++ /dev/null @@ -1,12 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Recipes } from '../recipes.js'; -import { check } from 'meteor/check' - -Meteor.publish('recipes.list', function() { - return Recipes.find({}, { sort: { ID: 1 } }); -}); - -Meteor.publish('recipes.one', function(id) { - //check(id, Number); - return Recipes.find({ ID: id }); -}) \ No newline at end of file diff --git a/big-dipper-backend/imports/api/recipes/recipes.js b/big-dipper-backend/imports/api/recipes/recipes.js deleted file mode 100644 index c586c26e22..0000000000 --- a/big-dipper-backend/imports/api/recipes/recipes.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -export const Recipes = new Mongo.Collection('recipes'); diff --git a/big-dipper-backend/imports/api/recipes/server/methods.js b/big-dipper-backend/imports/api/recipes/server/methods.js deleted file mode 100644 index 026c1c7ff8..0000000000 --- a/big-dipper-backend/imports/api/recipes/server/methods.js +++ /dev/null @@ -1,133 +0,0 @@ -import { Meteor } from "meteor/meteor"; -import { HTTP } from "meteor/http"; -import { Recipes } from "../recipes.js"; -import { Transactions } from "/imports/api/transactions/transactions.js"; -import { Cookbooks } from "/imports/api/cookbooks/cookbooks.js"; -import { sanitizeUrl } from "@braintree/sanitize-url"; - -Meteor.methods({ - "recipes.getRecipes": function () { - this.unblock(); - - let transactionsHandle, transactions, transactionsExist; - let loading = true; - - try { - if (Meteor.isClient) { - transactionsHandle = Meteor.subscribe( - "transactions.validator", - props.validator, - props.delegator, - props.limit - ); - loading = !transactionsHandle.ready(); - } - - if (Meteor.isServer || !loading) { - transactions = Transactions.find({}, { sort: { height: -1 } }); - - if (Meteor.isServer) { - loading = false; - transactionsExist = !!transactions; - } else { - transactionsExist = !loading && !!transactions; - } - } - - let url = sanitizeUrl(API + "/pylons/recipes/"); - let response = HTTP.get(url); - let recipes = JSON.parse(response.content).recipes; - - if (recipes == null || recipes.length == 0) { - return false; - } - - let finishedRecipeIds = new Set( - Recipes.find({ enabled: { $in: [true, false] } }) - .fetch() - .map((p) => p.ID) - ); - - let recipeIds = []; - if (recipes.length > 0) { - const bulkRecipes = Recipes.rawCollection().initializeUnorderedBulkOp(); - - for (let i in recipes) { - let recipe = recipes[i]; - let deeplink = sanitizeUrl( - Meteor.settings.public.baseURL + - "?recipe_id=" + - recipe.id + - "&cookbook_id=" + - recipe.cookbook_id); - recipe.deeplink = deeplink; - var cookbook_owner = "", - creator = ""; - try { - let cookbooks = Cookbooks.find({ ID: recipe.cookbook_id }).fetch(); - if (cookbooks.length > 0) { - cookbook_owner = recipe.id; - creator = cookbooks[0].creator; - } - } catch (e) { - console.log(e); - } - recipe.cookbook_owner = cookbook_owner; - recipe.creator = creator; - - recipeIds.push(recipe.id); - if (recipe.NO != -1 && !finishedRecipeIds.has(recipe.id)) { - try { - let date = new Date(); - recipe.NO = - date.getFullYear() * 1000 * 360 * 24 * 30 * 12 + - date.getMonth() * 1000 * 360 * 24 * 30 + - date.getDay() * 1000 * 360 * 24 + - date.getHours() * 1000 * 360 + - date.getMinutes() * 1000 * 60 + - date.getSeconds() * 1000 + - date.getMilliseconds(); - recipe.recipeId = recipe.NO; - bulkRecipes - .find({ ID: recipe.id }) - .upsert() - .updateOne({ $set: recipe }); - } catch (e) { - bulkRecipes - .find({ ID: recipe.id }) - .upsert() - .updateOne({ $set: recipe }); - } - } - } - - bulkRecipes - .find({ ID: { $nin: recipeIds }, enabled: { $nin: [true, false] } }) - .update({ $set: { enabled: true } }); - bulkRecipes.execute(); - } - return recipes; - } catch (e) { - console.log(e); - } - }, - "recipes.getRecipeResults": function () { - this.unblock(); - let recipes = Recipes.find({ enabled: { $nin: [true, false] } }).fetch(); - if (recipes && recipes.length > 0) { - for (let i in recipes) { - if (recipes[i].id != -1) { - let url = ""; - try { - let recipe = { ID: recipes[i].id }; - Recipes.update({ ID: recipes[i].id }, { $set: recipe }); - } catch (e) { - console.log(url); - console.log(e); - } - } - } - } - return true; - }, -}); \ No newline at end of file diff --git a/big-dipper-backend/imports/api/recipes/server/publications.js b/big-dipper-backend/imports/api/recipes/server/publications.js deleted file mode 100644 index 68a6ee943b..0000000000 --- a/big-dipper-backend/imports/api/recipes/server/publications.js +++ /dev/null @@ -1,16 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Recipes } from '../recipes.js'; -import { check } from 'meteor/check' - -Meteor.publish('recipes.list', function() { - return Recipes.find({}, { sort: { ID: 1 } }); -}); - -Meteor.publish('recipes.one', function(id) { - //check(id, Number); - return Recipes.find({ ID: id }); -}) - -Meteor.publish('recipes', function() { - return Recipes.find(); -}); \ No newline at end of file diff --git a/big-dipper-backend/imports/api/records/records.js b/big-dipper-backend/imports/api/records/records.js deleted file mode 100644 index f638f2e0ed..0000000000 --- a/big-dipper-backend/imports/api/records/records.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Mongo } from 'meteor/mongo'; -import { Validators } from '../validators/validators'; - -export const ValidatorRecords = new Mongo.Collection('validator_records'); -export const Analytics = new Mongo.Collection('analytics'); -export const MissedBlocksStats = new Mongo.Collection('missed_blocks_stats'); -export const MissedBlocks = new Mongo.Collection('missed_blocks'); -export const VPDistributions = new Mongo.Collection('voting_power_distributions'); -export const AverageData = new Mongo.Collection('average_data'); -export const AverageValidatorData = new Mongo.Collection('average_validator_data'); - -MissedBlocksStats.helpers({ - proposerMoniker(){ - let validator = Validators.findOne({address:this.proposer}); - return (validator.description)?validator.description.moniker:this.proposer; - }, - voterMoniker(){ - let validator = Validators.findOne({address:this.voter}); - return (validator.description)?validator.description.moniker:this.voter; - } -}) diff --git a/big-dipper-backend/imports/api/records/server/methods.js b/big-dipper-backend/imports/api/records/server/methods.js deleted file mode 100644 index b2a9e91d08..0000000000 --- a/big-dipper-backend/imports/api/records/server/methods.js +++ /dev/null @@ -1,368 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Mongo } from 'meteor/mongo'; -import { ValidatorRecords, Analytics, AverageData, AverageValidatorData } from '../records.js'; -import { Validators } from '../../validators/validators.js'; -import { ValidatorSets } from '/imports/api/validator-sets/validator-sets.js'; -import { Status } from '../../status/status.js'; -import { MissedBlocksStats } from '../records.js'; -import { MissedBlocks } from '../records.js'; -import { Blockscon } from '../../blocks/blocks.js'; -import { Chain } from '../../chain/chain.js'; -import _ from 'lodash'; -const BULKUPDATEMAXSIZE = 1000; - -const getBlockStats = (startHeight, latestHeight) => { - let blockStats = {}; - const cond = {$and: [ - { height: { $gt: startHeight } }, - { height: { $lte: latestHeight } } ]}; - const options = {sort:{height: 1}}; - Blockscon.find(cond, options).forEach((block) => { - blockStats[block.height] = { - height: block.height, - proposerAddress: block.proposerAddress, - precommitsCount: block.precommitsCount, - validatorsCount: block.validatorsCount, - validators: block.validators, - time: block.time - } - }); - - Analytics.find(cond, options).forEach((block) => { - if (!blockStats[block.height]) { - blockStats[block.height] = { height: block.height }; - console.log(`block ${block.height} does not have an entry`); - } - _.assign(blockStats[block.height], { - precommits: block.precommits, - averageBlockTime: block.averageBlockTime, - timeDiff: block.timeDiff, - voting_power: block.voting_power - }); - }); - return blockStats; -} - -const getPreviousRecord = (voterAddress, proposerAddress) => { - let previousRecord = MissedBlocks.findOne( - {voter:voterAddress, proposer:proposerAddress, blockHeight: -1}); - let lastUpdatedHeight = Meteor.settings.params.startHeight; - let prevStats = {}; - if (previousRecord) { - prevStats = _.pick(previousRecord, ['missCount', 'totalCount']); - } else { - prevStats = { - missCount: 0, - totalCount: 0 - } - } - return prevStats; -} - -Meteor.methods({ - 'ValidatorRecords.calculateMissedBlocks': function(){ - this.unblock(); - if (!COUNTMISSEDBLOCKS){ - try { - let startTime = Date.now(); - COUNTMISSEDBLOCKS = true; - console.log('calulate missed blocks count'); - this.unblock(); - let validators = Validators.find({}).fetch(); - let latestHeight = Meteor.call('blocks.getCurrentHeight'); - let explorerStatus = Status.findOne({chainId: Meteor.settings.public.chainId}); - let startHeight = (explorerStatus&&explorerStatus.lastProcessedMissedBlockHeight)?explorerStatus.lastProcessedMissedBlockHeight:Meteor.settings.params.startHeight; - latestHeight = Math.min(startHeight + BULKUPDATEMAXSIZE, latestHeight); - const bulkMissedStats = MissedBlocks.rawCollection().initializeOrderedBulkOp(); - - let validatorsMap = {}; - validators.forEach((validator) => validatorsMap[validator.address] = validator); - - // a map of block height to block stats - let blockStats = getBlockStats(startHeight, latestHeight); - - // proposerVoterStats is a proposer-voter map counting numbers of proposed blocks of which voter is an active validator - let proposerVoterStats = {} - - _.forEach(blockStats, (block, blockHeight) => { - let proposerAddress = block.proposerAddress; - let votedValidators = new Set(block.validators); - let validatorSets = ValidatorSets.findOne({block_height:block.height}); - let votedVotingPower = 0; - - validatorSets.validators.forEach((activeValidator) => { - if (votedValidators.has(activeValidator.address)) - votedVotingPower += parseFloat(activeValidator.voting_power) - }) - - validatorSets.validators.forEach((activeValidator) => { - let currentValidator = activeValidator.address - if (!_.has(proposerVoterStats, [proposerAddress, currentValidator])) { - let prevStats = getPreviousRecord(currentValidator, proposerAddress); - _.set(proposerVoterStats, [proposerAddress, currentValidator], prevStats); - } - - _.update(proposerVoterStats, [proposerAddress, currentValidator, 'totalCount'], (n) => n+1); - if (!votedValidators.has(currentValidator)) { - _.update(proposerVoterStats, [proposerAddress, currentValidator, 'missCount'], (n) => n+1); - bulkMissedStats.insert({ - voter: currentValidator, - blockHeight: block.height, - proposer: proposerAddress, - precommitsCount: block.precommitsCount, - validatorsCount: block.validatorsCount, - time: block.time, - precommits: block.precommits, - averageBlockTime: block.averageBlockTime, - timeDiff: block.timeDiff, - votingPower: block.voting_power, - votedVotingPower, - updatedAt: latestHeight, - missCount: _.get(proposerVoterStats, [proposerAddress, currentValidator, 'missCount']), - totalCount: _.get(proposerVoterStats, [proposerAddress, currentValidator, 'totalCount']) - }); - } - }) - }); - - _.forEach(proposerVoterStats, (voters, proposerAddress) => { - _.forEach(voters, (stats, voterAddress) => { - bulkMissedStats.find({ - voter: voterAddress, - proposer: proposerAddress, - blockHeight: -1 - }).upsert().updateOne({$set: { - voter: voterAddress, - proposer: proposerAddress, - blockHeight: -1, - updatedAt: latestHeight, - missCount: _.get(stats, 'missCount'), - totalCount: _.get(stats, 'totalCount') - }}); - }); - }); - - let message = ''; - if (bulkMissedStats.length > 0){ - const client = MissedBlocks._driver.mongo.client; - // TODO: add transaction back after replica set(#146) is set up - // let session = client.startSession(); - // session.startTransaction(); - let bulkPromise = bulkMissedStats.execute(null/*, {session}*/).then( - Meteor.bindEnvironment((result, err) => { - if (err){ - COUNTMISSEDBLOCKS = false; - // Promise.await(session.abortTransaction()); - throw err; - } - if (result){ - // Promise.await(session.commitTransaction()); - message = `(${result.result.nInserted} inserted, ` + - `${result.result.nUpserted} upserted, ` + - `${result.result.nModified} modified)`; - } - })); - - Promise.await(bulkPromise); - } - - COUNTMISSEDBLOCKS = false; - Status.upsert({chainId: Meteor.settings.public.chainId}, {$set:{lastProcessedMissedBlockHeight:latestHeight, lastProcessedMissedBlockTime: new Date()}}); - return `done in ${Date.now() - startTime}ms ${message}`; - } catch (e) { - COUNTMISSEDBLOCKS = false; - throw e; - } - } - else{ - return "updating..."; - } - }, - 'ValidatorRecords.calculateMissedBlocksStats': function(){ - this.unblock(); - // TODO: deprecate this method and MissedBlocksStats collection - // console.log("ValidatorRecords.calculateMissedBlocks: "+COUNTMISSEDBLOCKS); - if (!COUNTMISSEDBLOCKSSTATS){ - COUNTMISSEDBLOCKSSTATS = true; - console.log('calulate missed blocks stats'); - this.unblock(); - let validators = Validators.find({}).fetch(); - let latestHeight = Meteor.call('blocks.getCurrentHeight'); - let explorerStatus = Status.findOne({chainId: Meteor.settings.public.chainId}); - let startHeight = (explorerStatus&&explorerStatus.lastMissedBlockHeight)?explorerStatus.lastMissedBlockHeight:Meteor.settings.params.startHeight; - // console.log(latestHeight); - // console.log(startHeight); - const bulkMissedStats = MissedBlocksStats.rawCollection().initializeUnorderedBulkOp(); - for (i in validators){ - // if ((validators[i].address == "B8552EAC0D123A6BF609123047A5181D45EE90B5") || (validators[i].address == "69D99B2C66043ACBEAA8447525C356AFC6408E0C") || (validators[i].address == "35AD7A2CD2FC71711A675830EC1158082273D457")){ - let voterAddress = validators[i].address; - let missedRecords = ValidatorRecords.find({ - address:voterAddress, - exists:false, - $and: [ { height: { $gt: startHeight } }, { height: { $lte: latestHeight } } ] - }).fetch(); - - let counts = {}; - - // console.log("missedRecords to process: "+missedRecords.length); - for (b in missedRecords){ - let block = Blockscon.findOne({height:missedRecords[b].height}); - let existingRecord = MissedBlocksStats.findOne({voter:voterAddress, proposer:block.proposerAddress}); - - if (typeof counts[block.proposerAddress] === 'undefined'){ - if (existingRecord){ - counts[block.proposerAddress] = existingRecord.count+1; - } - else{ - counts[block.proposerAddress] = 1; - } - } - else{ - counts[block.proposerAddress]++; - } - } - - for (address in counts){ - let data = { - voter: voterAddress, - proposer:address, - count: counts[address] - } - - bulkMissedStats.find({voter:voterAddress, proposer:address}).upsert().updateOne({$set:data}); - } - // } - - } - - if (bulkMissedStats.length > 0){ - bulkMissedStats.execute(Meteor.bindEnvironment((err, result) => { - if (err){ - COUNTMISSEDBLOCKSSTATS = false; - console.log(err); - } - if (result){ - Status.upsert({chainId: Meteor.settings.public.chainId}, {$set:{lastMissedBlockHeight:latestHeight, lastMissedBlockTime: new Date()}}); - COUNTMISSEDBLOCKSSTATS = false; - console.log("done"); - } - })); - } - else{ - COUNTMISSEDBLOCKSSTATS = false; - } - - return true; - } - else{ - return "updating..."; - } - }, - 'Analytics.aggregateBlockTimeAndVotingPower': function(time){ - this.unblock(); - let now = new Date(); - - if (time == 'm'){ - let averageBlockTime = 0; - let averageVotingPower = 0; - - let analytics = Analytics.find({ "time": { $gt: new Date(Date.now() - 60 * 1000) } }).fetch(); - if (analytics.length > 0){ - for (i in analytics){ - averageBlockTime += analytics[i].timeDiff; - averageVotingPower += analytics[i].voting_power; - } - averageBlockTime = averageBlockTime / analytics.length; - averageVotingPower = averageVotingPower / analytics.length; - - Chain.update({chainId:Meteor.settings.public.chainId},{$set:{lastMinuteVotingPower:averageVotingPower, lastMinuteBlockTime:averageBlockTime}}); - AverageData.insert({ - averageBlockTime: averageBlockTime, - averageVotingPower: averageVotingPower, - type: time, - createdAt: now - }) - } - } - if (time == 'h'){ - let averageBlockTime = 0; - let averageVotingPower = 0; - let analytics = Analytics.find({ "time": { $gt: new Date(Date.now() - 60*60 * 1000) } }).fetch(); - if (analytics.length > 0){ - for (i in analytics){ - averageBlockTime += analytics[i].timeDiff; - averageVotingPower += analytics[i].voting_power; - } - averageBlockTime = averageBlockTime / analytics.length; - averageVotingPower = averageVotingPower / analytics.length; - - Chain.update({chainId:Meteor.settings.public.chainId},{$set:{lastHourVotingPower:averageVotingPower, lastHourBlockTime:averageBlockTime}}); - AverageData.insert({ - averageBlockTime: averageBlockTime, - averageVotingPower: averageVotingPower, - type: time, - createdAt: now - }) - } - } - - if (time == 'd'){ - let averageBlockTime = 0; - let averageVotingPower = 0; - let analytics = Analytics.find({ "time": { $gt: new Date(Date.now() - 24*60*60 * 1000) } }).fetch(); - if (analytics.length > 0){ - for (i in analytics){ - averageBlockTime += analytics[i].timeDiff; - averageVotingPower += analytics[i].voting_power; - } - averageBlockTime = averageBlockTime / analytics.length; - averageVotingPower = averageVotingPower / analytics.length; - - Chain.update({chainId:Meteor.settings.public.chainId},{$set:{lastDayVotingPower:averageVotingPower, lastDayBlockTime:averageBlockTime}}); - AverageData.insert({ - averageBlockTime: averageBlockTime, - averageVotingPower: averageVotingPower, - type: time, - createdAt: now - }) - } - } - - // return analytics.length; - }, - 'Analytics.aggregateValidatorDailyBlockTime': function(){ - this.unblock(); - let validators = Validators.find({}).fetch(); - let now = new Date(); - for (i in validators){ - let averageBlockTime = 0; - - let blocks = Blockscon.find({proposerAddress:validators[i].address, "time": { $gt: new Date(Date.now() - 24*60*60 * 1000) }}, {fields:{height:1}}).fetch(); - - if (blocks.length > 0){ - let blockHeights = []; - for (b in blocks){ - blockHeights.push(blocks[b].height); - } - - let analytics = Analytics.find({height: {$in:blockHeights}}, {fields:{height:1,timeDiff:1}}).fetch(); - - - for (a in analytics){ - averageBlockTime += analytics[a].timeDiff; - } - - averageBlockTime = averageBlockTime / analytics.length; - } - - AverageValidatorData.insert({ - proposerAddress: validators[i].address, - averageBlockTime: averageBlockTime, - type: 'ValidatorDailyAverageBlockTime', - createdAt: now - }) - } - - return true; - } -}) diff --git a/big-dipper-backend/imports/api/records/server/publications.js b/big-dipper-backend/imports/api/records/server/publications.js deleted file mode 100644 index 27200580be..0000000000 --- a/big-dipper-backend/imports/api/records/server/publications.js +++ /dev/null @@ -1,69 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { ValidatorRecords, Analytics, MissedBlocks, MissedBlocksStats, VPDistributions } from '../records.js'; -import { Validators } from '../../validators/validators.js'; - -Meteor.publish('validator_records.all', function () { - return ValidatorRecords.find(); -}); - -Meteor.publish('validator_records.uptime', function(address, num){ - return ValidatorRecords.find({address:address},{limit:num, sort:{height:-1}}); -}); - -Meteor.publish('analytics.history', function(){ - return Analytics.find({},{sort:{height:-1},limit:50}); -}); - -Meteor.publish('vpDistribution.latest', function(){ - return VPDistributions.find({},{sort:{height:-1}, limit:1}); -}); - -publishComposite('missedblocks.validator', function(address, type){ - let conditions = {}; - if (type == 'voter'){ - conditions = { - voter: address - } - } - else{ - conditions = { - proposer: address - } - } - return { - find(){ - return MissedBlocksStats.find(conditions) - }, - children: [ - { - find(stats){ - return Validators.find( - {}, - {fields:{address:1, description:1, profile_url:1}} - ) - } - } - ] - } -}); - -publishComposite('missedrecords.validator', function(address, type){ - return { - find(){ - return MissedBlocks.find( - {[type]: address}, - {sort: {updatedAt: -1}} - ) - }, - children: [ - { - find(){ - return Validators.find( - {}, - {fields:{address:1, description:1, operatorAddress:1}} - ) - } - } - ] - } -}); diff --git a/big-dipper-backend/imports/api/res.js b/big-dipper-backend/imports/api/res.js deleted file mode 100644 index 98e0836667..0000000000 --- a/big-dipper-backend/imports/api/res.js +++ /dev/null @@ -1,36 +0,0 @@ -import { - Codec -} from './codec.js' - - - -function Success(data) { - return { - Code: Codec.StatusOk, - Message: Codec.SuccessMessage, - Data: data - } -} - - -function InValidInput(message, data) { - return { - Code: Codec.StatusInvalidInput, - Message: message, - Data: data - } -} - -function Failed(message, data) { - return { - Code: Codec.StatusInvalidInput, - Message: message, - Data: data - } -} - -export const Res = { - Success, - InValidInput, - Failed -} \ No newline at end of file diff --git a/big-dipper-backend/imports/api/status/server/publications.js b/big-dipper-backend/imports/api/status/server/publications.js deleted file mode 100644 index 70bc655989..0000000000 --- a/big-dipper-backend/imports/api/status/server/publications.js +++ /dev/null @@ -1,8 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Status } from '../status.js'; -import { check } from 'meteor/check' - -Meteor.publish('status.status', function () { - return Status.find({chainId:Meteor.settings.public.chainId}); -}); - diff --git a/big-dipper-backend/imports/api/status/status.js b/big-dipper-backend/imports/api/status/status.js deleted file mode 100644 index d06166bebf..0000000000 --- a/big-dipper-backend/imports/api/status/status.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -export const Status = new Mongo.Collection('status'); \ No newline at end of file diff --git a/big-dipper-backend/imports/api/transactions/server/methods.js b/big-dipper-backend/imports/api/transactions/server/methods.js deleted file mode 100644 index d7546fefff..0000000000 --- a/big-dipper-backend/imports/api/transactions/server/methods.js +++ /dev/null @@ -1,113 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { HTTP } from 'meteor/http'; -import { Transactions } from '../../transactions/transactions.js'; -import { Validators } from '../../validators/validators.js'; -import { sanitizeUrl } from '@braintree/sanitize-url'; - -const AddressLength = 40; - -Meteor.methods({ - 'Transactions.updateTransactions': async function(){ - this.unblock(); - if (TXSYNCING) - return "Syncing transactions..."; - - const transactions = Transactions.find({processed:false},{limit: 500}).fetch(); - try{ - TXSYNCING = true; - const bulkTransactions = Transactions.rawCollection().initializeUnorderedBulkOp(); - for (let i in transactions){ - let url = ""; - try { - url = sanitizeUrl(API+ '/cosmos/tx/v1beta1/txs/'+transactions[i].txhash); - let response = HTTP.get(url); - let tx = JSON.parse(response.content); - - tx.height = parseInt(tx.tx_response.height); - tx.processed = true; - - bulkTransactions.find({txhash:transactions[i].txhash}).updateOne({$set:tx}); - - } - catch(e) { - // console.log(url); - // console.log("tx not found: %o") - console.log("Getting transaction %o: %o", transactions[i].txhash, e); - bulkTransactions.find({txhash:transactions[i].txhash}).updateOne({$set:{processed:true, missing:true}}); - } - } - if (bulkTransactions.length > 0){ - console.log("aaa: %o",bulkTransactions.length) - bulkTransactions.execute((err, result) => { - if (err){ - console.log(err); - } - if (result){ - console.log(result); - } - }); - } - } - catch (e) { - TXSYNCING = false; - return e - } - TXSYNCING = false; - return transactions.length - }, - 'Transactions.findDelegation': function(address, height){ - this.unblock(); - // following cosmos-sdk/x/slashing/spec/06_events.md and cosmos-sdk/x/staking/spec/06_events.md - return Transactions.find({ - $or: [{$and: [ - {"tx_response.logs.events.type": "delegate"}, - {"tx_response.logs.events.attributes.key": "validator"}, - {"tx_response.logs.events.attributes.value": address} - ]}, {$and:[ - {"tx_response.logs.events.attributes.key": "action"}, - {"tx_response.logs.events.attributes.value": "unjail"}, - {"tx_response.logs.events.attributes.key": "sender"}, - {"tx_response.logs.events.attributes.value": address} - ]}, {$and:[ - {"tx_response.logs.events.type": "create_validator"}, - {"tx_response.logs.events.attributes.key": "validator"}, - {"tx_response.logs.events.attributes.value": address} - ]}, {$and:[ - {"tx_response.logs.events.type": "unbond"}, - {"tx_response.logs.events.attributes.key": "validator"}, - {"tx_response.logs.events.attributes.value": address} - ]}, {$and:[ - {"tx_response.logs.events.type": "redelegate"}, - {"tx_response.logs.events.attributes.key": "destination_validator"}, - {"tx_response.logs.events.attributes.value": address} - ]}], - "tx_response.code": 0, - height:{$lt:height}}, - {sort:{height:-1}, - limit: 1} - ).fetch(); - }, - 'Transactions.findUser': function(address, fields=null){ - this.unblock(); - // address is either delegator address or validator operator address - let validator; - if (!fields) - fields = {address:1, description:1, operator_address:1, delegator_address:1}; - if (address.includes(Meteor.settings.public.bech32PrefixValAddr)){ - // validator operator address - validator = Validators.findOne({operator_address:address}, {fields}); - } - else if (address.includes(Meteor.settings.public.bech32PrefixAccAddr)){ - // delegator address - validator = Validators.findOne({delegator_address:address}, {fields}); - } - else if (address.length === AddressLength) { - validator = Validators.findOne({address:address}, {fields}); - } - if (validator){ - return validator; - } - return false; - - } -}); diff --git a/big-dipper-backend/imports/api/transactions/server/publications.js b/big-dipper-backend/imports/api/transactions/server/publications.js deleted file mode 100644 index e13a20da08..0000000000 --- a/big-dipper-backend/imports/api/transactions/server/publications.js +++ /dev/null @@ -1,130 +0,0 @@ -import { Meteor } from "meteor/meteor"; -import { Transactions } from "../transactions.js"; -import { Blockscon } from "../../blocks/blocks.js"; - -publishComposite("transactions.list", function (limit = 30) { - return { - find() { - return Transactions.find( - { height: { $exists: true }, processed: { $ne: false } }, - { sort: { height: -1 }, limit: limit } - ); - }, - children: [ - { - find(tx) { - if (tx.height) - return Blockscon.find( - { height: tx.height }, - { fields: { time: 1, height: 1 } } - ); - }, - }, - ], - }; -}); - -publishComposite("transactions.validlist", function (limit = 30) { - console.log("hello welcome to transactions"); - var needTransactions = [ - { "tx.body.messages.@type": "/pylons.pylons.MsgCreateAccount" }, - { "tx.body.messages.@type": "/pylons.pylons.MsgCreateRecipe" }, - { "tx.body.messages.@type": "/pylons.pylons.MsgCreateCookbook" }, - { "tx.body.messages.@type": "/pylons.pylons.MsgUpdateCookbook" }, - { "tx.body.messages.@type": "/pylons.pylons.MsgCreateTrade" }, - { "tx.body.messages.@type": "/pylons.pylons.MsgExecuteRecipe" }, - { "tx.body.messages.@type": "/pylons.pylons.MsgFulfillTrade" }, - { "tx.body.messages.@type": "/pylons.pylons.MsgCancelTrade" }, - ]; - return { - find() { - return Transactions.find( - { $or: needTransactions }, - { height: { $exists: true }, processed: { $ne: false } }, - { sort: { height: -1 }, limit: limit } - ); - }, - children: [ - { - find(tx) { - if (tx.height) - return Blockscon.find( - { height: tx.height }, - { fields: { time: 1, height: 1 } } - ); - }, - }, - ], - }; -}); - -publishComposite( - "transactions.validator", - function (validatorAddress, delegatorAddress, limit = 100) { - let query = {}; - if (validatorAddress && delegatorAddress) { - query = { - $or: [ - { "tx_response.logs.events.attributes.value": validatorAddress }, - { "tx_response.logs.events.attributes.value": delegatorAddress }, - ], - }; - } - - if (!validatorAddress && delegatorAddress) { - query = { "tx_response.logs.events.attributes.value": delegatorAddress }; - } - - return { - find() { - return Transactions.find(query, { sort: { height: -1 }, limit: limit }); - }, - children: [ - { - find(tx) { - return Blockscon.find( - { height: tx.height }, - { fields: { time: 1, height: 1 } } - ); - }, - }, - ], - }; - } -); - -publishComposite("transactions.findOne", function (hash) { - return { - find() { - return Transactions.find({ txhash: hash }); - }, - children: [ - { - find(tx) { - return Blockscon.find( - { height: tx.height }, - { fields: { time: 1, height: 1 } } - ); - }, - }, - ], - }; -}); - -publishComposite("transactions.height", function (height) { - return { - find() { - return Transactions.find({ height: height }); - }, - children: [ - { - find(tx) { - return Blockscon.find( - { height: tx.height }, - { fields: { time: 1, height: 1 } } - ); - }, - }, - ], - }; -}); diff --git a/big-dipper-backend/imports/api/transactions/transactions.js b/big-dipper-backend/imports/api/transactions/transactions.js deleted file mode 100644 index f5ff3709cf..0000000000 --- a/big-dipper-backend/imports/api/transactions/transactions.js +++ /dev/null @@ -1,10 +0,0 @@ -import { Mongo } from 'meteor/mongo' -import { Blockscon } from '../blocks/blocks.js' - -export const Transactions = new Mongo.Collection('transactions') - -Transactions.helpers({ - block() { - return Blockscon.findOne({ height: this.height }) - } -}) diff --git a/big-dipper-backend/imports/api/utils.js b/big-dipper-backend/imports/api/utils.js deleted file mode 100644 index cae4888810..0000000000 --- a/big-dipper-backend/imports/api/utils.js +++ /dev/null @@ -1,29 +0,0 @@ -import { - isString -} from 'lodash' - - -function ValidateAddress(parameter) { - if (!isString(parameter)) { - return false - } - if (parameter.length === 0) { - return false - } - return true -} - -function ValidateToken(parameter) { - if (!isString(parameter)) { - return false - } - if (parameter.length === 0) { - return false - } - return true -} - -export const Utils = { - ValidateAddress, - ValidateToken -} \ No newline at end of file diff --git a/big-dipper-backend/imports/api/validator-sets/server/publications.js b/big-dipper-backend/imports/api/validator-sets/server/publications.js deleted file mode 100644 index 4259f013a8..0000000000 --- a/big-dipper-backend/imports/api/validator-sets/server/publications.js +++ /dev/null @@ -1,6 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { ValidatorSets } from '../validator-set.js'; - -Meteor.publish('validatorSets.all', function () { - return ValidatorSets.find(); -}); diff --git a/big-dipper-backend/imports/api/validator-sets/validator-sets.js b/big-dipper-backend/imports/api/validator-sets/validator-sets.js deleted file mode 100644 index 08c5158967..0000000000 --- a/big-dipper-backend/imports/api/validator-sets/validator-sets.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -export const ValidatorSets = new Mongo.Collection('validator_sets'); diff --git a/big-dipper-backend/imports/api/validators/server/methods.js b/big-dipper-backend/imports/api/validators/server/methods.js deleted file mode 100644 index 704eb1036c..0000000000 --- a/big-dipper-backend/imports/api/validators/server/methods.js +++ /dev/null @@ -1,104 +0,0 @@ -/* eslint-disable camelcase */ - -import { Meteor } from 'meteor/meteor'; -import { Transactions } from '../../transactions/transactions.js'; -import { Blockscon } from '../../blocks/blocks.js'; -import { Validators } from '../../validators/validators.js'; -import { Chain } from '../../chain/chain.js'; -import { getValidatorProfileUrl } from '../../blocks/server/methods.js'; -import { sanitizeUrl } from '@braintree/sanitize-url'; - - -Meteor.methods({ - 'Validators.findCreateValidatorTime': function(address){ - this.unblock(); - // look up the create validator time to consider if the validator has never updated the commission - let tx = Transactions.findOne({$and:[ - {"tx.body.messages.delegator_address":address}, - {"tx.body.messages.@type":"/cosmos.staking.v1beta1.MsgCreateValidator"}, - {"tx_response.code":0} - ]}); - - if (tx){ - let block = Blockscon.findOne({height:tx.height}); - if (block){ - return block.time; - } - } - else{ - // no such create validator tx - return false; - } - }, - 'Validators.getAllDelegations'(address){ - this.unblock(); - let url = sanitizeUrl(`${API}/cosmos/staking/v1beta1/validators/${address}/delegations?pagination.limit=10&pagination.count_total=true`); - - try { - let delegations = HTTP.get(url); - if (delegations.statusCode == 200) { - let delegationsCount = JSON.parse(delegations.content)?.pagination?.total; - return delegationsCount; - }; - } - catch (e) { - console.log(url); - console.log("Getting error: %o when getting delegations count from %o", e, url); - } - }, - - 'Validators.fetchKeybase'(address) { - this.unblock(); - // fetching keybase every base on keybaseFetchingInterval settings - // default to every 5 hours - - let url = sanitizeUrl(RPC + '/status'); - let chainId; - try { - let response = HTTP.get(url); - let status = JSON.parse(response?.content); - chainId = (status?.result?.node_info?.network); - } - catch (e) { - console.log("Error getting chainId for keybase fetching") - } - let chainStatus = Chain.findOne({ chainId}); - const bulkValidators = Validators.rawCollection().initializeUnorderedBulkOp(); - - let lastKeybaseFetchTime = Date.parse(chainStatus?.lastKeybaseFetchTime) ?? 0 - console.log("Last fetch time: %o", lastKeybaseFetchTime) - - console.log('Fetching keybase...') - // eslint-disable-next-line no-loop-func - Validators.find({}).forEach(async (validator) => { - try { - if (validator?.description && validator?.description?.identity) { - let profileUrl = getValidatorProfileUrl(validator?.description?.identity) - if (profileUrl) { - bulkValidators.find({ address: validator?.address }).upsert().updateOne({ $set: { 'profile_url': profileUrl } }); - if (bulkValidators.length > 0) { - bulkValidators.execute((err, result) => { - if (err) { - console.log(`Error when updating validator profile_url ${err}`); - } - if (result) { - console.log('Validator profile_url has been updated!'); - } - }); - } - } - } - } catch (e) { - console.log("Error fetching Keybase for %o: %o", validator?.address, e) - } - }) - try{ - Chain.update({ chainId }, { $set: { lastKeybaseFetchTime: new Date().toUTCString() } }); - } - catch(e){ - console.log("Error when updating lastKeybaseFetchTime") - } - - } - -}); \ No newline at end of file diff --git a/big-dipper-backend/imports/api/validators/server/publications.js b/big-dipper-backend/imports/api/validators/server/publications.js deleted file mode 100644 index 8041d223eb..0000000000 --- a/big-dipper-backend/imports/api/validators/server/publications.js +++ /dev/null @@ -1,72 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { Validators } from '../validators.js'; -import { ValidatorRecords } from '../../records/records.js'; -import { VotingPowerHistory } from '../../voting-power/history.js'; - -Meteor.publish('validators.all', function (sort = "description.moniker", direction = -1, fields={}) { - return Validators.find({}, {sort: {[sort]: direction}, fields: fields}); -}); - -publishComposite('validators.firstSeen',{ - find() { - return Validators.find({}); - }, - children: [ - { - find(val) { - return ValidatorRecords.find( - { address: val.address }, - { sort: {height: 1}, limit: 1} - ); - } - } - ] -}); - -Meteor.publish('validators.voting_power', function(){ - return Validators.find({ - status: 'BOND_STATUS_BONDED', - jailed:false - },{ - sort:{ - voting_power:-1 - }, - fields:{ - address: 1, - description:1, - voting_power:1, - profile_url:1 - } - } - ); -}); - -publishComposite('validator.details', function(address){ - let options = {address:address}; - if (address.indexOf(Meteor.settings.public.bech32PrefixValAddr) != -1){ - options = {operator_address:address} - } - return { - find(){ - return Validators.find(options) - }, - children: [ - { - find(val){ - return VotingPowerHistory.find( - {address:val.address}, - {sort:{height:-1}, limit:50} - ) - } - }, - { - find(val) { - return ValidatorRecords.find( - { address: val.address }, - { sort: {height: -1}, limit: Meteor.settings.public.uptimeWindow} - ); - } - } - ] - } -}); diff --git a/big-dipper-backend/imports/api/validators/validators.js b/big-dipper-backend/imports/api/validators/validators.js deleted file mode 100644 index fc8dde0e4c..0000000000 --- a/big-dipper-backend/imports/api/validators/validators.js +++ /dev/null @@ -1,28 +0,0 @@ -import { Mongo } from 'meteor/mongo'; -import { ValidatorRecords } from '../records/records.js'; -import { VotingPowerHistory } from '../voting-power/history.js'; - -export const Validators = new Mongo.Collection('validators'); - -Validators.helpers({ - firstSeen(){ - return ValidatorRecords.findOne({address:this.address}); - }, - history(){ - return VotingPowerHistory.find({address:this.address}, {sort:{height:-1}, limit:50}).fetch(); - } -}) -// Validators.helpers({ -// uptime(){ -// // console.log(this.address); -// let lastHundred = ValidatorRecords.find({address:this.address}, {sort:{height:-1}, limit:100}).fetch(); -// console.log(lastHundred); -// let uptime = 0; -// for (i in lastHundred){ -// if (lastHundred[i].exists){ -// uptime+=1; -// } -// } -// return uptime; -// } -// }) \ No newline at end of file diff --git a/big-dipper-backend/imports/api/voting-power/history.js b/big-dipper-backend/imports/api/voting-power/history.js deleted file mode 100644 index d101a59758..0000000000 --- a/big-dipper-backend/imports/api/voting-power/history.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Mongo } from 'meteor/mongo'; - -export const VotingPowerHistory = new Mongo.Collection('voting_power_history'); diff --git a/big-dipper-backend/imports/api/voting-power/server/publications.js b/big-dipper-backend/imports/api/voting-power/server/publications.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/big-dipper-backend/imports/startup/both/index.js b/big-dipper-backend/imports/startup/both/index.js deleted file mode 100644 index 7297b2916e..0000000000 --- a/big-dipper-backend/imports/startup/both/index.js +++ /dev/null @@ -1,2 +0,0 @@ -// Import modules used by both client and server through a single index entry point -// e.g. useraccounts configuration file. diff --git a/big-dipper-backend/imports/startup/client/index.js b/big-dipper-backend/imports/startup/client/index.js deleted file mode 100644 index ca812ee5ba..0000000000 --- a/big-dipper-backend/imports/startup/client/index.js +++ /dev/null @@ -1,3 +0,0 @@ -// Import client startup through a single index entry point - -// import './routes.js'; diff --git a/big-dipper-backend/imports/startup/client/routes.js b/big-dipper-backend/imports/startup/client/routes.js deleted file mode 100644 index 8c8c4895fb..0000000000 --- a/big-dipper-backend/imports/startup/client/routes.js +++ /dev/null @@ -1,5 +0,0 @@ -// Import needed templates -// import '../../ui/layouts/body/body.js'; -// import '../../ui/pages/home/home.js'; -// import '../../ui/pages/not-found/not-found.js'; - diff --git a/big-dipper-backend/imports/startup/server/create-indexes.js b/big-dipper-backend/imports/startup/server/create-indexes.js deleted file mode 100644 index 9dbd5cad68..0000000000 --- a/big-dipper-backend/imports/startup/server/create-indexes.js +++ /dev/null @@ -1,70 +0,0 @@ -import { Blockscon } from '../../api/blocks/blocks.js'; -import { Proposals } from '../../api/proposals/proposals.js'; -import { Recipes } from '../../api/recipes/recipes.js'; -import { Nfts } from '../../api/nfts/nfts.js'; -import { Cookbooks } from '../../api/cookbooks/cookbooks.js'; -import { ValidatorRecords, Analytics, MissedBlocksStats, MissedBlocks, AverageData, AverageValidatorData } from '../../api/records/records.js'; -// import { Status } from '../../api/status/status.js'; -import { Transactions } from '../../api/transactions/transactions.js'; -import { ValidatorSets } from '../../api/validator-sets/validator-sets.js'; -import { Validators } from '../../api/validators/validators.js'; -import { VotingPowerHistory } from '../../api/voting-power/history.js'; -import { Evidences } from '../../api/evidences/evidences.js'; -import { CoinStats } from '../../api/coin-stats/coin-stats.js'; -import { ChainStates } from '../../api/chain/chain.js'; - -ChainStates.rawCollection().createIndex({ height: -1 }, { unique: true }); - -Blockscon.rawCollection().createIndex({ height: -1 }, { unique: true }); -Blockscon.rawCollection().createIndex({ proposerAddress: 1 }); - -Evidences.rawCollection().createIndex({ height: -1 }); - -Proposals.rawCollection().createIndex({ proposalId: 1 }, { unique: true }); - -Recipes.rawCollection().createIndex({ ID: "1", NO: -1 }, { unique: true }); - -Nfts.rawCollection().createIndex({ ID: "1", NO: -1 }, { unique: true }); - -Cookbooks.rawCollection().createIndex({ ID: "1", NO: -1 }, { unique: true }); - -ValidatorRecords.rawCollection().createIndex({ address: 1, height: -1 }, { unique: 1 }); -ValidatorRecords.rawCollection().createIndex({ address: 1, exists: 1, height: -1 }); - -Analytics.rawCollection().createIndex({ height: -1 }, { unique: true }) - -MissedBlocks.rawCollection().createIndex({ proposer: 1, voter: 1, updatedAt: -1 }); -MissedBlocks.rawCollection().createIndex({ proposer: 1, blockHeight: -1 }); -MissedBlocks.rawCollection().createIndex({ voter: 1, blockHeight: -1 }); -MissedBlocks.rawCollection().createIndex({ voter: 1, proposer: 1, blockHeight: -1 }, { unique: true }); - -MissedBlocksStats.rawCollection().createIndex({ proposer: 1 }); -MissedBlocksStats.rawCollection().createIndex({ voter: 1 }); -MissedBlocksStats.rawCollection().createIndex({ proposer: 1, voter: 1 }, { unique: true }); - -AverageData.rawCollection().createIndex({ type: 1, createdAt: -1 }, { unique: true }); -AverageValidatorData.rawCollection().createIndex({ proposerAddress: 1, createdAt: -1 }, { unique: true }); -// Status.rawCollection.createIndex({}) - -Transactions.rawCollection().createIndex({ txhash: 1 }, { unique: true }); -Transactions.rawCollection().createIndex({ height: -1 }); -Transactions.rawCollection().createIndex({ processed: 1 }); -// Transactions.rawCollection().createIndex({action:1}); -Transactions.rawCollection().createIndex({ "tx_response.logs.events.attributes.key": 1 }); -Transactions.rawCollection().createIndex({ "tx_response.logs.events.attributes.value": 1 }); -Transactions.rawCollection().createIndex({ - "tx.body.messages.delegator_address": 1, - "tx.body.messages.@type": 1, - "tx_response.code": 1 -}, { partialFilterExpression: { "tx_response.code": { $exists: true } } }) - -ValidatorSets.rawCollection().createIndex({ block_height: -1 }); - -Validators.rawCollection().createIndex({ address: 1 }, { unique: true, partialFilterExpression: { address: { $exists: true } } }); -// Validators.rawCollection().createIndex({consensusPubkey:1},{unique:true}); -Validators.rawCollection().createIndex({ "consensusPubkey.value": 1 }, { unique: true, partialFilterExpression: { "consensusPubkey.value": { $exists: true } } }); - -VotingPowerHistory.rawCollection().createIndex({ address: 1, height: -1 }); -VotingPowerHistory.rawCollection().createIndex({ type: 1 }); - -CoinStats.rawCollection().createIndex({ last_updated_at: -1 }, { unique: true }); \ No newline at end of file diff --git a/big-dipper-backend/imports/startup/server/genesis.js b/big-dipper-backend/imports/startup/server/genesis.js deleted file mode 100644 index 849d1d5cca..0000000000 --- a/big-dipper-backend/imports/startup/server/genesis.js +++ /dev/null @@ -1,7 +0,0 @@ -import { Validators } from '../../api/validators/validators.js'; -let validatorsCount = Validators.find({}).count(); - -if (validatorsCount == 0){ - console.log("no validators"); - -} \ No newline at end of file diff --git a/big-dipper-backend/imports/startup/server/index.js b/big-dipper-backend/imports/startup/server/index.js deleted file mode 100644 index 7d93b87626..0000000000 --- a/big-dipper-backend/imports/startup/server/index.js +++ /dev/null @@ -1,371 +0,0 @@ -// Import server startup through a single index entry point - -import './util.js'; -import './register-api.js'; -import './create-indexes.js'; -import queryString from 'querystring'; -import { HTTP } from 'meteor/http'; -import { onPageLoad } from 'meteor/server-render'; -import { Meteor } from 'meteor/meteor'; -import { sanitizeUrl } from '@braintree/sanitize-url'; -import { Transactions } from '/imports/api/transactions/transactions.js'; - -// import { ServerStyleSheet } from "styled-components" -import { Helmet } from 'react-helmet'; -// import App from '../../ui/App.jsx'; - -const IMAGE_WIDTH = 1200; -const IMAGE_HEIGHT = 800; - -var siteName = 'Big Dipper | Built on Pylons'; -var description = "Blockchain Development Tools For Digital Items & NFTs"; -var price = "No Price" -var picWidth = IMAGE_WIDTH; -var picHeight = IMAGE_HEIGHT; -const defaultImage = '/img/buy_icon.png'; -const defaultMetaTags = ` - - - - -`; - -const BROWSER_BOT = 0; -const SLACK_BOT = 1; -const FACEBOOK_BOT = 2; -const TWITTER_BOT = 3; -const INSTAGRAM_BOT = 4; -const DISCORD_BOT = 5; - -var botType = BROWSER_BOT; - -async function getRecipeData(recipe_id){ - selectedRecipe = await Recipes.findOne({ ID: recipe_id }); - return selectedRecipe -} - -Meteor.startup(() => { - - onPageLoad(sink => { - var url = sink.request.url.search; - if(url == null){ - sink.appendToHead(defaultMetaTags); - return; - } - const querys = new URLSearchParams(url) - var img = ''; - var selectedRecipe = null; - var recipes = null; - - - if (querys.get('recipe_id') !== null && querys.get('cookbook_id') !== null && querys.get('address') !== null ) { - - const recipe_id = sanitizeUrl(querys.get('recipe_id')); - const cookbook_id = sanitizeUrl(querys.get('cookbook_id')); - let recipesUrl = sanitizeUrl(`${Meteor.settings.remote.api}/pylons/recipe/${cookbook_id}/${recipe_id}`); - - try { - - let response = HTTP.get(recipesUrl); - selectedRecipe = JSON.parse(response.content).recipe; - - - } catch (e) { - console.log("Error in get recipe",e); - } - - if (selectedRecipe != undefined && selectedRecipe != null && selectedRecipe.entries.item_outputs.length > 0) { - const strings = selectedRecipe.entries.item_outputs[0].strings; - var priceValue = ""; - var priceCurrency = ""; - - - if (selectedRecipe?.coin_inputs?.[0]?.coins?.[0]) { - priceValue = selectedRecipe?.coin_inputs?.[0]?.coins?.[0]?.amount || "" ; - priceCurrency = selectedRecipe?.coin_inputs?.[0]?.coins?.[0]?.denom || ""; - } - - - if (strings != undefined && strings != null && strings.length > 0) { - if(strings != null) - { - for (j = 0; j < strings.length; j++) { - let key = strings[j].key; - let value = strings[j].value; - if(key == "NFT_URL" && value.indexOf('http') >= 0){ - img = value; - } - else if(key == "Description"){ - description = value; - } - else if(key == "Name"){ - siteName = value; - } - - } - } - let longs = selectedRecipe.entries.item_outputs[0].longs; - - if(longs != null) - { - for (j = 0; j < longs.length; j++) { - let key = longs[j].key; - let value = longs[j].weightRanges[0]?.lower; - if(key == "Width"){ - picWidth = value; - } - else if(key == "Height"){ - picHeight = value - } - } - picHeight = IMAGE_WIDTH * picHeight / picWidth; - picWidth = IMAGE_WIDTH; - } - } - - if(description != undefined && description != ""){ - if (description.length > 150) { - description = description.substring(0, 150) + '...'; - } - } - - if(priceCurrency == "USD"){ - price = Math.floor(priceValue / 100) + '.' + (priceValue % 100) + ' ' + priceCurrency; - } - else if (priceValue !== ""){ - let coins = Meteor.settings.public.coins; - let coin = coins?.length ? coins.find(coin => coin.denom.toLowerCase() === priceCurrency.toLowerCase()) : null; - if (coin) { - price = priceValue / coin.fraction + " " + coin.displayName; - } else { - price = priceValue + ' ' + priceCurrency; - } - } - - - - //slackbot-linkexpanding - //discordbot - //facebookbot - //twitterbot - const { headers, browser } = sink.request; - if(browser && browser.name.includes("slackbot")){ - botType = SLACK_BOT; - } - else if(browser && browser.name.includes("facebookbot")){ - botType = FACEBOOK_BOT; - } - else if(browser && browser.name.includes("twitterbot")){ - botType = TWITTER_BOT; - } - else if(browser && browser.name.includes("discordbot")){ - botType = DISCORD_BOT; - } - else{ - botType = BROWSER_BOT; - } - - if(botType == TWITTER_BOT){ - description = description + "

" + price + "

"; - } - else if(botType == FACEBOOK_BOT){ - siteName = siteName + "

" + price + "

"; - } - else if(botType != SLACK_BOT){ - description = price !== "No Price" ? description + "\nPrice: " + price : description; - } - - if (selectedRecipe.entries != null) { - const itemoutputs = selectedRecipe.entries.item_outputs; - if (itemoutputs.length > 0) { - let longs = itemoutputs[0].Longs; - if(longs != null) - { - for (i = 0; i < longs.length; i++) { - let weightRanges = longs[i].weightRanges; - if(longs[i].Key == "Width"){ - if(weightRanges != null){ - picWidth = weightRanges[0].lower * weightRanges[0].weight; - } - } - else if(longs[i].Key == "Height"){ - if(weightRanges != null){ - picHeight = weightRanges[0].lower * weightRanges[0].weight; - } - } - } - picHeight = IMAGE_WIDTH * picHeight / picWidth; - picWidth = IMAGE_WIDTH; - } - - let strings = itemoutputs[0].strings; - for (i = 0; i < strings.length; i++) { - try { - var values = strings[i].value; - if (strings[i].key = "NFT_URL" && values.indexOf('http') >= 0) { - img = values; - break; - } - } catch (e) { - console.log('strings[i].Value', e) - break; - } - - } - } - } - - - const MetaTags = ` - - - - - - - - - - - - `; - - sink.appendToHead(MetaTags); - } - - - } - else if (querys.get('recipe_id') !== null) { - const recipe_id = sanitizeUrl(querys['recipe_id']); - const cookbook_id = sanitizeUrl(querys['cookbook_id']); - let recipesUrl = sanitizeUrl(`${Meteor.settings.remote.api}/pylons/recipe/${cookbook_id}/${recipe_id}`); - - try { - let response = HTTP.get(recipesUrl); - //selectedItem = JSON.parse(response.content).CompletedExecutions; - selectedRecipe = JSON.parse(response.content).Recipe; - - } catch (e) { - console.log(e); - } - - if (selectedRecipe != undefined && selectedRecipe != null && selectedRecipe.entries.item_outputs.length > 0) { - const strings = selectedRecipe.entries.item_outputs[0].strings; - var priceValue = ""; - var priceCurrency = ""; - if (selectedRecipe?.coin_inputs?.[0]?.coins?.[0]) { - priceValue = selectedRecipe?.coin_inputs?.[0]?.coins?.[0]?.amount || "" ; - priceCurrency = selectedRecipe?.coin_inputs?.[0]?.coins?.[0]?.denom || ""; - } - if (strings != undefined && strings != null && strings.length > 0) { - if(strings != null) - { - - for (j = 0; j < strings.length; j++) { - let key = strings[j].key; - let value = strings[j].value; - if(key == "NFT_URL" && value.indexOf('http') >= 0){ - img = value; - } - else if(key == "Description"){ - description = value; - } - else if(key == "Name"){ - siteName = value; - } - - } - } - let longs = selectedRecipe.entries.item_outputs[0].longs; - - if(longs != null) - { - for (j = 0; j < longs.length; j++) { - let key = longs[j].key; - let value = longs[j].weightRanges[0].lower; - if(key == "Width"){ - picWidth = value; - } - else if(key == "Height"){ - picHeight = value - } - } - picHeight = IMAGE_WIDTH * picHeight / picWidth; - picWidth = IMAGE_WIDTH; - } - } - - if(description != undefined && description != ""){ - if (description.length > 150) { - description = description.substring(0, 150) + '...'; - } - } - - if(priceCurrency == "USD"){ - price = Math.floor(priceValue / 100) + '.' + (priceValue % 100) + ' ' + priceCurrency; - } - else if (priceValue !== ""){ - let coins = Meteor.settings.public.coins; - let coin = coins?.length ? coins.find(coin => coin.denom.toLowerCase() === priceCurrency.toLowerCase()) : null; - if (coin) { - price = priceValue / coin.fraction + " " + coin.displayName; - } else { - price = priceValue + ' ' + priceCurrency; - } - } - //slackbot-linkexpanding - //discordbot - //facebookbot - //twitterbot - const { headers, browser } = sink.request; - if(browser && browser.name.includes("slackbot")){ - botType = SLACK_BOT; - } - else if(browser && browser.name.includes("facebookbot")){ - botType = FACEBOOK_BOT; - } - else if(browser && browser.name.includes("twitterbot")){ - botType = TWITTER_BOT; - } - else if(browser && browser.name.includes("discordbot")){ - botType = DISCORD_BOT; - } - else{ - botType = BROWSER_BOT; - } - - if(botType == TWITTER_BOT){ - description = description + "

" + price + "

"; - } - else if(botType == FACEBOOK_BOT){ - siteName = siteName + "

" + price + "

"; - } - else if(botType != SLACK_BOT){ - description = price !== "No Price" ? description + "\nPrice: " + price : description; - } - - - - const MetaTags = ` - - - - - - - - - - - - `; - - sink.appendToHead(MetaTags); - } - } - else - { - sink.appendToHead(defaultMetaTags); - } - }); -}); \ No newline at end of file diff --git a/big-dipper-backend/imports/startup/server/read-genesis.js b/big-dipper-backend/imports/startup/server/read-genesis.js deleted file mode 100644 index 83c63523d1..0000000000 --- a/big-dipper-backend/imports/startup/server/read-genesis.js +++ /dev/null @@ -1,4 +0,0 @@ -import { Blockscon } from '../../api/blocks/blocks.js'; - -let blocksCount = Blockscon.find({}).count(); -console.log(blocksCount); diff --git a/big-dipper-backend/imports/startup/server/register-api.js b/big-dipper-backend/imports/startup/server/register-api.js deleted file mode 100644 index ea84a2332c..0000000000 --- a/big-dipper-backend/imports/startup/server/register-api.js +++ /dev/null @@ -1,50 +0,0 @@ -// Register your apis here - -import "../../api/ledger/server/methods.js"; - -import "../../api/chain/server/methods.js"; -import "../../api/chain/server/publications.js"; - -import "../../api/blocks/server/methods.js"; -import "../../api/blocks/server/publications.js"; - -import "../../api/validators/server/methods.js"; -import "../../api/validators/server/publications.js"; - -import "../../api/records/server/methods.js"; -import "../../api/records/server/publications.js"; - -import "../../api/proposals/server/methods.js"; -import "../../api/proposals/server/publications.js"; - -import "../../api/recipes/server/methods.js"; -import "../../api/recipes/server/publications.js"; - -import "../../api/nfts/server/methods.js"; -import "../../api/nfts/server/publications.js"; - -import "../../api/cookbooks/server/methods.js"; -import "../../api/cookbooks/server/publications.js"; - -import "../../api/voting-power/server/publications.js"; - -import "../../api/transactions/server/methods.js"; -import "../../api/transactions/server/publications.js"; - -import "../../api/delegations/server/methods.js"; -import "../../api/delegations/server/publications.js"; - -import "../../api/status/server/publications.js"; - -import "../../api/accounts/server/methods.js"; - -import "../../api/coin-stats/server/methods.js"; - -import "../../api/analytics/server/methods.js"; -import "../../api/analytics/server/publications.js"; - -import "../../api/actions/server/methods.js"; -import "../../api/actions/server/publications.js"; - -import "../../api/fcmtoken/server/methods.js"; -import "../../api/notifications/server/methods"; diff --git a/big-dipper-backend/imports/startup/server/util.js b/big-dipper-backend/imports/startup/server/util.js deleted file mode 100644 index a71ce6db48..0000000000 --- a/big-dipper-backend/imports/startup/server/util.js +++ /dev/null @@ -1,125 +0,0 @@ -import {bech32} from 'bech32' -import { HTTP } from 'meteor/http'; -import * as cheerio from 'cheerio'; -import { tmhash } from 'tendermint/lib/hash' -import { sanitizeUrl } from '@braintree/sanitize-url'; - - -Meteor.methods({ - hexToBech32: function(address, prefix) { - let addressBuffer = Buffer.from(address, 'hex'); - // let buffer = Buffer.alloc(37) - // addressBuffer.copy(buffer); - return bech32.encode(prefix, bech32.toWords(addressBuffer)); - }, - pubkeyToBech32Old: function(pubkey, prefix) { - let buffer; - - try { - if (pubkey.type.indexOf("Ed25519") > 0){ - // '1624DE6420' is ed25519 pubkey prefix - let pubkeyAminoPrefix = Buffer.from('1624DE6420', 'hex'); - buffer = Buffer.alloc(37); - - pubkeyAminoPrefix.copy(buffer, 0) - Buffer.from(pubkey.value, 'base64').copy(buffer, pubkeyAminoPrefix.length) - } - else if (pubkey.type.indexOf("Secp256k1") > 0){ - // 'EB5AE98721' is secp256k1 pubkey prefix - let pubkeyAminoPrefix = Buffer.from('EB5AE98721', 'hex'); - buffer = Buffer.alloc(38); - - pubkeyAminoPrefix.copy(buffer, 0) - Buffer.from(pubkey.value, 'base64').copy(buffer, pubkeyAminoPrefix.length) - } - else { - console.log("Pubkey type not supported."); - return false; - } - - return bech32.encode(prefix, bech32.toWords(buffer)) - } - catch (e){ - console.log("Error converting from pubkey to bech32: %o\n %o", pubkey, e); - return false - } - }, - pubkeyToBech32: function(pubkey, prefix) { - let buffer; - - try { - if (pubkey["@type"].indexOf("ed25519") > 0){ - // '1624DE6420' is ed25519 pubkey prefix - let pubkeyAminoPrefix = Buffer.from('1624DE6420', 'hex'); - buffer = Buffer.alloc(37); - - pubkeyAminoPrefix.copy(buffer, 0) - Buffer.from(pubkey.key, 'base64').copy(buffer, pubkeyAminoPrefix.length) - } - else if (pubkey["@type"].indexOf("secp256k1") > 0){ - // 'EB5AE98721' is secp256k1 pubkey prefix - let pubkeyAminoPrefix = Buffer.from('EB5AE98721', 'hex'); - buffer = Buffer.alloc(38); - - pubkeyAminoPrefix.copy(buffer, 0) - Buffer.from(pubkey.key, 'base64').copy(buffer, pubkeyAminoPrefix.length) - } - else { - console.log("Pubkey type not supported."); - return false; - } - - return bech32.encode(prefix, bech32.toWords(buffer)) - } - catch (e){ - console.log("Error converting from pubkey to bech32: %o\n %o", pubkey, e); - return false - } - }, - bech32ToPubkey: function(pubkey, type) { - // type can only be either 'tendermint/PubKeySecp256k1' or 'tendermint/PubKeyEd25519' - let pubkeyAminoPrefix, buffer; - - try { - if (type.indexOf("ed25519") > 0){ - // '1624DE6420' is ed25519 pubkey prefix - pubkeyAminoPrefix = Buffer.from('1624DE6420', 'hex') - buffer = Buffer.from(bech32.fromWords(bech32.decode(pubkey).words)); - } - else if (type.indexOf("secp256k1") > 0){ - // 'EB5AE98721' is secp256k1 pubkey prefix - pubkeyAminoPrefix = Buffer.from('EB5AE98721', 'hex') - buffer = Buffer.from(bech32.fromWords(bech32.decode(pubkey).words)); - } - else { - console.log("Pubkey type not supported."); - return false; - } - - return buffer.slice(pubkeyAminoPrefix.length).toString('base64'); - } - catch (e){ - console.log("Error converting from bech32 to pubkey: %o\n %o", pubkey, e); - return false - } - }, - getAddressFromPubkey: function(pubkey){ - var bytes = Buffer.from(pubkey.key, 'base64'); - return tmhash(bytes).slice(0, 20).toString('hex').toUpperCase(); - }, - getDelegator: function(operatorAddr){ - let address = bech32.decode(operatorAddr); - return bech32.encode(Meteor.settings.public.bech32PrefixAccAddr, address.words); - }, - getKeybaseTeamPic: function(keybaseUrl){ - let teamPage = HTTP.get(sanitizeUrl(keybaseUrl)); - if (teamPage.statusCode == 200){ - let page = cheerio.load(teamPage.content); - return page(".kb-main-card img").attr('src'); - } - }, - getVersion: function(){ - const version = Assets.getText('version'); - return version ? version : 'beta' - } -}) diff --git a/big-dipper-backend/imports/startup/server/websocket.js b/big-dipper-backend/imports/startup/server/websocket.js deleted file mode 100644 index 2cd0197cec..0000000000 --- a/big-dipper-backend/imports/startup/server/websocket.js +++ /dev/null @@ -1,16 +0,0 @@ -// import WebSocket from 'ws'; - -// // var WebSocket = Npm.require("ws"); -// // console.log(WebSocket); -// WS = Meteor.settings.remote.ws; - -// let ws = new WebSocket(WS); - -// ws.on('open', () => { -// // console.log('connected'); -// // ws.send('{"jsonrpc": "2.0","method": "subscribe","id":"0","params":{"query":"tm.event=\'CompleteProposal\'"}}'); -// }); - -// ws.on('message', (data) => { -// console.log(data); -// }); \ No newline at end of file diff --git a/big-dipper-backend/package.json b/big-dipper-backend/package.json deleted file mode 100644 index ef5a80166f..0000000000 --- a/big-dipper-backend/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "@forbole/big-dipper", - "private": true, - "engines": { - "node": ">=16.0.0" - }, - "scripts": { - "start": "meteor run", - "test": "meteor test --once --driver-package meteortesting:mocha", - "lint": "eslint --ext .jsx,.js --fix --ignore-pattern imports/ui/App.jsx imports/", - "lintdiff": "LIST=`git diff-index --name-only master | grep .*\\.js | grep -v json`; if [ \"$LIST\" ]; then eslint --ext .jsx,.js --ignore-pattern imports/ui/App.jsx $LIST; fi", - "pretest": "npm run lint --silent", - "genversion": "./scripts/genversion.sh" - }, - "dependencies": { - - "@babel/runtime": "^7.19.0", - "@braintree/sanitize-url": "^6.0.1", - "@babel/runtime": "^7.20.1", - "@braintree/sanitize-url": "^6.0.0", - "@google-cloud/storage": "^6.6.0", - "@google/model-viewer": "^2.0.2", - "@ledgerhq/hw-transport-web-ble": "^6.27.6", - "@ledgerhq/hw-transport-webusb": "^6.27.6", - "axios": "^1.1.3", - "babel-polyfill": "^6.26.0", - "bech32": "^2.0.0", - "bootstrap": "^5.2.2", - "bootstrap-less": "^3.3.8", - "bootswatch": "^5.2.2", - "chart.js": "^3.9.1", - "cheerio": "^1.0.0-rc.6", - "connect-route": "^0.1.5", - "crypto-js": "^4.1.1", - "d3": "^7.6.1", - "doc-head-extract": "^1.0.4", - "fibers": "^5.0.3", - "firebase-admin": "^11.2.0", - "jquery": "^3.6.1", - "js-sha256": "^0.9.0", - "ledger-cosmos-js": "^2.1.8", - "lodash": "^4.17.21", - "meteor-node-stubs": "^1.2.5", - "moment": "^2.29.4", - "moment-timezone": "^0.5.38", - "numbro": "^2.3.2", - "plottable": "^3.9.0", - "prop-types": "^15.7.2", - "react": "^16.14.0", - "react-3d-viewer": "^1.0.12", - "react-chartjs-2": "^4.0.1", - "react-dom": "^16.13.1", - "react-google-tag-manager": "^2.2.1", - "react-helmet": "^6.1.0", - "react-jazzicon": "^0.1.3", - "react-json-view": "^1.21.3", - "react-loadingg": "^1.7.2", - "react-pose": "^4.0.10", - "react-responsive-pagination": "^1.8.0", - "react-router-dom": "^6.4.3", - "react-showdown": "^2.3.1", - "react-sidebar": "^3.0.2", - "react-toastify": "^9.0.8", - "reactstrap": "^9.1.5", - "rollup": "^3.2.5", - "secp256k1": "^4.0.3", - "simpl-schema": "^3.0.1", - "styled-components": "^4.4.1", - "tendermint": "^5.0.2", - "tooltip.js": "^1.3.3", - "voca": "^1.4.0" - }, - "devDependencies": { - "babel-eslint": "^10.1.0", - "chai": "^4.3.7", - "eslint": "^5.16.0", - "eslint-config-airbnb": "^17.1.1", - "eslint-import-resolver-meteor": "^0.4.0", - "eslint-plugin-import": "^2.23.3", - "eslint-plugin-jsx-a11y": "^6.6.1", - "eslint-plugin-meteor": "^7.3.0", - "eslint-plugin-react": "^7.31.10" - } -} diff --git a/big-dipper-backend/private/README.md b/big-dipper-backend/private/README.md deleted file mode 100644 index 2071259f55..0000000000 --- a/big-dipper-backend/private/README.md +++ /dev/null @@ -1,3 +0,0 @@ -**private folder** - -All files inside a top-level directory called `private/` are only accessible from server code and can be loaded via the [`Assets`](http://docs.meteor.com/#/full/assets_getText) API. This can be used for private data files and any files that are in your project directory that you don't want to be accessible from the outside. diff --git a/big-dipper-backend/private/version b/big-dipper-backend/private/version deleted file mode 100644 index 4b9406e13b..0000000000 --- a/big-dipper-backend/private/version +++ /dev/null @@ -1 +0,0 @@ -v0.41.x-14.2 \ No newline at end of file diff --git a/big-dipper-backend/public/.well-known/apple-app-site-association b/big-dipper-backend/public/.well-known/apple-app-site-association deleted file mode 100644 index 43b3dc46a7..0000000000 --- a/big-dipper-backend/public/.well-known/apple-app-site-association +++ /dev/null @@ -1,14 +0,0 @@ -{ - "applinks": { - "details": [{ - "appIDs": ["QV67PMQ8H3.xyz.pylons.wallet"], - "components": [{ - "/": "*", - "comment": "" - }] - }] - }, - "webcredentials": { - "apps": ["QV67PMQ8H3.xyz.pylons.wallet"] - } -} \ No newline at end of file diff --git a/big-dipper-backend/public/.well-known/assetlinks.json b/big-dipper-backend/public/.well-known/assetlinks.json deleted file mode 100644 index bdad333952..0000000000 --- a/big-dipper-backend/public/.well-known/assetlinks.json +++ /dev/null @@ -1 +0,0 @@ -[{"relation":["delegate_permission/common.handle_all_urls"],"target":{"namespace":"android_app","package_name":"tech.pylons.wallet","sha256_cert_fingerprints":["8E:AA:A7:65:FE:DE:C2:65:DF:E5:A1:41:76:A4:BE:BC:F0:5C:9C:92:10:77:FA:8F:AD:BE:3F:7C:A2:C9:4B:6F","A9:F6:3A:9A:EA:6C:16:8D:C8:DE:51:2A:59:30:F4:3C:8B:2E:1E:F7:90:54:F4:D2:F4:C3:69:DC:B7:7E:2D:05"]}}] \ No newline at end of file diff --git a/big-dipper-backend/public/img/big-dipper-icon-light.svg b/big-dipper-backend/public/img/big-dipper-icon-light.svg deleted file mode 100644 index 42d675f3f9..0000000000 --- a/big-dipper-backend/public/img/big-dipper-icon-light.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/big-dipper-backend/public/img/big-dipper-logo-light.svg b/big-dipper-backend/public/img/big-dipper-logo-light.svg deleted file mode 100644 index 50a644fb0a..0000000000 --- a/big-dipper-backend/public/img/big-dipper-logo-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/big-dipper-backend/public/img/big-dipper.png b/big-dipper-backend/public/img/big-dipper.png deleted file mode 100644 index e8ee7dc9784defefadf4ca52a47c255612bfbc50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2812 zcmX9=dpy%^8($}toL=X{kaJW>%;r$fo_LwVkH=CuCWjnrW3$Z@_0$M?P>MNB4q-?= z4G9w_XNIigY?*D1VdeCy=v_UZ&vjqd_j_I6`?~JW{ki|RQ{4dvNpV$i5C|lRaJ2IP zf%X{uT!;3FGSi8%7*W_C3U`HrK-A15->)1H@jVz1hu=ZZhroOh33qonZ!d})ZcbAm zwGB7tO*iK`kmfWZHr<@I+?+(>IgpY_yyfN~(oca@H{4vd zet~~AqLK*wYNE2BX0++ZB+cRqk=5=LrbmGl}V0_lNt3NljRmCLa$82l$(t8)Ra_p=*2~RysD!Q=I^S6^< zZiUy{spK_}2*aI%C)I-%b8lKJcTbkzIz6IORk{sJUiP?ZxKo%Ui%6*CU)2xFX{*+%D!nI`ucIJMMi$X0s|}nHNo6aQ{12s0d8Dkph?$Gb zZ($wF+r9Rb4^2X(@|4xIelpF`dbl6 z)473-Ct|x+PQ1+IimL#WF=@sNHG)JoI+gRT_1b6SH{mm1OLTA!m;NLz@O<6rPdLFU z);Ug&YBt`$ZfAxSp`L7WPd!@b2=nUB;M4euv|?F1VHE77f06YwDmCcqb*rwJh`Gep z8`rZZ{A&hQ{RH8f)`c&~jYc2$^i_rJTyTne#>*_bMfBFnAqVSqikU?InB;7^HBMK4 zlU)4dDL6#r;XZFE9UBgGP_+5*?X4a{pcud0cJ%P$Zx&y&v~dP!fK_?=@k3`E5i&Fj zHcoa^Y!cyfMgAS#v9 zc|)(7Dn5%(dQ8D;hOp#m3adA_x(o@AaF6`=f6I|GV_naPmmqJw#IjeUQAkK@soCdi>X)C+ zT>i{br_FtSIkEHF5#t@3FfyvK9v5nqb~xc#`_v5< zKCXpqOz+GfA$3y1{f={WxAwYz->%3ci^G5;405e|V9y}Jm|!qNzV};T55w??E^eA! zb_YK?RCP!PCm`3F2KEdg^aI%QiABs~`+@H~0?q0W zAm9-SOrh$zr#P|7h-r2az_EEYqlu_U7t0ESU$e_!q*-tZi|-gDYZ7p5+cS403dGaPvhgPfJx zLz&2mS9K{d^Ph}+WMHSTB+nG`Cutje?0xccZ|gKugTW^@W;lP;5mF32|6pRrTrx*?7O^)})lunzs<8v5j&OS<1+K-FTCVtqQFT<8wt{=$y zK}1Vc863%W_w47jYX>5G>E@7Ylc+8+9{)3BHFD-}6{GA~{-)_FLdK%2Yy z$8EO9S1^%vvdh}}o1RufnmCx`5vbf!hYj7{$daMiAINa-GbfnObg>9)v$VJqiVBU! zdQ6sUlJ&q2eofiL2<_)oK|daBJ;27V<(~YP4v1*o#lXB1MrePhqBY}5KM4(;8=oP# z_0qk(@^y>6V4-jz0Nw@e;cwL0Bn9A4L1)1=JM)kHRhw1n4&cKgYkEp(P<2!WFiP%D?!E$U zPGhSuBTV|jt)guPYFCU`E}EgLC3GnDVZJ@hG>ue@b6KgTvfNDNfV2r(JW*K<~;5U@yH~EIfwX!?f`S}*u(+YwU!#Lkw*lTsw ze(Iv}yUYiYoA1bjcsFH;r1HvLPX#^7c9T{S{^L+7|4d;J-mA0MaH+U1Y$15oFC#jp z`4CDWj1&APtLdo@2fJKdcZ?l8=4Yp=vv%*{Lqe2$jdTm+eh;KI?u#lHaTYR)yTV3z)f6N4_XpIdRZ<^JRpkP8t zeVg8ltRcIg{)-RCxNarT>R|+wFo$uF8lCUcx>Ry6joJAXzG$Wo7_Z7tWtM(i*sQ3T z(3S%7mX4d#UNqTIVD#fRp9*1qj{b1}yF;mqbLa;RurM=1GUTAA*y<3sc#!2c0j^hR z(J3HW5%EEokx(HJB_%F7o5X;Z(>X=)dkV#rUcru85S%@p9EGOKt$3NNV**bT2Doa= zWNx^&nZpcOT+2lO;c>9Q!rc#CGPyQd8&(53$Ppve!YVBr|7O73==M=kdz5`UxH5O> z2co3l%H%n&ObWf}npBB$OUT-Ty#TN5TgfX}Vi0;P@}10mx=*oD5sbm?EKvD6P~{k} z>QR7qgav?sP0`Ike zzGP@!A~Gkz9Tw0khE@RaRaEO@)B3b$&L~$5tx)NRt6-QAh8mRN$F)7 zLy~hPRst|7{j5z$a-+m-?e<^ENM*5C^)S0o;TX=;mZE()dPKVBT%s6iA|BpnXiD@M z2Y02eMMvvFdeF^fh!Nx{dQ!hcT69Iv=!~e{dq{|DU@l42Sn|54@g$2-aBf=6VG68m z2_56g(C7~!$+N7pys&;lePU3Q)N49Q*TRft4$K#R6U{*hFGJ>7(5`Ty66Bz?rqb41 zE{n~c*O&yi#QRR4EjWilKVrbw>_g%I!V*hpKX*h89D?~InNbT{7ju{Z|4D4C-TqX7 zLRD Bh=u?F diff --git a/big-dipper-backend/public/img/bluetooth.svg b/big-dipper-backend/public/img/bluetooth.svg deleted file mode 100644 index 9540e1fc71..0000000000 --- a/big-dipper-backend/public/img/bluetooth.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/big-dipper-backend/public/img/btc.svg b/big-dipper-backend/public/img/btc.svg deleted file mode 100644 index 0ef510187d..0000000000 --- a/big-dipper-backend/public/img/btc.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/big-dipper-backend/public/img/btnbg.png b/big-dipper-backend/public/img/btnbg.png deleted file mode 100644 index 311bbc0e9fca5a5a5172224278920307645b4acd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 635 zcmeAS@N?(olHy`uVBq!ia0y~yU^E4?y*ZeHq}sd(#z1OIfKP}kkp9oWu-}2W%ubmX%xG21LR(R*6@ZMDs$aw1nV!w4(cn@SaE5369i2%7! zwzDEg3akvwP=tuT1By5UwJW{{nWh911f&1||EqtS+6r{HbxDw4FaskC3mZEZH@|?0 zsF=8fq?ELxl7^O{xs{`fuYW*fY|VEO`G4w zDdETNXc(KF!0Wdob$KF(A4%zl}9JJ3Co7Gx_cPZCcr{GeJxs$`#EIy>@E*#%WtN zZp*qYn5}v{!uu8!ZN8PYhV@?dnxnaERAGn}$cRYpHN6(WoV{k_F{$hX5IdO{%wE&D zH7HxUU*$*ktv4GUtj~Pi$yV=s`@9X1U#WN~{_;C*;eWHf?Fs?%-xoey|8jwU+x}&T z6{Y{p>T@sok-e(_=ZEVhMv6z`FTb23Snr!|?DfZVZhgU{^)HkBy7n(Srmp>Omfrr1 zkJn4KJ~$d5Jb7D!uWnM4X{@pEnwQgNCHUs%HJRR>EW9RE?#9RKAv<>-eqYD%Y~KDy UYm>e10E3ai)78&qol`;+0Q^K4s{jB1 diff --git a/big-dipper-backend/public/img/buy_icon.png b/big-dipper-backend/public/img/buy_icon.png deleted file mode 100644 index ed93daa8816958bec087af50521bebeefa62edb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1307 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 SGdlQyb%_~t*tE>VBk_OD+)YjZ diff --git a/big-dipper-backend/public/img/check.svg b/big-dipper-backend/public/img/check.svg deleted file mode 100644 index 28bc6da1be..0000000000 --- a/big-dipper-backend/public/img/check.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/big-dipper-backend/public/img/detail.svg b/big-dipper-backend/public/img/detail.svg deleted file mode 100644 index d4d923019b..0000000000 --- a/big-dipper-backend/public/img/detail.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/big-dipper-backend/public/img/easel.png b/big-dipper-backend/public/img/easel.png deleted file mode 100644 index 40d73fdafbad7569918acd7d1975e1d62246cf55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1088 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm4M^HB7Cr(}oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di49r(OT^vIy7~kIY4U#q#a7gU^$hsotz#Nv~ zhj9-hA_G|GwCr>^rOweeTc9b?#y)8Km1*~GuhC%WpT($W8nM9Y^OVAs2be-tH6MAk zv93B5bZ9CIcgWOb4cby-E41_l!$ougOoN!#9o^t?HDclpv4c#Zi(Mbg;^hwM-7aul zCt|^(>tYXPwXkYgWvQ(T1ac3iJ+R{B4l%jKvd$66jqH8!i-|jA%L?HgeF=?Si=+;G z1v+rb74?|)8ysAogyl>;+CegPQcbsv4{m(`o%!PI2cHn8v_Yz;fMuFr9kWnRQ4i13m7u; z!NBPJ6=S3ma52CW$Y0*o#;PTy%_X)XV-+wiT#KWC(PXmyCXnepixn8aTRefGJ;N=r zu`9_M82(c(Dd+?QX2k=;+{CJhRqN6#V50HZ91gVPZP)^(?p=4kuTF1YAs2t>pXP;> z)fZyr`*J^oi2s5I`N2q_KWi6!4$w|Fs$ zEj4Wbl1Iy#rn2aCWwQXusCz70oDo~rNUl&xxcDb+(WC~~&ru*nzS{+W(o*^$rB<;j zKt(1oOhEF>R+kW=4KFNML1eubNZWmpKww0c0tKSZGfZV!GtJmZm2ve|9-wHJVKPWq zn;EE6cPb}PGVD}`7gHE_svA(rH?9Sf8bXU(13V9`+S&v(>S{zHP - - - - diff --git a/big-dipper-backend/public/img/expand.svg b/big-dipper-backend/public/img/expand.svg deleted file mode 100644 index 8678427d0e..0000000000 --- a/big-dipper-backend/public/img/expand.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/big-dipper-backend/public/img/external.svg b/big-dipper-backend/public/img/external.svg deleted file mode 100644 index 3cd8632861..0000000000 --- a/big-dipper-backend/public/img/external.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/big-dipper-backend/public/img/eye.svg b/big-dipper-backend/public/img/eye.svg deleted file mode 100644 index dc1df3c36f..0000000000 --- a/big-dipper-backend/public/img/eye.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/big-dipper-backend/public/img/favicon.png b/big-dipper-backend/public/img/favicon.png deleted file mode 100644 index 40d73fdafbad7569918acd7d1975e1d62246cf55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1088 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm4M^HB7Cr(}oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di49r(OT^vIy7~kIY4U#q#a7gU^$hsotz#Nv~ zhj9-hA_G|GwCr>^rOweeTc9b?#y)8Km1*~GuhC%WpT($W8nM9Y^OVAs2be-tH6MAk zv93B5bZ9CIcgWOb4cby-E41_l!$ougOoN!#9o^t?HDclpv4c#Zi(Mbg;^hwM-7aul zCt|^(>tYXPwXkYgWvQ(T1ac3iJ+R{B4l%jKvd$66jqH8!i-|jA%L?HgeF=?Si=+;G z1v+rb74?|)8ysAogyl>;+CegPQcbsv4{m(`o%!PI2cHn8v_Yz;fMuFr9kWnRQ4i13m7u; z!NBPJ6=S3ma52CW$Y0*o#;PTy%_X)XV-+wiT#KWC(PXmyCXnepixn8aTRefGJ;N=r zu`9_M82(c(Dd+?QX2k=;+{CJhRqN6#V50HZ91gVPZP)^(?p=4kuTF1YAs2t>pXP;> z)fZyr`*J^oi2s5I`N2q_KWi6!4$w|Fs$ zEj4Wbl1Iy#rn2aCWwQXusCz70oDo~rNUl&xxcDb+(WC~~&ru*nzS{+W(o*^$rB<;j zKt(1oOhEF>R+kW=4KFNML1eubNZWmpKww0c0tKSZGfZV!GtJmZm2ve|9-wHJVKPWq zn;EE6cPb}PGVD}`7gHE_svA(rH?9Sf8bXU(13V9`+S&v(>S{zHP?HtVT(lY=D^|QWT2s42p1Qx!2i!9Tm?m!4;zn!JT`d1RXcob_3-AHr;eEp7gv1- zFZ20vE-v&dBRw5!@R1GH$?r0Dk;KH9W%tQo41CWaGJmx=zxcS;@0+KOJb0RTOYeP? z;XT7tBlV+Yw?^MzX}L11)vjkM`XKxdU*fg!N10ciygDmkeBrIV#N+ro=YPDCKk=F`-lq1Pt{gCX=#$jHCn7?Rf z$H3TAI46$1)yM+@z#Jksc(e#Ck*`r2HO|DCzRIShdUcc#5Z=rfStD=V&A`NN4YQjL z8W)$s>a1G7Z_hyID5ySDwAssG_8NCFA$y5LE5u_(XRtohLLZZz{=eI0C0PkUiPE5= z5Ep(6+@hUX6S*HV}Jz9q!+dE@gGOc-h+l&ulI zvX-b~l+p4MS&!(blDj07l`jS*Nn@fQ+a!<^bWy>I-G;L$R&3644Fl=w3~9c9mmS&;3iAjZ>n zPz5*Ke38R5OEH5{ZOh_7CAJ}LcR@S4a1J&^-08FthP@{mSTf2TXx@yVYPB^&cOV&LnR!&ABwD@=bKw1*L#%~u3EBsesx+(8xh`~le$1f&>e zo)9ljzQtfR=d`br{9bgSQ#5|t0y}HjSANsXev%D9Ax;jcy6BQd)_f=3$`pv@WRG?b zYZ!%v8=?Vt@(;BB`Wqb26ZWNTNNWbq6dfD;39?efiSZBatl zWYluk8^(=`oXb8^G|z?gp z5i5GM_*fdrNl>onY)laJ?-I`>sUEJfYoyo)BW!>eMHQ76VxbXD9nJM2er}#Sb1xOO zfY1vX2_l=R;@wvBBkq-#Gg=Hh5VP8;4vR0_=LzquXrHGfpsJVj)xzE=1OtwVrza-_ zE$|&HXIxiZAO`luT%dD(&gT5tIWoy|5t23*2XH;Hg!4oG)%fwXvaet0l!CO*^E*Se z-?L*RcmxQ(qNi?-&(>cN<$-@1>vsVF%gPE^_Hx;ehb-!+c^X9*C_l(FOSb=Z^n!rV zZQhO~RH2|7;+yrst?uQqYth-)K3VVMZB*}VJs?9e_KWs?XbU&B`3pO^=V(C|5oXyX zBrE}?jihH|sh;>3;!14tDxm8v3I^$9t4#%R<$8*+3CJCW6_d5dW{0yicGjP7_om#e z={VcNVui@(KkI?(QfVjZ;xudh;-S7f$?@<<`$CVF$=|L{o1!ev=I%ztV{U5N2^}*X zh{Bf9?(lwd>~$6REhiXq3T+r`amgOxveP-=+pjO$8NN!(!*m1dmUb588XwgZrN*OD z+O;Vimx?+4MyAo5zXmFP6;`X=vs@(?5@55_JZ{xrMhk3>i7y<#i`5PkFYIzT!$7EX#C@(4dA;HLSYLdyrICkSW{R-> ziK4&?{wtz7PtX3?uU+ET4p@y7=3i1SZjO9CkJVR9GvaZ*$anP~@*R%_`>w=9^nMta zFZwQ}7X%8Fh)!MRcXhswGx(KK_r&j>-^nb_{R7x0z@%#OhSZ57FFmE6^=TbEgv<|S z7SOrN%v?vW=`~2my^9}qv4Xna)=C85O)Ghy@*?)xJSyuNbM8vJH(xR{WdB=7=!iaT z*VqSt;AraXJ>o7(gKl6KQ;^yM&%UvrGF zdm5hNFDZ(mK%Isb*3@c%fd2pywyn`mCLPyclcbWxyR(|NW?E^KU_==f9xzrI(3wNX z7>`J29{BtFjh3h6tyGx^c6k~lV!FyuD5XuBTWT`&dM4%xXZriBG|)da7+R1i@Nlu1 zpVwEbaEN-zT;i*D1O^}8iw}3}bd1i=-79pj2H{Ha+V=*!I#{fz-W04s=+;4M=WhAp zfSkjgJnI+$b|>aX!cLq_0pih;r?M!L%DudrKLF4`g|MUG%J9w@w~!qHp+X_FpRcbY z0Y42*6?dEY=->MIk9EsQ-m<9DhNtR5*$VeAjv58uoqbtXYZKk*5g?lb_#1Qg`C^$= zaguS#EqztJ2=yU%oH;1ZD+(SJx{2H`vQf2sod2p4qt))uer0TwJ?cNJ zZlu&BAX7eyHiI-@Kq$}2pv9sfmGADDlpfHe`ivf^e>iyvBdQRMrSVlq&E}$XAhc%qDnWhZ`FsLA8X%O4fAFze}&O5msi4iA!EN_ zp>4jB_>i#vLY08>tk081I$$kj9AzDca6$&MqcuH}N17I8vLV2=$&e&*Dn&4*P8_w2 zKWTB0&_4=!g5&n$v&S#@CyDc}KGuu52OAryAM1|ORX;qm)wDZ9f`hl0D1ChxDvcH! zq^uE9uCC3z8na5qmxbf4N0uF_84Tl@UK0N?fa1um996LMJ?DtAZ5ECYy-JHF_ViF` zBwxQ6%+m0r3DyCNE(QgZ;qgv0I9#@hU`lzE6(!~lXM{C<5p^!NIy_HW{0;L(j)JS` zO)uR$M&_&YJa>zOOrXXpa?fL1pnOu4Pab2Ef$HzQY8n*wH}VEcACyeQCF?mfkGnI` zP9bxb(D7C0ZW}>!Mb)N0o*n5w(p9kZP2+@K?EOd8S;G!V;lAg!IO~OzFc~N%TtuN_ zf3%prP`0Bm(NE61>4L!N$wXvl-!z}N6!sSKpMfrAFF^QiAMd+59xLj>%+j)ZNuhyc z#4$4eo3xio+r?Th)`UQvOKFJoUYg?3KnMe+9z&_f1Y&>tTRxtz~Q z3Yg0OB_yE>gy*Z5dX z;omeOrgY?wLB#AW8Eu~ac$mw4Bw{cYa51wbTBPvZ%MnIMcGLUY|+QDkD4tLNyKr?C0js(!S1`OsI8gb z>&?kt&CGTe50t}&$C*3ljO$Ery%lZwfs@54X+=pGv5Dw0xvca&Ho2mqaCAP4<8bgU z89k|MjF4dZK;z*odKxP2=0tK+*8PJWQR4MmBoe6_0!1*t%2iV-L-HA6LWN{@Y5T7I@eQ*Ayb*=Cjey$d1HooY@C`CH^ReJgWSNuedDIcX&1 zf?dfH11z5(!x6b8InG3ry5g- zKdjsRakNaT$ns(|S6=_X_Epw+s3^Woi627={<1~bIc!>lXEVcoCF$RA>GPP6?lZoa zAk}<{a?PS58J40ktr#r_&p5Ht*XO%hGLqHR)x~mv`xDjF)DH^2PILx?!CMYAe-UQL z!Kh%T@g{e|?$8M1BdzUa4+vJ0=X`Z!VQhIAij9c%T*kr4z5y{`Q?3KGq5hiWPVMEJ z{Z6)tP397G{$MD1(>_nW7ydbRM1oNn=2XFLX8l0tf}zJ7vrUwH z_`g&@8TilR@o3crMESdf0vI4(R5;#-F<($@aP}wo*EvW92Ql&Hda|&uE5^Fr9Zs} zy1osA0yb=xBSK}**3g|W9ou-B*N`)*8S?gMd?+F6bNr9J7(u5m!;CSG_N;i1IF4>d zUoSqU3H;dGTaR}UXSCHi>Si0fw2a20E&&$E}3num|8XP}hlvq-+b z`o>sP%Et{lU4Y>cV!G0Ph5q4GRifa{VmkT3jf-+`uK0YJp(TBN+J*5rI}iw!WqO*) zwqcXc(VtLnjl z?G=xb&0$Rb9GUeoNHnMuzP7;{9r?+&9U}bnN#tyx+RdErVgXCEEBqn2gBP_t* zsTvFVoyE1+W&(dsc3^~S+E9k!(SEUOYs;ditQhwS1u}M-PxQ8b!jvG6n9h`GCvA1j zg{*4OxgD8pNS@YCB{o)V+r_@-8gnPBl(`%VQJ9GRJ!#<_anbkEES&1-u}CcwGJgEp z!2#P~T3Wq+A+1`8<`9ur^-yBM{+zW>Y@1E}_i2>VI5)p1ltx5iFEp2QYK~e<2W*T9 ztJ}~JScX>CQUrkmoh(wXWQ``7sY;&wb*0qEd2(*7F2Vic1={_X@W)WZfb=rQ#V}-hdfaYMMIDnwZfQHLf_m0MUJ(gG2U*>&%O>300Wa> z6er(~T+MLS0MTavSo}207J8pOASmbD&cubF5py&(4Urtj@FsEb-Wh1K1TE*1Z25D& zK_=1v|mt}Jq3mnbB{Y9c85p}!dsoV?y5L(?*Fl;gShG$emLaluI zQ#Z3x{KhPddHo5EdaQ~EVNV+-@pXi--qy(>xJ~U=lt$hqbLyOlCBhwl``PrENv)nW zR^fq%X7kgu+)36qe=TscHZJYg4B9Ah*a2mycGW|KY0N=mQIUqE}pU-+wvt^?IF| z{b2!O<_AUxlP5QoX?ecB$m^a1tuM0~hRG_#=q!I+s}6{S>xd2DkOB^Ql?`RNFcGj@ zk$yUqzyk#OB2+s!K#B|)iKcr%)vKKMH$oZPV*qItID4VIQkGRNohRoKy|!(Ym69hr zjo*Y82!Z&hv~fybeTJBt{epx}&f}DYtFB6*qhN4KGF^LQn!;U%I8y` zr(z288)lrc-VRXfzn&}a_iyx}nte#DuQE{#I92K&{s3P|Nr?_Q;c2r(Y77Pk-anl7 zn>0k}6^+e*JMt3yth-m})-nMCwCU&fiu}o=FL$oxI4oC9Xk?VIN88sj_eWZ^cv(uCkw2ndhb1Z z`u*j$-Ca2~^>Feze=N-3w>9evLJnSY@l*`BfMs1XP_1L)G&`6~Ror}KaQ%BJ;N2;@Y;`s;vo>lqw2w>(y4_P1p zM8)3<2>PX03N?jLPNjilGhL5BeY0j%0|sh%W$lHHj;*IJJ93ws<&lUpxTffa>f~R+ z6@T@M#Z~-q?Ga=Wl-LOh;NQpC3D zq{L}7sm_4H`gPR_#E`{5YC#HTD;>VRZ#n)dsj62(xhQ$`=M@RrJ;V6G5GPO1Z{pvq z1sh`~p~X@YHBQZA-|o43G@-ba2KcQbpG_pWyKUMvS4W3$qAi-obFzc>oph^Zwc)#w zvvG=sb8AP}zU@tr^peMD*NlQenqK zR6juFq}0{4pEzJ;iXCJ+sri*KLg<47CN!i?5adscArbI3f&m;hXBI+gNaifKlNZEd zR(adCC4iV{3(1wjx4iJxl+alPV5dfh;=z77Zyw~?GLGcZ8M->k@6;K*sB0?=R60y$ zgUWl3%Y6!4or+l;)$PBS<`fxLk!voI$55G=8!q%_4`W^~wREl5jj+>HRtYtrKhSc+ zHfnVJY5a%%_i@UWOx2kM+3qC9*_74z&8b~GZzZ>;$@ilLvQAj%B7lgiA7-gQ{Nl|H z8;W&t4S=Oe=UgEP&%QNv{_hX%dFip~OUPR9=H_M(kRvO^ zO&yxOxKbU3iZ$?9bE2u$sDOG>wpT5NmpMzYf-ymqA@Ovl+UoST?`=D}oCAJe3pix3 z!w|xD129(h`*Q|f$U|rP%N=PnT5?Aes77&aD`j1~ePBANn%rsRP4=tCg$I+x@EswA zBpfy?=270U%Gc|XzORBdhO-f`Q;&zbg(%nwFNOM~H`UVL&hVTs2|J^@Ugu+w(v)ds z7H0I=$NTHL#?ze~z^e9U?q6z1(l4P{TlNOD_2718or>dHfz^y7+VPfdG*fyy}57Gj^9Sm-nHa*^nPgThIPKTjo)bg(c6BtNx%0erQ zzFoevEce|Kx%6LLRu{KMq1^c6OH`!#0z0gMMtD5X7BDg*oEP2^hEHH8{$9UV$}ho{ zag_H~rLY?#rn6|piEKiaeNuT*X>9|7QlQa}R*~O+DYTHnCCMBU(3Fq$vej_|$@dK1 z*ASE)p_cn7hX1OPMLp|v5G)%A*OV$gkHYZV#yt+hbS<8XP~5TwvG$ zfpO=6$7QOL_C;r<%}L1nZy|6UOuUH99PSJG~4{~s*}{7P=A>7(%2_WphEVo{s6 z2a)BDxn0LCjC%l+^3e~Zhrz!7{+G-R;kX!BSY@c7*q&ZmZR|RGLkNX1AnRP;7kO8q z$ec=nu~N`!hfM!ta(D@b2%P-|i)449^EBEta?gxqI1LvF#ej!AhTcSg6LaCjM=7Ar z2Rs4M`TkB2tI-F&B$=)ZrGuqxR~^&`quW0ROYFuuU}d3-Pwg05%=jIM78m&ZR#YMP zX8~K4Iy=QYg9YpHwr@$4J;TY-ltj?y3w4#@<(eX1E%W`7u)C8*pvrKCs7(i=9XkQC zxniVpLd$5xy5ag>iZ;4^FNw$y3~vE(epy*KvAN}9H{6=q8r}H#`FDR3IuG&pyw%$D zV7W&C#A#XxHGgbpAas6@_*sPzDXy1$)@1AFqGiL)KVM$m_+ghe9onC#?rikR!7T`f4l$af0mP7P6?>0?j~$hvhk22tp$N|sp91i zsx)BEkyY*6I8RQav~6uPrxC3kLfKv%$mJQvAtS8hmK54fFCFV;fW}v9h$Ztvbt7r( z0b|fM+OO<1T6Q~p?s>WmH5&u@Yw6QjyDoj?A1gWLM_3FKSKS-f7V{?tAnjXS-_~e` z)?_J~0hu-KabXTrAVnR8x*uf?Ogfbr0e5b$;lqivDMAGF@-kH;K)MH8iJ6Cv-lqb%kcaWPsX z5OZKvghzz4OwcdB_Gl9zGMb%hJ(D2wy7oe0pGEnl{w(YM5yPO$%~0geOBrbCuLEFF6A^~k7uxxKOl z?Tm^7A~=Vy4rLDaZ`T!X?4Ea2WqtR|kzz!mRCL%KCmrzgf&hx=lu{n>-4+=bj1AvE z^@ArV45k%pvE!MCsS$p}Xk_Tz68yDqlW69Vm-2npcYqv%>K(oZ#ct^0maX40&Z>Mu zY#uleKZVGa;DTrF)x7ZTf&0V6o0s$M*RvLLq%EeW`zRrYDbN1A$7*ajn(g3CPJ!%U z09(xA-}4vDXuqA8hJ0B+QQ$B|Xf!c2WZuHD9lTmRwVx^0Vh&Tk+c z^?1F_GgCH#<~H$|mDstLtM~LjfoRkiT1(Z-$4{$wpI*$mQ~%`lz2a6jW@~^rKV1&P|Mk|Pi_$5k!VaaYE;INUHZJF@t@hq8UODU9M-GHG zP{xZ!fodr?L7SSj0H#$nfi4`moQ7Fl+SG9U#J)UPiVwht$G-KS$_}~dZi&+LFD2w)jf#gPV_L_apm6p zXak3u^A*Eh7{k;??{4Qv%NkFvEe#bW=^0)Itm|jB>r1UR3e?#$f5N=IAYN$oIiE&AiT^fOl0`=UZ|G z93CWOf$s<7br@^_-L~n8r(WDXIs;O`lRV`GF`5sC;Fn)-V>Z9XDEb~g7WHQY?yIjd zQ){1U=Vq<12o70+v?+JwK6D-!Ny&EHUmU)zA$!58Jv1R4O-6G0nX3fg$}rB5F!C_e z0jTXF%cg7qSmG{~;T5x{n(2mC?HuLUEh5;zY_Adx19D1j>zq2mNjStg%w4B*wn6cT z1)pcJWzUZ)lL-)lw_%*KETn?WLB=E#k@?^HhBazX@8KbhEOy4tZ8 zjcho*Yy3f;(G`ku;P^^=h5bzistuP?x~Qa*b2u#6nx;WtZa1Vz&m>PB6d zWXx{2T(R0pgyM+%&Kp~2O9z87@{|^wRqEj203me?x-`xA#T$UDx>zyI-=s8vYL?U` z%=qBMU0N*!NoCWu1R4(Xe9&e}+yB&m5 zNsalT9O`=T)+HsQZPVcoMq|#;GwPA}yVAR5%E=z7%B6ul>pPzZxY~K~f0l?r*slv2 z$MM+2KV2g0lfnuSfb>Z_36~&PpUZ7P_l{1niIbxWo{te!cGbioL;rq+`Z=4B8EbR2 zjgB`XS;lrDNgpYZJrI2r#0*^g*{v`@cP$g#?cb>61dze=P`Ob%)vqt5>U-VbFlYcO zn9ihg7U?0&oWVrx-J(>gy6XGsyxO;FmE|`5?G%U5?Ir2mVU^fC0wO47_&&{yXa?Wv z@tQ&{w?K$~99xhcONg{?i*GS7^S)mf;do+pdKR-;fbGQiStP6vU+`);+n{wRr39FB znqMsE{bal$yzcz-9C0qnF@6KW4Gu(%xMe%y=A3?)>(JMbdy8&&QY1Wg*u;gx8g|4K z%%av!#b1POwOnt0oOhWra>VKC9WQ5JsjC4<@z1~Oo~%D`>4;3|-8RkL+s-suk6l^u zK~dqIMjw_07l}S{tiKkHh{!#ch=bM2x>oxNJeD|?$cU16t(yDUj6qdYV<1_b?1S|t zI2@A8jYDcI(1ZNf=yEtJ>V%6LF*ak8qjUXzMxsP2)4uax3-EqtZA8Vc46jF#eCE<) zq=AI{9|cJ1ZG6e?J8lcJbn4{<*X#0N!~MZxDt*rf>N-QlOcc=!pc_pb{ z(JTCSW0w1@Nz(M(>KVecbAW@p2Vo1^Lvx{D&r)tx9RC0S)wk^=QDWWT|L6Bs7-Bn-BmaCWjYCa zuO@kkB_}&y&?sLWHeT;rOZm4sCaP zfgqB%=Ny}#_;jo*7+G;fwpbm9?tFS@9M#m^OfQw~FY@>E`$~8HOrw&jW>^I&U2U;V zm>S#F8aUB>=cI)W0oV0Aq0tex(5%dfoniwQjw>vUm410}m#8s!WM#0~Gb+{!_Wqgai-YG!+5F_a2Xg^h_l-|0;xzG|i9i8&g͠rm#?mljRAE@sC~| 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%0A?Ob*PpdB-*K|m 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

7=%)g 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 diff --git a/big-dipper-backend/public/img/googleapp.png b/big-dipper-backend/public/img/googleapp.png deleted file mode 100644 index 679cdbb34e637d6515f5ea013509d81d07959609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45579 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 a)s>8waYU;&)-4hMKPrkEPio|?!v7Cx6oQff diff --git a/big-dipper-backend/public/img/history.svg b/big-dipper-backend/public/img/history.svg deleted file mode 100644 index 97fd774e9f..0000000000 --- a/big-dipper-backend/public/img/history.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/big-dipper-backend/public/img/ico_artwork.png b/big-dipper-backend/public/img/ico_artwork.png deleted file mode 100644 index d4936eeab4ade633b6ee027bfd13c5ec536c111c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18701 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

P}I5#}`@`jPdOvZ=w!J(w2MJuWr5WBC9 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 diff --git a/big-dipper-backend/public/img/ico_battleresult.png b/big-dipper-backend/public/img/ico_battleresult.png deleted file mode 100644 index 3a0cc551e2bde6b3d13d5f3a9c00921e36c8298f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20688 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 Hu0mjf(qKac diff --git a/big-dipper-backend/public/img/ico_constuction.png b/big-dipper-backend/public/img/ico_constuction.png deleted file mode 100644 index 88f2d7d8d793cb7ed086404f0da11f080c223aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19225 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 A6951J diff --git a/big-dipper-backend/public/img/ico_quest.png b/big-dipper-backend/public/img/ico_quest.png deleted file mode 100644 index 6caf07c2cbc2e6ab13e4df45e34a85b348f7ee1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20934 zcmV(>K-j;DP)j-FHmY&r`-Xo;9|$ ze>b-eo98o}{iZFn1^2RauL01>zsMU~CqKV+^0CS&)`_UV$N{FL4fwfzAe~8!T;e$F zxaHN^K+jUf8o=R?9cAj_>;yd8l7{H84LLG&}vI zEe%-rg7gyw(8v%iByxOghIijvXivtr)%fvu;@y^>kA3@tbY;6~A{;74d z6MvGX?k55uVVhR)39Uaj%4Z!Y8~nKuLjPhqqcu5WZ~=qcqtqG3MwBK^wUIJcM`;Kr zXB+5I8>k=$zaE9*^krnTWo9m`LsJdb@of#WHY{i;p0e$jhoPCyXr;aVq)YC3R=P(4 z)EH;ujB$eK8nzC^Jo+NchJNmSt|aeFKqJjFCrFfdka`A=8%~omh->Y8cE}*}81>3j zKnDXlc#dI+LrWC}5FsoNGm00}WJOKv3DoPt5`K&S&fFV4_gLZv6&!SkOCc84n&8p_)o6 z0M&+O8AhC>Ajhb2n2YX9?nrEQ-+y*j=H$;ohK^}1Bz;j7D3@>@Sti- zFcbE<*e$SWoa#-w&Iuu&tT+W<2|G_$(c*+*qhFzF;DS+PA z-0~LiI&03&J-5!)e#qWeO`}%BYCtht2CYGb-}PS(4|voQC@wh{v*FiPp_v2MPMx!X zZ<+U``9=9*QmO_^?~JA%V0cc`_z#K+^!j7aK3S%{ox{0n$S2Kk@c^t|i(XqV>zesG zde*KqX*2Ai^dEnPkG^vqUoaPw1&gIXwJ>$qBw*yFPj;jH?u}8`rHN=Nltsx-dYyLX zO#3ug$X-Lc=$PtkCcE15)|bZZhNXyRmsj&_dMntxJ05KryV0Q}2&<)4xaUI{r>d3b zCJ&URC(a`Ub2oc4=_2i)QnJ>Svh6U8+qWETB@2`?Hmth?7yN$*@zK~tX_o-#Pk)s+ zwTga-Ef`qBGCp;rq=@V3AX6ZtdMtXCy{9}*)*)p7NhaMp>t!)b#ioI{VZ^0&j#@Gl z!w03pB52Oly1GK}5P-fnU?I(nes(}B_MC+j-5AT#gBI|%oG^g6BgfB;uy&njLtgzm z1De+xs^_fFW$kbs^M{W=@Xk%x1?esW=ue-^n_3%BaL-tdkq@BG%NiKWzN0{fb(n%g zJ4`*@O5_iy8N7Zc$wq_;Nk zw3?g%^N`|;K~RD@$I3%Cz{DEZu%!;-ygt5%!N9$(aJi>JHEmiBvP*>c*mG(t;XEVP zE+8xj>GX)As#>O<>+SS_VS0rT-5vySoS!iqy-xEQi8vY_8VBXOArz2#4d=wH<1x%o z?cAI;z45L2 z#ULu3xogc66NMU>s{;_GsKgEc4Cb-4v%i@L^wKt%fX?kD7`$zd*BDa9vEWHLL;fn< zO`JO&4cC_XvtN_rG}*oaKJnyB)@{O0q@6Nh9X!k@P|T(v37D>6^4d}U<-QB#O1Qge z;hi(37QzT|N)V+Eu`=cO%yo?-AVg|rFdWcMcDvBnXcojD-&=z?GzLtEnWhMHm|1g} zPn+o!R?ro-rWu*vP_<47cfZ#AjZ5cc2c`2saIeJLlvzhJUAJ-3z(c@au{1U`?#Ma?xXrgA*W8k(AB zs-81-+k+%+rd!KA`kO&JW0w%n0K#n92-VEf+~v8#kh5gD%2dW8*|DBYHAS!@hM*@^ z8Z3R`@uXx-USK|IOhlWo18Ii<^dFzgN6*&b!+mxefUG-hK4Msc@aVDBbA~bg!-bB= zMbe;jfA7(i$x1y9=Wq$6&GghEKIA5JqLT&_GnmB+Kwi=r?btjTk%KWToYuPeV(Ajo zUZVr9tD-)3odMQ5$gi9L2^C0_H+7m!-lue9x|8Sye{wOMfi%aR1X(mL&D zhA+zCx&JWw~bK2G((_P{lr~1Eg$! z%Y6OqhrVUYeYau_X-xoX;E^4I7qsj*~*){7&^xXl~ce~_L+1@<~2lfJ@fQ{ zN|}Cs1!aJ6(Uu|0E|+tfB3@>0ri0h3m1|C*MbB!=V!40Gm3jg=L0!6FjIgsob;-gl zg$V?eiBY9)hu#OI0%d*E>Mf9fjw;^y%Q5|?)I+GBWsbETSfT$0$ zF_X;|6^bDQz1hkO1_g^NkxgL~^=W^LvwAw(LA@xa$(p2c0bNh9jaS|c}bpf_MGlK>MfW2)Ml)bRs~SkJ%qDbVH>Jx z7y^0PreK~Bel*f?GWW!!nOPd>xPX(wMi+;Sc^I62I{W(xumi$L^BEt}ieVz$E2sx8 zQUonw1<^eScVwST1BlVuY!BD#re-M0ns{9cUgRX7QW)3rO1?BHgUCHjZ2kUrOxda? zthtycw3oeY4J(P+OcQ5lJcnCGXJ$k>tTBw>3Gi7QsK#{S669JM4LyRSf4zo$2}Hh_ z`C3NMdNP`uP0g-&XMr@XWMlQVWdq95@-O>)GskXn(i~E4m#$G+-;tMA%Ar_(DeX%# zsfs%DiSjc4W$~~6FJ=42IFP+F^US)%MatcKd!}qf2I}lH!__WCi+0ty$<`*OG+QN0 zH&<|4$CO2~_o9=_{%Fl48W>{QrIQt3)+)mcmSvTRsdb1At~7ad?TX2=#WEIP(>JVx zHO(KTj941sq1%l`k}awy2OiAc$XsS#bjFnYk##8LEEoAX7;$=<`S9X=cHvH@XT4>G zeby^75Un%aLnUY&MgoJ{HR8zyM7Y?rS`k-yz#iZ=c2JR8y*VPg)c5|B=ysH0tQc{j zfv2@D90X>}NIpQ`zh!a;BXLasV4tX%o;54}+A+`iE>J$Xn)nu7zpV0_{(pEx_Y|IM> zMxMusVJ;>#97pnORg&1Wr5F$!J6j3RN!#l<2cG%w5A1gcFQlaa>UU5?JG}9f>p^KC zSk0Ncvw0C_Rw?qO3^?bdrD9ZCPs(T-rrN(ib1u2Qt z?PX~=#Tr@i38J+=-E$%bK2%;Pc&B=ad<2jVofNa4mb1_TJqr7@i04^WM>S8Tak#=A zRYSO~R;}U@VDh=<(2gg6i-AZA6VO0Ik2xH8LIcij z_t$SvIU4xkZR~<5%Cu=2k=mD^qIv)AA4D4zE1~HSMAVoH|N4D;=$3B-*IWQx_zA|= zuVfDa=|OS1*3%HotlzVno^*Ttd}tGBTpk&^97FK4tADm zEI1OB^F~2Q3+}fKbe+sPx?L=Askz{Oh7folH|YrJ;iZSTWMH%dY1hqFqsU!=a@Y$9 zhy6OpK~vMdM=&lv)2Te&pi*(Z?*o{Gv3__P;XV&Az-fz=`~#zU?VgX#$tb4p3BMwL z)WLN2I~mu0h4`Po?TkpN2q`1WC}KH5H;hfx8M%Jv%Z;())2V||yt>+T@a4ZS&q?8y zZvj}Ke@1-++UA?8mTkzNXhia|vJeiY0orJ1Qi z96{vKD?9qg!OR_??fq^K03G=X!oPesaO5kJai(dH$5LeN=6@FXX%S++Bnf!-cr0gO za?K3YmdG*M?`g}+5->gQb%ftO4fOm!qQ+F&PvMdDK%fgF?GY}7uVRUvDN5gYm>``L z>kliO1fvww=}@G}E?34khFYzdEi>%a*y3p~C;aZa8gO2|GH^WYcSPzL zxASZh#A6iu7C=1iX#pKBO##IK0(CC&fcwZEG4NU1^w6^eUh*=@$XIRXtBZ+@J$17{QMiEWwc~w!Xu?+S;PSv9n z7|P#7UUUEz1sHA(p@4xYK=U#^ce+l^A(+Nkc0XULwzYVzY zDs4aj5fnSX+zZ+3ki15Ocikfg=S7MY+-|CVcpKJ~p3wmGJEs8$|7vu+ua9~EQt^O` z&@Bv&ses|a6qUt&X$QfucD3pVuR(Q8QP%j#O*MHRytcL_E)wzFK7E>s2FC(UI)`cULvRkK*&KNUmBCGu)dgi&4tYa zYk%jQ+C0GK(m(xJka%b-B>|ea{%8LUH!!)qv2LImZcL9$KeP3s**eac5{9ni!2y~) zb%d#i2N=0Wr=!fOh>P^LJ|8Bg(+iu)VO;tt3X$qn@6l*Zb_}Bl1(Lk> z*v};GdnDuh4;g7q2ShrcZ@G+F&)ZrZwtbSRfr1Zu4%0J^Bdi3ZF0`A#mezrxxt34e_JF0nqyGc7Mie&!DCGzwLS8=FS(>S7SE5WRL)J6YZu#OxrV#1y*CE zZ+{*5!13Lr)t!RHz|cZmr?7XJy4`(hVdzC$eqoyfA&Ap?uq6mHr+uaygV~Y176BeMJ7q$<5-O9M8UfFXPF@{6 z0-FE&O7K@c0-v1T2GY^>*%#k)cydYCyw@SLVj24#S^C765s1R%dnQ!LnUat%{sj0v zuK{29i4}{$!MAC zYjP^6dHT5qB8ocO=LiSu`35}DGv)K_FC_Xb4@JnO~~d)*nsI$m34+k(o3wka+``>%hCn{ZxUUNF(awY=G^P~2cA z<4w+TH?7GwHhU-iFw=;DO$Ms$@7_gBI2dTPxj*y9LwWDn9l!?r()J=C^h)Gt85tZ2 zDS^yJ+f_l8h?*G8!hRsUDum`SSrmp@K=YzE(Td>t{NI5$|2K~Q7)(ZbY%mjLppL;q zg4r+EzTN8y*lub8Mr&Z27iI4f;;^nM!8Z%Ic)h@GM&#Hzr>z2_hbf4D<`JdN*%%G( z^01_#!|UeRbg+V|wwrjWU%BAR9xbDQWR6K=-}e81a0d>VHB=v5^g(oP*m&}I0m7}f z*{iW&7taPb9Y`c|Sr;pm3`}Nctd}`h!1(leuUnaU&T7Cp_q|NjD3hZk%PSFCV>~xG z;Q%ld4d3&A)GFr7lbbjzfVuWMVz!z9g_)J;n&{b_)#@n;h(7g>F)vR7qGR4vO|lKR z$-B@Eey7MRCNXS2J3m(2mZ9X8BbB{pa#@+_Ue4pp{85xD^x zVt+nUn1K-1rk)1@O*C2&Dgv9)_c6;ChyMoQq5EKI+WgnR1s_E8w~y4B%8SU2z1qTBLT;MAZhyZJG4Q#POjjv_quCCfWd%+^;vs(Bpo8?YseY&1JLmSaOO ziqbUOjMP0z#tx5K5`A7Nbx$q43=afj!bT=w3-wbRx9bdidml<|eN5|q-Ur2;EhQp6 z`9*E8el-C(EUS3FHklG!q?*eDp2_r_!%^5VGg50io5e&V4_UYnZwhz!SrNWYJi1zL zG*d%EIn|-FTCSS;z(os^S!n8ldd*z$`e-+gYY*a;!Nd6C`%HU+yZ0p;>6kakT9~(< z&E9$dw3tUP#~b3TQOel&aI87)eF$P=a`A|05Yt6eN6g4iRI=L8fb)vC6JGvy;MxmR z4@qX9ITdJZv@|{YHM%r1HH+3Rz&%1AR0MI9Q{n<+l(LLqUWmRgLCc6m`MPuO=MC%I zrwvuOglAO-Kdq8~Amr0cgRX6DqDa;da%oLE@C?H2X0N5Eykxn%e$&;!7ysTDTeS_} zycpd6NLWbzuDgWr`S*6WJ~wAsrEThm*V;SP=1^VF+iMN_$J1kv@NvlKvo#pH$eEF7 z?+3O{m-A(>(bJBVEwlRdH5V|hz0hl|z&rCDj6EN#TV!hz^Z9FS+2cL0*0oA&gC&nX z7f@&iShmh0#*Q!>un?^dmMl%E@5wivJy`f-_v{Q5q=xxH)KP6Cmqm*d7oZ-kW;^C$ z)lHm7YblM5&d2uebCGX*>#cGhdlPtB zuyMnovIuJ`s=Aorg;BNL9ApsY%fCXfw=){3I5lu^p|TcY{jWKPvUhCv@Q^%`siuyc zrj>`y%Ylo=!k*+4f&Gq?ya815FgxmW81kW=`cwC3TFG>M;qO`EJY2*LJ0*YflFmXy z5;l7A$%GfZ8T7~}L>EkWzO3n4JDpK>B<*)31xu6jXtDHG&wi5ZEqeJWpqDl9)O|*h zuG!Me*M(~Oq;Yd|M5K-_%1$3UdAT0?r6#EF`v7B{A@&qXBFz;~00oWYI_vnppkyMB zMOldx`Nn+jKhIRiXXeIPXOh)JcRV=7F@q~1A+(aAmtBJc#f7gaOse&6YO5zcx5axN zy4XRNeVTFESw>+r)l~ZO`M+P@xe6pGkPh-I!aIX82AtX+wFd8Np$xyq#pBE;W|{>7 z%gf%@fb*YLj&O_nuJ+C)8=H~WiE_;a;+-wFQ&{jRFHS8tZg?v=iiu8Kmnd8)=GRE? z%T7-#V@ox`Sju|R#uLaBjDGlNJo70Ni3JsFTJbIM~b#G2;e)(HzqOxG9Q z=btzjF)F6ol^P2P6Rns!klq}Ogw+2T^_Jz5Jsyo6PJ2F9x2ZZKR@P16(5g!#!amns zX#Oix4eaMAw*N&`-@atGqj+WA^m@DO#z~4>s_eK4d|#g;11gvJm@=TUpqtz%$nw&q z@HC0?&&=9C1pMknrd~J(A3m5U;RILu4jS!IG7T^@85#93CV0w=K+8Jzi|+>ui0s^+ z`-}#94vMW>Xr<(g^wST>D24T`YNnk`2mR7meHjSZ*#FYEt_~bepFPc^zrIYtsQSYP z>PO!roPFwY7JBN7i#6bkh!6VRS`8{Z0Uy79*6?0GCrDtxp^WZypow`?>*xB1vLmt- zHz6f%;G)NyUrhrh`iEle)oR*bn#Vc>#=bta`_~Hl$j(KW$TcJ1zavyjq=CWnnp?l^+l%=K z3*F~|g_>EVNH{ar?dC2M^g5yYwMn$ZZm-38O+;E_9;yD9a52fTV28 zW-u=~yDg*uw}tLcDySZDK%?LLEp~{ok5@Rt18IB6w#vnm?0u#m)#ydQIx^G@j> zPkTJ34c`4pg`d}_Rq)yiw}0(tPj?OCF*ruLZOKG+#r>R97xPgql;%c7uT46O9rWW= zc24S7Y*4l!>y7)@qXGD7ky&+9-=27qpT5@uej~WLVn!V1dT;fvqqtq zARu0|``jz)cywl=a<&&jCC(GM7@@ev(Zl9{dZ|aNS4v{K1YqpJJu|Tf{37mhlKs;m7D(4K1RS@oa*NOB-lcuQ1sp&u zmYa};edR8?j?wuaT+B~^yy4Ik-k5lUM3}{yj0=`j zDa}#?D-{(yP66jMri@Op0BdRgjaZtly9AUq4HYFYXq_H5DhDSuClg^`*kGa;mNmIb7UqDHnx;f|@Z^O}=-WGFXTR zI;X@#f2u-bAewf-WoH4m-lX*fmxnW`TI-kECUX4NxYcz8QRi*77tT)d_J`ji{^~hQa^HPT2mcE2sXx(wlbLbU@TBN68JQ_O_pBwd%{iF;_;iE5Fx4fW>RO3!xU!ib zzmH6rzCWZv;zb8OTUck*PQpSBFxl&6@P%>OI#-`za!o78mjO&1c+?uhprsTIr-n>N zl5B^a-nb}cOjh+}UCnn5`c{{IHOp1z?On>iBbE z8SlsxUa?Y}{KAxM=7zZRiq!ET`%o5A2JiaIv@vGGjA4vm|1DZ|RK!kqfUoKdz`uWMm~uCX+bnd!j~i!-* zo88;bOTA_`oe^fz%UK`vjv_fMWRSz7T|r##_nRa9Y#&LkW}UJV!YOPYxBL&LtG)z0 zbOZ4|hc!TLptjzXh1lH^gq)?Nzu}e*Q%P;+z1L-iWIQ0ZmpFwzXisiS9DS_`A3F(r zPail#S!}#iF(KqIQ?X$#k92RvUi|>@N4tnQcBmE-!4?MWI-UKr< zJZ{U-bLcPr#hk0R#O0bfXM86c=M4&GWvxZwykah#q)0Q&@i%*wgJk6l58ABtn#>GF ze24JTly$O>KFg?keUE*r{>hF<2hS}xnwd(iRoYZaoaj7#X#vr;6!L;MsCm2YA~l1} zZ1J{lbBMGAbFw_gYHl4e6Aw|YwxP5=zRzf_^>+@k^IF;CIIDwqX4ANV6~LOJi%uO4koPX8GDXR=S~-JuU^Li#0tGTzZ4Wn9NzSdTlC#!#-`w>6!`MQelfDkaq^2C?VXrQ|>ET|Q(wzZit zdgXs!UY=+?5!2sj0mf@ujHoY3L`T=(oL^vexQh~-)G+L|9z7;AQSou^3_O0naBDOs zU<~XP56l?2vL2Lyxc_!-AkK2l4^;3iZL8D~Lw(<(iAbjBwDZrrp}w(_@|l zJp2GHauzq7%iT~Zxcf3v_h}-fZR(Z@YL`0YyC-CnP)_s1ZrU{4^-iM|7%+I4p)&tO zGjT^NsuI7rhtUNj_ckc(DiwDd;h{vo(5Pc!0YX`LWjykL&Nh7!c4yN!zQBFGtpn78 zT2ddmm1wQtktDI8o318%3W)bxbFF(UiSY9~@T=?sw*8LOKS>fZ^4O68i_<$nwK;CX zT@(3$BPOd4Nazmu_;4&Hq(;qyNPrmgVDM%sw2Yj%zA%-K@OXPHMose^^&b+`Kwc161UEQ<1-@*cb=k(jL=O-H=6 zGZD!H9jdVY`nlWywDa|qeMG*ONVc>Jn8a0=1=v`^AYu=7^k#Vcq&}m_r@EUnov=1k zF2a4}T~k`8gr%@S=?%tx*m@sR)oH_0lX0E1fyWCdzV7k(Vu~C@y+Ck=9$Y@T z$s(uMq{D}7KxddoKS`P9?npOXUB!ZS=AqA99PCT~QP$PcRhMHDH>xZpK|EoabN@E% zd~erS#$8Jy;t%?z+_)xS`ugXQc$MQi$!Qq5UJgb^}cN|b#x0-Ak(9{9P9 z%l8KD$|UCH_V1euOwmo<)t@F=l)dyHoe^E@W5LYz#aIm;Dg!|_lxcu+wTCq9Y%+H0 z-F?fq)zp3UbB(3i@`XO&GqgdNCsZ*FHy;YHxIL#_>Sjhk1PtqH5k8=}=gb~)=h}x7 zisl))Tdf)Ny743iW2(2Bu*y{C&9Q9ZAQHelrm@V=?tS-zrY7BuXyObWG1i@t%abz; zfig%pobjMN^*rNVoh5S&OB8oklE>j4^f3SF2I?m6;(usif-Q(JLI1|tDVRt-ywFe) zglF3j4f`c&1&IL)8Dn!c(lqOK%9mS|iuzfxF&ox})>j;YN56o-!qrZn;+`MpaqdeD zKmNW_-aQE(Pn46;SeI6?H)e6kFw_5*pX;_D%)#9boy82NW* z#{)8Z6V4BkZMwx__t4xeu3MLTHtWgxL$5N&$RxYG=xxqHQfzNHD&<~UU0gNxp$b;Q zcW-98^)tj*dT|WQPzXEz42sH2i}q3PHBKD$HBC#*y$nrFkOGC zvaFlg3qHnl=yS*YJ^TNH{$cbZ7E*tpXDD)&4iA0wqE_13BrNl_7GV75Mc}V~w(n80 zwLG4T^+aL1&65C->t}vE*+grI z@Z&xH)MF5-wq2IH(c@?sP-5gYZWVU*_U|)YeID`E=gUG7_~8dI36Odq@h-Ud61l$q zGK-*_n=9h_3vGGhnZJb{O6R`Uf|8RCJn$Fq8hC_duDys_RGQoBzFQ2AWgf|W?h?m~ zrmz5xkcjxfZFUj%94n80KreM__JamT_uLR`ny~W3jb~qjqLesXY&s)jH?im$jUqn> z8L#$Sf*UDa0n6149LGXoEbeyA<*vV%D}#RhWm?GxJyf^E?sJ%eX-Ad~_CJc`F)7YXA-ACaO{|PYEh1-@*vp7RJ1;!o21%pSS{ zt0n>4A-@Lt;`=DHuWL7XoQg2YQ(r=>4z}EbcELxAD`(SA-X8Fa%YUD2nq<$m>>ZM* z^>r8Lg!6qyT`g2|gkllMO-l*;THw&bcXfdn$jCIxQ7&VQYO76GzzodXX%B8o44A&e z_1}K0u9tCC$nvIotsettG&0847f6H40#(USNTU`pqgXIBVP3VAN43kfQBO_=@d13$ zLz-r4Yi9d2Q}xJI*y+9h27J@jtW1qviQYQ&xxz>cj}Zy5WOKeeA?-(bck8g3=z)8H zUiCN2%M;*97g!1&DDP!Y1^$^D^Eg zpja1aeanjFqNJ7!?JNMYT_e>V)rKK@ILSIeM5WsOMa^DhBWM_X*GWE9`X>( zNf`}v-}rq0;~V7{f^N%M%{IAWz@x)}A_08tmrmFO4-K&`~9?*u@vQa%JQxM0zm5aOtICY^yrpu|T9z_6i=Cs}hbVF7{(=q7dI z5+z??MDH(*)Gv>a5gxKpC6bSJl0ruvGL}kWtz*tNZ$4RykCILtH1SM6mLTz}1e?yl7Zd>=z92A^oY* zeV;Br*)+CE041BT`u$v#Gb09#d{itlYPc}EMKz1lz6!Q=QfXP;aufIcJipE;$6f+)KoI8rq=oj(QN-ov+UyB z3`k~f`+fa(Z@#S9OZvyZAe{H#y#mgtrZa6^a*q(f#E|u&UFY5Ez192G9qEYDXlJ+f z#+|9jK0d*MdIMmAFKr7mD6T=NRz9bu28VKK>bm|8+&0&8%^-ip^N7pSEFOPl*e?;0=VEw`#!f%JUf4Uz*d{ zK_z9#y=n5>U7iFG@}N(B*eB`skMCu-th{Qk4CGoSf~eMlM;*j+D^b4>ZI5R1HJd}MNt$;Xrv4nWb3!wrp;TR>1W zQLbY-*a_8lvax)&TA0%L=+YmBsXj*8u_q3Je zzFO~Qi^AsS%(6x~gc0F=e)0>oFxh7$e+U06b+CTv{e%ntM}kMr5_2U#)bhX;?vEEh zttF--dw;}yb>PdhXw;|06Jvw^2)x5z3XA=O=MkboJJ-fYK}02l(;F%`Fdq19ETCC7 z=NrK&OhR>V@!@SKZ1(jtjB�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 Ef@KsVx&QzG diff --git a/big-dipper-backend/public/img/likes.svg b/big-dipper-backend/public/img/likes.svg deleted file mode 100644 index 5b7f830621..0000000000 --- a/big-dipper-backend/public/img/likes.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/big-dipper-backend/public/img/line.svg b/big-dipper-backend/public/img/line.svg deleted file mode 100644 index d082d59672..0000000000 --- a/big-dipper-backend/public/img/line.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/big-dipper-backend/public/img/minimize.svg b/big-dipper-backend/public/img/minimize.svg deleted file mode 100644 index 2fd327343a..0000000000 --- a/big-dipper-backend/public/img/minimize.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/big-dipper-backend/public/img/no-image.png b/big-dipper-backend/public/img/no-image.png deleted file mode 100644 index a180d5c59a5741510b26d5f64f0e3baa9988f46a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121355 zcmV)gK%~EkP)y}EoMHmb!Q<0qhB`78BSCjXN4x|ZFy zR@;*=ZTuXX;X|hR1)NZW$KdATdGRm0?tKF*(4+PqWxBj#EZQ~b$~nnK_vU3zT?_0y ze#=C#B_2-C538}GAIOc zyTbp;>u!Pxo?E>7gy9zvTf?zE6`i^<7aa9@Kh`l39NQl*4j}NPcYWW%%RBEd=6ri1 zGoBtZzdOTZchK8-xtu8v^56PPS&Y%nm`t1`J}2Erxf=mb_}Rz5b+q$%O}g6cRBN(v z@1(W+`Yy~3AI8hdl4JSMNJU_xe)7L(yNYBQW^_H?N_kY9CFq$TDwI@PJd};$c=SZFj*gXQU+_iQ&YRyyUyN@F$I{sovNnBB;A*W7*Pk%Q8np>eK2Jm6 zV(%VH&ou z(S#-gbF*4OT!Y^NaVVS4T+Z&Lqgv{%%UNnEmUE6kfT!r7&3bQo16_=lrZWxN407?C zQZU+@KT)nN2!oX*FjtkLXG(3v@X@Z0p=&BOH#R2$h+TlpAkHsoV4W1@A4W0{f zO}|UOZ&okoXeoG2XxX+(Fgfcpg>jSF>5zAquH|Yyb5kdd6WLvOZ zlgs6Iq&A&bN(KvxOz3EF;jzGe7DrA!5f>)KN=m|%b!P!vE*`7q3N?=WA@-x7e_)Z> zXT>G@=JcV}9%}6|SPBV~ttv-M!qT?Di-iX_IYT(AcogQzXL>@w^Gdvtvh{t# z9Q@ZJCoQ5YY4@*~W5d#Kp>y%*27SgH%WX z)tkYo^I~#G6Vc14vjVg8vkMlQup0kuODcX@{f} zqV8Ka{FtfZ()VGqN4hoIH%rB~Lgq`L>h|s1foaa`q+L02EZ4Ur7`v_*bhjnBVv^cd zyiWJJpjA|E3O$WI?eMtDe~?vj_PA+_jAp;Ps*PjGxiYu4AGU>?rWy28NS-0c=;pR{ zcIva+e5IFTIW`Way5DNpubnG}8-EjgEv^oZeJB0+9`{_|klp2U`yO!NO)h?))r=O* zhUdNGH_SQ5Q_Ozt`!nXWyyIdIy>))ZNOzcXU~|*^2h7Pa<{8&-aFX|9qjP#uAIol^ zFy~0EE6%e0Cf5%J*6QhMm#G+OE0;C{sK89j{jAOM{C&+fusXV2q^*0`cTpdD*7h69(mu0yHM1NorM$m=be*Q`HhS83}H4= zi;Y@NuPPdZUcPQv0jHn%Ba6hSB1vx;7h-o)c{|6sq|Gyu)z=MkRz)Oz+@AWi_;H@s zSnzGfoU45?erbElIv97_!!_b^?I6)BssTBnw{;z7OeW?iW=BQMCM1ljIdtRkfH_0o zeK#UQzGN}K{ykw1SZg$=LP|O73+7-^&?-`E4BF2_?KhY+xtlou5pz@}&+a=Ghsr5m zFvsOJAI9*J^2-mHBOTjS`0Q%0Nsitj<&V$ynx9#~!3fkh6`5-Y#LMY>AEO~q(cs3LP?V{Y5 z&8~KtwI(ev<7^khfiIc_8cMrs$clzwZt&*qgJ}ph+LB#dO1t#rFi<34MvzsafRmdp z=V9UM0VG>AH7=WgNB7j_JE)da(7^KjVvHq8_DOu0Urg!2BYXrPnkAjfCj~}=Mh71k zYVl#bLG^w{O+YET%I6`gMuP7k4n6mzPXr;@)OCaGOMkMR`ZT&_K19AcR(PBv?prL6 zs-oKpF%wGn$Be!Cy7KauQ+r=Mi(5o0k4oCoT!n zeeNA|hzDglwst1Du=oXYymHSmEG~jMwBifqIKIn=R$q%1=1&>>5p#eS%)``M)A&cs z(FmX&{@IxOf;kPlNGJ!r)%$=sKU=8@HlTJ(Oc)L*n2iAk)it<4-a?&>pe-C};SilB z448=S5(cX%0F&|N69BCw<-C{jtm4xU(E)IGa##lmfOoPawrPgPvGi)1c4qHgo4hfBAE3yW*t`7?y+R3Rh9^ zDMJ=q24Dl+7_J#gmQ%nbgQ>z76I7!SwAzuSxRuIU&}c>FC1YQR6!oYJmk)adC+$CB z#C1u4Oxvfvx5-m6^m@dN^AD66zJufxPR~Hyc&hfVdpm@y%OmDs?9v5H2L$U#d|`2CJO*sy zm;-D*=>X%9jSrXuxiUC0LhSoQNw0Uz!EOWJ(blh&NYusGWgQt409?j0s;& z?tJx^->+DSFZR99*Vkd7yE8MVZu9+2Z(W+#_e;0-c%p}u>BX-l4`Zm9F7EfDWy*dw z;#LE|18Y-j@DyrpPbYNSnJVxdK*oKc1#AesiF>O zhY2)sF`kW%Xp#Nw8tRqPKhSX})h}$Z+?ooDEb|Pai|42KavwU3 z&9MwH_T!CPbngCOWS%f*^Xmh>N4=bd3!1f`044uTR=}yK?~QgE+64 zGZnrW;7)@#n1keg!rcRzC(PN~n5{Rhe8e1Me=}yg2_9ZB=jFBQ{RMN5iKye`PEX%| zPD}s@If-b4XJGb}yqYZCv1*gSfWqfC$*?w{$0WEM$*Ryn2Z{)uw`en1Re{7^tOT*H zWtRr+%Gw!0iF%RmK5ojcamh(U0r(;E^z=ziWm{fLZ(9v$W<|&8fY(-$pX{%9PKfO$ zCMz{YK-^RA0|S#U@oNDwJ6@aC48*Xp>AGd~DjN?qbxD4+@!5O8U)q~lX!nQcK5ra4M8i@^b|`z_^Q|cyxL+|=V@|yuJ7VU0-Fl z1)>dxu`ky-CtDw*@joUdstUNQwlQ3ymxZzW_BHtlS<3A{F{k{Wruy7{2`=t9cfcGG z$RHyIU3ltGd?w+ z{DL`(CoO!s&$-N9_#Jbme|i`2d7W4Lh&cwO95RYd3qZYnlpy?JRS zrNP{ZdpiiE1ge(nik*C)6nd&o()C9p`@|dnj#;dcy4nw(+rW#41JH}CJHNq|wDWVK zKXtRyJ=1sDXFJ!gYh|~O0JfJRv(aPpr{6o<=g2u^CBLqNxRHF)loT;^CqLRh$0p-W z|8HuZzlfPn|X}?L!?zveXLw`237&|S!4g^nfL6*7l zXWLPAZM4@rp!%+AGO1CK z{u?oMzS=za-Nc+W-n9SbBj;Fuv)5h4uxalNbE@oz0cSoixhmRE8oXo9!~(^qQ|UT7 zf1fd-iG zbjpU--rsdEd8b<66r)v}aSLsxO+xMk8C)Lkb8QPPN_9D}SAGbFD`sZ$;ZAy9v`9Y$ z!n$JZCu9D#T|WhWpX5M4z9MZ;R#5i>lucpK#^OJReB5dbTQNe{1V-?gW0dvXz(KNg zTQ!bM51f>wcx2LEa_tnPYab&Ggj*;k+6KWzEO^2*x#0dyi$-hN0raBv?(}FS_+xf^ z!iElBjW&MIVOW*d;N9#Rkf<bB*wBBfoA8~nqOhgq?3@j<9gS@ z4d!&|*XKj7IbqIK(OInUER7})NQ&Ext`Ua{HL+0h5+GHy=i?n9PtC6zK)K)q#a9FU z`)Sr}3W8%gNckkAV)X5@KEJy9U;F)r^#6S_7p;TN-UpGRADgrr`vmuao2NlZZC^Fc zerGzn7eAdL@t~Yud-USNwRIgRHrot6by^X#Zh9;KSj}jKuj{u%y}ZbANre5($y3kY z-kbLy+P;^f9%y{1emh@Zen$3b&ry4S}8DU1?5k9Rz)})Ioo>JeyEU&lAHpI4*OP?Aqu($WilC8@D#JXW6$i zWK<@d>erKD_!J3Xs+TGuNM*WdVWC{`b^!qpIWnC zy*tp`Zsx((L#9)=0N9OcVYrS}3%dTXgm7XKIx}j_Ki-6VcF*p5w)h^a<&!9lYDtgs zgNqgzppWzWiN}2qglog)0%G1Ub-X$&84fpPczy8FJIqOw)%~mSIo#zF=9FZ18b?;jFI%E?jR=82h3@FxX#8k5+0b7fBf~gKYiC` zVB>3}SZj}PTSSfa{&hd+fzli9x`@p%y~;(68dG%iY^?`seDhTcEdME0|AZ%T?TJVw4)9R|4@*YrbO zxgS~IzGk`Cmbtz=ZXBx=+x2^gENf3**7q9MW5&rd%e+Oud6XrjjEJe2BlYKVF#q61 zNB{50oY}E2_b$G%GH+bh@8j)6a^iHy)-(2fq1&htw+=peOcb-p-T4`u?V1AJ^YqI1 z1D)CWn-1P+K4Z=aM!GB7zb_2kjkIAp?|s9Z)01-?^9V!Fm~+zI7ub4c`ImufHv93} zIUgDK6&`!6&l&bhgj!YcmEK3f$Bysf6$FKz+72+oRN z=Q{dX8HVE6iT5fg`i&JTYe*HESTB*pvr>=FI?2A53gu%FZUMbACa@LM&>KOf?AQ7N zuFNtshWmuT@ASo@t#&;o+S$V$4?Dv9PG%Z^r>ge>Cw3GKf7L)qJD`vl%SR#ixcwSU``)NOtl^xu0LQ- zqj}?K^JO^mqn&>bRE5y>={jIU2ZKF$kn3ccRR0nf;*fA~ghkJo(vO5)9_vO`oS7>& zfChkPYa2~Ql=Mv*{`)&NwN3V~A(ioOmPN8im-2+hrm5H_UD^6wKelHNhE{OZcj;DK zO1sD+(p?+glD)O2^XAe?Ph!g__=8xnzKdonU9MrYojBwkqi6eWTc^h?IcdnxqN-0c z;2U@(+Wi*#S(B4)+4Vlm<_F$|OYQ^UcG=ebqxoga6al~Vu}KShg?$JH7&FO7hD~BJ z1`pHM#M%7rzw9d?^Fy0uU7=&eZ+{%2#5;8k-krB3x$DvWJ*izW>VDeo?GHe=r-jzo zQ~yK<_!<+Ic;xoS>c9K)j)42Sk2h$T?fjMIn`q{klO;dtKfr2!(9aSWt1|{mvbUcP z=zJ3k%{M1*w)k&D^(T1rtI7*m`NN_qKY79&&@p_b-fnFoX(r}~)fxI5Uxw91OX41y0s*NVssmpJ*0tQc(8lT6ipBL9Nf3l8FYH0W5-MJ2i2AAao;oyM zM6O@k4bp%qv3)wj@%kHL9gZ|c^gv7iM~|rN8AG}#fgkv|)K`Ji{}r&M^tFL3cyn5A z+bG%?zCm`$6IL*n(XfK&s%ERRUc93n#w<<%GHkXM_%&zR#a15TyUebNfMX?L8E@Z% zr#8r^`?1Fpg9ueoOGK*rSfVn$Ms&YuF;eR9_uYr9F(RJf>z6*euLo?1`w{ewfbIMV z81Mz3BfA1q`G@!d-LA*5)VHkD7ER)}oia+Zt&M|QphJ68A8Kci)O3ArgK?tityin$ zo5EYOryT{*ySEoHeZ+wN-!)b>dh&O7k6QXAtsM3ME$D51nCI3Im&6gs4jnVb?=j~R z4CD7iI&JX@bBuS&%b3tXBIZVCCUul=eQv**BD?K>l~%nYupd9#M{F&>Fzj1oHiA(SFSLyD z1|hRebmrLedJUfi(4mFEjXoRUo-t%SoTCWDoQ*mB2+2SzE{xgbJ9tAIo9~q2Fy82g zI4-;907kw^=8m380Kdl%n;}CYL8gvgL$Y?Z;Uw4iU7x1Y18;r_NrmS}z_0(#m*L`3 zKA^qHGG+Ie0JdI3X6w#gH<+V$wAuA`@;!arz|ihZKgo^6QFg~^#s?@XIy_zNmw5Q1;qT_J>-8f=&VjNEGCuVrlQDl`w%2~v%BgIohHDvDAlOO<3win0 z?7LWwwDMU-a7;Zp#ubC>ZSJKorjtS0#u_@g78EK~a+c{DNV`^Gap{VH1gEp{tlyaj z@QiIlYgG23DxSJutqd4j|7gC%a}#De@Cki;K-DVCb#GEYAS$+UBzw@&-u^v8*kVS29=Hd;d_>q# zoEYP!?Lo*_jiZzG~Ic?2+K3`bEmk}Os{6TH-jW)vi zDBqKxbU!54q>me#aG0#Fzue@Uul-yDStbujyInCXe3`afzX2ExbKLit0mWyY_%6xp z7}GHa?WaB5^W&PJruB~@x7GUTplz}eH!;U~wZuVBLlk+d>m3yYDQ{v< zNyPC`M8_6YYhN&j@?lZ|Ox5(tb@UZ;uKqdV7a2!Ff5V(qdnmHmu9l7S7nlQF4C;qd zg|QR!1#{f5LA3wEvME0vI_%Y8O0|N<~l~+N_-YrwRqv*wK0~q-Qeu~PcP^~1qtV7O@tT!{znfX zXNAk$f$E}ZptJ0InYFL*GI~;C(#a|1E|Vr%JsA-2=x+jBw>A6{)ggdGKR^e+gg)F? z09K2)#lMCfz%~M&)lu^`O%hG7;MG>6)CK*^TDt2d5(mZ>U5yW5wDAx8tBPjvS1Rvw z@l)cTONwS_r|h)s-q3|7Y+?@iU;U6EDYtY6jBz>m_p3}7P#?x74#LG5bR8>TUylc2 zj>e;ch{X&*`VsU^K@M7jKhJ6kZVDnR+p_e}001BWNkl~f`>7!Bo=$0k!H_YKSSJ*x3A%)pKIeNhy@j>q!yo0wLbAF6iWJ_U|Uk{k;vA!^m!<} zze)p4{)Y~n$?ar0b!+xdoeOg8qRDK$&U@DxCWp@3$^}Cvm0sr-+vN_fH^^ksGC)~0 z)x;k;=Ju5d$I`DQiL`r|VEJR%*EXCx!3C0hx-b#seScaB9AKUDNq}dS*{T{p{^~O5 zgJdV09-Io)HHK}(hS znEbzCj*l0LYafGZXu04XbEt^Msw#IgKV4t%F-N;<@Q)ccBM*GQ9RC>x`Dhx(6+e^C zBj!Y}EV^@Diaqf5ggF*R>3voCI?I0P>8F+Hr1G}Fb0ea+R*Gs*FeOE;!Z?dflsM<^ zv6Y!u^bh~C@m2+C2t?jn2SJ`sp5~;76SgIbZDK`#Sv6!?p>#`QfeQ{mL=;~OqysQjWpgD%L&cUA?2zF?)Oj9;z1BpgrFFlCiRL(0rE^{w z6fs*ZR!MH!%X+$BbGyjEWT8noG?XPN9u|&e9XBsO^f=-ACb5!hLxop^6u&dst;THH zeXJCKV|)NJ{Gq>apIZyk1Z@sHL*-_}7wRPK^B#v`69dIrc=jSLxbL&?z?@9^wPI8L zBbnq!mu;*g_vUB%LpqER3Js47$sdd33b8|L7%RNy_*FyIU31Z{|XDw`M0 z*;COy<{-8ejdN_+U-`0O&Yyq%r&PH?dy7sG;S>&g&X-dQNgzF|(V-?>@m<{Rdm@ftj9df>S^4zGj$LASAm z*jV<7c*Gohp2GI(p3gG6ls|@1QBmuWuRI8Dd~(%k;5hrRR;Xa4dlgg>n>wzGy>H{7 z+?i8DN5*GqlsD(Kpt=n8DYOgV*Bw%-DSJQk5iwWa_GJ3T% zLd)?beGR)*NH5FezAC@?P5ozSL;LN0k|4rM&9@FmQTvwTDrFZMIzUGq6A5svlTosv%AC&#!ZImbtlLmj#Q+rZy zn^?^4muJk;FV-%e%|Du-r{oh|@$C4c7%dwwW~0@{^M-gnW6r>`mK0%xF6|TMfEA}D zmf=0F*X#WWa~h_?H=8}HX;8AAF{i8_`3tz9>7;xq@Pav%MV$DS{>%?=n3FuGYjS2N zrbAfy33FN)Ll0i{Qh%3%x#Z8k{+^k)FQl4JtpTcE-)43#k;GV$%v9Ki@R!A{&D#7r zW-vC_TMcC38y<}|Y~Tl@=6I9uTX8Y|&6v2pEnr4lj{C$rxxLrxiSPCs8_iDQ4LW&} zcjL`;kC!igxN1Q~@GwS8BDr6$CiL89x(3`=L{4J?)uAtc2redH`}Mmv_{4;ewsnws z^IMQN!rsaNp1TZpFRd1@7xkEA>wogP)6eJFIrSY?)UfMsvd`E*_Ic9vK{uNxoMP82 z$`8DKlBvbd83%XXEU^tC+!yZjev1E7RTxQ0Z6Xe^GI%?Wy|da|-Q%HE5pM`Pro3a$ zleg|ozG2S&>;C>b=DcA6W9JLz^p5=PqksB(m76~H)^hfIZ2Sz85 zAbVe}7X5k!R#auOG0Cj!J4RP~Pp4Bs`fduJGechL#&k*^xav0UO`dBk*%k*!0VdE3 z?j@eJ^^#ek&H8Ho!By^BqM~^_sBV7aFNZw*MuoNp++ImNh-S3UDTPtvTy-}81KrCf zvgy%zRajw>;1!dk?8}$iD)O8bbO^G?jQ$qPqUn5;bmzXV>VoMh*LVK*it*%fQbS$l zrq}RhJ#HZX_AtVt-*gH;A%=v>7^7W~k1B5?+g}yIB41t&l7mfKI*;Z@7`5qS`8Px} z9Kq42-8P1M)3%%_+qmg;ou6H&*pjRoIyXtYIyfY2n4_x)nb$&b z=)I(Ww_=(-oqN~2xbEK^J0BJ>pI+T6_bZZ5w3CV>tABkc={*wHh(fK z@@ro)XPC<5AFW?7hvFf}89lkr?E8i}XL-3;9aX$H%yD5BT0HCK1#?=l)hk2 zzxO4}Uay~43Wf6`;M$%Wn65yn4$Kt=4gM#p{@qWgtXVA1fMi7FQdg=k#{?fuV@VL< z_2oG}LE`}60W&{0J`++`7UZFmmfb`jE#C~l;4-?UiN1kcSXHJvXcM%2+=J8jOxF3U z812Gs<#!E)x1N1ftGg9VW=qB=NB0-ywNw3lHr}k?`-E)PCfQicuEfz+chIXn?x>_- zlN?S6HY>DMU@pJW$_{(X7Jkr4X7gF>JvW_XkDOfJ%fIK?^B!?vnvi~$4s?E_%jH#z z`LhDfpeBUgRV(w+lQi*3ymZgn(t^i%EFBwkiD$CRE-91om- z5n6tgVRrS30#6>u4@{1vugC{Q##X5-Lo57~tLY7MD!UCbDT_Y>?%P5QcU(vCVbiHF zEd$jDx~#|9;f1^VwpXm9DiX4?)0&CzggJi3hH@}Yix^AkK4DIfKcD2lZk}epV2)y} z+}-4B*>z5S9x!L>k}8RrBfnt|nGWHYu6ca!adX0)CQH_q1H8>w%$a_>|JH?CiI-wfziU#k=$G6BAg04*4(p4>>PDFPJ_2)^={(SZjI&K%a+nf) zmeH?>`6GY@?=`(>#*Q+Yh;k~(=l-ivGgmiNb&t^F#?jtgRzBM76P{?=3vhTvkDT7i zl3o8UOUM9WlinpCb7)NY#B+v&o%@-R`8joOk!>IRz;$vA=>q@-O3TKzZw*|BbRBRc z8&)Km|9F7ZXvM+CjCKL0BrZ1MXO|(W^4SX_|F>Ep?e#Q&0j>P01ynWxQ zNXrjtlZtIm#0-}O8Xa@oR_Ftrz*T{>qB-kiTNdJ26I^{luYXU`+A#;R_6okmoni3K z);;F959@l5oHSD3FlYaMs#a1%ub9&(56WeVEmdK@V2(85I|;iCzr~z^6(g2ycFQ(* zn9~-a^Luq4{DwJ$mw^8C&0D#Y84>x%zyGd73@VLibc^rgB%?+tuOiyh>HfO8tkRaP zvRW+9V6KR+3J(^$QKSEz{$e>=q#@(ydjnC!~09+%MSKr>P|-y zv-*13H&F37Y$F``@&OijpLB8i<<3jqhW>?;!Yz>V;{WW`boSNvz7xN7zg?~WrJS2z z#BH3s`mFog<1h&FyXbl5^(pQiM%;f1_DN3;OxE@oOP`oW-viyb@9|9G>u~SvOYx>0RCRRQO zaqk)*q^*d5P0lWC$zX|;#PG7MC7a|x7@sU`$#HldKB;sIQBLLXMWSp~yV~>T)>HTC z3MKViIk#-=G#=LTIR2}>CbPeM8=(6_jvx<{U*$W^_G^%KfHEE2%^a;Y_|c>PlF^$L z92ne@mx#!2G53t)S&3W!QZMP;C{$R*&3Wy*YqlIQxet9pq5az^@@ov&L(CXAyOggQ z`xu*_(9dhT)4s8igu5MJj-lMlYNg|DwDDm$pkK3gB}R-tYlpZ)sIM_|40-8r!cxT$ zZ%N!Mx-$6W??#tZX2ZGev%-2|v{?A1cCu?HO}SowNVsX(@*_%!km7a*VjKxlBa|_XLtzntoD0dtpT>$(sgljI_q??j7HEp#8z#O+*^SKBtcoFRL_kPZpgU=QP zs9GID>|m`Q@!AhOE&N+NEH!c# zGK4S;tn6j6_GAUhw@pbvpxS+vGtgk^mq0$0$ue^4&YdYFSHDtL?dZV=-E_)5`5xxB z4J19utnoMrI)|2X51u(OO4+MMJ3n6TNl)}lmIZdCMIfE2r08=~Z#%a}di~>2&+FEO z_gO9;0ocZL5O4tUYFF1xw~jgN)sepG5h5PCcGY4|7%O_RcG*YlEgi_^1VFS7&LKEK zDeB;IOLy5J75dJpySVecgD(drM2-<7!;6LW@sxbbYpuJa?w)#=V$t65O}^gclhihK zAhrn5(v8K>!yZ%4jVCa$A1vOj zbB{S;Mr{DTdDSP(IYlyfgd8^Z7tGP2Z)Kw!h+Z)3`Zp*VHEOqZboQ5Dgp)4>673ml;IEcHkEZt_$mM^+Il7cGVP zIOw1Uri8P6_-pWTwY9=~84nn@BIZGTXKrb_`$gC6_NnP%$m&nE zn8nx{5K)av()atujkQ{V4Djnurnx^u9*y7iG`ON4V+_}Wg-ACFaf7nDzYqT}rxmN; z$?pI*hB>ift(Kk~Pqp&B@pbwP+C!Kc{i?mq=}0?_Z!cgDWOco{+yVUnJeS{a>3F~# zQCJl(^Q-0-$0u}fZ^xV@b|A5ZoYJtT$NdM)p&rHtP+EJuzhTb7KK?sBO`oPGV_>j{h=9mMP`8S78`%m}Im=iY15r6w;>lt&_ zFC%xwx@ENw?}Z;PNBMn~?2yngt$AK$E=rX?&sqAx845$w<;?v&5Wr-gaTgL9lY1`3 z54l}_Bre~cpcg?8y+6SW%55{}=aqo#PqI&tg5ebEZi^{H1G7ts>+_`#pWxGuCym%t zysfBBPjR%a^sXd?ai(O(=ronDN?%NNgON=ZZNrKfeMBlNtB^G9q;P;ZcXqpMBES$UwK|gQh=gS~9v-S8K>& zRo82`{&H2crio*Tx?fNQ9(1@YkrEoOZ|wI+3eVb@dioW$YO(+P(AVHlcfj zba}Gx$<{a+U4vNPpc2B1Ihpw*DfwB6lPJAaA;SOUQdOu?hLCG?;h)yQF~c! zh}4q0?vA}?w6j&U|IHT!d@jf7vwMNf8GW0#Zf*Q=*1I33I=jUt?P@$X!#sZF4AUo@ zdWaI)TF_z+z#AXcz9#(&G`cJA&>1wEY_@AqmYfG#_jKldJkP2C4Eb*U=!#**$0sJX zy2_1#1>W{Ghi)Q3&ZnjpDfHVOg8&@=OXrN;@T!Dt=#|IB{%fP7&(2G_#wlcj=-}UT z%81}r?cmD}gi1Fi7xiKGH2Z@d@u-aE;=$az9Z+`P(wUc#t5W`jSPik>{P)>g^k^VfHeCW~?FMxRi@8eU89{jeX6GIs>G*Wb9b{9$%Jtwc0ieHrr7E zV5))n0kxZ)cbFp|G5f-{rf*eho$?8DKmyfhUWmy3sKgh{p&DoSpocF$K4DJRr?%gq z3)vo_|AslrkJZMgB?O8H;q737Bj&h1Ea5dW5_da_UF?!tAR=*Zt8=?*0|Dn{C2LcZfz-FPA<~*wQcuTXq-#Lv5aFh?nNy z(c4)?v+J_#_lF>hZ<|!qU{(<`7hTnU;dj?tn61141{UU=DjaBfhvCnd}~!SB*r z55arP>6pE2-NZ95`hYnzvd)qGJIpztXkfx<+KPRKaK@aOd1t06`}PHM$|_8X?K4g^ zTI=eM#8_ut93igp0*{2@w0gAvBtZuLEB>cIEHaVK3c+T5E~x@DQI`9n4Y$UGL!pIW z>oje91F50IK3=%|VYB|=ceTId_vFHS9XK20`dfS#u68)Q?0_Kgag66hr_DH!NK8)g zJocXtG{f3~Dr|DmcUuN+?S-Dr<*Up|WrxNU@=9c@COX6AcC3poxr^yvC$0GGQ#n_cg)LIRIjaEev`pk=`^6k#1pzILRox zS88i`p^8+6!Hony_-3z20t;tMNK@B26s3-C@7gd2w#@|3shD>xU%WV@6%eOmPFqu~ z>#YV`17pAk_!^kw74so7#}qcM+a}{P=8UZiLle@blYhaSSzW5=m6YN{q|tuB9M<$o zc5OMWB-0nnsc|hLu3ZLx%}!gbB-4m%E>t`(rL0%A^Yw%|$bB=1U420JJLc%FXz?5= z^cT+9^)pV$iPQ)_nJ6yAdkfY`XM zOR;5+kN}_=fE64IrMfm5;b;Qc^PXc#b~?0A$fQ9I9Lr#-{%x;$>W&Q46(g#TD^8^g zO&S#RvG{7gQDh@8?=(e8{@EP1=AlBiiTjv9TH~>d9IjhU2pxp?t=z>Y{3HD? z?9f+%xvoJz`JvW&(&1J^wR>8;;N>Oo?wixs#IJAjiYKEv#&1b_@d4X-tj;lglIY8# zD^aD44f}V~1{P}(uuru4!9vN-*Q%%hmsJ^BR0ifudrMjS0*;l;NY8Z#%qhlipHzyD zPc(gHJ@s$yOIx$LhW4Hj!{Y1%=Co*BIYNI3Q*j9X-!NxFtYfQkk;lb5<`Bb%-*Pmh zGmid(IWh5%!-ZvwUt!KgAY#u;(w$MDthbo6Dxct0zO?98)4(g{FmITS`a=d~Gl>J{ z{Q1}4)qjvkdKS|`CB#7q`>TThzeA3&>m=(?Tnxq;t@BXt_Im`4{2be@RXpIFF49DY zQiId&?dlEBu}W_hIn{i4-QVf0&L!ac_T73jApq#S@OV^7z=69;xAER=#g*$Ube;x& z;^dZt+xwIE;ezTr8fpW;DOa2hyC0ud^|&zG^@+&T$qUU7vTwG+1scc`^%9^Osq?uu^AxiolKr4BcY3$sGT3|Z`yazv|^UK)mt9ZzyzFx-0 zb+44&PXZ?BQTFsP(ypBo;`aMVV+HH(%5QV^WxN*8#K);#e8HR)*6J4h>ZmKq7?FSc`#%M+n=?m$l(T^~94U0&6+}O<^d}?k5UuatUZ1;S zVVJxLlq97ls0S}cnzRoWTiEUm=9L=~VSY1oCXktvr89l(X+|hFk5=~e$j^-gEh)8` z{~bT;j?JvADO;nQ{OZKVwsqrxZ7r2lp^qn;yAI{?&Yw?&&HH9`^6+XCT&GPt&9(c! zy4m<{VDHg4S4Ys0VpMn6HM7h1c(DOgU%p6t+da}Lfo?ecX~)fWu7oZ6i*rI+z1Cr!2^ZkV=-xd*-)PVDmb=owpg5Ar@^j(Z-3 z5HR2Lc*2}J{JYoiT5fRq001BWNklwj25De(`2D6t`(bO5%Q zYAGqKBTDQ?S{17b(G%A-nOkkw864c_q|e{edrR`|0F&ie#E|z&>+6Kl?^k!AR<#;( z^zVR73DbFjGn>3=`|>9ADM6DCc~9EVS3TU4Y%jQ>`;W z&-U}14n)sg5*$Po%aA?6t}95|)JIbY+hSb01!)?$XjizBmoHu&jA5+minp-;Og_q_ zrO!*Y+H|@nQ^lCxsh6fFc*~@vWXzta_lr*~Othk#iz(26T5>g!U3U>Dr>;7GC+5t`#n3%5$nH5!pSx#dgn{Z2VbVT<3_qQ9p0n*5SX_V0PX$GkA-2W8?`zFLk@aHzyUS_3yX%FD4M0=B@&7C z(&P2Of}V^z29)Vjw%8Jb@hspEbA^!%jo(C~L3F|`3VNMBaxDyYT2{OUU z($$brlQie4aVheMSv-nL-%-+u2yRrXedSi-#>G@1{b<8a3u_oj<0XLlIVw|2jV_rj{CK+%mdLl z@pyW`97`z2tZ|cRhH8X4M`Aa9zhh3>qG!fM$Mx@+Gkg~MDyR1mbLeXr?3v#nkC*@a zc#wjv%XyN4okK~Q=@k`^0au7NnwTVA<;J3*zD~W!Wdx0a;+M9nm_U3*X79ot$pYk&IF9S#DIeQ2JxF|=B z5Mw+Fm>n=Cm)op>`cNgtZR0KXz$^M&wU%ZW8@BmvYD~yBpKyRa=9qkEQgJygkTzL4 zFu~cgx7RHgaBv>VY3Q*CiNsh0L`3@qT*v3sbu4*m`r4K&yN^v;x{1O1c9%?&rdq|V z&r#==QJ=tO^K*@}rKk3y_SjeQHcSB(tcoo#=T@h@p-jn(8UZy$E`%^9jw(Hrm*}&; zdxFcR&?^xv+)eq8c$t_3O8%Z*w(9&y_Qn-?Rae`d9CVX$*5&jHCaytJcknAg3U_PE zG10!?W6ti6zUooeqKlqH##`_)StTtB7_6d#a z;v41|j}Tk_Sfkk4T|{=Ix@%8b+)0;uGrz2Dr}87RIc6b^6(8cOIRe9t91~ z%vLVv>>G{m?u+7ipS!u{9(F55 z<4JN|HugihYN2>O4fSI+5#3Mc91BltP`R`jq-dNe^u$R65fTg@BVy z+U&f6ZL$q?O!w#S8K@E?U1>j;G3&OfHKQ4Aj(Ar3kcZVB^vA}U>FRfrNZ0R&`GIVl zkd1@8?__Y+K6rCKOqWHqjhpS_Q4>Ark@w;f{R z!@=+B+x;=cZ%KalPv_CO={$}5IqunSPgz(~7R1Y_tu}mgKct`LpaY)SuNti_Cd_ts zueqQAMud%3YkaLygfrmRe~U>zA?3YWAz>=uIz?{baMHl%&=S3n4KK}u8x-1cHv)#w-`W@ylw$*R{eW9eMyAn0}Ji zI?e8rFPO80b_QajW&WjA@C^Y z&uyq$in!t}1r)B#t+F7GVx=Qdg}DCF>HN^7Ev3}HJup|$q6?m^sKiN~vFO;U-HXQJE8uX>HBe0Rxgw+Po9MVmz5bUGi-&f4pF#8&> zoyQBBkF^x!##a5QGLe)Q@K&BsF<) zz!rN_F~Bsi?S1K0A@e|^uasr2Z{)PeA< zgNty4>B&BU*pH)sYSQ3s4Ks$G@M=DU4<+B)`epL_uFGn+ z#DYz_luXjnl7HE#(}bQ<$#jh86&aU9x)QDdAFcZ&H{wQkW(r2x4QhIbh@i-;tXUu6PGd}y% zi#{=X#~l7@b#@!60$@|S>@E2?A|7R5^e+1)6Acuj$tn?fjU(sA|C%(X6`wonNYbus zf9>F44%V(Nr;mvCLv1m}!2~mF{ZX?%k>IDy5x|xd7mZrC`>kh9u&SJIg>U-!JIb+@v`M1;XrQ!CCdKyKZwh-Mpq5sYjs^y%mlqoc(TM{**= zH`euB03fKcT;*p)mTngB<$AUlyz-7>%-HL&(}2Q;Xy3qp$Aw*Hda~qCQbqFrkgOTE5M6 zpAmY}@D6jt@<~UD?-om()V7e8km)w!K%nIqUj0eE7IYI8HEPA$ z>dHYcT3q{MwOV0%3hK2do5}=CM19rL2v@(0uZ)v$3dVG+;OgYd`D?vNoB>aMCBMT- z8C?J#4@jEiClnW`c89)7^F`kI%cX-#pL}={$YzTkqCRO?Kw?byZSP}+4O_X09;+Rs zF`zKJcROzczFd%)S~DRg-E+GZ(h}0@H74@3mHCobk%h0`J+``KYz%beqtc4;uA@Xg z56_x%WBEX|@6~C+uCCu|-*$Zts|(PtSn8DmR7YGbLw3_==hZa0`kCsQzxXe|0uPzm z(xq{Ku0DoyHnVt%{^ZwdBaJWm-fCqu9BQuXJG!7@+Go+u6}xU1(SF4oi$zsga?!eQ zMq9P-m_r>e|L`n^2`cjdG01hWV~&q#%CNYTKYzs>$WC2QX7l^sV2&?Dt$nr%lE?5f z=3M`FS{e&qGcuM8pzbZK{X<$M;P&vZ}?&9U3Nz&8P=>|70aUDF4;3C6#yHxPWvx( zqn%_cE=Hywr*wktsp9wG#B%zYkCP^AnOt~Gx~v^p9)}5G&nlaq`@u=lT;IUA`99Rk zE3GQ%W3B(?vR!8Qk6kjarS)qE+Dq}Z?2%0$&;;U8w$X%EvgWdjA4X*YGg~Eo9|(Lj z(DWD+yhEObFfAFFt_`yiHfrrtfEmKSi8;cS82-E3dF6(W)D9mF$DC+(wKRGqQY<=@ zor#|gvnR|!+$ChIXcz=vBdw2^V^&-JJPO?3zF>}gUsWaOJm^zbj{bl-Esp`KT;{O5 zUoj^*xo4Ad3WiM|Fek#V*`%mUPesHue0ahf*Dr*E|5c04#(75k?DMs-8GKoXqT|ym zp?}PBxoX!8+gIL~p*7o-0_4?LQ&>1sp2%Vn;sLe@C14^f6di$m^i4liJrL+9McMnR z5B!rc8|&~&RAjPY8vjb`wk-0HK3wL#;TM%;_Pv6_LZ1v3wznhVkz4O55{#YJ5vvl23`mX~@6b zkHn*X&DQQTx3Dh>;9dNb^|E+v2XtqA;-X;!z=a-cSSR_CNt5J8ECLU`x^ltN+=>8h z012I-;sn(VAHOWwWxB(hrY`!S>7uZ$mftX^wOQDa z*~XwOpD{b12jL=6Kye*>z#RMR4C|raj=_#OKl))nDT0ip&B!ot znj*loO-YLc(0}pchUR2P619}wH-0Y~rU*=OYA7SED+b8ey|)AHKk9`Y?f&iGPNT$+zp(g02Rg(+l&@ z-Zz$>#4qHjTK;1I;n|$_ppIB4f|f2h07S;8)~6*PG#(=qh~T%F$%CtBHs3+a7^X`3D%+lc<5Y6rarom_6at92bA`0MbGB!XJt4F5{ zK;#6;FraPPneQRu6*Gv5Y}k=50BE;F(2NsqALma^7}3arJwB~Xz{l3OwAl(kEcP68 zvW*|AI8ZOrG&K)bUn~oAqH8)qPdZ3-Z~E|UmWes;8>DT1d(>AUHaq6D#UW!eI@l=b`WN&UeSy^)s5d64WW<_`xh%3*?%j5o7oRHo)fSLt_n%+T z)jh43?lFgP2Z;T4YsX1IbA%~ND46dI5(ULJ**h3{NKgB9$Hz*Z(e?Cxnw$N85GJyemAhX|*~1ZPKeT(pgVld2BqC@w-g3r%jV?(7bPkQTJ4;m+EpF8Z> zeaPwV$)}HTqo?81J+96=dU`3Y9?)j9t@Pd|G6=YC7A_Y% zNPu=^PnQx|GUu+4_FhyG9J;o4^GX8>3rejr>iBPj>qQc$waY`_D77PS+Bqv7(lV<; zZFOiz-p$!KZC`DNUYSrWNSedv8d8HhqTV~UH_s68pq=Dvl zY3278SNbG-XSh`^*@Arfhh`^Sqi=#cTsOcsD}m13IuJLO%mN9wj2Vk4!;l?X_3e zIb{jV;pin$Mk2!^h{+vW_v)Jki;p(+Czqp(tw?YtQ9(~$m5CP)jV$6-! zjS9q|DWJD+tEW1*nKYrNOHOQYAgQ{oLM!gc1MZWopvrl>SaU{9sCFKs_ffxdJ5%tk zbTAhw&|HzkKaePHJIOEy829@G;+}u$;6VS*FHH{U-B(N98E)dmX{_(Adv4*~cE4MF zy8n*&t%zfQ%u6FixotzbP}z{v%p75+X>ITIaLdncUK>5xUa|jFadjcIrTCd4^8NuU zYv}ftq*qS2fsXP1%-iYWH*9YlIOZIk$hX|x2cL$!!JN_lTt(|S?GAJ9hd$xc)bl;& z?Bsg2vEkiE%=sP+U+s7&kKI3F_y^1hSE1WKcAn1eavJoIu&slc`6t$l=(@c^2Kg|9 zhkzqfKpvv&jGu&WW3LaGjb>EfZ=D3>C0(7wXwzy-B2Dl1qf%{lXa@tUbu^iw6O2uU zeT8JmoIC!;lBwDiwU5PPTiH@~s7iltSO2YJw%Kt{D&nK5G@~6VbaN(b zZ+bDIj!x)(q=&xpLH~K?N5#sNw(s*Grh{wwzo%azT|R_!5x&p{nQqJA>MPSU zo*I`npiZ54Rb~9Rf?Bx+4_cPcK1jIlDnBi(7%R(#DnanKU*>MB-kQ8)JomweWYc&X z_T5CATQzFu>aRiP=!v=Ov!L|IgFe9S^0~qOaN+2-f$wQ?*5YdV+ymxd9n@3AuHS5O z-(!wPPIaQO>n*=w4#yt&LY){NzrdV6i8!IyFED4)o@ofDXQ4 zPFV|9t8(`B>e;}YKmPi=vTR*|3DWAugL1)oNfWeLV9d_-V@45u58r|(uVm$=Rk~D( zpQcRE2A}DvvC{!-TR!%I?012(-7EgS$0#D*jB{QM`t|OfquuG=;o{eGJ{?xnH!@vx z=`wq}U!5hoI$5ws*LlU=V&IJwWx4geQ~%@L=RUJ(=l9_M2C}>E@a^61A{NJ1Q&gUV%@N!G@rS-i3m1CFPrW!!2Pa~e<5195(G&pHo?>X-7eEjxxDrkKh;WXw| zS)4fdhDR~SdeEgR|4%1@o_*{0+PabcAE=$l_zSikn!RDp^f{jmXgU53a~=kK;b*pp zxbukT%Gf_qa4fuhKkxKN0H5vxWNRJQ4+dV&ua#Ej0(q?Z%3b<;tLSFJ41wno@VzuU zEbo6P(Osw1t1W<79`+gIdNeMxEE%n9oOs1GQ30nFTb3V}#2N~0atwc7G zT%Y}2wv{yUKJ0DpJXrhcyk1WS^j+MFTC}=v@=ESwW}{uf$7r*hs@W$=U40>cwePBm z3_c=OQLBu%qQ6GXzWCl(ZITuIT?-ALG)Z^h7`%0^oE{A{xbJpwq>yj=of((Blf~Z% zX+uS>_;BC!(cSZDNl~a`e~Z?b9IF6a^qJ)Q(i85Z`a$|m(`dP#!H3-gJ#Nodr`IsY zKtgt(+Pxa%FRrU^=(}T%;f*vWU)1RC1IfUjm?N8LLFxJq^QF^t`w??IFOf!FKRoMl zt$*Gz$LZtS@XVTec*Y$0P1j{mVmlgwHV>FX-^np9Y*#kkN6b+_?~@ki^8N3a-grH>mjVx^C@J9LL)r5((wH2yww*33 zNvm%^Z_@kszCjt9p?wc{@#NK_tMNXkUPKO)mHhxNb&|a@RHF@fZP&)QYs`zBKf!Rd zo0D1EDQwK@XHob=j}-F?#AN@WOmc?9fCnK!mt%$|IZc#We`caHE`2G?%QTGU4MHp0 z1Xm=p^*+DK{6;>7-@D<{7@3=G%KQM2H2Q?70}IAj0qjX2JJ@Y&xi`OA`aCTuuULuj z-`#2b_AbqLPfx(G;gOm9_+$W2`Pz6FQTDTOwzE|3gN>gFo+sOD{8OT8EqrUq+7&M# ziG;RYMtnNOGfvp|o2N+GE=7N*HBkh->6&kyo-JWawOF%+hd%D~Tlcc@9CIdEg|IDL zvm=;pIThwi!KiWG+j)J%oV|m5e8#yBOUK?%-14(OVFZJ2zmsG_-C@ot{P(`-7q6HD zjQ2j0S%aR=Lq1~8CfPaby<*NJWI;U7&z>;nC!>ba`bl#iyCj)-NZdDP4Fdot(x%tf zrAz>vRyLaCRA=BUXQP?mfwN9BxK_qt69CAto|wrZKm2dqkJ1=e@u29CwggIZ1&2nR zH|j!gRo$+~^`skqFJ#z7| zREr*ez|454WeZBv2vdl93qbUm=UK;yo3`QSAO;>@p#2 z1UafDHcV)nN;k~uXN1^p$$-TiY74h7#~fS&eo~ia;DJ{V!ei0-DC;Eq2K|TUz2F0A zQO}q|h!496#I=Lw&gvWHY~;bs4(AYn)!w~$1x;}Jh8rGj{7%#$4}Ml zLp@=R8usD`Du2v*B`KdUr{>6b>`*OVx0f zq@J3a^%-zoXtGseg0hH*TI2i5vkrZ|+Scit);p7=H;c^um7`xDf3AvY8G65LCEfJV zjtQb-B)TOBstpg61Q+`e&09XW8juWKCiF3mODh;pR(@c+>qq?}6f-BYT>UOP_ONu{ zJn%!p2Mw8wT?e)CEuT>a*ft~TMTYgy>9=({A1+VGcVZlF9DpWH`*>%5UtYd4beczA zobO#~uiW{cs<|IGhR^M?srmHN6HQ?E$zLaSnVf0J)ndF1m(|TNs>cWJckJkxT1-;T zl5+1v<*h3_HQiO&SwlmXR(bh`Ia6OfMx>kWk58E6T998!rdhcOYjeV!7_=H^vDr7? zF$Y7+)-LxArjYOnmFr-^y=|K{JYr4~Pv-FrmvP1u+V;oGmylkH?mpoOzB}Y}q88@2 zkttzg()Y;svH$=e07*naRD<2O$8&8AY?-tGIFCsk9uhUBs$sWwBjQnrkXF82Z-@F$ z{NKv)-0%Jn@gj7v#c4uz`Bd)x-(DY^{Wq`uK;&(@wbw5DZkL1a+9*5iQ*ifj&OUMK zKLKEmtP>~ibnj(oTbUn6u-*p9&n@qHdh6O9{8--pP7JevZ*Ajw909#w-5-MZGF+4E zH(>Bg)w=u-1M-Q#jlCy+JxIRc>zSPc-hEa48(&6h-_E}4>#sB3e&g{Q=KPM{?Ef-R zDlaJfhOStOFt%=a{D(>7kzVKNXSGqi9_jQxkpdKE^n{I$xrWo}=~Atq;I4 z2Gn`57ucu$|KY@Be7{!ZI@~$WL;arqA@){T-DB?b(jv+9FvBbN{=iiEcJ#?x4jYzJ z*m1<;0|zme^IxAH9Oii0>6vb-VbPFj4;&lgM$a~lU&D?Ozj1tiTJWa#2h8bPoMBah zK7l13eZZU}Z|PU3j-D}xhlbrgLl3*&zhRDvV!rwGy2qT$tqsF-*F)Xm!&_*VJ~X@D zU{3z|@4w5H&NYbxFDj#(b~+xgxF(ejT@qYKIOAZ z(6;R?%PX`A4`(0NutNc-5~rN3Y|QIWE)N1Xk)+JiLPu4Dip>j4w6+RXC$qnRt6BQP zsq0@pN!RRm@6EI3jT?p*1+kxEp||d{WX&|Nv3s&(z~s*HQPhs(rcLh(t=CY*gyFtX}&v73-W{G(IktA z&f0*N(n^I`o=wVzsgxCtVm{Gc(7S775tx@EH~;}+4eYB-zbCBAMi!hvP7Nb}HMMqj z{VHVRp0?fM6DOSt#$}vvGS~#@8ZzhE=@In%+FtU2Kbo!G(1*J5ioZTNaz{ z@6dNae5URG6q8vctH~(hY5H2eK{gx|Hw&|U1pLIekesLR9{S7IlbsQB($(G9+;rKy zcZ87X%$}E}!z&SfFy24RIT-(7amW|xE*wy?5p$c!{Ov5=2w?xQNJGX*E$WaDh$}|o zggL~IjP>KQuz!!^UJJX&9JV_o-OjmUUd?YX$8wLmWg8-=?hXUrfs#*RZ*B30Ih|IH zewQ@T`77q+itp<5EYbAqUodA(ULt$kdSP*5&cFKXbPfdBhtg708y@yCXAuy0u%aVn zptp&W-RF2?csl>oL9O_fqcbo<(=I3;N@$O?9;O?veze_>nS~~68+=Lq`|#q!G+M@^JC~Qmtsqw#r~iL{yfpRFQv55QI0a>d#wSIzHK1d zs-k1k7wb74JUjpp&?t%tdK2{RJXaqx+z$OIi)(V>$R&HSM=BQ3&{Al}Z6-fVC`vzU zDGe^)I{B0*$;GK14(@Ry&9om!^{}(5OFw)b(gXdWXO7chPzSia1z5%oWb2r<%j>?Q zm?pBa@>%BVXmhBfGimhtweYn}f#A<$T-W6u9T%&54Dyw*{lX7oIT$!#j`@FokYMSm zKz9sugE_RDV>*9&LP?(sF65;b%mI(CYUIxj^&?N*VorNLjHuevi8O*Z=WeL{Q%S;vc8qun4!GX5z;mK?Hw3W{4-f1WtWYx?kU)-ts`7 z`iR4X)}I)$r_3VQjxEhTTosY`0UjB~`$3;`HGR;i62q?dtsU_D)D&7Ho3nyDsIugL z+hWCUEm|+m6Bc)o8;@KJ9LBt>fS+|^_Qc)WC&g}foOY{~&hlW*JF$BSg-tIq*iMX* zh=B#Y-!0m~7b)jmES~IR-wbpao`1WhUIpy3**by@0jBg8(dj5_*C=Q+Klg*bF~EqF3MZ1K4Z@2mGnWE z(^?wl{KzbQHnbMgg9*(@ZG&m)?J7&w3`UcG9s=_NZpsz5>T||Lg#9rQtda!R<)1yzCxRO?*$=ao(b$Gk2 zF7?5IIqhIK9@$Sj7{^(0Lg&!D*%iLT-##d+m;WMg<&)Op>Z3^x6jS^G)}oJPb9na; zj%;U+81(d!%ZX6=P)~rk2X!vBEyr7ZuD>}}^0Nq?!AhfTzXgF2^fX7()-dN9lze;q znU}SyLCbq(IuJQ%&5kQMPo{wdgsOcO?_RM)Op+nP`1D?;%A%ISDcabIiCLK>Rv1Vy z{tY_{a+$o5VTW@a_(fB{hcYu#aSZxr3>+k#4xTM`DjE$gFb2=0itW#6uD!;>#uff8 z2@iT^2j~;==5!r%$RqWq>WY$X5*yur7}pJR27j*6rDNJTXPaltkxmQ;@zrzzJG^0z zKCeDYUx;J3K`nfI!yNbx`ASI;Wtzdn;{|h^E~CSF$TgY!73QcCLs!N-_m(UC5%25X z8FLh<((L6kQUe|$a^2lw4(Ie?F@l^+f*fhXoPR-AV@p%3=RhEyRw%yb=l!5a87v|i zQ(m&u7;MgR$KYz4f*cWs@C^)2bH{#*@nid5q`kx@Som0azl#%81FxRgC`}0Eg6yKqbU% zKIg`D+HJMaTqTze25pK2v@9JyfLFtKwt;j)$}f#29PNffa@h5NN)|v~_7U{us)j=+ zNE}Tq90M^-yIZ`rCt!#M2=)aC&;$udX01GnI_R+(7R%DRR*7*C267*$25YxpH9lTTHbj*~_WC+RPJW#P|Lbxgf-oCxt;LCIje)w+jcB#4O zyP6<~QWMhcG%RxUUv^L6MwlKTh;6MPya(nWA&LOhor=e>K8&dqeJw9I(Ak^QS<3M3 z2;bC$eovUwDzMbblF_#rU62RNksLOWb^kFuyZ--t=3|6CsS(wjK3abJE24)czmWKjeS~Glk2m22FR~*p)*{Z_O#gHBB702a=PVAZVLwk z@h&i7U-AGzXlysYVE7O?r9Vx`;LBD)0ssOOo4E2x(N2v=+H-FjJS2HxvK}w-t(7AE zC9XIKuHIvl6Z&@$X%m;QYXl_GhyJHx3xiOGYCe`YBf);PCbb5NVe*rcY`RxfO|)R! zi=2Rsp`BMe8+5GCipi^e>XBKOA+_@4>OcL>F~^uP-@>>ppj zNs0kvn91lnUCukqY10vlyKRXx^n8msA*@0}d~H0D`4`MFUVM_v>1cWn@dP*jaSbU+ zLK)_!&6&q+Y+b{Qw6B)07C2NG&1n@t83ul9Hb;S~!Ve`y)Y{^@Rxue7^HAm$l@`bFhVle5i${6{t~XtECk)e5PuK!FFSSPs zOdW72iv=Jt%K)26oM6<09e%EWN#oVp0Yo4LXXk<^tPE9|st#bbUDUv}z*j@JkS)bu zt4JB@xqmwEv;y^#nviAZg|;l{x)$&)tN7C;)In-o^0z>D`Mm<$cnKd&z+>994ohD6 zJMD%_g#(6vb{YjJ2_yn4z}=fZ3`7g6 zwk1@Un1U_%w_z0Jv{#k+&C*LEF0)8RgU({_p%IbPCzZ!ne)NeR>hdBuurHsDPk1~J$fH_ou8L#j=Vdsp8 zH_Y)#n=f2ITmJk3bIf0;+my~h^Y@tJxy&Y-B|q@|N`;>=ha#rMPzWNHuCQc#!<@dD zA3>Nk;_`qw{>#W-Tx#FfAP`3dBo@LXD6b$uV+8m3-c%J^`yBn+eS(rMZmV-^=Z;&X zXV(TV>W>M@0q_s)o?j;_|GR6qG7Q_ky?)z1VmV;G^lFT~X>_*x+WvvkgN^P-dDlii zEco2>zmuXx{O;`k552y{!y|zvpTToHY4G;$KT`Z2Nhc!zBwo(L{m!Oys-&wY9^b_O zD(ly%{U7P%fBO3GG35Un4!&uRv|jw?{|~AEZ;$yK`al1Ny*FEvAwnzWXNXWoGf`dGoACr-^>_; zbD~u0G?xU%aw@YkawVCCiNi%hdMZMC@lj4{&DK^qgv+xc{6KN^thj4o%A*>+u~se> zwei67PCnLP&iBoW-3i7?Cr5`txYD*=h93y=Lpt`v%(?<}_O-YlDAXrQXW*zGIG$*6g2VzRTn>%-QAQ zbGnUnjCl-m%E!0c9IN3x=(&wK#?d;lQHBLgs(RmS5SQH#oM+?7{dM?olezQAIX6q+ zyhbJ?&G5nIW&Rh+f+IaDDjK7!2r)s%Kv zAmjE<=K=}L|@2?d)mlRez%P15#yQ$@CbW1U+$w^1T0=Fcb|W3?2~v-_DOvBSLl3v z-u`Itb2@cDc)DUWZF`RY41jr-3~xB~|MANvt?Y7w+r$&~h6z~y8v&2Ff^I1`JTdsQ z*yzn~W6tfd4mkW2*#8T!=Z$;&);V52A9J2T)Dy2m9C*S;{*{XF<0gLavq8>_hE{N3 zBmfbiCj~~3*!KDs&;g6rc$~|C-}mA-9=;e`?shs`ijXm4kXv;O{zeMNb z_s+Gc$0umj&?(Eu#yaZk37hiokMeT+Chgn?^grn86{&eVz&wS#UU-xoC&JDeMn={Q zak=n(T{Vn^{E^fo=CP!LVfuhMk!ep;%J#UBUh}oTejUP!4RgZI@mM3Y>p9UWao91Z ze}~W)b-;f+QsE+6+KT!6Qxor=moI=G#0KaE>R9v-RGsoUWgUn^$`yi`ibKZzvs2~g zlOV6^V`oI%N_>%vq~hxppG9YW^XhGFl9FYaK&5q4*GQmtrB=u=gJmrp9QN_0(5W6B zYV%*=G*cczfnj$sqCuH+6d6FWu|Cttz?YxX5!cr+dx*^@rNIlUSdfrQ(iy>BSGpf) z#PK}o=2iw>LVz2t(rFu4-3&*+lPnfxmKghY9L6K4EX2(=W<(t1;?C!ep^9C1X4#IP zD4PfRuw78`%P+sg&p-bh|M>am_~n;h;{E&g@$m3)l<9xJ{`>X++UxG4kK*Oam+|Xg z{VG2BC4 z!pvTM1>y4XtlASGKfQh=o2g|tu8n5-LgyjJy_WyEqYQreu1X3s+O6a%I`OD)4W62* zx-6_BC101LU1K)R*FYOHmdNI?O?~NL<+lx_I7gr61bobKIH-OjUIQ9Lm=reN;PteH&l|V+CMl*A#{diw!%Ws3nHe8_^illgH@}HL{NWGr zo8SI6KKkgR+t?W*yVUcEUH)}y6WSmxrt%X24d;NdBVH6DzVHT}+a2ZX+L>#`lQ>;Z2L;}xYF zq>Vh_mR)SeW^A|_!`D++W1Vcqo6D#G`&~Jy5mg#d8Pl>&)84`Y0|(3QE}?6SWaAJ9 z8huV={;2qPMWu{JRc(TmA3SdEf2`E!x>W-yyD9-s1Dnnc1$e*)r3eZ!?r9DmEf_#l zP4PInCEA1jA=#V1X~?oAON6HPP|c|u*|BcIR-O>HKjdmaBk@A+i$;(pMLtuDmRV-Ly%3Kx2_Ky+XQ{UxdUjQ5`$YEZr*-G=_WGjeFH1J zj`!Wzto{6ao9x>}O~p>av>ZNT|JnU+({Zc)le)Pfypv3x;yK^}`82(}{tQ_}#NFLp z{Py4eEk6JJ^Z4}BPb2T{LhIxc=0r4nfmc;ulrdBgj!(6PiGed2vBaBmx(Pf3b4+eC zfx3py=V4AnONfI~vaLBHOOUU}G3P16-|N&GS$golI?!AM?JKO!x?4+9nfojrOHE%f z^<#Fh<4#4(fZYblw;DV4Lnm&m?UT*d@qh8KRU?pR2v=K$jgObRvn?5^;$g(D+Bd|Ba!MOqa(^ZmdSXNL8^ukxSvbB`?e_n=`xue zK#)Z9j?u?;$f=x7+$l4m&QG(wsmMd1I(Zt$wRTW3O5O}hY~ldycyfl&+cb4d;133} zxhi)pluvwgp*$Mg&M!0Ru%dsnKqVbVG48--Uthd<5ubnldHm_me~!DmyCddYYF;yL zzJI+`nHju4<`Xu~_CUZj=q``aI48{6=G<`5Rs64Dj@>9~c*oaz9_DP~hz9Lz%3dAr zw(jzS>F(A2S<&)|Z&tV`sZ(vFfk4o1P~N8l=Tnx)mnqGMUjH;+?RvP};j;r1@w#i% zG2jYoV~x{S*T{SY22ymb_8H0@D{u(e=+a1Q?8HEL1bO*@-0S)*x&&_hP~c?@s^pMC zjaM46U(#svF{q&3ErjZ5PG{yx6^;*0qD ztFPkz{yrj-+cVc^7Y2;*`p$a;T*LbBNIL*D@`y^>u!`v<37*RN`2P43wrzLpv7 zS6%_&yw9y1jgQLiwL;9sM%A({+Pa*1MxiwS1y|)mZSzlm|M31peEs#; z@#Pm^49whlt)Vwydc(Peh3af1DEcn?G>$i}&|LmFI!Ac~b5I>{OvonR>VZ=okC-Eq z5p9TP*F2_p&i6FtTw`9JVJ|iVI6ZX|8(!4{+Qre4R4gA=2++6}ri?a6PT zp-Fw{WOMat_YNTDM|7(JmKl~ybT8#XdcN-Fq>EC47Yv>i3k0r9a0SIVQ$7?GmNXj3 zM~-w|xssDm+r?i89E&s5N9md!P(ijU870S?xGWPG6RzuBs6`<1O2TyuBkk&SULz!V zET_AZm*mhKWh2hUl~5c!)yqL?T~GCA*)_4nW1wpQ(w?sJAQvIKDCb{5h1E&h)Ji1F zX)LHx7{hU=1RBuT@AMqH#{2gl;y?f6KjQW4*PT4@Yko|SK4kMxSAKirURHe%SydCK8!*tn|+o|b+ zvTb4+vYdSrdNMjp#;)HC3!J1m+q^tuH(r>})urJbRWzsT0@spBP;wRTIN9u}jUP?^ z%V{tP?bGeH%?&OdDqg>S9sltk{}CTPe7LR}=144c2%5l?H2)ke2IdH0Z;aIfIpU0A zjJ27V16`)^P;D&u$=FE0fjKl8_UV*$>{&8<0(01Z>Aa62KNWyjDvWa$+n@slYhT0$ zaCGbGyzRs?S!#N$!0)6@5~Pc=3rgA(7QW$lkE*-lIxdxcw<8or3+ZGR`S=};!83EL z$e_nHkXKS@Ac57EeNW1mKniNwTB(8}uh{4&f9_9Z9}3Ww)`O+B*n>`rC&|)I^PKob z8@t}_KxE)Qfj1YgO+m-LavvsUn@eTyTl4y$G0cd(q808h-I%!=-o{Ux#td*&(9p2~ zP&*JlTH3svwAs0;T>9H-yT5lgPMJCNpq3905ApTaU&r^~e?M#hG|y{hQ)~d69>9{} zsx&7yJs|K9^vk{nFrMOQNeiofeum@ZFk#~d0l@dexhgZ7&zrk35;Nl^#7kdUZc(p| z-+5YoVo8{I!*Eh!4*925e>a8Zpo8~a*lK5Ru*-JQA(~A-KJN_tw~W^9!~*qndHy%5 zHj)FbEuu%I#A(;KvbVQy-dtO^_xBBRSUn2iJj1Vj?*&EE;lLbxuI*axqA@`{4|CQy zYu;MbJ|!JV$9@jxpz6;)oxG7Apv`T}(GA3(YU*Tkz#=ddBemm`G3~Kz_=4apKFI{L zg+mk)$ZPDn0v&x$=i9ru4$TkBt`pCffFO^UuYHd6zF`o#JwjFD4Ll%j zYG?v~D`ev2)vS-%a37j+8Ijd$W69_x3kTp1#(Q56Xj>58KdwNLw7u^1>k=?D`m61i zhE*GUWirsa?BB~7mvz7zjW4g}h%fn`beGmxuA+o{{jVb4ym=FE-@J)>sLt<_7@en= zB>U%ym2A`dX!Y;9DEa_F()6eb+DUiPaH}X0#MZdB3a=>J4#HqMRK8VYwpVebt2rE9 z$t-objhB;96Jo%xhcY-w)E;?=8H@%{JTkM^l~fbUKZWPmrsi8K9uVgLXj z07*naR8G$Jd7dZhvIZ8IFE?AcfjQON&fT2mw9mktOVvt7uzP{ZXspj(p?C~)5X&xK zL{+3XhKCa^bVWyqyznn+@sl!G{9r-U&1&Ijf~X4o(P77o@HjWIIHJjSvkS;|curjwfl}A-8bVgO&dB(Uuo{B7LQ9fQew*plUMWWP|$|^4g ztu$$~T}`QG#Yv3c5~^S&2Zz)|tKln+kCU6-XZY%a0RKP$zrhpxV@x8h$$X{26@7vN z;weLj;pr%cL+Rq{{CKp<+6JscJ3qiUZU+JpeA`$cePQ=JmbF~P2$GW*<%%r&`jU(b z7d^1N<;LXa@Juiyi4)9z=%XH1tdTw2N@9`?(gHfZ@-QA@7@_* z#tUp|;T+HBq^j_j9!Gp|%%Pt24q6*FoBRZK-M6nRhB;LIMW{#)&!C@}IQUibasHG?t@kO8m=J zjZNWxPa$MYO_yoA2@>Ms6Zi#P(E$U8n>t5fI$pFEC?}zD=fPuJC=ho_U>}RIElNrY zAeP}C35o~%CGldSIu$Fa2>C;=9R<1c|7=B=o;fMWcV97pEp#vtI~`a=Sjie)THeEig})4H*jkJSi0}T3Q)<(mI0d6m#?g-1L@PW*O_ zwT+d=zXiq4{2;^(F3kQ+Zj$@OI|0w)lQA8%YSROEOJUoPYZmR4G%oBUmbfm{fNW><*7QIB{Byi{`i!R{* z0dr6Z;(QtH8i!gkneIazPtbvwsy1Q`3ulv_#feH(m{0-N>6tlJq>@@lYCn{&*w|BW zwJQ5`v9PdT(}bnF4h9jMRfrM@tuV-H#kgi;L0%Q>sVnUhOAAu85Tu!9Qyk0=K-tCE zlAc_GOX3e%@*v%qgu^;-#wf<<|CssX62Gz=ba4>W^D9qOCFvhFpnGjmVKZRyuzB{J=inCafSM(0>FvrJWN zHW$gB*!T(xWz8JYPL3f-ynp}xI($52i2%k5NqLK4K*JSZ<-pcTA`ZHE;jK6ZscaG9 z`r?7hlMn{elrC6BQdued2Mu|zG)FUEr^8HnOY)YSqse?ICoW-ENgiE}l2;-TSh7CR za5=>iPytM{j~x*+5R-T63s@7aZ`(RCpl)+Fxxpw2Fx|tTRQIh02E%>~(Ark7(cL&B z8zr7AC`(qNOgA(yE*kx8g!69v#ih;6H*n37V6AiImG|fwc&uC(P+*8zB?DJDv`$x0fXD!MxM0 zr+^WYVFl}+A<)&{4hm;aicXYVIx(6msEGccMDQBb#3Zsv3*>XE{xBhJvNMKVA|;Cy zt<)CB%ZRv3>OGsXv7$z&vJX`NVFg$?+bLtbK8Z;}QF#*sl}4!El7bKujw?{+c8Z^m zt0$d>*mlw^oDq$DEc?$5PM~Om2aM4AA3(aX4;HO@wTQR2ZdB2X%rQz8nw}2WOnt0~ zYajVcq3OC0Ca1Lk76$-qD4O=&l8tBz4fs?VKkd-`P9Qr&Hb4CEL%e_geh{1ylN{qs zKNSJ=O(ufbK2O0)uA3YoAoTITOOHvu_v#9Ht0|ZiPfX^>PqwDyl~ZMRogDvJ8_}5kW23)0xUQE6tKs*|Ai6@33}V;? z`wh3~gHCTqwzLTYfe!My@gSYJEUW3MJ!)*Wrt6Z~`}gnThaY|j6b3He8K_Z~pv4v9 z%l$DT;($3-*|vGbl?A@kIF6ax3LkxmIZBY`7;gKiNdks*#2nJRD9jAS$j*QcI;&?P zu+gV{RQZvx(b{;dXOH!{ZAsgVjc(0h#SVMvFiKekvRC=aVsr9x4%rI^hKP;OB7EVElVeN40iKAxLrw58aOpP@c|d*NyF(ulrf_`3l6ihYDSd{ zFuizI-f0S=CT+NuCQyyfS=Z-&FlrOV`XnpNC7;^H)q5YO4_T)+qaq~0EPibO5urfi z4w()$6FAY#00^>Ab5@aL{mkka7)C%IbV=4jK&2kAQLb{}gjkhDan-U$*Zgd|T9%-= zs^Z5VelQuX@y3&RlXeE1w1mSHJ*>ez8uGdRtDLd{U79cru)E()STnhqFA13jEp$WJ zsarv|v3PZzrNJ4TzQt!$(9W**ZJWvIw(-kWb)Z}RUnEIvbYGVbnw*RlYNgp+M|=co zf#p)b;)MyO+x$Xa`m5y^7Kw<=X?jokhAd`U&&|W&8KlLxC%5ll8ruVATrJs&dEGGx zejvrK6V@T`rhwDxHmATPzh68 z%x?t+V$2D1AWyu{ss}1o!Kdw?lQKYmUzJVsq23c) zb27db)31!vh)B|(S@Hh;hxq3||7i~EfjJmVvI$9A|M=sNR?;{{rd0M|68wm zsCf789nYfSCEEo+<+y&me*EdD*2gyQqMDDopLn&eqhD{fVGd|Vd)AZYJljP2uJNKpO8jbhwk{c-JT=)`TjT&v zIyugHy{Lc2mPO2@yT>ub(cJivi9ok=-X@Nrk5;Yoe86n*dh>1PtN)7}v-kmAUs1K6 zp`XfT^fE(FBp4aY!c7B99L$FpK9SLeoC}%hwb~N%paF*4UM4JLseWh~^D}aqpn4z; zt>^;lJ>L`Er!7ke+L*Zv6;BHZMocwhRDLy(;JAYyW5?UwdST^2r>D-E2!qmYtE%YN z#>?=u(-_g^y;HS)b9r_WN3uL@up;CA`}fz`gRsOdb(oQIS~|f>KkqXB_@_U`U;gr! zc=_^WPliWw-&ACvvN^EJ2df}{pP=jmI!}@xY+CNO76AvffF3_X-I`4Q9dmoBeH%9q z;yir27mwVU3~cPAzr?C5eiPih|R9X!uTeIX;*B~ zDM92--aJ`4Vva$;T*yvK?*9$~N84NWOfEsj0dqFLI!$_jd0f-@D~Ly|sz*}K9gl)G z*ptvXao>Q`(+AIN<)(KcyXodmRH&ox zBQg(Y!kgz0N>tP(7_77_02LRx*mUt^qP}R_b$kz&Iv|o?kf}BPrm$+`SG! zE`!$LGO~K{;sMcH_kWMy{`R-4 z+0gC9Y!JytDfs>S_W=MY@&_A$4DAJbBM&`NkOqteG7gKhgV`>hc?5Hs&pEJIBg6Wq zFlWX9be?wWi=2r$^!K*loxaiMR#AG5xB~PEbLN6$Se|{;A?D{|PSQTCC6XLqyz}}9 z=D4pZ6OcLj(Tc0xZOoyp=y=1H%DLV#=Z;|s(a~CSzq%t! zxmsZq+1u65oGoqMbj6qnRmthhKza}yyz=^L&qK>iQi~=F+jin#d?s~4#~2BZpEkmN zD*&}1C#RFI9I^>BMk%e^!vG}6$YfD|jm=d)#?ucs98z6 zqRTNyF!ajUWT<8Fiw5#@jrs8KAU<3U@VL~LENnIMN_6x`4{g;yg6skJY0Ii1bO+{m z)cx`$Lt&Q(N6C5b5KtO;xqjVGJJADrgMMAT4SAr?mSh(23FB)ya2r2mzs>&eA7o7V zdb(`3x@?D2n;a$STDVi3o0O*pz#PpNAWL8L;a)_r0%&wPCV(R*3+b{cCU<6Q;+ID;2eR(+ z%GSRL_8FKXnM20ro7DaDFb6(#>7bSiq@B6^S23rE&5TJik)mJhnDb(LYQ#Z5tbS1_ z>syEPu2x=JMCD3+{92n})Md3gv{C7aQg$zY*|kz|QK3SswnAh`^hLnM3QftLmnE@P zMM^xAG@(gGevhJTytD%6{5W(nOM=}%mh9nB+ECqw-}a#A;E)Y@8N^VpYZTmqd`o~Z zdGXc5;C@>T_){Ts^>PilTy`m=>A~!Qj$D0&B$Fl=BFVLF_0fwLW7S#4P!mVEcY1|P zzNu@VE8F)VuT_1FF1-E~{^@#C8(fD!IK$Sk{GQ%Lg6lknJ{Evc5RxSi97A@pnkG~J z&?klE?YiPvQ}y7mXmmMlpM0gCeQc+_*$$ABw)!kUVo*W*Bw($ksPjcV>`zPpf$j~dB()%am-=TkdUPLgUyZO3DNpKjybYd z^AX3|<5v7_%#jJ2%}%?RqYcb)TNvRw6mw4gkYm_en6t+9&eYpr?75g@a%eG9+;l&C z0&}YQn)_c$KR)rZF~`1J^26oe4a~XQ8wzur~F;!34=>#GdXu$Q^n zrd2J@G&=2VVU=<+=`A_tg-3#xsG~qNb+E7TAFl6yU1PWv z+VE4wpo4?v-lmOywLwL%>sw59EKH-#Rz%iE8ujE-1Q-4tc7@-hX+JKQSP5EB8rYhv zY|hOt-HR(~(xA!JIkW2l;4`Di<~S)jJy7vBDj8mfa$8wcCFIzLsG$%2#dg?P?h()C z29_dT;xfkUix~lf1GD>p$MkNmxRK2dFPb@9bOX5cD&zb{3wL}?eR$bL3!+;^5CL(} z-iJyPqU2YIsKZxC+7p-qyOhtZ@%Y*Jcn0R^-E}L1xYH0*hXZqrDu!Mo%XvIQ_2ZbM z!yst3uwaWN&%_+kWS!H;U;jK4bF?jG7~b%*jECo7&XCL&F9#;|);ObcxR;b&`1Td= zgHH(Ff(|pf)p+j5))HDA5T&)X(i)clghHGgO%d=@DZfb<^Z>d%XO4N0( z2>dX)+75}4{?f4Jy-*fij_=(#W`a@lkRyAkl|~#iG^eJQQE&6x0B3!>4hd(IFLa7C zCSLiv^psN45J`<~3W0@YXtf2z75HcxEx9OmOv8Jd-_FhSR^YP1@kPXtO>>ytapr2R z|CM#gj9VBps4dQsEL2rH@6fhVyh>;eq87QakZE?}?OFuDLdmep&Z=ReJ*Vn^sJT0K zb*#MgdL(N>z@KV(Y)oYu;e1^m`u0@}`ZvtM_vX_WU)x_*!^>)huiXceI56~M?KW?H z1aqporZ4QNEzzA)K4H#0gK{&c?$a6NXUx%J-u1&!11S{ea)CnD^6hTqFTDJ|U_d3hEN&0rdqlKHnLCi<8;c~@gl|NnDZXom3ggHiyC7UoC>CWss0RWJAbUx!bTz}GiWY`X8 z-WsIOZIf-~aLUfcS{>bfdRe!4!4qa~iq^95?DJ6qgSb{|N6FrvLa=&dYj19G(5ufF zHl{;H&u(tX?BpNwHB0js&}>NetQXI%EZ#kC6O+QYG`gEjI5WwO_i*m%7u46}3q-N; zkZxbRnH3Cq*q9q0UO}cogU`M2u9x>Cx`O=s9-wZ$ntk3<)u9RT(~NJIokdc-IUtyC zMabXUQ@yj_W0;ez$AK-J@fllkH!x>QMw*}MgKyLC{?ls``)+|#Jn-=unBz9$9jC3& zit3}7L)}iit|spcht0<@$5ICJa03&bgE?)7rf}(?)AIl?t`4`rFIVs<#fzWf@frpQ zPE&35sbg1H0>RZa{DHQN1A1Y`tU%WeYC3R%bOWU!AA&~tfX1)oXKRc;cltaXfj1rb z9x8wg88Mu<*geKsz;E?;RdC{E zR3~v5wI_g`t`oEsjRdry8ta&Ga{O4UdKh0H+s&R>vg{LEOk0v$-cxN>k*WnsVP_Gu zBC(LGLFo?bg6JDI5w$8Ha|>v;i}px6Tcj`qx@3HCe{TGDTGH&``t=dT6+iUL#V(BF z5zG9CFa+5nv%#r<@L<3?|q>QEN^}WJ;;Wp+>#glJMu)Utd z9QUz;AH<%_-H1Kc9L*Xjm!7EgSbjCFCozZq;8Nb`P@jo8FY-kB5`b1J)?@*pvcfXK z;UL}=nvtAAAvYgrhN=!ZqEi>T0q@8}&5RW!OtA#fCcA8NTr!e@@?c!Wu(i_`ieSkV zNBUES(P}kaKSzhPf4aSdRVz-Cu%r|``Mc+E7p*IVXAj~XY0ED8_K0LJ=ibO_U-2n{ zO1blRnL<%c2;l8^AI6ARw;la>U=AzmqXXMGnA^#xK5z3U{g=rjjYk8V5bsTHY;MkE zk1BVa^aX?T*vAJ|ln}p^i+9Kc6;ETnVl*n^K_H=W!;abBzXKeD{hKV?oCu80UyiD- zjSbAAT>HUL`Rl-qX2+7DU}M>Yp1k0kJ%Ke0Kv(Ar-^;A7G=`Fj#pjS9=HC4vgDdK^ zzOonm_)k9DPCu{Lp_8QnVWCu+ zt^uuY#X|#ix13QokCZOU`b^9e2Adz?a>2$KzOmcBYSk z9lipBoofZ!oqN7ONAt;aGm-~!1-*#f4=rjOKK6S6^0p9wQ*R~FT)et5O{ePLSQOn7 z-|LG`@>4PlmRfD;sSWZwXe01fI|*b!1i&8rmSlNi1KYV_wsBpTZzlN=81HUaV@`QT z*QuSsOWpBGFfKGV5$-gZH1G|zA+)7=DXS+KKr$As9#pFPZSx%C86?VGI-TZ|J@M}W zM{)^!lFWs$!Vec|?q??*`sBMm_SNwod|4flWH=JHg6Eix>2VBU(MP?}zVPbG#VWn& ze&C_Z7f-+TCXLq(bKre_{)%8#3JN~q#Kq>sobIzd`a;GYi6-W_+$N(F$5ygFcz6tR zJTkG>VP0zOS(uZZwn9A7%PUJyVGeM>3rXiSPIAHdDCU?Ix~`_3bllfKFPiV06L#U( zMjRB5vZ{I~86F-m0B!|^P+Ao>ilN==JX4QuNZR_^Qrq2cp+Pm>3fIggk6G=F!THOG`hQgzg`XW);$7!c%5W1dn2I8L*6H|J|k z$~?2(uiA~8K|Bs}i?N!##ScL8(Pmu_piEUHIh7v!JZ~wvgxX`tc!I%vf#AlDQ=<;E zP~x;Tye9+n?C;x4;s-RDY(r)Ic}67?KGVV|<$!y$x=ZcRUe~+?GSh#e>4Z#U>cLei?G6-?Z-$@+jNd2Bstv`&fJ z>IvY{MJjo>>Wn{{T$q2om->U6c}|HOS_w`S6Axm9>rkaapxi(L+@F^#oiFfzC~?6S zAt#2qGCf!~%&EspT?d0iQ8}oebO=(25p@~Z(&TD3&h9jp@x;Zfu66l(zFP=dgTDsy zNr@OgWilpdeUQOpKNsfki0v5Iw4Xydt&ufF*%!?w8!}>K_baij^^bfJ7jJ{BR~Yof zlFhvQ*B2`av_>Cgy6|A>flmc)eyMjo<+5x#;ySPA6}M8Gu_B5sc=vF|?|MoHcJ4GR zT(P79c~9Yg?3R*Cw`S^Eiw#|Ol3k;~oWkdD-Y@z1W5bkvb}Q}}u_pl6T-oh>scb!v zL*3yfY+|?C96G&q)^3fLX=iRa<`8lN7z&~dILv>$?RA(W_r@Y zr3=|pG1%{z(|k4LABpRc?4}=Nl|Ma=Ig;r)Ms(DE4(3$g*ok6UML%E2-I!-!&W`!! zvn^gc6LV|~a#%vNi4PNV?!;8z=E#WaFxK+sRuL+(-tvQGIC^(bxwuOUD0or@PN=>4 zHF`6Sa0*SR#+(W67;Xx@2I-J5tNb1`#sRu)DmhK3XO#iKLZhv~Bhjr3Q~fayeM}H5 zRxjGz;WIEy>fQKhkMQ|w0VGv0Y4W{+?USPxJvyl?#>@)xOJ_8YZT7YfJu!&{9X=oV z#2P*+e_9zzp9okq^)+5Io(TU7<|@TbB`lz_c|7UorwoEs6ODnNiUG1vwKH}rq8=Xj z=PMo_9-F_%;=xAkaj#+SCd)82B*D~w zDxmu`?8N16z*ds2f{B&k38>>7SK&N>#!3;!HVT6BiL8)}NSDqf*0TFDeB{AZ#s|ra ze&@Kz_chn1hmJXv(XvywbE$_Q8cxhSS{8O&i^5AOoWHW!IsEq0pB7ud9O%WpA2wSH z`w(ve@niYAqPY=gn1eAGGmQBf_VFCdaX+F}6VFVJ)Y}1b%>R5lCc=0!TCso@nmmCy zD@kjMy@jo$eEHGyFlWW9Ek=6;gEMjXCom`N9x9wknvf@e|EDmg;ex?gmgMP+74*Z~ z3kr2Pl$ZaaO(y2);>-Y*)VP!Sc@hdVypALDU$qh%2OhTI7MN5n156l&%7%&oay-yi zWkCsafW~2;fuLdv2Pk_9HP<0QTz5rP)b_Y^MktTa&?D=YBX_xX9X8xt&3fgvWDJNR zjUzOx2B`jm%>z{078`{nrcdVxn>@&H(7rrYLiX6M3fh&)DxC{+D1aU9TeQM%DT;P7 zQGmEro+?7sjymcLK>(&F$MYr~vTa1xjl*_x}Bdc=zsI{Nv%zU047BAOJ~3K~x|A zhIcL}D#2m*I%CL1${_C=VMRS27MphfQb>SZ$ zIDucHnfWRHa4`sS45sO%`0dq|HNE@NBbdW>*=68AHVPKXlz0ns*uWAf401I?tTFZ2 zcTeaTtH_Jtk5x~6JO%MbFvrwINz^6tR$UA8d&8Vuifcs-OA??-*cI{9?cqtx3E5|w zOcU*(2$$k*%xS=YSk+vk7CS_P-!bP;4`iB%5aB@Eix)5A(@#H*fBWpS`0TUK;^oViTC7BIu4WZuO97_i#!%$8hsHF4 zH2ksge1wWF59k@!4sLS{9${m6PykDw>~zOen>JnwygSpX66PSR+rqF3^A!a0Hg&em z4f)u?Mk#wdL4;8q59SkGZmTwN!w=ACpf{@?`@;ck#6?G67>4oF+K~^)Yv|3c5g+Dt zw(od*!ki`qqa3EoK6-qNQhed{jc5b_q2fvn(}n6oWPv(fG{=#QHD zxE9YBhHkn9f4SRhKj44DoFL|6W>5T_R&n=w_HT!$71$y?-)eGIauksRe30Og7o$gq7X`-lCIhAu7au*`WUyA2 z4xP{e$K?vyl9SAKozh`;B!&qVD1|1rSV+Q<+Xz^Y*is7uN4Z^~Z0##i+-en?uvcz2 z#LC7njP|75s^EP8_rJ$?-+dQ9|NL|K76CvID>H!`F(ux={}A8*{rmX-`|snwUcQV! z{_&6T$3OjP{iSuYw^5w{=aYU9poG2Ud-I_L*aGYiE&>AQ;bzKz(Id%N6*0RFcK}w} z)Di%KtLz%RBCxuJ8TGzB-S1Ew(JL0q2)ZMp2lZouE9ubZ^6Fm?V{TMst5DG7K5Wyw zd1UYJL&~4&(2Lw!KdX=~0(+Bw7*pYoj{i-vmk)cDYsLy1v03CEBDK)%uN`wt?55X& z^R%&NV9vy1R=a^oszB*4(eIek_%?Y~8!w1A?w8NPob0yhyCN)1xKa&^rrpw)tg?o& z3@yWVGsvRxJTb?lyl6IBOlHr*oN#|`lamI?8nWtoxl zkM;!sQMX0W66(@_1Kp9mx?KWjDU$MmF}RFLr8F3;0iXk8ngct)FiD#$4FvM8_<$tc zk4JWlO2WP}vhr}+HM)0f{rtzfXgt)Xfwu)+cMQxC>$~@XY(xo+&WsWP-7(FcRB-Sk zoUANlS({CC;<1BcD^*9dgX;}EJviZgI3!i=C;vloVF)!@c>qL$>CFkn>t;~)Qs zufO^#e*E!A`kWJ%JPSgCG@K`uOH}XQzmIRe`6k}JeH)+u7`skxBgBC{+ z06e-$7GCC7BDd4&sRMk2i6zS@WXOckbYSDnWt~rr&ur1uxZ8h!fiL$t@Q2KS zDTVQK19KumTe$^doiIoGaa-;3Hu^|WkL7HYJ*KIN$rC6xHWS@0n&fNs$S`1Q`nAWmPkn1ZAXNontL`1A9B3|UUoc=ffS!n2QqGO(b?~Y?j`zji zeQEYA(Qw|RdPKKy*_?8*5l`Lp{Ws*RSLM```aNe)!>sc&G<6 z2MC&LCk&`D9dnkzF=ti9FaP`{zWm~g`0C3q*A^IAXMkZK!d$c`(a{zVlsoLIduq9i zb0!Tb`L09|ooIIrJ5Y|j%~_p64()KZh*P0YE#fb>!Ki#J&PvoQy8AfsWUA4r#*o-k+8Q}6?C zW41)`Se55ln3EBW|FCuz`#6CKrodlqz9@f{F}gk0venCs3^(|}Fxz>cf30_nQU3zw zpso944jFK~9dlkRJkdEHr+y8T5j~-?$_Ry-fz-pq?FYK>9hDL@I9v;*5qsrmmPj$v z8h4h}yl=^oRH3ky-B@Ah?2sA1H-RO2#@npSx$Iaf!+j&sV%(%b5kMF+yHopD#+qnO5zq-qTwfYNIbfDK<0M+cYWF1#B zaDBOdc!*c8Ud6lj@8jS9{omu`k3U}Of?O7eLi(&U$;ZoR!5x>Wui$9{6_*Xr4pZZY z(aL+eAU=oe!*%4IQ8ckLWn`77x2CH60Zng+Ed)1|3FYlTE$1^d<7Z#2ujSlcAnZ@AGWjrO; z@U+Rx^dQ7o@&$`l@k!f3U?sw%_cJhO+mm(s&<9j`Cg$8_^aExlN()w=nJEF`>S1NQ zxK@I~ZfF2?CYP=77)w6n1j4C`F%ld`S)j!L`)~rc&?$Z*Q zbVMjwG(fxf(%f7ilDt;;z29@Rgx~K#q8E`DED~4BIw)=a0(6{TgFdFu~YSKTR*ow#|NE@4oMy=BN)3 z5Ap4{-^MrJd=vNg_hOn=j1q2uMyIdF36tUsq@CB-xZnT%@A1Wd{%5@B;bz$^x7gqd z&6n5bl3rwU0w&pfP)Ad66-m20mpU$a`f7i+O0!?tajzSN^JX+^5#5(w5k^j#&$um@ z`vLSXInwU4+duDD*`m1md#Doa^EC>6+{7x@r6bI7vkuDKUbW~-%pC_oyHF&gGCkwJ zoO%XERF_T19LEkBcZs6*z3h&B?~FO!w%z~Nc!Weou}3jSIvkij@GN-kggMy9$Y#5E zsHWML*+=hx8*`%RrJ~#JZohpzX_8!5wSKI6r_(B*ssJxbA7g8<`HK4(F-JDTyx|#` zLtT>Vj`7mdjye1t9S9rm+;Z}4(HNr9l#~NiXLg683mBsi{}w72lMEYe6?2F~A+=L| zK7WRiV;mt&VH)n)S?XwGbMVxh!mF+Lza2GP@;HW(6wv@z3U z)rpo|yd=pn!UC<+zsBEP(AtG`?Q~MMl&@DEPI^}Vof^@oZM+bVWMqLEKD!~G42ymc zCijxAU@~;;eUMkLUd4ZX^9`L^1g~VnSDqO-7wwF#c7s-TyLRoeksp5eA-?$Hi@3kP zKU7vs7lM(X4`-~iW4_|d)-T#vgY#PY$fc_pUCY~OyJd!wT6RiXOMqj^XN)e+gFfr~ zW-I1wr((@j@wn!Y$n&e%IG&$x>yQ5wg9?%BB&l8yA2IVU8fz2lz`AT zhkmI`jFtZa=A`t}&hUg1CM4(+bMCyc1`0y}2e+hW$MmRzhXUp^{)6mN=nz+U&r*inCChKbSN<7r81N5o4vsJW#)l z7hzen-9`_4BF1^dXvO|xUN~aPP~hy2m!h*ncFZ;eny`D1$gF5dgLkuCi$+siZ5=R7 z?KpMLi`5+XdK4IIH|P11-;Y215MO`wmB1!_T&KyVY(N&BiA`44Y`ADd#P{ESAK!fa zwSJEW+O6DdsSfh*iJA7topuknY&znp_S;ued>sHN)-Bv+r-$I!bd{a{R%y9qPZ;xt zP#2B4UEHk-;n5Q)zwel%L^cmlNnNkIj1e6qk*{XrC&bLykiaEO!|SHYe4G# zggK#pXww#xhBs+F7;kQ3j_G8{RVOO;VE8oVC;^?7wk!T>zVz#)Z4GQRNJUdHLr7*D zjh=xyZr|4&tNUC5H$Rb#`VP)!i|0+#ZL93s?w|sf9$?_2g= z&wHw&s@?j&=Szl53fLWEMm6-1d^`tpA}X@2g57>ky1s=uCybBqh2L%Y`x%trI7bzX z%1;~X3C!Wu8Lti_5_=i+9kb%7v%SbSV_G}ZVYUI`DyceG}lV0wtF^m^}S|} zvz@;7IIMfVx9)qHgCZL4B7T0P%v{kf@pB{;C!lMJLc~jE^QGYK06lo+n3_ZLnGRPK z1J$wOwKjx(b^`<*Qy-nuzQRG1b5Z;D z*m=l|`b19bjyaIs0US1aFIjxMbqjwQWb|z^od1%G+nJcbUxS&}W&|v=VRH8b=5)si z!xxv=ke$skF$cW)>k7Hm@Xg1VnA6V=tt+lC{F`HpXJ8K7D;$TF+jNa@-f+aB9KKR@ z@KpzZOK14C>mHL_#u;<5$_k#fYFP0I=9m`@+*yq##t!?w^Kx)Mkm$%;gJ@+{eGhO7 z)@?8KA9|yLfehQmK}wk68Ee|m>wbn&Z343D$X>w^we6PmWy=(=JREzhc9^r>sBT>Q z@l&-m<9tMGPd!e)b`~fR{?967 zN5h8lw~_J?EF#7)3({wkvY){UL#^vK%3$q4^a|4d{O3R8&6_tHukEaj`OqBOZeMNS zij=D{$bf6rPz-N~(C==^R>ZRxst8^sf__}i zy^7@H3efio#H7%M*!&Hwp0>lCR^wx{^W||(o*7$WgZ_4{&3Y)~ZkW^P={lNIIR5rv z;xDreiW<5?G#+OLnY56ihB>EdwAyIOeNp;2=A4q9vVOWVWXHY}bB2uxC`833-UH?w zY%H6;`tC&mpPqp^7{ikln~3zf3^d+~VQ!(9fc!`=RNuBoS+en?_*v6Lqj1B{H zyszBFwf^KrND@viA}i4rR*{isU#$@y-e2tX~Jygrs^f6AeeVV=OI*v|$lZ_}CK z_$6|Yb)qj;pBa~N6*B2%94&Json1O}&htwy>rYno)23bt>0|emCay8!x0$wWs`5V8 z&ZN(PGRBfl*7Fa_%d9WR=m%`Kic;--xf42NKKIo1c{^~IoZs_Z-6Qckjzted-fzii z%KxzHi->sp_HDd-_wFpWQ*c@S)ck6;S>IcQ(c3k#6`Y4%U%h&D9ZZHjk`7fo;Q*@e zI-50Y-3~fB*fpBnKONM&jrYBLn{=z39-a)0?0zw1ra4UE%|EK)f`8__(bX%UhF@jl zMFpOgY2&QL<6e0+9BSj(c+bI{gA!16Ax`^>w}Yum&F&3@tXM%g8-1?p9dq0li*f^5 z>7BT6*7nF_m@_v+Sc&uM!ckr~Fz3*&{od3BM9plNb3Pf?bUFZG%V{3P9O1LZb6|1a ze3oHH(a)Q1Rai;@-;+Nw_7(r~(g=Bwk$a9kAfjF8H)VrQ=>IvFT4CVU96gTg`PqOxzE99CpB3 zEi7mihw>qdJhy|8kTq#hu&YS(CCJ$21bu>*C1bJ#&v3cAA$!o7pH^!>yOI&C&>vzB zE}TZY`R`1Yjtdkk|7a00TGI*M|Y&Yr-W4m!c@mP`ig z{@O8zs5}yS*p7vuA!EDpDCWSHfZ=8dru+;f2=;VVSfWxIujz6GDjxr!i?29nKjf+~ z0=rTy_k~c}+}hrJ8gs6+!+0n#2hT9w9x&$){37`Ptx~Ef77DXq?%Ph3t_x*>=>8|z z)Ba=uIxaO-P_O_W|FyJ2Zh+Pm|Cj-qi7dJrl#*5qP}WZG+4?*9V;&wzuQ}rakwgO8ZOa{w z^Vr;%1=urvOy<dP#qVFm4Px%p~4DviV~^X=sXM9LZ8R=iXU89uh!5W?kx#0GKa2HHjvSkW4{ZIe=k}b z=!ydMRh-X?thfBPzM~?!3U;(M^cw)x^t+_hD^%$3rB?iJIkT_Sn@vL{fBK1!b4x!4ZgU*?mM+Wlq zKmNh(E7D)uI+~?!t%_>^P;pFONm1so3DS8{a*e5b?z-fg@`nC{KH#f=(r7*?^E4k? zHbQZO4+5pI4H(4gk>l&KQvz@TC)AfJYykwA5%xlmDY~3&3*Rx?X2l(IIKSy|TZoNC zrNft&;@+Cy*|gx7Xf67fB(F1wJLY(${<>D{N2o-KV=ER)18Xs}VGhqt2F4SPW)}5! zk@z&`xIN+rff`=pQ(~4KbJ{}zO}AZ>K^on!o`E@~zN*ezyM;v!=a-6{kFNQpH~2xy zcQ^>JXmEkh;SU~mya>bW409Z)W|BIzhOxG@OT^fu^EhoX2)+9V zZMz8nmJHe;lpS$@2xR~4vy_0sqyX6OJVk7L_BmESK@xmovNsjj-=NbgSAM|JWqM?f zgLc6(84GDcdNteTw>8jQ1#buLof0eko(?rHuzh%_@uXF8l}W(z4Bvkj2oW=MKRr`0 zJIU(&wgZPeKVinbjQ9P!ck%AsyLkEXrAWjgAZ_L*zalSft}23Iw0!TE!*hh(33nPvs)24DtP3iU6Kg3qNKG~#V^17B1fS=2vjsi z%C{=p8Fg&4kp$RX$-g$>;}oT9;UBNRx%K}2`@y)&EAV?{5&i{;H^W`{qr&efxG*-O6;Mx64!{8$=4X>1*EM z-=VFb3ob4>aqH5v8sk4bAf^^8@+Sfc`JEWRZJ=@rJH}iWOk+^5`vrL;IYC`>iCvho zz0&$k%z^CYB-w}DWb-uU>@-Iti~Dxzd6)y4o2vH1xcJ|B{)%N3CI6z0^D3FCK1o+0lY zb6#8o)Md4nb-RvgU6bn%jfq5FF#3CqeRT!O%*vd?s!w+Q!+tO%O0fpL#+rpDwh4pXt5-tOmoH^i%!fq=q zZjYXljixOIz?8mM&x-3H^25UedDYh6fo`WE4|8v&Mu@^0nBTLvTOFO%_wU|~AyxI< zY{@`+JCvSgHwzymlN_?bVA}rCDir<2bGLQjj!d*gkXE=lxB`Lr^{ZF$)mL9d#P$0^ zfBMs(mIy%`4WZk6M9hT23v(c@S3OO=UX8PA8xxt~$GtMJq-Cmg%!xLh?sox%=>V5% z<0%@yK|AK$4l0ep9fLaNn4_f)L7L|R(`AnY?lH`v2q**EA|h$zbzbxd%sFBy17CI= zx1_OS4zOItB4Z9)#Hm@-}c}*jFV2;y9h#Rr9B#jMo?wCos<7RT;fH;LAfbHwouj8w)zKZ+%`?$ZqkFUS_Dqg>OB|O;l+TWWVbJ;Z#v&K?3 z9Ts#7oh_SB1Mi3tU>iSuJYMY)#%@$=CweD;A^Q*5iruP(t42R~o@2QkZ9KF}a+rP# zl9L=c9@@&BAIBW|2cXQ)JgUtzFvnm3{;v72Pzs&uA&ZVV?ErW!Dx3%6(eh#Ell^aF z4s@fce6b&F(Bn~y5yZPSSJ}3g$H;{Kc)Ji>W0MMbAkl`y{^jn6frIrEgX$G>?H5-WwC!xU+1D{i_)h6Bqrj;w78 z!Vk0|X(z}x6!KpF#gdpXS8fT6`4Zdt5aI*&;ZIKZim00H00Tk%zQ{JizHfALm9q!Z z;z4Oj%X|=nI33_8!tXSYS#rB{R|HdBgT7er@l_p0ZMGnA#$i*~9+JLRJxP@5-Da=8 z4-XIV_U+sF>dP;gh*nhG-`~eqUwsvs8NdI-A9nwyADFEDy4eYJT$=(D-o|D&-Dsg}ePCy)1ch@pJwA;& zC!NhPV(Rx1%xU^vW>zLU#+64g$LDuH#N6^Rph!PgX|D})IxqB5G^jQ<89%ajH#XoYGi>!$sRJJbm+w6vN?LJuWt?J{uhVaHpfUnvzcOM`hT6JnD1*=Qnv(k9k0Ql~H zY4%E9Ob{je$gYGXbCWdA6AbzabXUdOw{PRiFTRNT5BDaItN(}l`}p$9FXQc-H>$i) zs#tVE2GEa?tNYRV#~wY_0cFD+OIkEXN$*R~wNZPx=6+MM9k_$4#+g11{39=IUdQj97p3P88W_j1`k=2TFvoT1eA3r&{VB|`@w1$M z&>qwmiVM%e9IDIf!IvMqJ=vO${hhHM?KYahLM0S?A^ z=q7*4kbU`nx`G~>)-$0;j5n`en;&aTO#v)4yvaj=a~~vVhpV^;{gf}Ul2W?nX4C!N101D%TP~VR zG#NfOYcW7sBeL>>xtTD#o!+upm~^JuNf{lI8{Gw6v#j-wIjw5BWZ2jsO&H+`%z;P= z<;nh+sZI>OfjOXn#-!yS?^TQ|s$M>ZIhQ>s=2)l>{7lScyPo)TduAMUyCh!84k_

B{96v=R6t`wu&Q7UsmkA5%Pd{6AsN9VTPRXmu|4FiJs2#~})ZBd=e8=*zJ1 zPSv1XXp#i2%3{;BYzE}c zZBJO$__Tn*aFzkVk{EdEbP!1xMv&x-BXGaeX@S-zfY=NM!mzV4Mw`9Fg;3W%ujrbq z9nt7E7~y(rM~^ynvB65&^%E{}3YT05_MuHHpudmmmAmjcOb&cKQeUTvZZvFleHCz z7+0QxG9kvi`gkHS!)dyreE!wRgQt&hJYtd1?@0*)e!X`|ZH|_*rPDc`ovHK8eJY$VbXoEvPLYLcmFQdwGJDF= zbY>Jd-1JX&r|}qF?4%zv`xpwQw|H+7%8ZXc{*^i3Oa>r~!3%YMIA7s$!9{L!R_}SDtd$ntHMkPwUzOJ^y7xN7QVQ%`Fdfss(8*N^V@v!GtdX%`0IYJs?X!1YV z`%{?1>W1-{AW9!joAOi=V(89f?5mwEms$gX&=% z0^v*aq1oW0kKUc!U+HoI9|mx~;+l@s`u5oZtMY_gvg?qQKnqHK9)igbak#`Ug`>dP z_0qRN_Lp5}5US3A&#(;xJ%HY66Yi`Rh=20QCx#;mE^S3U-xqBSO4II@U&N61dF_kG z@+-ctmLTQj%a`%-#~%mv3?5VdZd_3p`{F|7X8++a%?g=?K|r?}*`0Jt{WK9d7K~S_ zUuML^!$bW2?c4a`i!b8-{=WCIX&|$RYkwa!+~42FSBEn@oo21&^`L;+xlPr%aBr3G zXDB#&FDzTw@*dsqzFb^8?NY;v4=O6kMd?(CJpxT(3i zUZxx)Vqk{GSL#?UzBXY+G0r(o>Fx=02LCkK!5gba-ml`0_tw_U#YD34C2Kdflo`0wn#5&AF}k0#&&4j@yQ)l7xJGhP+p=c>~F2l;Z#1Uxy- z{UVLv}m6xwv zo7t1ix{_%mdB6G1Z>;27npZ;8(4?VLT)d6sad32GFeq!uT)`wN;*(E4i5D+kglo}j zNYH~0ZNfLD7xk5~Wtpu;EP22mJCOCc#Spi%c~9FP!XQgN%wF+`?Aw*(JlsD7uoR1+ zsfQXeLY{KJ4k*8Q^X6(-3%=o(H3OsD-&{KzrW$U#??nWw48T(2RG}&)zdB-$jcCHr zD-m>*I4L=S(qgl!??(mtx#|Wa)EKW0ee=@u{Y2|r< zi}itPmNm1jnDuFvKy8+^y|E}xlBmTS(Qs7RT99*U<5 z7wwnqkTf;;5Xd$exdK!3H!xk@R-!ugfQ;viU3klGf!E6k0X|HUmwo^Cx4+e&Sg=5^ zWYq*qk@Ra&H*9y|5AoHPU&gCfuQZ0^vIPunF{{ee z%+9Jb=|Y;h2tY3#N6is8)102^;BJy#a=UEwZ2#w_K?eRFQ5$pl<*ki*ZIKCcsu|ky z(Ud?hESSbPvH6TS`mkhgecE=@b1`SgV191rJz zNKgZPIEP0C@)a?R6fxAxi=8xVB`HCu#aIhwk|R0P*)^^GdfnAOXp?ji`nUZ(6y z_j!Yg-4FU%hb9|0mJt|2aaGDJIz)5kG>)7(o69S5$gVp*%R1(`&A8WRWb82HnB&2i zHez}Z#q5a2TNFdadi*X&`12z%aZOl2L=N>~=wFh?a z9LzC0mW>qW_bRh^9JWYIYTU26jfZA~V~Atog4^bAZ7|0ga`-P`j#>KV6U|Z^y?p9Q z8HEQp7_d!I#bD^AQ)jCsAFZq?0PBnAOL;sgUvnJ&+uR{_Z4j!=I`evR;ELhnRd!L1 zHIo@AfyvQ6kV(sV>SK$GXv)L{-7)s0q0wXWw8Om%683UxY<$JIe+^emf>4UwS8q2~ z_q0|y7i7lD2LTX;itxL@nEz>Cjcs%tmVRH3BAev)da@%G4 z```azZ4rT7@NUFUgb~X&e^^kG%uv}l2dLg1uRr|Z4`bU3z@7a4C*tQI%#$F0=@D|D z)K{c$AuH-khT__=bZln=4AieDm@nL5rof}Q(JpdvQ>_fzQPLd6PVK?Cl2>U zkDEzej{^i^pX)I>UT{nm8uWg1y!ILRt%64RIOFvc=A5dIJ%>PYr|}$f?leoa0UF^A z1r4;hP4dX0xRtdFT(BB-BkMx)1V@nKPOw%y_@2Q)5V`K!(m*_hdxF9VM+%YM2?nJ5GcWkGWfI%$gA-wHFAN@zKG1 zM$z3ae4h2GCbYXwt9`~V9)J1emsgVGgB;{?=_Z?;U?W`Itb~Ir9>pdlD7wXJiQ6+fcP%+OnVwRI(t?i}NIZteg~vSo~5i$)PSe+1JBdED_== z`Ki&`l zvFl!~E6E7ktqtv*cCwdoml>ab{`q>sDX5m_rm9c&*CDjk~w?wt0DPx-@L#2*1+9xq5)Mjwocz=G@`&#`a_g=>UZnGo%H<+DhJLBbGpvjfI3E zMlO&hX-}LMxfmzGgy!(ri4}?`0o*l9Re#V&#*zfDtJ+*6n|1+$b~EI3Iw6aio!7z4 z9<|~|4E4AgS#2T))zx&Uv z`HP7RJVZoM);0m-jLUz?r;KLWNJCm)7yUOdr`B0jvyrN@?fIUJAX#cQCOSNB% zTA2yjtRp5{fCRQkV&|VNFde1N6Fr4Fpmt8Xnl^oNAj2H~jt+u6I&vQq0xH3;00Duc znlQKzJcMI11$j(3ELkTzHRm$R!%D!zpPz&=HFC&n#c20Rd#s-1P`NyvKSQP*dZAMX z*ro!TJWz7o_q+J>pa0xQ z;1(1k)%fhlIuSn9cT03j_t(>;@#$}V6aVwCe~r7lI|D4+);0dqWbBisF0Sv@WB~ia zX5wV4jT6v&v06hvgB}dvuJ*ET9z6c)t9ZcERW7y?Jq;0QKwGUZ zojp7}#MfVceH~C@dt}Pg!cgW|ywV)N$Z- zCOi}3!hFo^ETLgGmW&}SSBPVdq51lMw-X6Pc-$Wzxs5rh^z{uWMfM#TY2NuPwD>&>ZJqu&iu4PkiCnW7!Mft*_ zO^GA~88QS=k=CatB2fkoFi021tf&M|8j+gI;7Dajz{?OKvaNOuUmK?g12|O3cBP71 zMXXB9RK2ESyP%%i3c`U97!5n&%EsDhtP9|$+oJ+N331g@_I)^2rj1>ToNBUfd(1xP z$WVG4B{Nroy~Z=+7x0(`A{gN-$y^qgPJ_6=>_+Pe{6slTz!nB>pJXL7{_;QmNBjYQ z9UD$f8bSEQi;cFN!;sEEX+GV86*~|6Ma8c_`E~s5Z-2YC&(=77s}=#HuU_R@IIGfa zS*t$R)shf##ONz{jusPTz$^?|c8toLSyk1QWW4rYJZ`IZmq*OO4YC$}rJI-84+k-f z;r`CL)&E??gH?7ETO=A@0Gs-BF1ftgPVDWF~C+{PSidt5^_WLA#J!U@G%1!c{Lp$UR4GH6DJlu3-OXPE~iU@ z1A!Ypf3OeG?RgUSbg?3)e&vWmko?MSY_b5h$$Q9>Fef10{zzqtZU*v4zQnL$W_)NS*kLLJ0+ zHh<)HxACJfi2P0Ht({4^od5N%#NqlYJ)gCbCjvA;MtVGM`1xQk1tv2{f85YR)q(Uo5n5tKPP!hvR$P*9;L$mwE*xF~u zJ|Bo#I3?nG%I2(bb%F>G7OAWcWn#|dE1QVWIp#KgH6@8BRdYB;{{QT~ZP#SSZ6pXh zY+BOs%dtjdduC_OdTr1D|4$>SDf(DslcIM_N!^Y4a5E4Q$h=j>-LG>c_EU9lCK5mb z0VFc3YIFwe=8=~J1LwnOsS6KY2k&#vc$;P6f^#Bi(KI?VaAfouL*&rDonuNUmEZ)X0-fBeVz%fI|f>bYf3f}4Sn&l6Y3I!?;_QNA9s z+q|vUtcngb*LYbW{&>CagU6pf1uG)e7+tL=QZE{J-%9~QAGJ6S#d(0pIwsnE{CFKu z{!YF@*(N44kbIe#r8JX$McxA6{c+i`u_%7qv`VYdezk20|Lwm!haz|MqJ^Ow2?x5R z&DRNYdZj+&OJw(NJlCE&g*TW};9)V|RTGz}1$%}$y&zi*wEhRa1G}4yU`}si2j?&3 zb?ZwoXZxME2bj||)K5aE_PV2qAqNDW%5CAlI1y_ekr#+8#Sxot=u2d{nkfz=KClYc zDtwALdSB)#;0G!6BPQm&5%eV`Sq7d7=OOxVuW&(J=ECBOsfF=wYDijAn5l?t+LQ-b znjVrS&R6%1sL-!SZ++T4ro0}jp!D(7b+|eczJ$L^q_p=`p3~Wy|aN{j_CIz-)^ zGB`v5!*rTO1q~|T`O<5N6LE|-V~Zq|E7uDvgG0-`DpitYoG18gP;}0xJyLJJl2k+P zU-xb?wa$~#-wz}aXXKLu_(iut@SD{W2VOdB@BOc5@7}$O|MFk|Yy98;_>b|kpZ!c4 zL$8oXq?#bRStH%~i!Z*2zyF7Si2vuG{waR`^PdOKopp%P0N(oKIBY{7FE})K1-(@J zmMWlvR0+4Oqqf8mxP~7#y>akZ^#tI@nVJHwtTAjQpV7%&!0vP#gLVPTBSy_JslQJj zKgN4Gpv>(qfqXTm#-_#3up6skWHK&+ubv#j$uMEb*s05K~oN0SZ z$P)+qrMqE{V5wGDu3QlI#7a-wQplMuDQr$T%~s6f5MAA&y+l`I z0tOciGOZp3!DYDZKJ8$7uV;kg$)wRIgf|8F2D^S}SIL0tIh_sXOFH9 z4tv1!WPmVxC=H-wIxz;S2_RuT^9C6~c0R9^p@X3%Fd`2Awr9 zQht?9v8cC#yN3snP6!1T;J4ru{ynRwm8@`hxYjv~o&&tM75f9s(Mq$&DYrZLJq60WrtVvuBklCMVQDCaz zUf`PYo*@4iGZoYzkosN(ZKXCtl0b;FN#deOh7Aj5ZDkjScK!_X`j+f5X6r>KOJ94| zTLD8^lFA%r>retwx0m;E8KuKlMXW8mlrd7;dG$(lIp(hUTR@SNC{2cF8uOlA>FuZ^ zK|0Lut<2fU5gB!DmpCNssGYwPjUhk4bED1Gq=}VMT}j^}Yu!}vBh?K+2)>|6P>hK9 z^2>Me_kaKQ@wb2bxADUt{t(}P|9$-Ucr7j7ehNv8OT&&%T5R!FBgO?fS za+)2J!5-zt#+1frdh|j3gP^5-@pBPxZ&%WpZz*~b+Z*HdjHv&%?$}mgd&8VN{Ge24 znNBixk1^MxAgz*Vz@C-yxnke>TkVIQc=l0wyT=^*`>^Q4c#q{5%n^Cf_jLS#cMhyj7W>V$N!+I?>>7{?vRiq3b)j^P#+nA}9}&1^U96Ys{femsTNFAN*G6 zeMn_iXP0wY+q}&r9e>~D&|GgpMJ)nL;gYeokrtRt%3tIWr0Kj;)(Zsi>H};YY```$ z=V@fUjB`M(QvIYdOmcYL%1I^XbX2Kp1<++dQ?AVpgH`fPlCkBNBZZrYCi)n@EPZp4 z7yaP9G8kb1MbAO?As-6NnG{&ri~IszZ3n{!ARwc32r zy>87bA3Bkjp9z6XaSO5a#hc><=fUTEVL9+n>{0ugUmJehV~*LHL;j%u0_L3NCsO2g zdUF`6Onhv}sV05hyO>tIe}p;2r4b(&J==1E9LtQ=-}-|*i@rdVxLi@cDmzF8@2L)b zk0aU*jDI8c1aowLMaSIc)VU))@cm8|wZvV@V={w*HRwlXV*n7-glnaS8~fB$Fc@%B zu9>0=L}e9TWzryPy3pW@zatf!Zn1%(c9?WqC~4Lt-fN&-@d{u)?$ztecp;TK=Li@*Gs@ul4g#6< zas+lHIXHOCz`sB(#hcan8n3IrwN?X}^Fw*B8|JWPw|y`7d9zM&Rd&Am>Z^!gvNP1T zCBizYe=5vfeZTx zbM%`1^xi9&WAm;)z02ym8oaCTxz=f!S_4f@N8Ma`yws|up;BNdh1pVM5b#2q*;j7 zlB6a(xwzw&fO;GSZW^K(yw;4m=ird_`{bdF2!_oguRm_bN57ia1pC&^Mr%-*C}~8+ zaVEGm7;&_jR5cmZk5=d&T-(zv2@2XsH#tKAoXJ-AQ%a4wRoqPY}1D8&{ zYu#|57|-$1(=pFej?Iw=FZuSyN{tPs?WDiNpk`+S`r(%e|GPTrSuxYz2?4b_*iDk- z_Be`ULnGsT6~7Gd)2C0D9!3t89*B(RZ-VkY`ACK3B!B ze)TIhnsb$2!ugo}k;>4UBJoxp1R;@XDfHBhtavJMRziEQ!SFyF)8ce(C`%m~d zxS)4^fH_Lz5DHE#M3~pyvZHspYL?<&uVBt$oV^8jd{v80+6>n6q8?zViy^ z98BUEr~1yooNLJuJc1k;Xc!8rx1nvMi5?2WI1wm2#aiKCt-Ot&11Ap(iX4jv)cBtn zLMKWh%G8GfgF0X$)}O$_`<_Yqp+5F5c`bi$jH27DRnydu&eKVU$l(3%m_KElmUCw4 z$mC9~%5TpM8)M{wk!zj?1Rfb4W5TBF9-Q|y87~lRrj+7z)RPbo_|!7@Lo^Xve}OLg zv^^oFN}rO6+4Xb^U?(2-=Xdthn%8Q|1NM>Re7(-(G{oO^deKfh@ma*^+xPu#Yf10N z8CW?MpW)0-e;TXHrH*}h(BtLu=W(V#Zy59l`0sc=t-ked`d#w>njhV@G7NjL1>~I$ zm~(hvFZ%cib2fr`b3abLbjF;HjT)FbOC>Kh-V@9@#>}|)%U3aH(tH|wZZHQuI+xRG z%@ZC@m~+zX9gh*@3D+C$UgcglWDgHH|TWqe`!3E_>EI1s*S*2~B7Ng=qU^ zQ=_ZrGsb&G82a{K|8&R>0O>cE{ZOSt7DIS>KV&tzAI3BAHrM8AI|l-flGxh|w5oM8 zHa2!W4f*y3sO!!;4;#Ul+gS2kQ_4*jUEy>eP93|(e2@7%LFgfk?JMfc&` zZ?`W4Tx|cutM1=rhW_-$u0jtiH*2GA`D|?e24#K%(Th|ke^^NkMK3xaS9t5$w zt1-%wW9S9%o=ncfoWWm;4d~gJZ4spJPna`#k7!$e=9BvXwNJ)_`?(FE67y4CY3)aV zyyfKq=Ae7)Z2IL+?Qiuh*A>SssE_TI?$mo;%1$Q(g5W zyYFc=2C}LFUu|rd6guM`{cM!j(}s*b&#-ufbM)D$M#iO^{%;$Z2Yj2WV&C9gV7r2J z!!P-`aUX1(Dhc8D=(sroCmdW4_(f=fN4_KaOCqK$J%5S+OSkKOcF=wX>B7f@i*}L& ziN!t?8EOVYQQ%U^#UA^&9b2!}e%VH7n-MtpT*k(C$`o}D`!X`I&gvYp;W9wX&|c@@ zdV;^2O(G)Vb5(rz;ls7nvkqSC*e_pWVKhf)yS#mN+R8d#^Bm&sXnjDLzj{7CDr`g= z)WW_156>Di9dmkA*ht(ZVvjg2>($>0BQd!i(Uk|BiUa28$P!LiXLo_2Vyb-h|2sYN_SqLO^B;8)TI z=W_J4H}~aIM!@?f%0HY-yUPAsZU%>vRa;r$RYMa4jaVR+%_F~yM0G1(#XQS+iA~=X zwH!RPtAFvV&Ggd@`ku^-f))A>)d9b3UPRxQ3tb0~zxwK{`1H{$ zIjY-6=vD)Odk4d&zJcI!2w}`YbJ$V)xZKzPJ%S%al?(J%`%fP~S+b+wQvz|QwQ9T3 z*sOlNVUBwS5LMK5LdGFW#I-QAHfi^IJ3N7f2m3R|6m#%bqswZNx)210feUVr++hw= z2DNE$9BO($4Rb^ju0iMbh&icR7CK41=r5d&5F;4e-C~a5&KfH>y+hM4VvfAl?NjHU z^q*l43l=GTpc}RD*Dwc*c#aX{>j0MR=%Pn3=gs0=qWQ&WCn*4kR?0Hg;gp?Fq~2S! z3x^%0O3>mYC!tI1+&uG3RBx+*GN*1HlG|g<_z6&Z*bJIWLvKq zDB75t=0FS~eO^ap^JdSrs*pU~2s&b?4EP6rX%AAtYM?LEWz-0fT~%5}Jy+XU=~Yn2 z{ho(Dhq!J0c;$SBjCGpL^&a1j4Bi?l{a)(=j&@TSx*SlP4X@jeP8v=rsBlT4Ejy+) zT?S{1DTi$qelZ-!m^#&0umj4VVITrO|B-!v&MW1GMAsLVIgs}BFEIM%_rG7;RUgL} zS&l9_JYYFCH)~V+17DW#Z4b%}`Y-K^F)5Di0l2gfCKD}zMU0w3hM&gz_S3D4+JBz zmyj_I*!&9S@YBH(>x`%RX_$k1<+wQs-(gPFo+4YI z8WzNCZwGN75zmqJXFD}`$8)l4*dppXWv zl<;mZ921;_u5($P@O739w)cIC%eYJi_JMBa;Z?3o{k=+2<2~AyJWo^kb^>OXz1rGo z5m+$|$7!C2ygCmM)b%NJYX=_>`UEVqTybQTZx2ik2{@|;+lW-yx(7nqxWfy_9F~|q z_G$jE6Emz9C+O*g&cr*!JauQa?s}!W_ej&EC}i6+!a`+jl=fqNnmH zg2;x_jyVGZ>=S!ye8m-Fvt#%PbNbVQqVLnRUoP|l=4g^7bg#ME z(bH!)m~-{Z2>qt?+*+Oa3~JsnCpy-h+~Vvh%Ig_(A{gUN7n1!s+KxGbs%qv*S-W~P z3jooFk#Y8g&fI|-6^)SK-656E13Fjqj?g_?tSGKPc?KF4r?%%JZfT&SBXsts(V$tP zle$Bs0Jf|MGWOXSueBg@s$f~Ryanz>An}X|+TCG1w|650{la;TF zyj;Vux>JL%dcb&QSkNXrMV?xr>^TYsLq=As*xmtZ&Y!MhHueY|P->u0DVM zY~PbZ<+*&gKa=sY#}4LR&D{e?&wqDuX|)Yro4u|xa>S2$5H=6?Lw+LGr?I~N+Rp4~ zC9GvE36w@p<|7Z!qC2ZlCeyLcA&O0mRi4yl_+G09qJXw(uS!)hZ7_4KqOVOc4w%zE zIq@T6%pjA;hnUkgJgR8Hq)cUi`V@0IDH04&yfA*p{Je}gtH=E09uf{4=S9r1{BQ+Gz7O8n}11fDJUf`%4)f< zrNxj3E0gO91CZ!Lc{uKg!*q8t9s3S>_=4}W0- zHa&?Wt)EgGro4MKB5AvezJK8xl7m)I>j;&+ZjR^T6XqKVIAQUEI!f81&MV3J?z`{e z{rmUv`O|0bq?36^GiuMJeMoPs30=@e9Ce^@1gNRwu=hePI&k9M_Wc_UI}qs8$B);U zo&GeI^Q&%vAV+#9%)xeY%DlNQ04%3fzVfDhdaO#bKZUXxWSiZAIj}EX;UiJaey>V{ zgrt9qIkEc(pKv_z`wHeXf2b%-AU50_K2*BwNw+)YxCc zoR*`9Mx00^<39Kpb3$2>#NCFhfk}6mqx23my9o}IBOI+szCLxeo$9_^ud|~y0p_y; zz_lzDD=;;7eW`n_ZYt33MO;@?#+f*4FHT27vhNp)VRaSdGDaqSH-;-*08)Cjm<+xZ z!A~mS-!}5>`D1x+&-Mc}6x*uWvTCq7zol|=450ENO^w#F@@-&S`qxi)h;`D|dL*d^ zT;S1XB%-#60o%}7#!6E`l+!4-(H34pufz_xx9dD&D(JkX=QfJ4i|cKcr|~y}^F{C@ zpE$H>SCS`P+2|s{XK}GSR?^C$`4(&o_Y$_rF*iP15Dwrg?Invil+IgN&l{O*eY)!X z`|D>N)E*QVWzOexv>nbdp+`e(O+qA4lSt^c>}C7vT&ulu0NE{W9L6DIHWxj9W_Q$h;e!8jz8rJf_GDfoJlV1NIbaUAv!de@=dC&j=j5p_uAX6z z{?KRBU-CL%5wBv7`gj4($T8cizR+In!R9jU!?W4^?#S^JbCgewN0u{`d{6_Gt&8qE z+t-x|=&C~lk!I1l|BZ>g8WNKQ!AcT@sFnFah_RnIf+7q!R`!W(*#fU-s`46{c^#f1 zIF-o~fl``QU7{sVc^54=@8*q;{PJp$3{zN1L6;)e(2c=5EJQ9lGgK~nq5_78Is>V* zQB5}+7Vuhhv5XA{#8t(d7tWopxYOkD^G-4jlGCD{QR6aRS}%yTUE8gkZ-qAyk?J8= zs6N*%zxYVcfhJqlUI+H~DKBhXI&Ab=2km>qqn5YxK$kYK&qG9+?n!IT+XC`hzd}Af zLXJeeSH0~^I5)x|+;T~x#y@*)%PyUUga2>^eR4>}Mzv9;LyXjUYQCnUE?ICuxvJtn z{pwfOZ({{r$rolATlJ)hNc}S^5SM(=-^4(kaTzkH`0!h3YS=E-Bb79SJ6PMzZTdB zCxL(cV6^(nR%wW&YF z<+gHV;G(BETs;otyqrvDzBYbNw5HDeS<@?TS8}f^n%~UbAL=lE+eqf^^O$3(T`Tg&&Z#-T}4$r3Wu%%TQgzgLq zx>}RgOAh|0PZSVM&*;z_R zqQX(v>wb^nA7f6cT&>sPSH*4R6Xr}TIp0sp06$k>eu6nI7vfmSyloiv9CK6=TjeJl zFJ8eMw4J)3F0c7&8D78~+P<_Kv0$64)&E_$md(Fx=_PXtuj0VtxwpUmLh;h~B3k{n zv-3TvY^T_(FH~@6i3sYFy_T~1*?=SU5QH?k0ttsfA}_mv{gV`1C+iF zb%NdI>HA(St)@l#I;*hNj~_qASMT4)hi|{NU#;)ox&uFoD-ljt>~M398uG@X6*|Y( zoEVHDWFZW!X`E^MRUcN&p?!CM%#q0uVw=&l9%4=?4!b@II_`OUjybKz?kMx${HV@% z%<1YPaI|GU`BF73wQNr?$6}()ne`JLzlJ%mhguyKLTB9p5m!K4f6_KHKrQ%Fajn#(B z;e9)PVhYD98B%U@wyo+0@9mJ9L=83MxF2U8Nl+df5+E$hY+PH34w)wfBfslTU;Dfh z&@^$N4Qllc03zqp$aL#j`Q7DM^DE3L7XFx0&y!OdJCXKQ<=Zvp80<-N1eB#PA zAsQLH&F9{3$*3!cn?7)A1AOJ8=+t(9_=wM6*j(>6fy;FceW(T7+#CI(PGwaiGqa5q ztKWxjzwIOkGX3HE@8dVW{&oE6Pk##F%4O$=*%;Wj`<>c%wlA^W_4=FN|Gtx)F#=zi z-K+Q-`YZ#KtRJLb?Y*9i0X z2aUz&n4@|>@qy==F6R+*mfk94O#jow>Hp6$M}4%6-oX0q{2X(x1jG{=ohtG+btg5W zfr(xjQh6}glAt;O03ZNKL_t)4BX&H(9Az5*4IJt__qO#G5nSDrI@WTS%_*D+CpaQg z9Asq8XsjnkObN+x)X5r{Huh`(*sQ$PkId_Mb2Zj6S%UpsYRCee_tt?l&dcCaveGNi zdDfY6n8c`EXBzz0Q?9DkNte#nva{pGLbvO&8wi=qcDZ)xr~8!90mzsZ_Sf0G(vUSj zH~1U8`NczL+X`X?W$)9yq~EIAL8h@%-B&n#rt)#+M&7Huo9Y}1&a7zeQdjpAbCS6r zr{3$DyKle!Hh%ZJ-^s6kv+WN*{1CtW&2O$`C%k%Ue9ylF6i*hLsW!9@9)JCHd_t0A zAk6+LHmmn^EZyqeR%tSawP{A~oTJ^L^$2XYHYswezYC6RvJ4wPd3}m9K7alk|N8aU z@%w-Kw^b2a{1Ua4cHwY|q2(T94x|KVILUw;L2V6QsY;w>E8u;V%AOh53pt%3QZWz0EO zB9G1$F@`w=+Uw=H0+|Gw_d*@xKd_}Y`y@;vfJf*#0j>FD%)l){1oyO3vf8h-F}QaK zL29*!!CV4dRV_{$h@lL8Eljf~v;h;7Te;PhLct zm_f@H*>{+u6%k44y1Gz%TPNw5gK>Qv(YpEX4dz%SXpV@7hbV;UW$GfY`+Nn`!Oy3s-Uel23+!d zuFuz(0ek3{X@%n{>N6zOIJ4>Bt-1X_td%3j+rMTDHSLnCH3KMt|6%{3apdDw^9c zsa+PgHTf6v223MJZIZFWePNvU6yP@8#;Qg?$pK$V=Vi{l$=79E_!5LY2c_@6|32RT z_P18ax#J(#_uqdX@87?_`WTOk1;Jnqz*uRcqL6YQ2alO-aol}7%588rUd4kEP(9*} z&Nso%o}kOAj1ReYny1U2D0Xe!MC=?ng{_(@Ek1qv6#x3K{~AC3_~Z3VY!H~!fk`mj zE2vW+*T0JQdzc{?+c(=r#R=@T>6vfyc(*&>YkQ1wz#KgS(SO0_s^*~@@(gqItOpP* zqb#7ePYdX{pN|D_aK1FYPEBkxaECdgLq9*@&8wJWBX5Yt-b61uWza2mk|fQUhTFH`u{taoG)8NuJT z8jmTsIP7pJDm0ey7iof*F}aZGc}q>K08yq<;Uk^3`q2 zWwrt4*ebiY!04Lexi&Juv3vV|v$CP9w|44Vz)REdb;pw*1C|D`$8&MKYJWKsUuzD> zUDKi!w}`OnrSUX_YA;1lO`S8udHq%n9>098@&54r_wnmr|GE>Tc3bsF_HDSCAX5o)iH}w7V@iXC#MSHz(S>IghN2jH9Px0Wb+Z>Gc zhW^|R>Tx4jh+oFn6}*#PPd+WYIEy1W8qZGicAKa?)TKDap#yMGZfwnU!Hoz7d+us< zu)6;YbF%-Zxa-nsGT!$DbFOiH&J4e9>|UjRggNA6wb+u@F#cb`oL8=07fh6PN}3&v zhh050DV|`CR+qrZ8via%%e}V-;%#NJpIzwy9BBpyuC|b_P9L?5YM;357IW(W2RfB2 z0-SCo&F9WqXCb1bL%Tzen{Q};vm^->4yQ=&z8>2Lt5JOr?yxmg{a4SVcxjhr=WJB> z+xPev3w~FpPMl+wN~b)KRdIQ?i8$%`1bF+U=eyeNMxTu6Zw;N-+%h%VEySrKWbpvN ztsdIcHpihr6TRnbrDBT1IV}1N@2!K!`s?31-q@oa!uQL6|KW%D&98qQfBy5I!#WK6 z)4#S-tn1TN{<9ALyq2u5B$sxkq*?K8kdXV@XY#5(PF|ch5(|Ibb5J&C+a+^l^9|d~ zIO>ry?sDnV+xx?NCu@5e5Omr}lY2z#NWo6G<%8QyJq`wT+pl56XI{OZO}0HdVNNqB zH1BZ7-```-h0VhzlXiXaGOGM{TU0lgrf2z-ZeI^EXEgPyfy@6Q=IDHC-^Y5?vGzK8 z+tJ{emP~%0Va~d_jXxS3_`dG(3j+;kl}s`Ni`=w?U>%(ViMe%3xk`VT#$4J`0b6Bm zVA}y$X>HCn{+7Jg)L?rqS1n#+Inx3<>;s+Nqc0p8PSKAC-#QkFE?ub zcBc33eAn8oRgHMT6^ytYVX|O8&A7x9D(x4YGv@2+J?x1o`WupF5zW^=In5(vP+gmC zzz$>nNob>CZTG-N4%sE_IIc^>B%`?pDGp~VZ9a~PZY+ZRNmD%S;bznsW*s8?(XP9%y zu)JTBt`=ZEdt*N)GZ3f34?LAn$FH?^u+C`J)M{8zLh_(5Mq?WW3Oy;`N)}JEv*{U@ zRr?fNclML_B7UNePMq*6ITt1!RipyHLPzQP1!w2Vsd-+ReCr?bi1XoavC@Xz?Gr*D zl>qw`S3(N3ZGoFU^@w>L+4>6D3vb$6YD0CIFl<2#9cjV?JBTQ&q^jMR@P|LdS6_W~B|GN3?ibKyRmF!7AL4hv`yI~)^(t{hJw6gH zW&ANl+luk1?W^0-pEi$={n`(h?^qFHb2P$BZU(&ZA{qd@$>e8_F=ydk=2P|cggI5q zMxm3zhv^WN1HodBuVEX1ll`VFK!%*p4w$1ptNbZ1(BX)}{aaR#FsB%=CPr>Lc!oL2 zcGvydX=uYZU{3Q>#AZC7l_H^CE0KDJIZD3j3esV=dT8v%^Q2labcnYa7*V`%?WEpI_gjBhXs0R^l0vS(3mEKOKq7MdcbL)0Jp} z0SQ&I*A*xHRJp>YyNO=aQuP93IaoBk6|kTs^Q&^eY>`mSSWTK|;ayjKE7N6ZaEFDa zCotRmX&d1K&yOpDfXwCZmvQ*&V`0ih11nJ3*N$9U4&+CZt=@|+w)asSgz)LFeeS?B zjh%WR@3Sfc8|(LjHurfwxSzHxcwXzKT~M#S%1Sz2ie2D8vB%S=KVXn{1}n4q(TS_5 z>k#p8e;c1Ze&mWdjA6q`8DGA2G+r)h)>rCSA?M-yUJk0*=$1lK(;PA?A3j=}(ZV zosJ}X!<=-!^*_WLRH!+QSI-_{4&_bz8WW2fGh{r)oa-MRF$v>GwGKZ`xj`QFj8sNs zx%?p&d1LK_IbnK&UNmb?mZkl<=a>hJx2#XWN51&a z06MA_(7DK(Fz9L}nF5F`xuKL*_<_&0qVF*(hN?y-B$UrR*|6$|#nAx^wz^*W)Qo*p zJ*xjF1~A%N8y$=4lQC;)Qza7KQroTR>VsL-rT#CIGL($rx?yd@?MKIwpe0(<%AN7n zKrR(3Q7)=0QK|>|ltYp`I(oJY&Ifo*8wc&+eA{7Bu?Og<0jc$yYtGA8i^_N%4jxOD zOp%;PHsl=Vl%SW6E@*!xQos4lZ{p8?`V;Lr>FYR?gO9R{_M5co#x8qrf-as@FeO*g zxt|HLD25e?*hI@bd=2zerzhU-#~W?tDzrlG?HHl=w=vpAbPUH^5xV_CF~=~ZMIH1` z)eVtj$BdHu?z<_^Ot#$HhWHg_b-grxh-~0b^>&9j^Y^pDc=H#pVUF-TWwhR;Ju#_69wpK1qQ0_z3+wd+_GV2iXb{yK^*|qVGFA+8euydcpbkIPKktG^C{D;Q+XGUs0TA!Kt#z0!oa2N=v4 z-n#DWyric)Wc1juQ??DAo1l&8ylkuM;EG4b;+Y%T%z$Z=yZMo^sDAYPg>f@0sv5a(6ZI!NLDOZ$|K1!Nuz`Fpgr)Aa_#IlK1@-TlTXa)#o&`< zi+#vf`>@X8;-`IEWnKSH>|!6WalxDpu*N6b!$-1E9g_2bPcWz3ucdy8?wU=BPfLPZ z%<0!+TfN&*wEU)az#PUKCJqGgY2^0@M>XKo6hVn<~Cpr z?zOd|q@Av+0~{0uk(|c$#cawF7Ta#?aXBE`YDv7$a2RM&gJqWE4%_XTaD>je*HLox zBe0jS*^>_58dJuqqgNCNf>$+;;g9n5K6djd0GTpfCZ-Dm@aRpF&9=+*1KuhkEL)3c zr{;Jb%^8WyHG=^+9a$@QX;$H1qStRWt zh8{TTHB9Yxa>5*AOJ29mn%1ZcKEj;Q$ni1Tx8`-(9G(?>E<048ZCkJC>P;ZwG#^kb zUTs9)O-Yf_-Mko*e?m-nf#h>abn%mG-q7_jjQ}I3q8aI$fuRHzmhRm z0<%rRxX6kGqyYa6k|0XsRr4ipFhUzieX``{MSO}Y`TO!b=yx>D<-{m)&ayTnM(}bb zQYKgv1OTvLNC~g1G-*$9E+axR+R5jTv1K>~A<;lo_|G_iKLny$-~cR!6Q$4)P*WSy zGV)wWn>{SM&l>zpJ#_z~<`Fb){POu2eD!=`UQO@WJXft>A;*{SY5Wmc98=QmuIF_G znL}c&v@5Oy%J1L5k3atLk6lqhlC${-^c+KH1M^@=we)VQU7ef$Z?IdUFHUA)fi<@l zCgwnI{3~-HcEE)jpJC4Xy?zn|V@n{?61~}<$x4}X+JiTc2};w8H!13UtX3d%t?{qF zN`U=2d^K%Wx@6vk|BfG{?}j<552>_rf#*q~EVUnE4snWG{FDoEqiooRnA5%vn(~Z~ z;<5>mSuv*u@1l=5%`;j7=6akP%qjK9IU|5i3IeOtr()*)!!8} z%3H)05=_}DS`Atix!#ejb|PK*^-7BK$lwloaKa8#OIZ-FL2vQYVpC6WF2=Vsj>(sR zukhYPtJYVbLw_N9Fjd`OX`1z*rbY=sl+|2HKVMzbX?nG&ai`UTWKGaxm!YzFRmYS z`+c`9*r6hmq3Y&;xL1RZp3KGrP3Rl(bLbW=4nD2&0BbuiH}0)@yTKe7L2vn_#HCO@ z%e*|ooQ#!>UqrZdMAcp~Rqe~yK(N~&u0;)dSI?6zd*uc*C8KcxX zc>Ml-eEj$+w6bx!_TaQ&rfNJBJGrAbqIFfpk3ars-*^n)!GCBcom@5mX6=J2ppmv( z2sz)_JFOCp_T7_c0H0f1?T1?Fcyx_mPS#LWI1D_m!jrW3LhO*-@0dfpeaNcu02>C4 zom(R3wYcRu71B+ydHBE$=BTYBc%J$T<}z`~hnSYcZwg z9p(@dW>r-%1Ud%RF6z%PXC7%lRny}ncU+G1(BtU+SL|rNS=$_3&-4dhq1VQd$xzAP zA|~`A#NrTn-Px+pud)Hzw>|*Y!Y}4(26q8F|5e3+w3{-94_%~mLYBcY-=Gsp;F;f~ z+vWfs!HPPAv`1N5*=e6prVB<#B6A;Exa=`?KzAS*f;tL~qjR|fHYPi4VXHfekydFh z4eG;Dhf$~Tts^Dp0OvUtEw#xwycWr~=lvyuGDd6D?B^6Pocg@;@T`Nb$YW2$?nbes ztVzlIUkyAci%;lflB?N8#RoZfoQ?)R;qtkj_Z}tz+QXUK=pEY))0tFph@qs|t2*H87crp{Qe#=UgG{l%nK=QF1s7s-upVGF%pYG?Q#D-+%1XNqURRyZ;mo8JD zNpd6!;Kb1sS@eDt6DPfaLF3uC@v^woz5Wb_Pb+_-91#h=v!l~nS^ieX@jR!Bxk?U z%ECUsz$nGM=6#Koqun7cZQimy*G2eC(a-^N`LQpPpxZ~hOcY9$WH>SH~{ z9C;45ROc$|33I^v#?zon{p!;^`q})xvpc$e|BTUUb<-953F6#@5E)x><{difA!F=Q zs`~Y$3HRePDIuNdXxxu4YhCQbOf99Nl<5;Mn)p&aoRBk)ANxRt&0ECx zd~831ptvxUWb&D;ZobW{wViSgnZS;zmma1YXI>3>kXYqcP*ra zV~)^<4Y^*1Ql4QBoxEvm{I8C8nA1l)2G-DqiMc%4a@{d+yuln{L3rGKO~P(WM@bb{ z#wnpO?drl2fQiIE+#jB>;biiD+xq+_Z1e+b2YDe}j(&Vo{Twmzt@mRQXKnnhoXYw)xfUdYZ2sf5E`C!6U5$ z-^3$R=E9EJ`Dr)(7SDE@f7V$y+Gt|Vfvrm7s$C^ny zV#gQ5lF~lslSN#Zow01goaT4O0rSZtts?{dr(?~b&C%{eh928&u~`jy9D=aQ!ae2~ zPx$}?CE?DUmSMl$@z<^|&Yqhf@a5j`Pw{JNH@6qZw@3O-(`@AW@2$Zx1&m`I0tz1L z4NWZ6zSe_TlIuhuS3p9ZD*>jTZ{d19Pn5&ihby8UT>x8F2?yoa;oj9>w-@GK@Q8)s zTS?i9Uwsj+N+ydutW3NhOshovSY6p4!904+e6o1c9zBTu1xt(!1WDWBWNN9z6ae z-;>h=0+Dp!Cww*t-Be64ZX|h~Joos0Q`tIZLHE~P=6bqBe>VIpG^~Vxj%PmXT*{=a z_Y`X$M8n|%+j!f!^WJ78@l>r7bI1+t&aq=B@yg810!A7A8`e$U%(vD?4Af+@>dg29oNP_We($39}^j}-(gPkQQ+P2<_`T^PUUkmD4Z!ca>5~w}My_=Yaes4V+L?CmM1Pa!JQtAGQh2e~j3|1t9?vvG^fZjR+71-Tw=`!+ z@G0pn-`jwz+H(Z7@Tvf~p1k$Q!os5ihU6=Sw<*KeMw7qWe`D!($Qy*Oja6p~$YXLT zkmr&9oYSehmqYD?;Bu5p+T-`&wzzpWRQbW<q<;9;XpiKw#Hfv%XtK}>)cEan}$4N0)=NdJ0M58n8@@jhG9`k zD;$*Mc2%`@YD^wh-G+gZ73(-9v`z3tHE4~o2sFN>>Ik4)q5FB;cl)4Uy8IY+&vrel zr7UV4XSC%Z&z-i5%0xFZH!$_t+Mg+hHCoz1wDrG8>H~qwGxf5u&SUud*Dzch_V{?G zqWl0R376#4ZS;CQ4;~+f&WJ8VpU`V2R47fIWYAnhZLocM01N`a6MdM4iI4vOxzzrk z-Q4tm#HT#^G%sTdQD19xvWIB`Rm3JsSE2{MR`o!W+}pXr#E*B3|TD?!+fQ^Q}B^6rEX8ei)WbA2dc~E zO!FW0pkcsd>9Xs?u|RnGg) zX<55+89fhP4Ej7wz3QyL>%f@FLrYMNqDDy;D-3&PI}d2#+01*F@8?uoGEOUY1HdZm zP@Er{@~qR&M&$W`@5~9>=aO4?025ZGqMc%H(YTI=vcT6Gr1a#Vpy61wD0P!7yPvmS z40jSad(PM}dUGC!PD;#SpUs_4Q(FAwKB<&p#^Cq5VwdqNN;sYV*^H)^gdMnlwV+lYvb! zp{{kSe=BG=Tbj~=ypZf@@yi(ju*9(08nwz zfzOR&jx)XwRc^Q1sQKgM(D%mpr+*C(!sl2KLTr`Q|GdY$p|U&7;gQ}Uf7`4M{tD&{ zU2ZsWx;M{TxdYp?;UiT0Jm)8E?l9+28PdPquE_HaJ96)Ycja^J4Dx;dt1Bbd zHLrN?8S(0?pgvb9vYbHDhHWICvw%L-ATA~AbKKYPQG=I=u;2Kwt-z*P-eu_BG@20w z;7tIU~)Mu*ZvwkM#cVt;6aOGB>X$*`h|w zPU}CI*v8!Yof3fD`PqN}LJ>RL+o6vSA3pF`$Ok($oNeML$JF;S4=F&OqO(mBrMX`h zP#h`(Li3iMLV=B=!F#_Cf1azTQu%JcZrZ}t9{f7J+4FcCa*klqpEm4Zkz-EI2iYnf`!;>V!FvdseKk`y&ZU$SM4t6bYIG!<&OtpOseX&-z5HF9C3NwERNv}~mP>~Op9~r#h@e}aGXdnb z{j3ZsNd?!&uT~xU+)CJFYEaYzzdY5R4J5h1-oD)!FBC*&b!XdSA)nF`?7`V0P0|{A zSM)utbT8R*+*Pfl7z#7nl)+_6x)t*j>8l`#=W0xgfBn=O+Fv%E4X`>Ibe8Hd(zjJ2 z_;C(NB4rzqpW4ScDLA}oW+iYv=b{(;q{@=}J~TSR+bX>FxA3**XZ*Tc&k^`pnP&F0 z>)`QM>(f=1P<9{kbh@@r0->)O+o`>M)8=R+U_WC`>KpOxxk%8y8;=V!Fn?3I2zWL6 z>dIcTFA- zJ;$=o<|V?yuh^wku6jNl8;M`C^)WDK`Z@=jT*<2fj}I{CK_%@j<|rQ%b5iiMD~!WG zS~;Q@b;olpVtj=CAg>-YeuO#m_33x|GKh^8W%}qSKV(y`5ev1Nl-jUD*S#G}PF0)> zJ7gT4$CE(PPHP1ky{3CdX2%F(4##=R2%lI4ys`&OUKD5XgNRrKb{4*>6&3v+89G+x z5%Ni|ROK)FI!R_!5JHTm6f_sdVlfRk75w;{D6kC+bo)n45$t@$0;iszuF>j4tFCxY zaB8n+PwUou9Dp)m4rE-i=v#^nY8$pvk2UUDyHOffxxko;tMg_1*z(1YNM7c(-D*s1W>N!PP(60 zC+9Z7cVMq?OoG0V!w?OkOJ5HAX{-oSWGAWV0V9U5U~KxZKGAt_+C6soydofW#Xuak zD>8>JAU!9ebp%zyC%4msyFC*M8LM$g^>Gj1>k^Dryv)@I1X{U~PAp$=(5T6t_y$#!u{u^e|YvP|*hmv7i8a7YWMM#FSA&XNUf;zsF{AVS&XY zCmYR4lhHm)`AaC4(7atlSio*0Ov*=xt5y<*+th=VJLJd8t;Vnd*resvGH*v7ETe7t zsXff&wvIcj1aCj$Dx~$Eg0b#^E6@W-cJN*QCg{OXsQc46ZPWT}^+(l-@8A&Z+S?(` zj|B4r*qcfYI#Lbn^W?^Q0Ysx&R9)Yb^VLdn7|;AXf!i_yj|A#E@U1~<&xD=!7Rc_t za|2*XU76`gplWId+s(F7=Q|>{@3iT^$+>%US@LsZ)8t|B>THH$4=afBJv&E!s_oBj z!wcz~XTDdfX?S>L9i2*xbHW^@en{x%Ct`R1az4-$bD4{|qveleM29-hPxjnRs5f4X zmwU`HK12?Niag8R#OJtL-Nx>Le4(DUmqfuaC)@Xcb?_IfocAA8mejHyVNSLso~k2h zeN^_nkH#1-Txf3z{!Typq{)Tq?lMk!z0dJJ=i+nV_3YlvLxQ@)|K@0zpEopCaIFP+ zsMrW3t-ou#sNd1_b$?P--3}lOm-gu_TEIE^(eoCeoK6*1O(O?D-x07e;i=WzfWH54jBO*wky zj@IjMhLtpRWi$M{?V|9%q^uUuOC+vpK(IMpiAITLxWBB{2wuik4CFjiRorH)NzHAa zBA50nz~;NV;6fzheyF)5qUz zxu_?dcMnc2W6MzHPtCu`u`O=Eiv+;g-eRGSjl_Gqr?#{Q)J+!>Tx>h??gHQp%qg9r zberPX%QDq&W9r=7ON^3>dasfQpx|@FoQjiQUA|1~%!p8*)g%UdPt1|J$ubvW022k3 z?J?$rbrC#q5NQ6-n6oTw#F6MH!oOf!4nFzXF$cR9qV66YZ9wGugfw?NPIis6U%=Nu zY*c${K}hRrn7bY2WuaBe=4N~otEGNrvA6`AdBxP-l%qt6j8|8iH%=Oo9a-u2_t#+B zWssKN*Eeh{Nrn8?{W=(GMqY^(3?&!UljEx~7_U^}6tuB!1O<$jeIs4Ar4q$4$|vU4 zLAfH=S2mx{=d=zoq>n$FtE_7Qz{z8>AZ@_Ej)qS(WD{O}c?kTt`h#A>?O@Jl@7<36 zWP$LdM=yjUfiLZd)5~FomWo-;@YK$woDABd*65>>pt!(;!5!9k0KH$p$ z@v{za*`cagjoGS9=tGurSD7X{S@q=7&a42+iHD+*R}pzxLCSh`sLI#rSw zAUVsHsyEjGyVI#QP%W=+0Y|;I6)W*gORPH4Q;PtPpgEsgQ=KShhdd+;&0TvNSFIE6itmoflQAh^9Om|-ti`(5|G{pOqAu3}e{V0Zk* zJGU6Z6?$Uq5Qz8ps`Z%+(K{?qZQ}$1G!}%UYWFad-VmB?e#dOid2D^0U&Wm6J4ar)-Uy^VE0}}DgX*IfW)j2= zQXJY34Tw4YwJdwE?%%m<&f5*$$LNb}b5&qG$v_ydi2j5VZs6if9`xqam`wCJtcmS4)GQMsvSuNR|jG)(xyhE_R zWOE=tt$6iXVXxnq4@U&H2M_G7=YH-XM9=eilXw+I%Kl_cpdw zC--@{9poo8+k9i2LIKswv4xKuUAbkPk4TFAc{c&C@IMsthy>&Hu%0c+JrDIdQ~RwG z4JHdaU)J}*q~9j!2BBw*oXPo|pN^J0OD`(rKzEIIdh!f&U`Uq79!J!n&X}{yu_H>} zPM*)3wwb#S?K2O?G5w!#RvhS&j?OkV`MSZ*Jl|J+z4iHpB~eu{bBu84L*|!KO~Ip* zRd%c_5QEYMv_JA6NnR;E-}eZTpQ zUcupYbo=$+2#(N#&OKh&m{0^xYbW+#m5PFP^%A;r&#(QHPZiW>^O@A)Rdl%Y{OQxD zE6FL+<4l0yJUgU15|(BqP<5#+n(dJ1`N@u5R_H{B@bf)YXd|@XBdWDok>LZ%XLN<< zeo1-N#HPIo>!hbPlrkRFRo9ks4ZZb=6PRalE4x(BgU`%qOX~m1Yc(B3D)VEdD>ydl zBQhV3IrbX1I&HX3%lnzlZG9%D2yX)i9UEKfoklo4!=KGAgx&+pG20q8&^Tv2JjR@f z--?wX<5|2Km_zyFM*gsIo8FwqO{O6OctzWTj;YV~uGX*lknq_I>X;(4jd!cJGM?0$ zsjGt?1HP*~E~#2q)G_Hju-U43muQ*D7#Ufa&5cYO2}>@;twhN_tk#+D^}M3`TXJED z+a7k;p*$-qjM3~^${zrB{pQdLsV=1O9KL^gkr|mRkO>LT;I&K0Qo1zCngLt3>2jMa zB|1A~sGfn#o4VRCd-W_@()BTZ_Lw37%guep2jlx+X7VCqdG>936X!8Hy3|4cY_Z1W zTIo3$a%IfU)jFyQ7+c`mso?_^gMZa0XqxzYIb4|YEOia8KGxqldRX=L7gVkRDuiB- z%6q=*VLRK(EkFE@GdHf+1HB$YMjkY(knrvL)caQX$=uGaP`88sSuq;(;Of`+NX#;> zZ4mevW$)^<%5QTmC-PJmJ;$Jp=Z+^NHO|5ublh`v!lr}_oz>azxMeqi2?gu532>8W~lgJj3G=nkC*LDy^uyfQn)jp1-{66ULEU* zCmC-T85t1-*6qKUIbrB4c^C?1a@P0ykSE6JBuO%{=5cLPX+jk96EgnV_$V6eN(QfQ z_bpD>-71kdkTIQ+wCTOUZ+4xO;K|I>r*j3Dv!F7lY3WlBFL7wia@%;is3VMAW;HGvt;8b+1-*x z42f;lW|EBivU0sBpR5#m&K?9hq&)`6>fwgd`=#Cz7gN z!u{QBlsb(aM9v!9DI3-*yTFd(c}Hz;n4?stZN|BB&zNIqBll#S@r6-}UAvr*F^3g~ z@#)1U8rv}kQnQ+&aZkg*Bhx!!4r#Afy?`SBR)t!zrBeG2otu4a=xKN7*C3SMYnR<^ z^Wt$-k7C*i^rST|x2xu%W0{PlE-m-pdXiht`f`l}`0^~snzqArg)i;O{&+bfEPQT+X*=HUS))4Zd{bozIM$fHXzX>4d5 za~5N>izh-nYO^I{t|PZIl1Yu25xf7}xXX^P?A)W)HXf6Y+<2UestnhM*@1$W2E#iU zZ{$8}@9-d>&jxU5`oqMZ?cBuybBxN3o<^A2{QC}bln3_LXGh6yF^9(sWb6aRov7|= z78Jkn`|H`p-r(mjUQu(I`bp;OMTpIl%=uC0kC+&DJKiY$*>;;}k!UQkW?>-qWa3ZTmS5 z=on3z`Ns%irGGKyb8t-%Z+Mq{-MXedkHfp`4psnjjQiK*{LIt;muvEQ{R5j}V0|*; zX<2r6O(c2Nd?Y5%KZ*2Y+@IR;ls82DG?^n_miOT`{B!q@HB^m7)pY(lne^5RdVZzN z?Lg}5JH*NB>FckKf3I+@J{UWP3g8_@ue{HHd4F3^-N<^voRe8!iQRq%K< zCW4xGODTIE;~h*^KeF$+#BPdCabG(Py&4kK@}fI8nS4g@`zu%`ze@ty5k^xS_tDj; zE#Ol6uy}KB?aVexpvL=WZ9bxDd^O~2C=#9 zzca$sStrW3@%KPr8Gk2o{Vi=Xs=@cKhs9e|*usyz7M~kD?W<(OgvZy}r_GClOXz)Z z`H0>Lb9Ubh--Q{yo?*`2b)u&jJ8IDbz4oymNB75=bK(i>Pz}}B>wVrFGv`I#XAiB% zPd#d^=&_IL-0f;>cIY>EJJ{Ew%$@hWUCpOMWrUQEPPr(v*^9hZFd|?!VoDV;OBbgT z8=Y$yP-)iYiB)FwmlxIQcws~dcAog>za+P1By8Vf2;eqPDx|l+y>jWRw7r_x&`s@6 zR6Up_Jt2R(?$|oTww74vO)gIRqdrgjfN-?3$0bkG+V%5fKbOxzW{xYLqgl;MhFV56 zMzhPOJl5oyG$#r7+e>GL0;h;9ya``)c7e0zALKAEbp4*Gfkt((^G3@E23;9h&kC~mH!s7D_xHNsdkBM*owZ{d0b%*CoJ+-yBdWJbK zUCr;r8pX)R^zg0L;CJKoA?D0y(^NbP55&D*i^4V=+>m$5^*A;$Mmj3%yE@$MmQP}* z>14ZiwxYKP-6Db^EO3+6A`Ktu%}QgI=jQsNq7{qCLhn)gfhp&N8KW8N&_M>Bg3?rf z&9q{xRfSG*WZQ~~+vG$mA6gmFvoj+S^%mScU9S?6zB(WK&eQOH2(W{Z>;)(IJR})6 zhoy7en~(^4&V|oe9NNd$gYP`f-T;Hz2yBhL4;S0*oIV+AJmCTEL$CIaTT*rrBqrxK z0i@h+UWQ@V5%(zjs~z@~=5$0@#yp+Bnj#k^!{4V#{*#ONKwI^B*`@KRDz?KmI3+NC zuQ!K#cwdM62YWb+yw93fUf}N|Il}pi{gB!bbMze0onN>P9&t!6fuE1Ai5quq?$7dx zy@}1r3h*K3RH#GE_ZwATeW7XLF=Ji?p<_g?KaZMrAy&6@g^!bt0&c3JEaV}#^@Nf7!;p2|-SDW>zt7rr0Z<4T}r@`fVR*S|w z2eR$$rVdvIQhgprD-a?i=S~P_c6>n+ zJ}HXq)-Ao&*wTXDfiU9wgUc$?ci#n=x17+ih|@8zO82 zKcHJ#_T!wVGayzui8|}@sEE-=dcKTdN`PVX_N9Q~z8d5y8gtG@pN<_Piq6OMCNVCYBA!}>gseZ}iS+t!N= z-~aHK%8;J&AXW<>h1}z2j=_^vQ03L#_G;UXTyNc7woVcbt|eOuHoRR8Mi3(-t$E1P zh}>~>jg#gr%F{9)Fp_|#rg?6p8L>-) zbUY>4h0Rm{oW%reSrv~ba(@PrWS}_$EbHpcU(^0IiSxoa7Q0e5>@TPagwvC zEc-u4-x0fR8pR#vOiHsqBLzQ=LwoHc{gj9-nyloHFAW{ME5_KTv+OJ&HG4Fq zIJHwvDGy8Lwz0c*9LM+JT@L&f4DEWbO(tqQm54?Oh`3KCI>u+(6qhv1I zoF{K^AAnSn8kjIK$KwW)AekTFcMtDa`4DsDG5yn%s~t-pV~*}HTnRx-D!i5bYnYSt z8PMuQS8HMQHY}=_Fb7wHKH_E|8TF(~d(HEkeFOskjR4kMC$MbJ1^EQF8qQl%yhXI@ z&aJIf_lN0QjzNg0Z1MxtdhYcNfG0lKO5`&}Fg5)ue&0^Qc)RB&4a;9;5BMEE?eJ30 z?Qdeb{+?DmmpJ>Wl+0XT>+ZI63=CW1LV7H_Wz*Ed3I;11k92IRZ_rGXKX2Mq``wCh4@`~kfPmyP3sk$>-mA11 zFm-&7-DdVrxEWFoVf1Yp5M^cXmx@mb2xzudFCfsz!|9~*bGzlSF)N0s^po4X*Bl5R zN}^qC4_MkxgLe+z6viWWzWq!74kGCA3NjejRyvxrXrdw=Q(Fy>6zxl_001BWNklF?Kyh5SYk5W<(~fX z5|NDG`9(~J3^C$GHZ0Bu912z-vRHqSRLbgGFveJojM?of^nm?IVx6qT2P!AU8NnEA zpTgIYW%`uOr35&scHnJ~(WdW#hzcRd)#4TQYcjMR;K#naX%Mt-0Ly9+C1d>Ks6ZQS z{{WvpwH++GzbvTswb2$$Om>7Pv!O&7C?k=k2eb?0*L73dH_NIHE(qQ}CwM(t=HQqU z;_qtnyX+Pu*0l1Ichk3Kol*i;Zzah3I%CCx5*mA8V!XiW8!DrR1OGSQy2Tvo#41Ue zjOS~Z(>ObEK=poQ0EP>OIi}`v8sKZmtZ~M2u?LuA^cCwxU);^e?RN`V@sSvydJ57) zeAwb|w@dp3S@+3mo%J?Z!*vhn1`JZ4SI=pUsUW8{Q6Xrtn(hIV3?$kmqf8Ikn)-l3mh8Hcv$p+;oK} z92gDLK`_{##)^pTTbixZudipYJ&k|LMot{(>4~q#jx;9kIb}cawb9$#y6#|aK3=L$ z=J*jogW0)PJ#IXi?!AR(q*|g^06EIE$Er~9bekBuX)z`N3Em}kr8?98H-3}LVHSKI z^)+c33uZqetI9TbAT95^+5YrbEXvAXNAA4k)LjG4KKF+kJH8zFJZ?!{qgbIq7zxuX9!Rb)j0SlINInhXY3&8F9v&(7&9EEEK4q>talT-v6FKK`VB&iAW*=w*Au0bbTjss%zLdLqU>ye8)au$9s%F8+Fg2r- z18>-NI@KcstAgXD@WjdE!4OAr7)` zw%LKCHu+Bee;j)ocG@s(>P+MA8*nk^6`yy;VZK{M>?dK)**`Ugm_|0=4)@1x8c^|) zcr+{eBGX1Y2JYtMNxSWHXIGx}dw%ax?bL?PFQHjU9{le!G^$$q8U+{~f5&Z=L;Zt4 z0WqgOQTpOXCmqu;MOVMvl2B&IFvxl0f3DoM^x9=85CJVI=>a(2IxApq6}JLrWkvp) z>|*B`wdu(9PC0B|_6*ySuC2<7IS#Da{ha3!b0WsQJv&GZ-lcNgV@`?8C(0TxyZQQua8=n-CNf?-CPMXeytUK;LF^9Dr`HBoED_$haj# zg0Xr?taKiiGA)jQ|3mrnasVbjJPSPz5?9C_&gWj?ZzcI^R#An0Jd z(lYdDgOApep6x*;Pi#_NRIpD4KsNUul$G+h>Hxs*2?`V~!9^V2OWQp`V;)ph45&RT zTNOkCZwa}p;O@@rTyf0 zmY%y%t?h)TjW_u=_8nzg4x%chHT4m)im`G?l+( zIltXQf<=#Zu#L6_;WZ}zK|Ha?z;hdW@O#1>JX>}wFl_pnTBdoPG3WY(T^Jw4d%-uu z?ih19mcfr^{~3949%`#NXG_j=zmz>DvM zL$mU-#l7aFysyzGI-m;EeC9LxeF1sF( z?J1V$xojd*lR+`+O;2|cb8fi`-49SJZ>K%;9wH_1Ti@kq%_V%m30SrCT5d0%bbck^ zV=M&@H(@fDysb3CXzUI0HT1cRT6Nk(_WoDFg}{$t!bV$R7#1W!k?{|0mFsD`Oay{}dJtKS36xq06U zA|3Bgkz$e;ZQHw^N;(X>MzA_)Po2#9U?uy2mEB(KFe-4A#dvIjL;jM=sxXil@z$ss znpgm&${ZD&57mN=?WXlV&A2)V%#0gn`Bg>f{Ap?&zF?^&P3)tn4(-`OPCg$=UA7Ac_x< zXuWcs=O70AFWa76bzZv^uLPTiLOR9Xige}Fu;+)- z`QfE@5^D~o9M}7I@7~2<|Mg$rtWf{Y^?$CPetq%97xBdxU&x)ucI?|^>)v7U^h&?= z;F$OvsmX&Kb1XEjzr;F=DcB;97cr;X`{rEx?Mv>joZe|GN6ULX-|BPkc6jg#=G>F= zv5DQrMk7si`--O&YaXTakVW< zbb64KQm}Y;Rc`#S5_3-M(bcAs5Gvzz4wecRe|^?tC{)_xYoTw$UfLVNa!@<WwpTwxBb z7EN^LeB+EcXUm@at748)Y|j3QcW308F$de{9!j)n<5pdYm}Kca^EMW=R_5cHF8D+< z#3AN%C<9rh*ywZ_U*6*2=|Si`*HTsNr=a2Rs+aq(H;T4{dYSR6)Sz*-iPKY5P&FP5 z#V|nQ(*Js^pd4u374fvZiokYU@(I<&-xRTZpYsbo4UXwgBzLB}JY_P`q!}G4>z8Z^ z!Q`j(@wwZugMJ5g2K zKeprw*0($(;{OX9fS~SQNH_06%MDcPwSy|`<9;h(cg=dx&P20mFqS^g?NcB8CI`xv zG{>cH{8dnaww5AjY&q<@p{KMB%0%ZFu*{iKC0z&G5Fa6-(`|3KDK^Y2>ceOF5hxZ9 z^HrVP(#`Kp*6AI2^w*JY>Al!QOYGKTI4jniZ-uxB+c@8+xH!&ozZRTtjo zt34+8Hl27Ie=~G_O}hmCiDPd17GvQ7a{xPavP+4te145N4LgT6gx3{wT)(wU9Q!wp zSUI06-p?6xoTgb$MEMOm;`|ZjgwE4UfEyR_b-)~HZJ8yf{}glb*Q_%(SW?E!_;-JQ zaF8_pW|=Ew^5HD}^Hcv%GXmLZ;{BaTr`ywsf@XOUvIhpM-*9Q) zI+VdS@SF~~x+!q51G`~dBh;W?SG`iHN*3h>$aQ-g_@uAowzkH8k-lbYHB=ZU>Sden zzfH^+a72B`A%Hir3zSo#znlU0Gxhh@!+*?1v9GLIqWM4({&!yDZy2c!n z{j!jykD(qG{l&-=%t5|HJV($FYhna3=UqMD;4`IFtPps(DZ$`f#}1coS~8p#XEC^I zs7AgNt2^8W-b4Zbgz!M~xLA(oI`(Ud(|#x&vfR(`-&)6cPXN^5arKp34`+V)^SW%> zg^l4j`5`$_zS_25e9*K?Kgch=FO+rUNtPmfoEraE;Qu203IEb-fT9n^Menwn)vKQ_X+Oq{N#!U9embxQMZ^6 z+>g)OYu_G&AmIIW=5%+#&m-SIT*2?4Gm#l^8w~{|dJN6&!l#Jm2Yo<2#2j#;BNeu9 zc{X9rsr#^{j_N;4KL94t@TFGg|jC-$}F-E?Nn-%|XKQbz-eNMOh+s9tJ47w92XhR?}W!^Z+$k!jw zfYyEKG`R6&JXl{VR~?<~SM5yC0o-f+%AsA8W$2@>;^0+j(g0KAsI+Ogfb~jSXKFIb zNq1A6938MEWheTzUJg$EEk=Wzg&{*9;Kz>+CYO$5X0AH=h=|1RN!77r>gsY{G4TPU zrn0fEa)nb4c*Y#|rRW=(9_o(tA>NOe3(3RtB*gnjr#&^l!<-}UrQ=sHr`c)?fBLcR zXPCqF5ffG)T+gp}+K^wvqU)RmCKk$7vlan=Wggpc5>=Ro%#k*McETgO90T8l)XD(Z zH4-TVG0TTI>lVr7RWh*oQe0obT0C6)P;d>iP%@J0FncO(sjNIVXgZ8@=eC{ysqM+W zQ@t_80kl9qQC2B zeKZqz9{Y9{gO1l-EbO64ql!TDJjh1YNW(^70z1$~AJXSYTY;`A%R)COw(u%i38Q?* z^?TN-$PgU}!#>(3H8I_~A_DD@nwRY$4j{5}8tTMLxyK3)3~nQATZ1cT(HR?D8RRwr z?wPiLFD6BncL$z>w$pS&mmn$4c5t43sI{#=5(>$KcFS*=M=Q5WR2XNwL z7vgCjyh6>E_o(`ue5LM3A3>g7eke1jq*`R#I+|i|o%K*saXo8O6Q3Lqz)I5qsT^B4 zJS4ktK)JdfU{0Js;`|e$A8@LSSRdOe7Baxc;TLq4$HC3e4jC=_)CeS zlKZ56A7W0`fr3fVZy#e$@k@~$R>Kcoz#PKB;koTUF~#SK&X{AV6pk}rB}=0=C7JEt z(czVmz2YE4h7Oq*ZVf>`B(%W|>8{TXrl`VkCNf>i=8^Q61A!+CD(mmV08Ly8@V*PM zA)ox4GY%gxAeKv^o->Slqaqgk{VBp2IwmNP&; zYvecZ7J%!&3`RKnSbhb4$1}HeRt_~dkcAx~`76tm=r#dCrfggC9i#__SL7-MYBLt& zrT@^7Ry~z58bGekaEdQyZ^Vr$uAp{bSgVSlQw%4J(~u35edY^&uWm*c?*zgnw%lLp z;EH@Gmyy1;o*Qx@vRq4}6kS>Vaw#-uK85z%1(il%QtbnjomyeNPIBWHE-Jc(G8=qk zJ($m9R9&$k^`fBZk1zYkffOeq$+Z&Zphc^1;A-e}22ijcrv;e9I|RnIMBAx8!yNVX zD+L_)_|Db*h?oI$Y-1g+wB^~?$}`9%xI1!zIqIRZc~ai3P*gx0-z4R5d3Q25ZQX|m zd~od+a|r8{~?n66}YXg)Z|3MxD&)ZdcYW$`LoovHc>@su~;28hu_ z{KS2}QVFg`38(X7rHtjs`;a_!YAKKRUzRwczJnLe>aFypu2=O_S@=c`$R5Fg`U88T z-dtuC(m4W6>JQFx8T05?^tXH#KiM{YXSaj1ROwS7FX)fdMZ6Q+pI}bWg@}aA96y*WrDfi!xFcmU;0`?Jo!&_dJ9IWTR!As|<5^#<8o|s35AEg* zX*gIn{3w-|SbVuQ)`dZ9Fw(jyo1I9|F$G(B*Xw(G@cF{K^`XG7^KpNZt=MLJ{o>F3~ zdT8n^B*Jq{EtYT)ahXu>IKOA5MEtleU~oqN)1tFvrA0=3@p%UEW3~N>?jgLQoL7JI z?A?q3vriatk22SlP4^SR9H@ZaZb@?2&t6!s)eou;ATqSux?v<{NQ&|+$t=(wBx$Q1 zF=;$tj`BaCd;Esje~me8GoD1Vp3n;_=4@=Z&}(2@ltXL?u`pv!DaW%|^P226=HO&O zTxU=(L~}jeU=H=S2U*f#)8#$pBsQ)Xn|!f;x|DCBG0y~PRKZM;Qp^3}E(nT=j1aRj z&avF_a;B5z>uWfi2YK>;;$3QpGit0}Yyt}bVGl|Cs%aimXqc`Ty>-kT((1bnw2kaKJ>vhi!oQJIL zvkyZ$yYIEahLux0u78@j_<*nnw3-UV;G$hOK4AUzuYZj|@|C$Y^8g+VMpB1k;sr@t z1}fMGXO=k2PTO%k%7L&S1zHBPDdW0%p9uwD7P6#%^O2RhK2bnEaS(E9y_b}y`fFf` zA_cGSazT62C9K;buv%Iv#ygA$r)}8}@#|piG77x3;Jy*F{#?DFxRw4HzVG;lv+&IL zfM3QOOe!-TP5%0qzXb0QBa-#ek|=8Q54e#2o^o5^LEyU}b>Kba()7`SLlt`#zTaVv zHJycDSVa2^n3I*s-lWGJ|87sfoNjw9d}-)4<#HbHF~{))u>_OAkjq}coMuA+N0-@U z6{zwAb9|DaNi*VvDDSvWmL=S}V5-xdqnpf0Cd5>}T@!_6Bv*rtw2$ z0d~nF&OCrY!K=>NNgj_W;t#f3fzPC@U=x{rLh_zwS7ckHDUhUUYIlQ4Y}J8(V?RFI z^Q5Y+!jOs}2FAp+@D*2C0ognl>Qj7BLComB0^I?`HMB`z3+GI}LN1iF(mKj{kSFZq z`Y(Rt{b~-hfBMs(Rukj1EW40=4HpzX`|PtmLq=bLKHWEttA#e{&waYC(5(cZ`BB5F z+E4OFF|pfWlESz=V@}dUyTUz;W1i@CKRWP-35jJrV2k-bV2 z#LGn{OO%sz{^+Za$PNqriUFw45WzEG%Ran>W-nVe$R`>seMstE)6b^ivk|HXfHG|l zAaoMk!GrM#vZtB915qGG>#X60BQRx z>AuN0!Lfvz(`bhn<2oVQ@CSdfKOX1Zj)gJA*Q`zb`S;3UE;sDDT56Cu=sW3CG5A?u zQKIarU`}A7t(C|xfA>52^Pm5`yDIu|AFv|V{`}F8ekAp(6Vdb!q-9)#Fb9>8zC^17 z;=U&X_FiC)WUPF5eP*JE*!cu=*x!kl7Nh-o=bd||Ws*y0xsSJP??5Z; zRI#JRe!SaiFoV#qTNsPh4#M8P@C5zUy=!`V0~Fb_+sy27Qj=#5vMSF4xZesMNF#It z1Guw8?HqEP}sz-D#U zsp~I_zkByi{`%Lyas&8m9I49p_PzY!4}Xw9{pnBg`RAXHHvil8x9h*tWoGi-ci+i( z-+c#V6~p|q`}2=}^douq?p-SnS|Y;dTV_1$n3GR9*L1W=tThnjD3~A7$-`C;RuG~-Lxu0Y)sf$>+HsLmCEZj ziB6c0{NtEA`3&$jQLFMfy>s7r|1OlYwMNTu&KM;H{;$Eeo&Lm{UeJ zu(Iu-QQ-s7ndIy%_%JfM`ulv~BG|u*CmypB!g#T!tb=1)NQ&tn9-~IRXrX-yHltcx zj}x!;uq9tm&ox5>x6e+xD8uY^lHd^Jdtwp45hDE0*BFIG`}x zrxssXu+4{V{$*}Af#m8QmgBul@O;PS59}hwF_ZMNpInmX!-V07t)Bv_m1kx!`bcp# zV{WVikz+8S0a>Un=^D)eGP;#X9|o*y$hc^9c~i$_0%slrcrV-Tjw##IW0gr+ukORb zF&H}D|Hk&?ptD$|by-VHG3I1M{QckmJ@m8b3DVQhl&>VD&H$?h%)uQ1964rO%{T)$ zJYWt=rlD)3%euS99HIrI4~-X)R7{v-NN6|4F)Y9w^x4OY91G*zi*Aj>A_OUXw{uJ) z8qJ1&&)$Kw>w+?gtOHvI9MBohw9npbec^hzS58v;@)%9<>>yUI--NFr+jGxdI$9 z;~%Ml61oVrYUux>n)7H3U@WN_{Mh&84+Fh)&fysnoQT|%ksl6IDcp~z z)w@#BOyujYzm|XfU;nEJNws2Nx{!LjdRr-j=xg+_KJV%G`?K5=wazyui${-at*81e z!G2lhPj#Ig>%WSl|H|tTp2+gmfBu($kzf4c7j4G8zDOoF^{*};Fz*s`CY*RcZ^WEh z1^x35pHEnaSrOvRE#4m(Z1jdi;zat1PGqq2UAsfkaYgLJAc}lppUdll_R&5!_3{3# z?xkWKQ_tMvcpoUkqMko6k(?a+P`oSDB`{8=)~#)WVUn{Bs9XHfX+0OQ24>65-he;b zpK)y8>GPmLGeJ*o6tirnwdz~Zrt^$Ex-7EGLqAe3t9z3mBYYs6vgy&*9O*D;^RAQ# zEbJ4wLB66XFbry!x^GSQnsxE7L{s~)E7X<3w-g%nqGhf0xX!c67hikk>6H>GW&_op~!5&IyDAvut!00!41K z5R9*Z0gydnb*hC1r82&^kT>5rF$kEL#EARI&|9HPF<1Jf`qqp3cN_ckNf^|kyWx}< zHBKMmPnX{Zek5DZ2Z^k0t1rIz0+7B8ocQLdy8jMX5at5R8Gz5!(q;-PFPge1u@0Cs z*(lGS0nXt49p<=RK~6j$hvUeEIfkE34A^KswN9I7 z#SiJfz{aV`$etZ$^iVnVClZmOJWCE;>Od3iU3v00QU1EVPc2MD?ECNK%isM@{_uxC zG`VJ)+iOk)pW5JQ-R+NqVJM!)*<(eyQ-A4rkQmQ4`XCuT#dXKOz;gq12|&;7po#9? z3RrCah)67L2COO7qZKuX?~^>YG3N1Pht-II=4J85-`f?x-S2OH^Beh}zy0lX-6F?T z%-y-+Riz{T4wy65FT=!Tom~eFRMZ;0(Q1`~Zs6Sd*t1_42IB49&GeOQEb3Ff$ zu?Ts5vHh42TsI*4Z&~iJQO~qwI_5cCU7}Y17r|hEb!Uof&J2FOdIO6}{OyaRP+c7W zT1tNJ$)Bd>aX&dPjsBw1PRHYQVM&KVy+j6T+;>|W@m~PNSrdUE$Q<;9W-h|g<*aqz zr{<*86PV4`r$RHl_^*IrlgwqYrJ0m7tRD4MMB)dYDkx}vaBn6#Tjc(y3p4?AVYVJM zz@Dn|%YXW(e4|89)HiKCBsn0*6_0b>i~6cu*9IL9e{@vB#~<+K&uC?6=GRKuwD{4l zp^_b+%-1MmxLyfmrFgH&$V3+hXc3Pq_7jCwUD=q{4o=n;wJAq+o=cm~Tgp?K%=%D_ z5DOVv1nWhgmEn2PhUAe5B z&5PVsNBiEYPAd@cI9Msv*m;wkwecY!%RD4KZzT`L>aA}UfgIuk_`)NTbx6ul0gdhl zRg*U6A|iWV*nJdgJO5rUKBHdpL;T?uRh2*eA?4e3RCVz}&uJqd0dwd%+X6kwfpzi0 zsbuo%e58I0_NP3G+#h6CEj57NKG4SW8buLwMEK+o*(6)ZAgfDd+G-K*k_hXvp*NS+S7Le)X$g$>06>#|!K{h2G+T#^d>#kcxAZ|c{)Fn%^N-A7Ih3|-bHdL z$?IF`2S*+DhqslCa8`%I6y<7WYsL=0I$ZbM*1beVmdjvCjrP@p!Cc+gc}hb#V;jd7 zl)#Du{An&)x!``a@zkV+6%UjT|3|GZfZmtcMG7Vr{zh)5F$IiYv*0Q#l9+J37PwVW ze~q5yr@sZzuQ~u*coorY{4A+Xm_w~#Mviwm9)m}#$}fKL3;Eg4e=edpFlMOo1YhZ6 z8cS*}6lK10RvMfKHsj~JG1@=>t`k&*Pw&s_vuMorYaG?F9^11jh?#~NLp%BkI>s1B z*_%E^U{&!z--?cczXG}7yD5sc_RLSQPw|mn&Uz%ai_f(N1aRSgY z9uqihB?f0iB^EBuyN%|RX5)XvacZ@*FbUNkeEkY@qUQlyqaXZ){!%#`bF5h#`jAp~ zjX7RvqL;f9^H^)UA&fvFXX4d_C?)7jBv)Td5Fn5)mU=Hf+@>#s#AYBHi%xcfXG-yz z`bOGqT&=50#LmR9*Vtf#53=-2bZX`}wG^;6{^wUeQ@~s%#qnz(s(cFhZCFt3-v7Mz@9? zRo&=-e39IT&veG>p&&EZ3dEs6XdA&3uT%~zMAdY=|HCc@l!HHtKz0x7f<>=yZ*TJ3 z-~Lv9`o$NLQEXi=1vH~ygL~m{$Y$mW;^83r=@9E^@6SDdPx~W}-A{5z8@4cEF|HbSh@i;Ku#H1o(nWqf#l40ReOi&;Q{c{y~2Io8QRWXP*(~cz=t> zjVZeB1G~_@YTNp$0y_adTSvVP*aU68j}zwTo&lq&aaA2(m-ePd%uz>>8XKL#CzzA? zu*!qSSkakGm%AH)=;CV_>8BmzMTC=pZMTe`98i2kh4gPAk?SjX#W6rv{KF}0-1hQ+ zN4uiSD{3&MMPH}3IA&%cJqvo4J?mFrzYk>b-vWqJH(@hPM>E~~tGfTXG`}|P(&2Zn zAAt+0UHq(djdUr$>yZ(&opv(^86T<0$D7#N@=Q1bE_j%LbV3f1n1%GkJ~V5kfzJf^ zwlK!HoepVmCY3W^$pzEQ-Qmtla>=~o@$GAwu}=rXvo5U!XxO*$Q2Bgz5N#z0#mC}V z2LFHl=YPuo{?~t%_wV1|5)5A}oOw2~_N+Z#I*;{0U)4e7fAoW<8`RzGLrvGDL)I-0 z4p;nZt(RXLNa_m>7T=F-@E_nG-zsc`309L-v{oh~r2cpkB4z+{76J3vq zD%sC}{&V@~fBBd4Cm)c3Zd2}8r0OQ0bWE=paz|Zn_;AdLiN%?cOnSP*ocv~B6MPl} z-96?s>~xwlUWo9sKxBHBvN^5!FunzgT~8@nrd{frL3%rnRp9L!wioshtUD!($bZ1wAs)EyLCz~4 z1fJEw*Lg!d4E{3u1y@U)_kw|q$8Yb@vfkWt9|TIL7&}{cpS}A`e)-E^%CCO?Yf5qu za{`|SJ>;{2ze#UiaMA_R$PusOmt0|v+fvhwHm$QS$OY!WI8^04h35mzsRQ!mMUz~_ zWw#TIAO1|U-v-AQx^w>4ILURKCgn+W>>FrazOg0TCMNMU4w0@f4`II(AHtpKmtX(U zRv+&0rSX(0Kr-QNC#NQZ@6P#^bq`opqCudgaMS#+@FNfmV2s$_G9Ij}KCu_p6%O9> z>cTO>0D4Mg(pLgboPuM_5Lv4tLOL2e zyGu>8B3!x4K|mxm!yx1Pyzk$?m;dvJKghS=ek=Kgh;7?fdOG%9xtj*mdDc8VcXR2?rZZQY_a;h`faQNV_g_PIxt?fugJ^o?`(CqI(pRc z#FrFIsmWRCi{P}?3VC#MjmV{AzZSlj6D|Rny6}+?Z&996M&#FC!CC zNySQnJqfe1SR$7|D9+Bql}zD}k6jFd030U(AA?(<4uC*DC^V(l<&_kQ=@C?_qa2fp z3+GSf#_r1igY1l} z05{>lAkUokWB`I0Xys}uwiuGBDG}a&9+QJf z$Vm@}q@>@K&w+$I&4oCYUj`F)~Y z287&NK-E~_WO#@fe7ClpfCK!TxL29cetyr_XPbb+5-qjwzr1BD7-D6G}%V=AO;?Tz}o_w@1 zE31#Oj{Qc$*x?Ie0&H_-OUdynB2oi_XzV=c;A$KV@mjyxU-Tu?fwHya9>i|1Pl9Zo7x%t=liD*Q@Jv3$0ft{HwRD}mSR)>S5xq(Smw zHeZsA3Q*HvkMh<`V_Mazv(#`}f#C<_i+x<+h5HcT3!On=5MWzoeID>UNSoXxXfl}L zuwWwW0PNCq7t7LOfRU&dw4ab10dH3#}{P@Q|mjCgSpU6*t`qTKMv{P)02u;Rvg1GCd94Bju1U*^X zUxq%j^)y9j+hh6!a|#BSz`4*IP!YpVn1kE+#QCO)t0V|!mzaZzT}|7A1gu&)^=%7E z5GWC13yfnU>UBSG{I_D)ZegMj6EEV++oBJFE_cNxA0(lfq)VFw)iK+N`gttZb>t|8 z+wOy!XLN@2nFiy!YJ)0SWf!R>k-V8%rZwo z21nQoXGxoJJfZ#kdZ6*%X5eY41ddpPxi2ri)W2NtOb*MF&uD@OX z-7oiV^mAGX`pD~3;#bhDv;U!wAEMt)_(jZlO^+>^+Bb3k!6Kc;pke1i9^(EdD*?~>g zQ=YKzU})Uy)l!CX@@Gi^b{XkOWOl4!Kbu!Ms^U_&^^s2XZ!TKSExLnB(0y_mAbLm) z`?7V-Q`0%_|M1&0p(1#S-?i1jEf>w01ZE<8NfTG4aFva>hK5rf@B>cGXK;d1%0}}I zg&1!lU4MO!S=#d?iW=s*s}~des`EqNM^Y0%Lq+21(8&k|gA)OQET=q9|jaNwy#`@Zx-(k)~ zeSqP@>;>j1jL+PJaSQnb9lxv_0-rAbWfQpCu8sSoVjU?h8DvuDucf_jnOF3%Ff)l2 z7zJdt9MDx|ClkIDw%P?bLkC!#rl2D6lhWb7{yoJMH?f1ft<{=Umj}{JcqBl{XX$1Z z6L$YQpP@X1e*JZOPS{{p&sd|GXe3YKJ{wD% zNq4)eIBbMY6az736!ERi&0~n-9w_mnbFez>%oh1mfx3NNy$?w}gx5!B?*A5c3)tWF z$xn;nJudmjiPHDbZ%J;C9k&g|bPDRc1drSWv^OkV+Y7*|NmdCf2iwpN`vL#KJ|lD_ zZSD`$(4U%8$SdUz z1#`+D^#rB2a}5x@Ca{I!yu|20+Z$mcU`pYam18f?XA{PD8dGfe$Z?D)8`YOgPiQ;+; zhboI~O^3tt8c9bzfkx}O!5TjTo{-okhZV9OeZB94Pc(VbKG>$Vul{oxA(uWH2+Mxo zYbHJ2&okm)p*EG7pgecO!ISG`YT$bU zn8P4)rhVP^%3o$6eR|mjfFZc=C{5ss3G2x7LFPkWlyIN?`pBLSa^o2AoQ_ntJjGY< z=r+!4n>%Jdg-cWS(?C0pgI8l3Ix6vhvUY;;ErTKz7f$t_W`V*<*=$M}1a_iuNvHDA zDrP@{byD%l>B+qSL^=oZH6Y@!fP>@JP;!AUCb6144bLC#l(zr5#Y>TEd>IC=3;yo< z;^8vK*K78!^w=kGkNSrCPsW5tm@~!H5rljB+j3k9hx4Eo-6xti19=L1IVvwJ!EMAY zEDL%anvrU*CNw_xVj19o6Q-oVqGtT(6j!z7JnZ1vqs3QF>cWw$bo9ID<$FB0@^^{0 z&Y+BD<={xR6FJ~8^g%oW4U}jvOiI`==p`MuqZM7?3f-yid{X7k50tI(4jf`*8|s~| z^!X{_&6aCP9Vw%yK)oQ!U@Ns{&|4+Ggr4;)&tMgcyCP?48wolr;RX#OzNW1vDdk=l zS1^(b)^dD{814SQT?+b5rPY4p+PK1gO%z#{MhoN`65G{9`ZMDY0u)$WjpR)YuuhQ= zTun14XF@(9vf@1c{&0Cl_JP$tw>x?z`my)F2E$@seC{YlIx4XaI4*=e*&=wtj?~r) zsIvd*9z2Xx&6rbV0>ep+KVF3XgftJB*ldQR7R@G5W|a-j8PgPcSF$!bT{B z(^P74jX8h=Xj|YT$Jb|=Q);Y7Ey<~VdBz-#<2Y z;1x1C&Fuik8Jk5P9uK?0DAS_5dAZ7#Yi4~hW31pjR|0-j;_sVOnr)Vd{hnrnq}W2U zwz+Vvk>&?p-N!zH{vFTmP|ZfrNu}}3-K`5yH#@N_f{EqojK0P^SGPH3^VnI-DmEp{26?;z6x}H3dMi0 z?5|0D#GDVovX8LWk;YRzc~I?<9~WXzSMILUkB9xrK8$QMQ-HUYcJ?z&u=dA_dKFo# zH6lSL)=2hBMYb_Pg1CFSvQ3tcaz*ojJm1dZnJweZqjSW9%< z2nK}%xpNqK-d$pI)Tyw}YmI#K^19z9s~32`+Vxs5tn*b)c#T-ZM^#`d9W^Ga zs65-w?A0Ri$-27#67I~P?J=FR2&$<)9f^b@NBaDT#E4RjP2Yi|o1(3XOz2m5YZ8?} z)Kf*z(?H*qPgir~SjF@GIc||mKyYSu7q_h-$$)hJHfdf7?jStTuK65jdH0c}Q(n*$ z(aP-5udvU=s@&j%STE14-Q*-N2obGXc9VBbrKv8xRPK?#EkbVS_IBNqDqBO#r}*+x z7SOwdIYsBSY;8PZ=FVRZ_KxqA^(=omjhSN~I;nHgc^MQg?s@Ct;6tZ)KRlvw;Lw=2 z9%lM8Rfy*aAP6zjBsfuU8L)rT4`^X8b=& z%Dl-U8fOZ|*NSJC!z4*H_qzi`qU<~{SB|4>&wyu9`B0-u+S!2TO=xJ}k)yRYTu$yZ zXh*%Ec%H`*67=bqkG&*Bqu(G==*yod$IaEHlq#|E)J@+@si6xr=h1 z;Vk9MATl7CqE@Bzp70hV9o`V;N_xv#he<0>3h0uW|Ld(Dl_JsQf}n*w92#o))g?pcS`sW z{!?><9r$#ROhxcDHm71ck)Q)km>@~n+bkXOsh`aiIf6gwuj^4+kj=&sVBq|Pc#{Kr zth{7WBQpFw2yzO3g}-)(wix&!TIZbU>Gg74{QwkBg2c*_@Ec0l<5D+1IPp`AB@dPN zRJ_L2gEq&yy>KQu)O%qs`;PjPHtlT1C+TL6!^k|!av{d&HPwy{N8g(`@Z@=eW4yfa zM6RP-X8(XrQq%NyQf3&xKFs!K_C5u^Abn|gFQL4bJn)E}`}2`6n)o&h zNxU-25zdQrtQ|1vMW2xKBL>zc@B!jwr^ zT<#r(Uz|8IEoiqZvDSV@o<3+t;lo10WKq7MTClxIz$A{X89nSAaf20 z_OXEu)#d@Y%Jg2kW3b_-V=GD*yl>07*naR6W{$=9YE8O7gdo1oRXi)z*!9 zV)VkE9`h36aJvenLbJQeijuN3j|wt)G!6;CghT!Z8{^Q3Fy>I*l*j#*w%Rqfna$-Y z*JRQzst#2`p-?_x%I?>a!9ypTALGv>dwUlCD9L$*InJ)Ko*+YhX=02Lvuf<2MFvscXaKO(@4>tNh%o!;?z?@@S_oq8c?)oh@^DBut;>b1T*nQ1i zz4NMHef`Jfy|z;U2+%m1qh)2r1700a4AQmbA@%JbT;0rY8#GJP4%2$MN2V2n|j$FaM`@E>A1)q$l6vx&wP*%i(3<(1CNpJTiHgmoY>HtmTj=a$;sJYcNgv4 z1h<#jwtyQ+i(hf=w#M(=|LEJ%HKNXyOvW(RqcLd^i8~!#{0DuWaijW^flN^UCl?ijgM@5RUQ(t{8jCtZd+|DXGEXz&tb%!}y ztfW8KJN%#EPbBwyP2eExMM$n_vPibNkz5RhzeuM7@b8NOpJ_o6W)zG(O zRYK9KYX{bLRGaX&l&NpE1ZnYP$mC=zm2g#q&Lqj0S^UIv0GZ{UXa%@D%;pM%VZ}V0 zwk+ZUn*fDP)CZR+vuKC<@u9rFB^6Igbql3V#!0^L%AVk?fmorC!zR9A6$fL@#i|2d zc7nr76W?v6b4dF@8S__ld9b6^9`{>uNXfpj56k~xr7l81QTM1<)TQe!Aui5tL~mf* zT*4Hzle#W}uQ)RicEMpXnT2`%mVKANazyCZTo2n`3a0>2k7dBhe=S=3j5GPs9nawA zBp}#8y@g5MIpA#WU?5E$!)3+e5Il)*%`!BDY>D2Ln`~V&7j5#LAU(>iGblG#v2}1ohhANgn!JIG=ahBvzgO4zW{}3nPpLdo!G97c) z8J#K=&h}g>nl2M;nv}rLXVcJLpH1~VNolJ{(I+QebvAUhI)bY>PR9VJKv=(>*8?TD zxumuKkgM{D07o1imzj;)vOYLtj$jKXO9vi*;nHL$XSQwWt(dR+$K@{9uQ%{CzEr!d zX$7rl+c?;|z68cMUOhas#(X67bs1>2vFJVI6zSzdpN+S>AQ1Ld(!I!~{-?OCT}*mk zpZKpFY>lfzK)+yj3CljPkIb9H4f_v}npbHCQoHh#{_4u}^nyb8qQVKmqDQ%qG4$*! z+a__Ir}Fvex3CIt;~SF)nLhN~4(Zh6&*f=2B$rs#_}GS>aNs!5R9aUU;Ph`W=T>JS z_l}eYd__W7`2|cCk$W2rm^0No`S2a)OuQ$LXHg%T=+f^VW6s$3Oc(X~hIu;VKjJGo zo;`|zp7yElQ5R-7Omf%D zHyJ`;RN(#>i{ot*YGc?yVz#GnU{gA6-V;slY+$(M$*fm>GD0(M1;fQ_|Kb2u0K!-u z_;+HgIANWgZZ0=pE{D+SA4*%_&?8#v8Tw9gsE*_xgmjxL@VG1038rpY+~=ZMktbH6 zmg8lo&VL#Y{15yX`dFQW$7C7S313PjdHg9-M%y*LdlY*lXP;uF4GqqqR1`{N|27uJ z=jtI|meFko_=VCSuK@!icGYt^F5m8f>UmOSE+FWjUZ@AIRaahw?40#dH?i8G8Cw|l z9!sfX=XtUX#Ix5H8F&~9l~I_t5&x?zsApNv zo&Iiy5Io(?COl!VEnk1rfNn0Ywdz&26h-(=k5*7@R~$L?6V5xxb7C)4zUjEz>;NNP zcX>TCRn)a<6djY{GOPkBAsl{!Wn1i1O^Mg3m_^^KL!kRh<}*T1t7MX zQO6?mArmcr-R;gSS^zC487WfZe6rm!=qJ&OUWPVx7L9RKWp}I?byNEDc(qNl`c;*0 z@&)2!ln-eY%qcQTp~d!^R}L%Y)D?mnYmL1Nw@h{S6?J$2aMhxx3LEJX1BRn)Efi04 zcxGnBjWl6KeGD>neQcgQER<3VJx$a=PABjD8)}!ht+1)O@xFE-``3)o4J?WM?-k8DRUH6)u!{ z(1U`}7?LXrxZ07)uV;bYF$7-_^;^hheO9)EMd9z@;5-j!3hO>I&s-(Rx-rm)R(5}` zqur-LKW4lqpDSVpG+kk(zanPlyI?C#x#MqdInZu>t9Vdbk;5Rl2vLYXoW1xtE_Yg| zxjRT7F_hn!IE@bdtUv^_NNmCJY{Gq(`^&!2mn3{6yVm55o^Lx@&I(~!DF+|uo8*h{ zLT~59$^hC1c!+znLwTDkuqiZIpVucSKI%B69_8ju4!($fWkzjqz>i6W0u7HH zLmnA(aN^)`n&ndb&qBAjN`#mr*hh^yr|Vw;yJK>aA7Kv_0snD2nZU8`s$QW1=pYkT zCBG42o$)rp&)1u~m^ z=E2_QZZ7aNV&@e!yROlF>Eo_@zq{c_x@@BI9HyQKIE0R^)jTrI7rNR*55!Bvb?Lie4)w(RV^`yL2&_Ow zd*~NeR6J%dXK5=S?n8h%be0gY3O=d5;3~juUGwzP@gFcMyPL3K;(6npR~+i*871VI z{o{x^gRpoeushE+=7{8&;P;3N$eU7&q}4H}dUk1raz4PEloK&B`$1oS4Rav&E#;W> zb%#0GIj%BAST*oT9iW^R>lv~zyUHS?RX4MuQt^3f6rEzdSHO~aF zem0d|$i_xfg@f4Aq0bI*f=M&Vpu@I~SzvL(kk6|l??79S?>5_ma|NhZxQ}+=$RvYs zT~|(ODi57TS6iNFYqoWiwjtTwf6YSYu2Yi7{ee_y#FX3JeRtJMpCRnt-zfq@zXJZ6 z`d!~bko5HcN#pY-K@;t}BgGt4pfBLZ_2Pp*`k-Sy#%tJ;eAPfNsV*>a1iCuFg@2*V zMB?mQ<&XR^?U!xbXl`$K!^U7`q1Z@8*7>1m-e=^3eg^z4J81D|z)bHCeH49+@CokA z8*oB&w%>2ra3z*7N2JLdx(xe5jF?Dl`-Z*?=AiE@;{z^yg-?WTz?KKhaozfTZ0BIR z_XPQZ4V7VU z+iOj7rdIn)@U1hK?9|(v^wal9FXL+u>!&o7RggvDG?agffjn(C`tTz9o6(a^UZIaX zs)O(5RrHm!I=!O1anZ8yJhypAJQsgr5{YO$16`&JlP6Yx?fp)Enh$0Lq@Nz1lZ~n; z^yTZI60&;BKC7ynSAXly>F9sHayug_kNg#S6MxAk$bqpg2Yp|2h}5LZ{hZ#(Bc|I{ z_qbv-)1exnwi*v2Rqt7H;+wTF$5ZOPJ-JoZvv@+e&LrJ-7y%%`;2V!vEK+;hX_cjG zdB&V>k>YK|%yo3U2H}~vO=wZqYhW)RYq$XpIYtG z=>XCG30LPs#qHszA~u*Aw(Rt=Z(M;}E{}G*WO3m4B-QF8X4J6tbG5Wh&m!JZ?uHw+ z&ya)Dsqi(+dPWYv?Y?7?=?c90v^fg7vT+OmyI!n_;e#YXd;{n7JY7P;#-R5tgU{3} zHB3?}mipjXSt382^dnV2i0c)LadffvjB1y-4lbi!u2i9KbbUhC1Lk1g;ZLxIMf^O# z9Hf;sAg+|lpJ0yn2~%E5?9#s;VvccY5x>@4m85yf7{qZ_a5^x1%{!N>H5kJmOSpmyTCJycL{lJX z+Px>JLIw=8?RW+&Lzu}{8J=9xk8t8vVdCl@Wxtw?U-5UdnLyryuZ|6e*(|nQ$sy-@ zwT`OaTT%4RzHvsNE{AgiNe=LxWMB=;pud5i=yxa+f&E2K%%FagU-mw%Pdmlil)C;m zQpiqOmZ@&7lOWo;FM4#Suq+9BG(AjS>u-rnDhVB`4?$SZdc~ow&$K5ii~-VExteKa zk%@Jg3TwE{8nzY@QI8R9!c^-g5LNs)AHGBjQA`$bh*6D3g zYQZ6ve1H} zQZ(@4`g&6jRd-VN4Ob9swf1N`Wj1$1U#u0c1B?J`r)r-yqEgi8$^ zP)77E=;`L)`$QgtHS>NLfL5c^0;t#1sOOR)Us;duH2x=4e}WSFgRmY4c$nSl!yKU4 z3Y-`a2<<^a6;|B3b+>&Ae;Fi4T`d)(hNST&UPsvqeTdti20(+)ExjNQ@=7NBL(c{> zET24$zwG~uWi54xRQ5>;M%H7PF_{7uxBY5bg`87rqX&6aU|C*6M>soXT1B*jk#n06 z2VsB4b?vBMmMt(FrL^Q*V!#wugh<02VxA_U`|G7#=RsWQTelC1#*}X`XU5q&W<0{2 zfq~emF~FUT@sBX4(uJ~m&hH84Gy$`;dld>uGUKzAxG_x; z3qCB?=nvTDGX!CWbJ_hnf_Yt<#6geyutsOGo%6;X_e_syfcMgo#sUfyOra}6mC#YX zor2!acbVgB`fou5j}7v1r>n@wq_f@zWzF~jzM)Nu8f&f4(%YCQWFz=&$%ook$L|6d z&UHOkgZi*i7O21JRb-xl*UGbySA7KwG^o)cB?EPLpT}pZ&#ISrF3Y|wA5%3+zpgq9 z^b7o8dxpi3kHE?GK#QI#=0x52vpLR-fgV$)C_}mxb0lNQz;B|TqLVh~3+ZY!`iR#liCPopWc(Z0HJ%;#8!<;gR@a;Qq<^;o++VxZ3#RFBUE!GMRAU%2%CdfXqRo6oXD`_?Yq zf$9z%%-m(|x!viqwR&^V-yPM-jwF?pjQmKUezM(b{iqG}nHtVo*&o@)tWN``ukFw& ziWJ|0hSh4UWAK&m$1X{0H^d5ac8-zG156TzW$UPGLT`ILy_Vk>V|}8liuRiS5A=}D z1F<`wxQdGB{PvirElzJs^?OFqry4q)$y&5dF}ALw3O&KNIfHSJE_3+_bFQR5#UnmF zVNNB~&kj{=IAD&b|Np>y(!o*mj5!@EDzoel_n0%$711&djsx65ritdq!9?fxIbOYa zl7m95EK()j-xrBx`pA(yp%B?i<2Ya62OESqX`s@$C5EO}~Q zXS}J{{jEeu<0GQdD>5_PK}!-<7*g*f`YNYD_U~h;X_LvR$2p4Ao&t4=fFrTA$}?^# zce@#C%)tvoRHF|9MEImLXULZ~#3{6Tk%cc|JB6F+?KylN+gA{8-L71+{2t;e%w$m? z`OChMj*%@hCN{kc%`tZ4KVv#c3kU?`sde0j_89a|tF*yeVS+HE@JBKcBe{AF60SR6 zF%O@z)`td-oaFU0c|{0Ug{D3$=4gpoKmdqK3H#tx2VIvi{FCHQekaJqw|kstl*9I? zLbLEYmy<%}A?8s3Q*9xA-(rqt{iIXvzW95DIY%H)df49+%yE0V%+9xvUUGnYggNy- z@`Zv0$m;=fXlFyxp4J4JG3PDQ#0|@eCq0T2s?dR66i^js0Umx5b=P^B#l$)f0>-V* zy}P!}SA>V=y(>pufj&4PPfcOF4Xg);^T8RNbjUd|a)3DPmvYUalnw$aol{bH&aO~_ z-ZFrM%cRs}GA;XQ^)Q=vXR zXj$5W?*)IL09p-oVO%ctapD4VcC4xuddj%{7;|9MU1yt|pB|Xb-#zAdeHO#VDnzCy zn1jm+Zf_blT^9|jvh#*HXis7~rK#nYn1i%S0Upe!el9VGHS1%cYU^OcoVS2^b&?v& z@?<7NDA`uN2}Py5dWRhgkCL2y6>BRzt4VU=GYm z1AD@cQs_3gNBxdDc`9c=(@9*$E|*b-eK=X~K7xZG4$S0VKm{?!>qe2mGtD?bzIj-K zyMj5Pw{3q~A=*hu_2Em*0XhcbTAd`Ie(o@bSIiR6!iMHjJj0wsVjq8VKo8$Uy+6Sm zNRBQ2ggK$NY-1ua;?EPz2_J)sEgtG>Ybx?h1qKTs=BiLlK|L^IYzdxJ z8kZ&5{80=eduHA;aPK1&>@v84bqvsyEsfP*VcZmJZoU>J2)H4?s>bQeEx8i!|fGY>JK=0F?+Ciy-0 zlVmM)kmErJw^`M*f1UIMev3Asms`ZGe2+O8N7n4&V*!j*4=@K4!9~hqkWM^CJ6vN9 z=?Q!)X!$SxRe8}y#3RbB!5`HZ)cXU>IrM|8S}-8oVh#tPa;$kf_qhj{qo7N#vO*SD zhqNniw|hh3*%>s{kt{$k25GIWX~5&1ND3FpSv83!nT0}zR+AQgF2ccD_BBJEU=Vl! z_Efc-jzoJnu254jp)D2%+aYz6>B;C4(303annHjxkvQzjuF^94v@ERVwv11fF4A z1b4|g>5zMX%FXKPU(t8*MM1q4guCa9eX`o#qP`NIS}qy zpTvYlv5#!xJUiY^SDTQ5f6*H^=%>I_*fIw3&4j`y*moLIco=fOT{3F$@AQgK7d>`6 zL%bOFrOnQ6D<4k1-WBH5IQ0oL_Jgr>g*l!8+lb~Zl z5cxthZR63xa!P8tzf9~c}uDy4k246rl^4=>J>|LcC16-u8)J>j{Yt0?wIx~61pcgOr>0m(-Y=!vf*u(Qp_yQ!;o$u>?-D%^S%cb z9Gh@BBR-3EPMG7gqmHJ(l6Encg71zwp0E=34~c{~e}*{%Lq84QNnccSNWP<9!9cf1 z;;GZN?Fa5V@(gn%{T{d6)=eJ??lFgDB&d*PomN&cC(F36qpEA}5Fvnnbuh+V@{NrL6lRLlu|l>?MxZaqP#^DHt=qq`3ThvX;ai6DuTOrr0} z2;MN4bRlS~j1IVvQj<9xuwhBn+woQf&{PZ_ZB>F^1FSNS#DD?+rNE@@8w0E-MLf{B zC7R*W)&L&S6muageWqP8Wb}axx(ggX}7|-jxHdk3Xd!uh=yU z15in9>dXp#&o>zwD7c-~6Ep7LM;G=#^iQt`VAcGmO0juB_H}bu0w=%LD*oVQ<=Z37F(CtwaT#NaJi;7I za>VMEJK)Ph%*nB$w%ti+z6tO$=G26@@>SRg=_bs{)pK7*O5UOQBh2Az*YV__JQ3-b z^X7x0h2s1_5Ar^gyTSs9{lCp<>az~`o*+T=E9D=#yyo6uo>Szk$)K(qIMlPF8)rYb z1(LNjSCK#-pG6|yv7~3)_@Q9vcULq~F@N3A>p+w{KZ|XgaV;gH}xjc%xMq6dMp>Bh}SST(1O4b+GEy|hwgxyu+ zPnyuyASA-Mfi}0T z%PkY@n5Y&VZp?uJD819fe*!@SWTyDy`c60SL^|f6PcEO|<(PECGlfjmKu5C4Ctq-? zCMKR%;zLFmSWj7w^l-3mG3YoPI=RLiH+tg({n3iQpD+iV+3|Bg0CD$yxk+r5%>Gzmr@clid8vdj#*4B{Pp{cLl~Q5OJ1%qhv?_7 zioi3GjPHs$`qkI(Jq;AP#-d!pj9}SiA(+=W5c7cdY?SK`osN{So)7SzvG*F@PKGDQ z11@bwlD7l49s&auBrRxPd&cF>cw4M$Y9v|&art&#Jy)cKZlgQ?mDe5TCbeh?}7V8dDNYkI{; zgPkim&o<7jhN7z=1Kt@dFunVTKk+;4vaf4*(a=(2zXspLD}N1f zOwdNoYIUu0e!)@~xgp6*_g?08Scgo{3XdzZ-*v2O0BM`XX&A}#BHJfGuRil(atenV zfrhWk7hZ{n=*Peo{;5DO{Z^nn_$t9iD{bCp_vJ}!+Q<3KwoR6zH&dYN^_p#vPt+E| z-L_f8tMDMIe1oedB->zTr=`Rz%B#(fH#1az8Yb}G-8p8rBp=(c&Mc82t~!Ri@S~`0 zO9vu{S5>fozbpMx*N&U`fc*@r(uEUwEBfdALeF|VjJtXbAuM^q4^{#slbqClc9g3( zh&h9gP%L=c-B(fK9p>=3B{J?UIxpDIggJwbS4^VJUUeQ^XUt(8bK3<1-5hkd&s=~8J}j4_lb2A@a&%mpBAU6KmEED)l4sBC$WcY|cYM4=lQ&eS zQX;2BBf=N=fbm=jL0+;KAnMz4+lk}+gk_r?=bSTKnq#?r{Erfludg_vB%tdOMYzxJ zj_dZSTUA!tdb={Nu9l=%qvz2#6viq-+{5?MtAbt=va8rbfY39gAglvISVOB0X0UB< zy1`w>z&He!epAm5d$c_#7}rRv_W7a+RVWm~_GXgV=dnm6_r_?z6 z^i?$K69y>vgTA6AEZ>BdffI>$IH_X{WgXSQqhXNM$t3v05U=dVN;;!$C}BH|hmscf zHq1d(L0Pd%;6MFJs}E{Wdq_MGQyYJqp85R^=Jb_L^mOj~7IQR{A%#!ZF|GKQGkJHI z<80d2x4OP)2)f6d$&P-UA$S9!o?uSUDQ?hk>>=i?Exe81s-#0vjA(s^IhwJZXHRz= z)|jvNDxzO~^FI6`n24VRtPvZ+|@RWFq+ruhi~fwhyKEa{r&ApBIQQ%s;6A(5*j^otNt85rCWeH$LsxqdtW( z=SicFvFVexugZW#U&V+^vV(8j@%H}(b85X8#+y?oKPVpj0K~~Qg?{bs4Og}BRJ|Yg zF(2XMzr4ehgK)Cw2o5dn#ADU5JVYi!NsWppJ$Z<$&jp~D{mylL^JTF!WO>7E6tDJ& zid`3$ybWB04lujLS7BGeg6+zxho8qN+4YgpLQf<_oBNMmD_x6zNgk0XW4rdmm-Bh1 z-+tlqAWl;1wA_n=w9mK(niGAEf2O+bp(l!5a*~DqihQZFLZn%%*@hXOInh$yV-w}c znth=->9KateWS)w0@fni?b&sz*Em-0>57)m6)XM8yF@&$t7KJP*3}jLv5$d=5pITa zSW}z8-FB^7u7kejAd)h&EJ*ic&8K$7e(H6GHKRIbJI^uAT{wt&j53b zG|Iao7(vWg@4ll*wyiP`h<=GVj#X3x#*|kvM`~NG-1O@nbIPTl+haWJs$YHc$GzeU z*D9+1ZN3Xuk4vp$|JRmWmxr1*Una1k&^dE8!X{mlbMXb)vVq*y zxh`iC$g3wd>r96^f8*4$ui?b9ot82^9W;YpVHNI@%M|n|Qw@$uhhqR;l;Jbq%9x%+ zAgM3*AAE270Mi^Y)>hO#@O+{F&5}Hx&Wxkar@Uxb{jg4-it~clKOl)C%}+_2H24vO zCk*)^_ta+U`@d{K53vFy}+)pIe=h5=^i@w5w013(&z2>9>vcp|dyIX@*&R z9Qq1tSsuRHOFf?4t$I9vFp*pp5I9dz_WTU%s_Y*wn}!(gTMH2QaH#Put~dm%I5rYp zJjal;xWhq8y!RE8Dcu}X%j7?*Y|pG)g+#*o0PeqQLFX$xq3b_6>j`fV*&z;vm~+QWm4SER_!J zxNP}&@^xO9kUTUCVq|8QU&;02OQBo43F3Tmj9&Xbau(IEFLNCoctIK1{kTQ=%AuPJ zQCpKV0E6!k2T-;5N&U~UbFZHg6L=497jRs3bTpJDf(5Q#)vwLl7r>)irzk`U<`ie9 z>ZHb-ey%a+iiSSIoRQu&OTA{noQcTHBVy1QbNX8SF2hb^yv@$9Fb8|(wt3Th^$K%9 z2QEoqtkn+gb&O#eeZvk2scmSu&gkrw1U!Q5M5jIygq!|U0y3JyN|w<#sn`fk-Yr!s(dd0ont*cLVk5Sgd(?mUMN6WP zKa~K(?LSrsCe3cy;J`sbSvr)nv|xVV3VI5;vsT%dF*l^1;4-z?1y8 z`J-Q4zB}_b$UFH1zPj%l0b2C$cFrwa_b)y~OoPkCigdzX_5B0?j*sZ$JJu)kV}F?R zP`uc6Py%E6*@;!9uY2O#ID|RoF0atK^NHRs`!4-bWIl{}TJ;dL1?D^7WLLvFXFZ-cnRoN9>bdim|WVF?&hN>1q1g3$h>I>bWt+qb>rY?hl4OK0LZ7 zR9E(4S`RoS;LpUp{<2g{1>$!NwC=hJ<43HO>=W5PV__{9(Bu zM{qe$0w$89dO1RFYZ>@)67&hZ|{gGP&KJD2e)C_ic*=yQth~Q&I=5xs=ENvu3}%N4l>DskwJPaqZZ5Nxr+TN- zx@caj8!>n54Q5m-D2au9*7D4UPJleQaREH=ANh3B1w)%f)E}{H~Qtd$^a4?YT_E zm(Vbv;OV9p=@TSzK?g*O96gpQcZsfjNDv!9SfWn^z8VGy+HtM`2TPNbUHrF+GCOVV zpls@06tojCQx`!85;S-ERhLd_MWk@hfNgy%Apl*|$+tZWbr&v?JhK1r?6UeKB@qfG zTTfmS>H3>@uA5aaM<4}VQ9A+I)dw}_lM?xI8;)Zd78#83n`4H?bZDnlZeUBZ~_3& z)3z#LJ9wti#;F{1eM z9p=C|lJOX$UAW+iv5q|Wk`;g-OFR4E9T^k5I9_40vJ#P>02D8p5Kw$CneHa$Gf0$?%m^nC*(}b$F{q{w=(EC2}(Sm-Yig8%H=D-!LJY4+`j7z zR~fqfU-==hQ{5zcO<`^`Hyg14Z%=kd8{f!t+qZ#jo8$J_%*li_8zX@BcrWXK1#jr5 zCj$HvGezVg1~UEw=O+Jhae9Dt48q8EUMObBPy^;1EHlObAU`+3=X+4AdJ~DbJ@InH zoB=bixXOQ$Y2@_*ZXxeS%%K<;#_S`}%H}DaM5dUlnD+>C0Ozgf3}cS)>;|8FQh7SB zbM&8s4n(eE>2R6(TUQ{E7|e2%3?mLG;6zt@grnf7*D)}%>q!|%7Y9RhP-ha~IvVq{ z!oZV6Zn|Ep{b>k|`1ElkKS~Y*Mc>iDb)&2C_oXE1DW7v!k1E>!ciI}Nt zKCJtZ6VIf;GDCr@gSAO!QNs730B3Jes7Xxb_YxAva+&0kn}Q6u#4ki14?%Kfn)(>7 zLa4NYYS^C3@o=B>dCFi>xBc+#rnt+^xJ-AUH9HmEBOg+D^R`m>CEhd1F{p3Sb?Cnv zV$Om_9QJSMh0#MJ|jIg>mpY?QOVagHDeJEqpR>|HtqU0Vb#a)KsitOpp>URa3DIj zwJw*Vr5N#+I8z`B{fgopG(>g-9gxkSP4Tf-6=>qW9dnT8$a3%;D;>i{K5t1c4>nid ztk@w9bFgjYt+pjPgwI2r*s?j)*;j_$J?2z0A&c4CIw4uAt_BujT(Xfq)=Ax7V@~?= zVU+;eKg1kkLvs1W{SkAHmvM6P5OcB)_}KA}w?h3*<&EA^P#C5()Hy~gu(vzyv)oC& z;}%);k9E7V$I=<3chS1Ewb%|@S&w1zgEP-o7(18IpqWw84P6>xI&e>QJ%Dtdc5x6R z@IgQl(rvs2KpdrwvMLCyu6KUB4F`;%32ks7^dWtz$l$pJ{m>-*wPLh)q!z%VB5hi? zge&+|AwFEI>fc;nsT&V;=ULpgI6P9Dq?fCe-e=m1*xOai_8zjrzI)JMNMN60uw6;f zkU7W#=u9LxpUzwOE(yXP8{pIT4YZnk$0sCeQe?u@AZsg!S~l4VVilgeJX<4>BUVs( z=p)HvTWdODU=8VOTkvi7Uh=EZ2)~)K;v&VZym^~qlxUCxsg%)H1Uz0)vo$_>6hk{A zn<~tB!5ncv&odidt-oEy9_fU%=r(yP$wu_$ng*Q)EMH&_#)=@F+V8r#!kqML^hpL+ z+W{ZHy?KK<=wo?S5~2jgpr@DvjF5g1%qrGgV~&Px&|pgUAmbh85Sw6UmwuQuTw+e# zYq`T`T{f@vmKlwkUqwts{WoVUW1jvj{hl2{?z1PW&}k`vj^VF1V- zFXHxU!@KbTuL9#4uE)erSQwi z(|_CtzEPChW&p&dMBB)hwthob$&1V4zu28C61b(i`dPEWK<*G;p$`pU%)ZmVR8ouS zBTlZ`HvPuQF&*q929YwtsA!Hy;Nwok>lnzb&X-A>bh&-A0LDASq3~h!dqvj<1mArD zP13z(tnSe!;#&88*2lO69T~>>8vJv`G_l8gpbOseKIbtOypYdT8>;(n9zvfnCuK_g zSSBdup9P};TL^O`eS~Ij!IL4t=;k4w$1~e*MRl((ElNeA_8U>^f8nWmI^7ykO96`*TEqDVNh6 z(S{DTVXC#uQI5;AHF2ISI@LZR?5B%q>7Bi(nOhRQ!jpr8k9etaQn$G}_AzHjxG(Aa zY_OYN2KcZ(x-Uz$_eB}<^&w`wK8Lq~KAw!=Ab8?`WCP=(KA&_Dk8aMSOnps#-q3l# z%A+gL`C)&%QNh>=lLuV6z?_Z;Fh)Gk$yFaOU00Y>5|hTy-GKVg-y7?%V$Or>660T? zbAgkOFo#1?u6*fjZS5FmS&>F-yykW2CkGiQtNq9(z0S{|V&Xe6B4QC)QpkdbG^I2qSFO_LLQPt8$9OYNz8Q))R>pq>LSWZiOzX zLc#}jo!q8iS!i6Meg?jGtg@@+bN?xSYU?YSwB>`_CC-PY&Nnj_-z!fXYvIG2cCwZY zmc7z<{X5c)OH;poZi98NP}K-?4CBZ(y!|AQ!2N9-9+&bP=C}{TLrjK4_ghzS?;%}v zM{=;9P!F-)v2EvOLEh_jna7iR)#9g45+waZBqmQM%;7Dqt%}H1hJ*-oKVr`6lzcSn zOT)G&m}7xYX;b7U{jK8gj5+LY98bJa{yOG3nAGhgf$xto2lxPIN;)o<)Mp)Ya%D-P z{aT-K$6I=C_VE?XFTZ);w*L&dQ>AzDsh+_8TsV`^Y{v_Rd69@@u+)JKm-rwa$NM=E zPUy&#V35E(n3AxIkwN3AkXH%M(lhgBQ@ug9deOwE^j7&8+?mSrJ7?qhoS%5VwXewz zwNK`>&yaKVXQnmjuIBc%iZ}4l%b1I%*kK?%$z`Ri>v;cbN$<)0r}{GS)_jHKXZwoO z=?CwlbNg)9^?CNMv~8`6Jogx=bS`WUay!Y=Ns%inbpK~xJo{d1;>tg%E$EOodr!s+OldUib^FbOX!E?-Z&PUpNeBu7PR5NegZ;{@q{mJh-Zx)FZ zV%8PyEGw8J*Y-HZl3e-DGzMPPzNSn1aa$jFy~3QcAK|#%`>lQS_R!|SCe6NIezUi( zhCvCl;(Xo#7F%8$ghlKva&T~GZ;<0@9t@aMr=FqT4l`5RItZ9=hlyzLa6PQA?iuWB z9|FmQj=CGb%y8Rkk~gf^>VzzND(C%pYLTXKCGWdN2$`Z!vJUl)$%tHju=Dzf3$dYSw?VYrfIaLv5ik z@~d-T&@MpJTkZo`DC_Pk4~F`Bjk3X*O^9=?4VkP$%$T z`$O7%O zx}Q}42;VCg`kNf;ShYbJIBn)J#v`K+%Kb@aU0yLM2hE2zB5eyHxqpzPwC^BWJ1{U@ zO`rSLX~m)QQ{(Q(RHNBR&#K+u&*#j_my3Q|`B-PRS$-;)jn@cb>j|k&Yr#Of`vJ-6 z{t`BOlBASaKlOJd;{kJy^+vpU0dsuY^3?yRr~Ns^SQ}mSz{e|?GwPxu;X}-EGW1fx zWSc77h5wcwl%7upe1bXIAFt*D9|PvRWy+t$vG0uy98ZR1A=?H*C%ZvE-&pFs8Pf=~ zmx!}PkVkfB(ccOROca9^2^3*cpbx}(USYpN5YH5nr4(!?6Ed8x-8K@AcoR)B4{Xhi z=!Omfv&P??Nzn?ApmUeg>A0)WO5QBPHmJz3d}#3~2&ewp#48pdzu+g=O?>q__NJYe z`3nOLBbqbPu|Xdi`2jh97i9W0{9X15U%=BsMLY-C>@ug5kM=8)~~HhYCRhzZeZ_U|jNV<+B4-^0|} z9x$iXo$&ODcEKDU_Kw&bW}@4? z(B?d5Z|tZhwg(W`kw&?A-AGn2Z9%ZLq>s;+*m4K|p&FMC^^d%=0xMGtg5J7}yiwPaP~V8>a#X+bR=!zn;4SSAd=RgoVM^xm zNH;%teHtt&>kL~QEsHj+(Ui8?=OG#In-zhpup!h}aGl@_`Zttr_gpT!PV##{s$C*A z+na!+RxH2wKxA^OTIVf#E-t|@5`5H&w zH)77}v+x2Kmh#AJ%)t%g&R?@HP=Cf8;3L$Dn+&Q?+%ZR_bHTD&jJt0!N7P_^NDP!h z;Wg$QI7b_?7N0RE4}R0DT0WrC znSbjnH=3hYetC;*;b+9UKcu z=L1a2v{o}8V(dgG|v3CKg6=5(}HtB6*B$2t4XsSOw|n9ELs{gBeC%U zkSG@mu(>9wz(YSQ`ebA5eb}p0LNSPF`M^5)WuW1 zGi=$Tqu9T@jMacG{4SgQmAMmmO}&mn_Trz&p}mhSJ>~ z7ikv9vz5R*;NCVJtfQ83V%$8A+F4pb!GyiqWIy7;kcV!wD6e^ftoT9t3;28T+1Hfv z(B(E~oyxZ>>bx9X#N~LSt~3+Ve?1Ix7(DXeNXXO#(vH;WsB9A(_Wte ztLh3QIH1r&5nYE`NL?^zGuY%nd3t=^F(*DABh;@*UNuSHu9y?#YQn^F;>ug)rD2W; z>5BUp@FKov%<%!n6gle(zK=G}kPWfL9dji3^L?WzkH<+J+w%BlC2`6bg5X_4U`Q*$ zx0&T+LL-@JuItHztvh*O`-YfUTS2IcCmP98@)=-Ol^r~zRGFki-Z5l6k>Xe;C7E1U zwv%kCuEs)tYcpjcnZa(9^5Z7SnG~_i9vJn&D8|>jX>RU`R^DIHp_k~ z%`bg!IwCy8s-ZR+w9t=1d3Rga~p2)-TWg!quEaiMe0O0bI~NeENe9lpm|v}0w^wn7K~0=}y&l4fTr zebO0+ohRM+q6&UZLnL(Uof|8rV2;L&SwS^gN3i?`23a#D21+bNY4kt%-GEgsu1o!@ zr$*|6IdOiN2rM3;Ogz3GFo#$*K~ddao~Ny{JLbd>?25q}x_*f{C{h|UKDIjzJPTpy)NR^}Q@ zovP%FNd=M$OfC%mO3-#AxlYyFgXU6Pn72UULPIbn49=wr`H$shF7j*)AD8OI(9tVI34?Y0fptt$kUPli_ z<0X=ERi6^f^vxBPJHa#8DKfGpu(Wxsl7N19q;213U9%#$P5=W!XK+3ezvAc0r1GN~ zlL1nidjxVnhYG$-l=iBaWo$-$u$h-P-nq7yd7aQ3)XB^19#`Ne5wBS%Xc_3mm@gmf zS5r&*yp4Z*IbaSb1eo_P9!%oldnshnE0|+tbj2xD9HakwY>{qAvuPE=C|Kc#T%)?m z33DQzBzaNN56JNnb25x@H39fAvUq2*U=FQNR~vyZWZgUF1de(8$P<7Y9DiI#7tC>9 zv`7`4(>V8xIl(XJ9Y>G!D&(gsGBHO%?_N$@Qg#Q4HjFv?*Wdqucxa43({N$|c7s05 ztb@m}rL866L$X$=NxC2Qxl1jR5{26M44_J>?*BpgJQF7CMX~8k%Jz%eBh)*|3P6e2|)a~X6Dcdy_tZoj3iUnjlU^Aj-g6Ck`7y&iV+aU2OhhE zvae}>U9%gH-LP5-27&6D^4RhGr zyDv>Kbi$7Vk|s|@Ryp`&#~kVHp>B7TXUsV|)q(#T=HSgKTJ(SN#~bDhfpX#RUZ=+r z#w(7SQ`9v~=tM-Jvpkn3{8n45?F(nY7f{IDe>Wfj3`j00yY&iY=VWjJlsqYGPrcH4zL}*xdcodrUGhsRj^f+Ty~Fs zT(;T5)1$5HEY=4rLptvK07R_Q%3$fENDx_jXC}|bX7PFU7$gyIOESe|k&7HQU9JQS zJY9tXFb2Q{d}sb@hGjJ%y}Hsl)(bgEnfW>am7Z|nz#%mFthV6Hkzi=nA7rRwfnPoe z{l>@zc64Gzl{6SR;XTNUaTAK+>f6X)9mfz03c&M*ahACw6YzRFQwFf+i3pz6Ud7ii z`M|x0f;#mI*lz1TEK0t@ZR4(PD2ojhE6)>ASB!(dnWXQnvUc^*Y;V@=R2UUZgU9oze^%t$-$*@ zyjloc0Y4VbXySvCD}e_j%Br0zIyB57cFq+u>u6&R{wRaf;ecP5sQH`$OMo@}?{|^; zf9H3DkN4{x;S#v((;XxFiTouKBOixdZcj*a_F*xWWwHp@l?~{?OqTa9fL%j}P$$~i z=A{qnZ7?eX0P!LDT@)4iz>TlwzUBc7F6wkO_R8>% z-|+RV%kWG5F7!d|86$9W0PQy^`X$-S?VItBvY=)xP!QU~i-6IN@$y^1JH!{qA@}jn zZ;9<3Y||$U>*0R|-K(&ET?z$#fdzTbTw+d&&nt|fH%J=5DbtPxb3)J5uGA4KCZD=t z4%tp5tW_tHiM1~=C-?!~iUF={y#U`Q%n^{O*$?~J{_+NMDt-|Ah)r)X2Tqzv;{Bk@ zc1*fVd*h`q^sOB0t6t8Slc60JqrO9Ik|Qxk|N8rX)5~Kjg`nKCY}dOp*Om+|2k>zZ z#FpUn&L$clWCd2w2qi{7tNpnM!RM|AyjH$LnJP!V-8n>Z^X9??e8wPb@3#=a4+pKhvA-^WaUL-qScCA3~l-*OlHKb6Q=Id%c&KbFBKLz!T=& zaG(%)i#gpsFLeKeIfF1W-ItgHyoyNipYE6b{j*B71E9(Z*y89?`fSU9;xjp%(H5CD z?P&?hnah5Z@4ob`ZFyj1dc>CxqC|Dc8O{ewpV1$7K77>qo)R?XAZc$SDAXD+S3xkO zph;()V*saFRpBO*oRT%y`ct{NZe`EnMqap66XC&_P8t=P2s`I6)02taI@#EQ{UkWfHFRnl|V!JQRY3E7x;pY`efVbq_0 zN<0qF|A}@m5JtbQW1q1RLg$fYRgS}8oBM430naf}(ut9dt+Z3o;F*}%BGo~*$D!Mx zA`1IU_*9`sN`&7u;K8Mj=Ffm45hJME!f*HigxG?{}Cp^ihxT;1%W|AQ&H#d~o81IpCwrU-c)E zx0o|0p-_+LzQLR#Q}EJD-(e1`&+`n7R>Lh6sgy-x-F1adolD)T0hE^kK9mt}qefwb znUGxaJMH6$q(ygqzEwrclOCm#MyE31vn&ssMz>)IjAf8Iq>z#iVw0mwM}qRYH+z}@W6{pU!tnY{sFJf zAKr~Ptw_H5gpEr3m$vWZTuHf1@3HQ$BzGVzFEOxpGz6 z=+Y9gC31PW?>eso=Zs5(ho3*T33}z;L9Vzw7dp$*UE&9P&w``GSIPPnbHb-d;!Od4ukdohoQfCtVSjX< zUSbaLyQ7GGEogzR4w!>7r5`q$t8fT?yjT^q?H z4J;yx?^z0P=FN(WA3rY<7`$f&>PgjRB?d*1z#uwt)!qQle(})?87gRuOCQKzGWf55PC@c};YZ zOpwstXXPevz0#6kWN(o<^&Q@_sr$Zystkp?K$_a) z8caDQ=6r}}s#a31AeCt33R=>bczhWP*5WK}N8xJ=>4Xn$=p!R;|tCdVpPkm#% z33Fz8;mad4XUw^NKD31nQOG>(Z#~6u`F+TVvMqv5Px?iK-(K#|>&W-=KnfKW_N>`? zwbD`RE0}t`gFyj~r^IYX2K&s{*@4xfq3M>zhIvpW0(DGwU0|2-TL^Lxj(hf ziweIUuE@J|;-9$RYux)pPamx$9_W5ypHKR-Q@s8Od5heeCfr{S0GBqug*lIX{##?s zt=|`Y{=|xnhGm-MH6-g(E z6`;-abg@GZw4SPZsl&Vf4d2yz=iA07ujd)e2HIXCbAJAasdrstA<`ZHdf7T7x-4CNU5Xh&X< zbgWbuU#3?poq8L5f1?l3-+HWZ;~zc$L`&C1D(wh*i&%qh)a3?UlKYo);uFS$j@_rI zopcjT#}h4L*5zW}PZRozIc!*t{eE=Bl|9=7dk+d+O}O+cW0$ zSlqsec%!V7XUrK4X@~)?e0zyGTSs+l+&qUTd!3h<6TVM0tABy4I~GUG89o_@wZb#z zE;%Ui{cod)UO=GcX zH+MZozizcK7Oa!gEpYzw&4cE{CXtO=oWP|&mDEyPCPQPBkV!z1f2Xw#u~=4+59LXo z{ECI<0sD$BUGbF-OqitYsr1M=ozaG zs&jd90Kf@Q1W))=(Q_l_oPiv^8g1_P?nhdiN&1ele@ICLP(Hdt16k3~SMCaR|3r*p z9GY0-D&X&RR;RsMyyUUT3A~f6BD72bb{ABAsCUMk)x@Hm*F`>v`v=TXALxwRL@f&< zZ2zi^>4SDanjw?QYs}G<(m@_;uP$J=3MX98Eg~(Sn{4NJy9hyT*^752pft+tAEiI*Z29|CGfkDDZ ze#ZlVP}%f0Ug9c3&`x#-#FLP-?O! z-}*k&I&n~cyyfVr-uXPcqzy-BIwz`6RQ`m&KiTT}|K_t-2flik=8@!Qk2-*s@?_)0 z+E1hRp?<|VAqZ`yC*QeZzMwD5Gf(eWJ(tvh>W}*PrtxRUb&uTd{quw&UyUncn?L3J g7e|X__$$5t1I#JJd2#e4O8@`>07*qoM6N<$f&}y&zW@LL diff --git a/big-dipper-backend/public/img/pylon_logo.svg b/big-dipper-backend/public/img/pylon_logo.svg deleted file mode 100644 index b11c0a14f7..0000000000 --- a/big-dipper-backend/public/img/pylon_logo.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/big-dipper-backend/public/img/pylons.svg b/big-dipper-backend/public/img/pylons.svg deleted file mode 100644 index 6e4e7733dd..0000000000 --- a/big-dipper-backend/public/img/pylons.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/big-dipper-backend/public/img/trophy.svg b/big-dipper-backend/public/img/trophy.svg deleted file mode 100644 index 972f223a3a..0000000000 --- a/big-dipper-backend/public/img/trophy.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/big-dipper-backend/public/img/uatom.svg b/big-dipper-backend/public/img/uatom.svg deleted file mode 100644 index 29c934ec3c..0000000000 --- a/big-dipper-backend/public/img/uatom.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/big-dipper-backend/public/img/urun.svg b/big-dipper-backend/public/img/urun.svg deleted file mode 100644 index ab6800ac71..0000000000 --- a/big-dipper-backend/public/img/urun.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/big-dipper-backend/public/img/usb.svg b/big-dipper-backend/public/img/usb.svg deleted file mode 100644 index 5363c5ec05..0000000000 --- a/big-dipper-backend/public/img/usb.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/big-dipper-backend/public/img/ust.svg b/big-dipper-backend/public/img/ust.svg deleted file mode 100644 index ee6be05a50..0000000000 --- a/big-dipper-backend/public/img/ust.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/big-dipper-backend/public/img/ustripeusd.svg b/big-dipper-backend/public/img/ustripeusd.svg deleted file mode 100644 index 5a8e5a3bb6..0000000000 --- a/big-dipper-backend/public/img/ustripeusd.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/big-dipper-backend/public/img/wallet.png b/big-dipper-backend/public/img/wallet.png deleted file mode 100644 index e6c2f280009b14c9d457a833cb4ad8fa22fdb772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2206 zcmW+&eLRzU8^6a6cVTUDG8*Qr5+6JiYBX(;O^@QBp59~}B-HUNQEXnu2?uRn%Au3D zvvabZPN%l0<*BSxBq1-ITQ52qkO<^4g#3>7+tG9Rt-Pv+$ zlhKiGI?t@+D<`3C*47`LF6W{7e2>kRoSg+SbKeA~fU`y0$!2vYi}IF5I&gw~vzeu5 zIx>=9J$#xrd2H_UE8#}6M^m5ue&_k4 z3&P36GoFp9f`dQJl0{A%Kis`G+loF){rg7wjteCI?bpbT6SOeqjnuf?a|msn`16H1 zuNjRpq>xUSZhhmtpuWYopWY?B%1uw13ZH)yOwmuQ3iG~pBmTdwDdJW?^Un(nhgF?_ z#lIUG^vrP8Pi(EddKW95rQNuTF>dbYMQDQ6CrT9D^y^m%>oq|;e~p%eYH+Y{sgmoE zjF6bUfpU!TH4Dk5y$uoQcz2dG+vZ-gXQjy;3|>fmCVHi;V0T;=i)*u%p97JuBzF*b z1|qS+2QkKWCM>=7+g)w(IjhW&G*VwBE4WWTF|MPwQpr7+j%+)~3{BJVjQJr>OkZ6< zB(iA?qP7KTw0F;Kts0{?oBcXW#(D|~ZmU-UfKi)``w!=7DrF2{ia0?`a-{7q%^F9DFBP4Fe-jH6Wcidq~fAo%vK17L>Aj=BLmmZ_1Yqm@2U zfu6?n;zk^}gDkBq2O!m$e(5(T|CWzfBy`#;>}(9AZR>NLMYH443cKpRUK(zzPLCaI zA6G3I8h=sCQb}G+yr?xDS9NwhE;oPfIX$0}G2(r^oR#8ea@_o1XDmd^8#n0H{BO^p zXYPNdbxy`F()c9~zrONve)^`O>f>H^(q!>q*qo7((c=t*nUP%O{$=L5LOXW%(>oc{ z*ViS8yr+Czm^mdyO76ha9=ZTsS%NXP&bzM$ETPj{KJ^CCkhi!vrO7HXP)06)SBQ>x z`18^LlDcje#%M@&ATo*n9*LIpep0bDWXIT2R`6N7+r>Uz=MU<5XR1xMkT}0MV~k@g zt4f-9RhW|dHl2kqi6%k?_w@%cRe&--#z=Z+zmCw51*5Q7TJBro!;^on;=KQoNT4FYLfvh1%q7|&*vL|&?AJjfc$LpRn@+H~kP%*~l>#oa~Io^># zoPU_8Aq!g`SlhS#PHD4EqIjjrqNWX2=63o0s4XsePAjL~a+E8$Thdcv1!#{9i0u>I zZMHnQl6zmb0EhmWhB2Z=*~WtULn;OL{sPHW6LdxpBPkQXAcU4b#TasGrVpu)j!}}R7+5JgeNtN-U;^`%q$p#Rs6bZg+^^uSVIuo~_Q_Vyf+K?07GR7Dt4w9e z;9&XT>e}R+bMMRB-dn8o${e-}4`b2&3N&qjgI% zwONu-MxG}mL^3MpG9*x29a?9csparoxnv;{wInjnU0egwzW*prO z$IDt7=I4?E3CB1uaRsd4?>bF!BSG;+BSrkzAXOICk0#^0$*=TtafKQyPkV@e2Z?&M zj#6mA*43;M5PcMe?v@h%%tv#Zs+7-bs_(U5>MM;84?EhC&}em3JECStp1aM=U&#>I z+XP@GxPvIXY8QlMz_@ioIW>nj$k_-)J&95V!s%{cpyc!?zUNubF86!Zx zjJp0W*ogJV;X4_x!kV}?7M#>C9X|cAYJb(B^5u9TeMyKub$=lI(pc^fH1(5KRS?Qf zv9?k@ln-ha#&@MH-@jM6Mnn^nM}jbubKy$4OK5%h?k+siig! ziRw%!q;GJCTN#KTM#!lM)?>mz?V#({8w=@$=OOVaf;b-yEipA9WGL{ZfYPg z#3!bgz&+*{P?E|Mz%Q1CHK$iV;!z}VVzUi`l^QZ)?cjo|{!dj4yWt*3o6(qpHHd<1 z?$_lw12xW2)kz%a?&w`Kc`-QWo`Ii>J>K>`RP_;qe@)Gbi)LGTdTi1)hak)I1pL$>o4OSKfNJB6N~wMkM6J#UBKFNgmf Oi2vqoz85y}#s2`2``j%6 diff --git a/big-dipper-backend/scripts/build.sh b/big-dipper-backend/scripts/build.sh deleted file mode 100644 index c0ee4a7a91..0000000000 --- a/big-dipper-backend/scripts/build.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -pwd = $(pwd) -cd app -echo "Pre Builing node_modules production..." -meteor npm install --allow-superuser -echo "Builing for production..." -meteor build ../output/ --architecture os.linux.x86_64 --server-only --allow-superuser -cd ../output -tar -xf *.tar.gz -cd $pwd \ No newline at end of file diff --git a/big-dipper-backend/scripts/genversion.sh b/big-dipper-backend/scripts/genversion.sh deleted file mode 100644 index 6bf90b285f..0000000000 --- a/big-dipper-backend/scripts/genversion.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -echo "Generating version file" -export TAG=$(git describe --tag) -echo $TAG | tee private/version -git add private/version -git commit -am "add version $TAG" diff --git a/big-dipper-backend/scripts/post_build.sh b/big-dipper-backend/scripts/post_build.sh deleted file mode 100644 index af1aa34d9b..0000000000 --- a/big-dipper-backend/scripts/post_build.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -echo "Builing node_modules production..." -cd app/bundle/programs/server -npm install -cd ../.. diff --git a/big-dipper-backend/scss-config.json b/big-dipper-backend/scss-config.json deleted file mode 100644 index 00c4cd4f73..0000000000 --- a/big-dipper-backend/scss-config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "includePaths": [ - "{}/node_modules/bootswatch/dist/", - "{}/node_modules/bootstrap/scss/" - ] -} \ No newline at end of file diff --git a/big-dipper-backend/server/main.js b/big-dipper-backend/server/main.js deleted file mode 100644 index c3e79aa589..0000000000 --- a/big-dipper-backend/server/main.js +++ /dev/null @@ -1,376 +0,0 @@ -// Server entry point, imports all server code - -import '/imports/startup/server'; -import '/imports/startup/both'; -// import moment from 'moment'; -// import '/imports/api/blocks/blocks.js'; - -SYNCING = false; -TXSYNCING = false; -COUNTMISSEDBLOCKS = false; -COUNTMISSEDBLOCKSSTATS = false; -RPC = Meteor.settings.remote.rpc; -API = Meteor.settings.remote.api; - -timerBlocks = 0; -timerTransactions = 0; -timerChain = 0; -timerConsensus = 0; -timerProposal = 0; -timerProposalsResults = 0; -timerRecipe = 0; -timerRecipesResults = 0; -timerCookbook = 0; -timerCookbooksResults = 0; -timerMissedBlock = 0; -timerDelegation = 0; -timerAggregate = 0; -timerFetchKeybase = 0; -timersendnunsettledotifications = 0 - -const DEFAULTSETTINGS = '/settings.json'; - -updateChainStatus = () => { - Meteor.call('chain.updateStatus', (error, result) => { - if (error) { - console.log("updateStatus: %o", error); - } else { - console.log("updateStatus: %o", result); - } - }) -} - -updateBlock = () => { - Meteor.call('blocks.blocksUpdate', (error, result) => { - if (error) { - console.log("updateBlocks: %o", error); - } else { - console.log("updateBlocks: %o", result); - } - }) -} - -updateTransactions = () => { - Meteor.call('Transactions.updateTransactions', (error, result) => { - if (error) { - console.log("updateTransactions: %o", error); - } else { - console.log("updateTransactions: %o", result); - } - }) -} - -upsertSales = () => { - Meteor.call('Analytics.upsertSales', (error, result) => { - if (error) { - console.log("Upsert Sales Failed: %o", error); - } else { - console.log("Upsert Sales Success"); - } - }) -} - -upsertListings = () => { - Meteor.call('Analytics.upsertListings', (error, result) => { - if (error) { - console.log("Upsert Listing Failed: %o", error); - } else { - console.log("Upsert Listing Success"); - } - }) -} - -getConsensusState = () => { - Meteor.call('chain.getConsensusState', (error, result) => { - if (error) { - console.log("get consensus: %o", error) - } - }) -} - -getRecipes = () => { - Meteor.call('recipes.getRecipes', (error, result) => { - if (error) { - console.log("get recipe: %o", error); - } - if (result) { - console.log("get recipe: true"); - } - }); -} - -getRecipesResults = () => { - Meteor.call('recipes.getRecipeResults', (error, result) => { - if (error) { - console.log("get recipes result: %o", error); - } - if (result) { - console.log("get recipes result: %o", result); - } - }); -} - -getNfts = () => { - Meteor.call('nfts.getNfts', (error, result) => { - if (error) { - console.log("get nft: %o", error); - } - if (result) { - console.log("get nft: %o", result); - } - }); -} - -getNftsResults = () => { - Meteor.call('nfts.getNftResults', (error, result) => { - if (error) { - console.log("get nfts result: %o", error); - } - if (result) { - console.log("get nfts result: %o", result); - } - }); -} - -getCookbooks = () => { - Meteor.call('cookbooks.getCookbooks', (error, result) => { - if (error) { - console.log("get cookbook: %o", error); - } - if (result) { - console.log("get cookbook: %o", result); - } - }); -} - -getCookbooksResults = () => { - Meteor.call('cookbooks.getCookbookResults', (error, result) => { - if (error) { - console.log("get getCookbookResults result: %o", error); - } - if (result) { - console.log("get getCookbookResults result: %o", result); - } - }); -} - -getProposals = () => { - Meteor.call('proposals.getProposals', (error, result) => { - if (error) { - console.log("get proposal: %o", error); - } - if (result) { - console.log("get proposal: %o", result); - } - }); -} - -getProposalsResults = () => { - Meteor.call('proposals.getProposalResults', (error, result) => { - if (error) { - console.log("get proposals result: %o", error); - } - if (result) { - console.log("get proposals result: %o", result); - } - }); -} - -updateMissedBlocks = () => { - Meteor.call('ValidatorRecords.calculateMissedBlocks', (error, result) => { - if (error) { - console.log("missed blocks error: %o", error) - } - if (result) { - console.log("missed blocks ok: %o", result); - } - }); -} - -fetchKeybase = () => { - Meteor.call('Validators.fetchKeybase', (error, result) => { - if (error) { - console.log("Error when fetching Keybase" + error) - } - if (result) { - console.log("Keybase profile_url updated ", result); - } - }); -} - -getDelegations = () => { - Meteor.call('delegations.getDelegations', (error, result) => { - if (error) { - console.log("get delegations error: %o", error) - } else { - console.log("get delegations ok: %o", result) - } - }); -} - -sendUnsettledNotifications = () => { - Meteor.call("Notifications.sendPushNotifications", (error, res) => { - if (error) { - console.log("Error Sending Notifications",error); - } else { - console.log("Notification have been sent ",res,error); - } - }); - }; - - -aggregateMinutely = () => { - // doing something every min - Meteor.call('Analytics.aggregateBlockTimeAndVotingPower', "m", (error, result) => { - if (error) { - console.log("aggregate minutely block time error: %o", error) - } else { - console.log("aggregate minutely block time ok: %o", result) - } - }); - - Meteor.call('coinStats.getCoinStats', (error, result) => { - if (error) { - console.log("get coin stats error: %o", error); - } else { - console.log("get coin stats ok: %o", result) - } - }); -} - -aggregateHourly = () => { - // doing something every hour - Meteor.call('Analytics.aggregateBlockTimeAndVotingPower', "h", (error, result) => { - if (error) { - console.log("aggregate hourly block time error: %o", error) - } else { - console.log("aggregate hourly block time ok: %o", result) - } - }); -} - -aggregateDaily = () => { - // doing somthing every day - Meteor.call('Analytics.aggregateBlockTimeAndVotingPower', "d", (error, result) => { - if (error) { - console.log("aggregate daily block time error: %o", error) - } else { - console.log("aggregate daily block time ok: %o", result) - } - }); - - Meteor.call('Analytics.aggregateValidatorDailyBlockTime', (error, result) => { - if (error) { - console.log("aggregate validators block time error: %o", error) - } else { - console.log("aggregate validators block time ok: %o", result); - } - }) -} - - - -Meteor.startup(async function() { - if (Meteor.isDevelopment) { - process.env.NODE_TLS_REJECT_UNAUTHORIZED = 1; - import DEFAULTSETTINGSJSON from '../settings.json' - Object.keys(DEFAULTSETTINGSJSON).forEach((key) => { - if(Meteor.settings[key] == undefined) { - console.warn(`CHECK SETTINGS JSON: ${key} is missing from settings`) - Meteor.settings[key] = {}; - } - Object.keys(DEFAULTSETTINGSJSON[key]).forEach((param) => { - if (Meteor.settings[key][param] == undefined) { - console.warn(`CHECK SETTINGS JSON: ${key}.${param} is missing from settings`) - Meteor.settings[key][param] = DEFAULTSETTINGSJSON[key][param] - } - }) - }) - } - - if (Meteor.settings.debug.startTimer) { - - timersendnunsettledotifications = Meteor.setInterval(function () { - sendUnsettledNotifications(); - }, Meteor.settings.params.collectNotificationsInterval); - - timerConsensus = Meteor.setInterval(function() { - getConsensusState(); - }, Meteor.settings.params.consensusInterval); - - timerBlocks = Meteor.setInterval(function() { - updateBlock(); - }, Meteor.settings.params.blockInterval); - - timerTransactions = Meteor.setInterval(function() { - updateTransactions(); - upsertSales(); - upsertListings(); - }, Meteor.settings.params.transactionsInterval); - - timerChain = Meteor.setInterval(function() { - updateChainStatus(); - }, Meteor.settings.params.statusInterval); - - if (Meteor.settings.public.modules.gov) { - timerProposal = Meteor.setInterval(function() { - getProposals(); - }, Meteor.settings.params.proposalInterval); - - timerProposalsResults = Meteor.setInterval(function() { - getProposalsResults(); - }, Meteor.settings.params.proposalInterval); - } - - timerRecipe = Meteor.setInterval(function() { - getRecipes(); - }, Meteor.settings.params.recipeInterval); - - // timerRecipesResults = Meteor.setInterval(function() { - // getRecipesResults(); - // }, Meteor.settings.params.recipeInterval); - - timerNft = Meteor.setInterval(function() { - getNfts(); - }, Meteor.settings.params.nftInterval); - - // timerNftsResults = Meteor.setInterval(function() { - // getNftsResults(); - // }, Meteor.settings.params.nftInterval); - - timerCookbook = Meteor.setInterval(function() { - getCookbooks(); - }, Meteor.settings.params.cookbookInterval); - - // timerCookbooksResults = Meteor.setInterval(function() { - // getCookbooksResults(); - // }, Meteor.settings.params.cookbookInterval); - - timerMissedBlock = Meteor.setInterval(function() { - updateMissedBlocks(); - }, Meteor.settings.params.missedBlocksInterval); - - timerFetchKeybase = Meteor.setInterval(function() { - fetchKeybase(); - }, Meteor.settings.params.keybaseFetchingInterval); - - // timerDelegation = Meteor.setInterval(function(){ - // getDelegations(); - // }, Meteor.settings.params.delegationInterval); - - timerAggregate = Meteor.setInterval(function() { - let now = new Date(); - if ((now.getUTCSeconds() == 0)) { - aggregateMinutely(); - } - - if ((now.getUTCMinutes() == 0) && (now.getUTCSeconds() == 0)) { - aggregateHourly(); - } - - if ((now.getUTCHours() == 0) && (now.getUTCMinutes() == 0) && (now.getUTCSeconds() == 0)) { - aggregateDaily(); - } - }, 1000) - } -}); \ No newline at end of file diff --git a/big-dipper-backend/settings.json b/big-dipper-backend/settings.json deleted file mode 100644 index b622d29702..0000000000 --- a/big-dipper-backend/settings.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "public": { - "chainName": "Pylons", - "chainId": "pylons-testnet-3", - "gtm": "{Add your Google Tag Manager ID here}", - "slashingWindow": 10000, - "uptimeWindow": 250, - "initialPageSize": 30, - "secp256k1": false, - "bech32PrefixAccAddr": "pylo", - "bech32PrefixAccPub": "pylopub", - "bech32PrefixValAddr": "pylovaloper", - "bech32PrefixValPub": "pylovaloperpub", - "bech32PrefixConsAddr": "pylovalcons", - "bech32PrefixConsPub": "pylovalconspub", - "bondDenom": "uatom", - "powerReduction": 1000000, - "dynamicLink": { - "apn": "tech.pylons.wallet", - "ibi": "xyz.pylons.wallet", - "isi": "1598732789", - "oflPlay": "https://play.google.com/store/apps/details?id=tech.pylons.wallet&pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1", - "oflIOS": "https://apps.apple.com/us/app/pylons/id1598732789" - }, - "coins": [ - { - "denom": "uatom", - "displayName": "ATOM", - "fraction": 1000000 - }, - { - "denom": "ubedrock", - "displayName": "UBEDROCK", - "fraction": 1000000 - }, - { - "denom": "umuon", - "displayName": "MUON", - "fraction": 1000000 - }, - { - "denom": "ustripeusd", - "displayName": "STRIPEUSD", - "fraction": 1000000 - }, - { - "denom": "ujunox", - "displayName": "JUNO", - "fraction": 1000000 - }, - { - "denom": "upylon", - "displayName": "PYLON", - "fraction": 1000000 - }, - { - "denom": "uusd", - "displayName": "UST", - "fraction": 1000000 - }, - { - "denom": "urun", - "displayName": "RUN", - "fraction": 1000000 - }, - { - "denom": "ujunox", - "displayName": "JUNO", - "fraction": 1000000 - }, - { - "denom": "eeur", - "displayName": "EEUR", - "fraction": 1000000 - }, - { - "denom": "weth-wei", - "displayName": "WETH", - "fraction": 1000000 - } - ], - "ledger": { - "coinType": 118, - "appName": "Cosmos", - "appVersion": "2.16.0", - "gasPrice": 0.02 - }, - "modules": { - "bank": true, - "supply": true, - "minting": false, - "gov": true, - "distribution": false - }, - "banners": false, - "baseURL": "https://wallet.pylons.tech", - "cosmos_sdk": 43 - }, - "remote": { - "rpc": "https://rpc.pylons.tech", - "api": "https://lcd.pylons.tech" - }, - "debug": { - "startTimer": true - }, - "params": { - "startHeight": 0, - "defaultBlockTime": 10000, - "validatorUpdateWindow": 300, - "blockInterval": 10000, - "transactionsInterval": 1000, - "keybaseFetchingInterval": 1000000, - "consensusInterval": 1000, - "statusInterval": 7500, - "signingInfoInterval": 1800000, - "proposalInterval": 5000, - "recipeInterval": 5000, - "nftInterval": 5000, - "cookbookInterval": 5000, - "missedBlocksInterval": 60000, - "delegationInterval": 900000, - "sendNotifications": 0, - "collectNotificationsInterval": 10000 - } -} \ No newline at end of file diff --git a/big-dipper-backend/yarn.lock b/big-dipper-backend/yarn.lock deleted file mode 100644 index 16689dda27..0000000000 --- a/big-dipper-backend/yarn.lock +++ /dev/null @@ -1,5226 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/generator@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz" - dependencies: - "@babel/types" "^7.18.9" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.16.0": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" - -"@babel/helper-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz" - dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.9" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.18.6", "@babel/parser@^7.18.9", "@babel/parser@^7.7.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz" - -"@babel/parser@^7.9.4": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.0.tgz#b26133c888da4d79b0d3edcf42677bcadc783046" - -"@babel/runtime-corejs3@^7.10.2": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz" - dependencies: - core-js-pure "^3.20.2" - regenerator-runtime "^0.13.4" - -"@babel/runtime@>=7.0.0-beta.56", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" - dependencies: - regenerator-runtime "^0.13.10" - -"@babel/template@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz" - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.7.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz" - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.9" - "@babel/types" "^7.18.9" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.7.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz" - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - -"@braintree/sanitize-url@^6.0.0": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.1.tgz#45ff061b9ded1c6e4474b33b336ebb1b986b825a" - -"@emotion/is-prop-valid@^0.7.3": - version "0.7.3" - resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz" - dependencies: - "@emotion/memoize" "0.7.1" - -"@emotion/is-prop-valid@^0.8.1": - version "0.8.8" - resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" - dependencies: - "@emotion/memoize" "0.7.4" - -"@emotion/memoize@0.7.1": - version "0.7.1" - resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.1.tgz" - -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" - -"@emotion/unitless@^0.7.0": - version "0.7.5" - resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" - -"@fastify/busboy@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-1.1.0.tgz" - dependencies: - text-decoding "^1.0.0" - -"@firebase/app-types@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.8.0.tgz#50a539a0a20bef8c50494d0615592fe2a384851f" - -"@firebase/auth-interop-types@0.1.6": - version "0.1.6" - resolved "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz" - -"@firebase/component@0.5.20": - version "0.5.20" - resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.5.20.tgz#52165b5f7d25c4ac9c679e4e48d6f7fa7bf722cf" - dependencies: - "@firebase/util" "1.7.2" - tslib "^2.1.0" - -"@firebase/database-compat@^0.2.6": - version "0.2.9" - resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-0.2.9.tgz#a1b4ecf94e11eadfc21aa48121b3ba7ea18a57ae" - dependencies: - "@firebase/component" "0.5.20" - "@firebase/database" "0.13.9" - "@firebase/database-types" "0.9.16" - "@firebase/logger" "0.3.3" - "@firebase/util" "1.7.2" - tslib "^2.1.0" - -"@firebase/database-types@0.9.16", "@firebase/database-types@^0.9.13": - version "0.9.16" - resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.9.16.tgz#4f7f612c00346641a641ac689005857190e91ebc" - dependencies: - "@firebase/app-types" "0.8.0" - "@firebase/util" "1.7.2" - -"@firebase/database@0.13.9": - version "0.13.9" - resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.13.9.tgz#8cf8c77fb837ed1a6fa85565ac8c28864b0957fb" - dependencies: - "@firebase/auth-interop-types" "0.1.6" - "@firebase/component" "0.5.20" - "@firebase/logger" "0.3.3" - "@firebase/util" "1.7.2" - faye-websocket "0.11.4" - tslib "^2.1.0" - -"@firebase/logger@0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.3.tgz" - dependencies: - tslib "^2.1.0" - -"@firebase/util@1.7.2": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.7.2.tgz#dbdb259f141b5025a7faaaa38e2ea5df0be36ff5" - dependencies: - tslib "^2.1.0" - -"@google-cloud/firestore@^6.4.0": - version "6.4.1" - resolved "https://registry.yarnpkg.com/@google-cloud/firestore/-/firestore-6.4.1.tgz#3cd32ffb10a563a9c3c91236b51e49e4cd088393" - dependencies: - fast-deep-equal "^3.1.1" - functional-red-black-tree "^1.0.1" - google-gax "^3.5.1" - protobufjs "^7.0.0" - -"@google-cloud/paginator@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.7.tgz" - dependencies: - arrify "^2.0.0" - extend "^3.0.2" - -"@google-cloud/projectify@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz" - -"@google-cloud/promisify@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.0.tgz" - -"@google-cloud/storage@^6.5.2", "@google-cloud/storage@^6.6.0": - version "6.6.0" - resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-6.6.0.tgz#01f64bf706acc98dc2787e490afe878ad9f64250" - dependencies: - "@google-cloud/paginator" "^3.0.7" - "@google-cloud/projectify" "^3.0.0" - "@google-cloud/promisify" "^3.0.0" - abort-controller "^3.0.0" - async-retry "^1.3.3" - compressible "^2.0.12" - duplexify "^4.0.0" - ent "^2.2.0" - extend "^3.0.2" - gaxios "^5.0.0" - google-auth-library "^8.0.1" - mime "^3.0.0" - mime-types "^2.0.8" - p-limit "^3.0.1" - retry-request "^5.0.0" - teeny-request "^8.0.0" - uuid "^8.0.0" - -"@google/model-viewer@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@google/model-viewer/-/model-viewer-2.0.2.tgz#1d1c60240d3ea1e7853875a9110c8e73d6276314" - dependencies: - lit "^2.2.3" - three "^0.144.0" - -"@grpc/grpc-js@~1.7.0": - version "1.7.3" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.7.3.tgz#f2ea79f65e31622d7f86d4b4c9ae38f13ccab99a" - dependencies: - "@grpc/proto-loader" "^0.7.0" - "@types/node" ">=12.12.47" - -"@grpc/proto-loader@^0.7.0": - version "0.7.0" - resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.0.tgz" - dependencies: - "@types/long" "^4.0.1" - lodash.camelcase "^4.3.0" - long "^4.0.0" - protobufjs "^7.0.0" - yargs "^16.2.0" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz" - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@ledgerhq/devices@^5.51.1": - version "5.51.1" - resolved "https://registry.npmjs.org/@ledgerhq/devices/-/devices-5.51.1.tgz" - dependencies: - "@ledgerhq/errors" "^5.50.0" - "@ledgerhq/logs" "^5.50.0" - rxjs "6" - semver "^7.3.5" - -"@ledgerhq/devices@^7.0.3": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-7.0.3.tgz#bdd7e8ce078399fe644067a7e1ca9a9d2e249c02" - dependencies: - "@ledgerhq/errors" "^6.11.1" - "@ledgerhq/logs" "^6.10.1" - rxjs "6" - semver "^7.3.5" - -"@ledgerhq/errors@^5.50.0": - version "5.50.0" - resolved "https://registry.npmjs.org/@ledgerhq/errors/-/errors-5.50.0.tgz" - -"@ledgerhq/errors@^6.11.1": - version "6.11.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.11.1.tgz#a8a81bda6d28ac43c757e109b1ff079ddeec54a6" - -"@ledgerhq/hw-transport-web-ble@^6.27.6": - version "6.27.6" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-web-ble/-/hw-transport-web-ble-6.27.6.tgz#6daadd40cf97a440bb794b5e3bacb1e6716ddbd4" - dependencies: - "@ledgerhq/devices" "^7.0.3" - "@ledgerhq/errors" "^6.11.1" - "@ledgerhq/hw-transport" "^6.27.6" - "@ledgerhq/logs" "^6.10.1" - rxjs "6" - -"@ledgerhq/hw-transport-webusb@^6.27.6": - version "6.27.6" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-6.27.6.tgz#8c4b5f96419511e3d8159e01baefd52891a91ae1" - dependencies: - "@ledgerhq/devices" "^7.0.3" - "@ledgerhq/errors" "^6.11.1" - "@ledgerhq/hw-transport" "^6.27.6" - "@ledgerhq/logs" "^6.10.1" - -"@ledgerhq/hw-transport@^5.25.0": - version "5.51.1" - resolved "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz" - dependencies: - "@ledgerhq/devices" "^5.51.1" - "@ledgerhq/errors" "^5.50.0" - events "^3.3.0" - -"@ledgerhq/hw-transport@^6.27.6": - version "6.27.6" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.27.6.tgz#87f886591bad047c18e76920519aceb9d844667b" - dependencies: - "@ledgerhq/devices" "^7.0.3" - "@ledgerhq/errors" "^6.11.1" - events "^3.3.0" - -"@ledgerhq/logs@^5.50.0": - version "5.50.0" - resolved "https://registry.npmjs.org/@ledgerhq/logs/-/logs-5.50.0.tgz" - -"@ledgerhq/logs@^6.10.1": - version "6.10.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.10.1.tgz#5bd16082261d7364eabb511c788f00937dac588d" - -"@lit/reactive-element@^1.3.0": - version "1.3.3" - resolved "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.3.3.tgz" - -"@panva/asn1.js@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@panva/asn1.js/-/asn1.js-1.0.0.tgz#dd55ae7b8129e02049f009408b97c61ccf9032f6" - -"@popmotion/easing@^1.0.1": - version "1.0.2" - resolved "https://registry.npmjs.org/@popmotion/easing/-/easing-1.0.2.tgz" - -"@popmotion/popcorn@^0.4.4": - version "0.4.4" - resolved "https://registry.npmjs.org/@popmotion/popcorn/-/popcorn-0.4.4.tgz" - dependencies: - "@popmotion/easing" "^1.0.1" - framesync "^4.0.1" - hey-listen "^1.0.8" - style-value-types "^3.1.7" - tslib "^1.10.0" - -"@popperjs/core@^2.6.0": - version "2.11.5" - resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz" - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" - -"@remix-run/router@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.0.3.tgz#953b88c20ea00d0eddaffdc1b115c08474aa295d" - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" - dependencies: - "@types/node" "*" - -"@types/d3-array@^1": - version "1.2.9" - resolved "https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.9.tgz" - -"@types/d3-axis@^1": - version "1.0.16" - resolved "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.16.tgz" - dependencies: - "@types/d3-selection" "^1" - -"@types/d3-brush@^1": - version "1.1.5" - resolved "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.1.5.tgz" - dependencies: - "@types/d3-selection" "^1" - -"@types/d3-chord@^1": - version "1.0.11" - resolved "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.11.tgz" - -"@types/d3-collection@*": - version "1.0.10" - resolved "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.10.tgz" - -"@types/d3-color@^1": - version "1.4.2" - resolved "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.2.tgz" - -"@types/d3-dispatch@^1": - version "1.0.9" - resolved "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.9.tgz" - -"@types/d3-drag@^1": - version "1.2.5" - resolved "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.5.tgz" - dependencies: - "@types/d3-selection" "^1" - -"@types/d3-dsv@^1": - version "1.2.1" - resolved "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.2.1.tgz" - -"@types/d3-ease@^1": - version "1.0.11" - resolved "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.11.tgz" - -"@types/d3-force@^1": - version "1.2.4" - resolved "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.4.tgz" - -"@types/d3-format@^1": - version "1.4.2" - resolved "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.4.2.tgz" - -"@types/d3-geo@^1": - version "1.12.3" - resolved "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.12.3.tgz" - dependencies: - "@types/geojson" "*" - -"@types/d3-hierarchy@^1": - version "1.1.8" - resolved "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz" - -"@types/d3-interpolate@^1": - version "1.4.2" - resolved "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.4.2.tgz" - dependencies: - "@types/d3-color" "^1" - -"@types/d3-path@^1": - version "1.0.9" - resolved "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.9.tgz" - -"@types/d3-polygon@^1": - version "1.0.8" - resolved "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.8.tgz" - -"@types/d3-quadtree@^1": - version "1.0.9" - resolved "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.9.tgz" - -"@types/d3-queue@*": - version "3.0.8" - resolved "https://registry.npmjs.org/@types/d3-queue/-/d3-queue-3.0.8.tgz" - -"@types/d3-random@^1": - version "1.1.3" - resolved "https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.3.tgz" - -"@types/d3-request@*": - version "1.0.6" - resolved "https://registry.npmjs.org/@types/d3-request/-/d3-request-1.0.6.tgz" - dependencies: - "@types/d3-dsv" "^1" - -"@types/d3-scale@^1": - version "1.0.17" - resolved "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-1.0.17.tgz" - dependencies: - "@types/d3-time" "^1" - -"@types/d3-selection@^1": - version "1.4.3" - resolved "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.3.tgz" - -"@types/d3-shape@^1", "@types/d3-shape@^1.2.5": - version "1.3.8" - resolved "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.8.tgz" - dependencies: - "@types/d3-path" "^1" - -"@types/d3-time-format@^2": - version "2.3.1" - resolved "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.3.1.tgz" - -"@types/d3-time@^1": - version "1.1.1" - resolved "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.1.1.tgz" - -"@types/d3-timer@^1": - version "1.0.10" - resolved "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.10.tgz" - -"@types/d3-transition@^1": - version "1.3.2" - resolved "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.3.2.tgz" - dependencies: - "@types/d3-selection" "^1" - -"@types/d3-voronoi@*": - version "1.1.9" - resolved "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz" - -"@types/d3-zoom@^1": - version "1.8.3" - resolved "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.8.3.tgz" - dependencies: - "@types/d3-interpolate" "^1" - "@types/d3-selection" "^1" - -"@types/d3@^4.13.0": - version "4.13.12" - resolved "https://registry.npmjs.org/@types/d3/-/d3-4.13.12.tgz" - dependencies: - "@types/d3-array" "^1" - "@types/d3-axis" "^1" - "@types/d3-brush" "^1" - "@types/d3-chord" "^1" - "@types/d3-collection" "*" - "@types/d3-color" "^1" - "@types/d3-dispatch" "^1" - "@types/d3-drag" "^1" - "@types/d3-dsv" "^1" - "@types/d3-ease" "^1" - "@types/d3-force" "^1" - "@types/d3-format" "^1" - "@types/d3-geo" "^1" - "@types/d3-hierarchy" "^1" - "@types/d3-interpolate" "^1" - "@types/d3-path" "^1" - "@types/d3-polygon" "^1" - "@types/d3-quadtree" "^1" - "@types/d3-queue" "*" - "@types/d3-random" "^1" - "@types/d3-request" "*" - "@types/d3-scale" "^1" - "@types/d3-selection" "^1" - "@types/d3-shape" "^1" - "@types/d3-time" "^1" - "@types/d3-time-format" "^2" - "@types/d3-timer" "^1" - "@types/d3-transition" "^1" - "@types/d3-voronoi" "*" - "@types/d3-zoom" "^1" - -"@types/express-serve-static-core@^4.17.18": - version "4.17.30" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz" - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@^4.17.14": - version "4.17.14" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/geojson@*": - version "7946.0.10" - resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz" - -"@types/invariant@^2.2.29": - version "2.2.35" - resolved "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.35.tgz" - -"@types/is-plain-object@^0.0.2": - version "0.0.2" - resolved "https://registry.npmjs.org/@types/is-plain-object/-/is-plain-object-0.0.2.tgz" - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" - -"@types/jsonwebtoken@^8.5.9": - version "8.5.9" - resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz#2c064ecb0b3128d837d2764aa0b117b0ff6e4586" - dependencies: - "@types/node" "*" - -"@types/linkify-it@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9" - -"@types/long@^4.0.0", "@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz" - -"@types/markdown-it@^12.2.3": - version "12.2.3" - resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.3.tgz#0d6f6e5e413f8daaa26522904597be3d6cd93b51" - dependencies: - "@types/linkify-it" "*" - "@types/mdurl" "*" - -"@types/mdurl@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" - -"@types/mime@*": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.0.tgz" - -"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "18.6.3" - resolved "https://registry.npmjs.org/@types/node/-/node-18.6.3.tgz" - -"@types/node@^10.0.5": - version "10.17.60" - resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" - -"@types/serve-static@*": - version "1.15.0" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz" - dependencies: - "@types/mime" "*" - "@types/node" "*" - -"@types/trusted-types@^2.0.2": - version "2.0.2" - resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz" - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" - dependencies: - event-target-shim "^5.0.0" - -acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - -acorn@^6.0.7: - version "6.4.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" - -acorn@^8.8.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - -agent-base@6: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - dependencies: - debug "4" - -ajv@^6.10.2, ajv@^6.9.1: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - 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" - -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz" - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - dependencies: - color-convert "^2.0.1" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - -aria-query@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz" - dependencies: - "@babel/runtime" "^7.10.2" - "@babel/runtime-corejs3" "^7.10.2" - -array-includes@^3.1.4, array-includes@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" - is-string "^1.0.7" - -array.prototype.flat@^1.2.5: - version "1.3.0" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-shim-unscopables "^1.0.0" - -arrify@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz" - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -assert@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz" - dependencies: - es6-object-assign "^1.1.0" - is-nan "^1.2.1" - object-is "^1.0.1" - util "^0.12.0" - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" - -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz" - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" - -async-retry@^1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz" - dependencies: - retry "0.13.1" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - -axe-core@^4.4.3: - version "4.4.3" - resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz" - -axios@^0.19.0: - version "0.19.2" - resolved "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz" - dependencies: - follow-redirects "1.5.10" - -axios@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.1.3.tgz#8274250dada2edf53814ed7db644b9c2866c1e35" - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -axobject-query@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" - -babel-eslint@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz" - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - eslint-visitor-keys "^1.0.0" - resolve "^1.12.0" - -"babel-plugin-styled-components@>= 1": - version "2.0.7" - resolved "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz" - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" - babel-plugin-syntax-jsx "^6.18.0" - lodash "^4.17.11" - picomatch "^2.3.0" - -babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" - -babel-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz" - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz" - -base64-js@^1.3.0, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - -bech32@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" - -bech32@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz" - -bignumber.js@^8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-8.1.1.tgz" - -bignumber.js@^9.0.0: - version "9.0.2" - resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz" - -bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" - -bootstrap-less@^3.3.8: - version "3.3.8" - resolved "https://registry.npmjs.org/bootstrap-less/-/bootstrap-less-3.3.8.tgz" - -bootstrap@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.2.2.tgz#834e053eed584a65e244d8aa112a6959f56e27a0" - -bootswatch@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/bootswatch/-/bootswatch-5.2.2.tgz#4d3d15dffd8de16112b64fa37c1164cca1543110" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - dependencies: - balanced-match "^1.0.0" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz" - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz" - dependencies: - pako "~1.0.5" - -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" - -buffer@^5.7.1: - version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - -camelcase@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz" - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - -camelize@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz" - -catharsis@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" - dependencies: - lodash "^4.17.15" - -chai@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^4.1.2" - get-func-name "^2.0.0" - loupe "^2.3.1" - pathval "^1.1.1" - type-detect "^4.0.5" - -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" - -chart.js@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-3.9.1.tgz#3abf2c775169c4c71217a107163ac708515924b8" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" - -cheerio-select@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" - dependencies: - boolbase "^1.0.0" - css-select "^5.1.0" - css-what "^6.1.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - -cheerio@^1.0.0-rc.6: - version "1.0.0-rc.12" - resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz" - dependencies: - cheerio-select "^2.1.0" - dom-serializer "^2.0.0" - domhandler "^5.0.3" - domutils "^3.0.1" - htmlparser2 "^8.0.1" - parse5 "^7.0.0" - parse5-htmlparser2-tree-adapter "^7.0.0" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -classnames@^2.2.3: - version "2.3.1" - resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz" - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" - -clone@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" - -clsx@^1.1.1: - version "1.2.1" - resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" - -color-convert@^1.3.0, color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz" - dependencies: - color-name "^1.0.0" - -color@^0.11.0: - version "0.11.4" - resolved "https://registry.npmjs.org/color/-/color-0.11.4.tgz" - dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - dependencies: - delayed-stream "~1.0.0" - -commander@2: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - -commander@7: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" - -compressible@^2.0.12: - version "2.0.18" - resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" - dependencies: - mime-db ">= 1.43.0 < 2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - -confusing-browser-globals@^1.0.5: - version "1.0.11" - resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz" - -connect-route@^0.1.5: - version "0.1.5" - resolved "https://registry.npmjs.org/connect-route/-/connect-route-0.1.5.tgz" - -console-browserify@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" - -core-js-pure@^3.20.2: - version "3.24.1" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.24.1.tgz" - -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.12" - resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.1.3, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -create-react-class@^15.5.1: - version "15.7.0" - resolved "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz" - dependencies: - loose-envify "^1.3.1" - object-assign "^4.1.1" - -cross-fetch@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" - dependencies: - node-fetch "2.6.7" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-browserify@^3.12.0: - version "3.12.0" - resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -crypto-js@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz" - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz" - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-to-react-native@^2.2.2: - version "2.3.2" - resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz" - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^3.3.0" - -css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" - -csstype@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz" - -d3-array@1, d3-array@1.2.1, d3-array@^1.2.0: - version "1.2.1" - resolved "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz" - -"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz" - dependencies: - internmap "1 - 2" - -d3-axis@1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz" - -d3-axis@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz" - -d3-brush@1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz" - dependencies: - d3-dispatch "1" - d3-drag "1" - d3-interpolate "1" - d3-selection "1" - d3-transition "1" - -d3-brush@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz" - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "3" - d3-transition "3" - -d3-chord@1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz" - dependencies: - d3-array "1" - d3-path "1" - -d3-chord@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz" - dependencies: - d3-path "1 - 3" - -d3-collection@1: - version "1.0.7" - resolved "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz" - -d3-collection@1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz" - -d3-color@1, d3-color@1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz" - -"d3-color@1 - 3", d3-color@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" - -d3-contour@4: - version "4.0.0" - resolved "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.0.tgz" - dependencies: - d3-array "^3.2.0" - -d3-delaunay@6: - version "6.0.2" - resolved "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz" - dependencies: - delaunator "5" - -d3-dispatch@1, "d3-dispatch@1 - 3": - version "1.0.6" - resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz" - -d3-dispatch@1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.3.tgz" - -d3-dispatch@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" - -d3-drag@1, d3-drag@1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz" - dependencies: - d3-dispatch "1" - d3-selection "1" - -"d3-drag@2 - 3", d3-drag@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz" - dependencies: - d3-dispatch "1 - 3" - d3-selection "3" - -d3-dsv@1, "d3-dsv@1 - 3": - version "1.2.0" - resolved "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz" - dependencies: - commander "2" - iconv-lite "0.4" - rw "1" - -d3-dsv@1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz" - dependencies: - commander "2" - iconv-lite "0.4" - rw "1" - -d3-dsv@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz" - dependencies: - commander "7" - iconv-lite "0.6" - rw "1" - -d3-ease@1, "d3-ease@1 - 3", d3-ease@^1.0.0: - version "1.0.7" - resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz" - -d3-ease@1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz" - -d3-ease@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" - -d3-fetch@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz" - dependencies: - d3-dsv "1 - 3" - -d3-force@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz" - dependencies: - d3-collection "1" - d3-dispatch "1" - d3-quadtree "1" - d3-timer "1" - -d3-force@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz" - dependencies: - d3-dispatch "1 - 3" - d3-quadtree "1 - 3" - d3-timer "1 - 3" - -d3-format@1, d3-format@1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz" - -"d3-format@1 - 3", d3-format@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz" - -d3-geo@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-1.9.1.tgz" - dependencies: - d3-array "1" - -d3-geo@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz" - dependencies: - d3-array "2.5.0 - 3" - -d3-hierarchy@1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz" - -d3-hierarchy@3: - version "3.1.2" - resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz" - -d3-interpolate@1, d3-interpolate@1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz" - dependencies: - d3-color "1" - -"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" - dependencies: - d3-color "1 - 3" - -d3-path@1, "d3-path@1 - 3": - version "1.0.9" - resolved "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz" - -d3-path@1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz" - -d3-path@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz" - -d3-polygon@1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.3.tgz" - -d3-polygon@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz" - -d3-quadtree@1, d3-quadtree@1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.3.tgz" - -"d3-quadtree@1 - 3", d3-quadtree@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz" - -d3-queue@3.0.7: - version "3.0.7" - resolved "https://registry.npmjs.org/d3-queue/-/d3-queue-3.0.7.tgz" - -d3-random@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/d3-random/-/d3-random-1.1.0.tgz" - -d3-random@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz" - -d3-request@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz" - dependencies: - d3-collection "1" - d3-dispatch "1" - d3-dsv "1" - xmlhttprequest "1" - -d3-scale-chromatic@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz" - dependencies: - d3-color "1 - 3" - d3-interpolate "1 - 3" - -d3-scale@1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz" - dependencies: - d3-array "^1.2.0" - d3-collection "1" - d3-color "1" - d3-format "1" - d3-interpolate "1" - d3-time "1" - d3-time-format "2" - -d3-scale@4: - version "4.0.2" - resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz" - dependencies: - d3-array "2.10.0 - 3" - d3-format "1 - 3" - d3-interpolate "1.2.0 - 3" - d3-time "2.1.1 - 3" - d3-time-format "2 - 4" - -d3-selection@1, d3-selection@1.3.0, d3-selection@^1.1.0: - version "1.3.0" - resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz" - -"d3-selection@2 - 3", d3-selection@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" - -d3-shape@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz" - dependencies: - d3-path "1" - -d3-shape@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz" - dependencies: - d3-path "1 - 3" - -d3-shape@^1.0.0: - version "1.3.7" - resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" - dependencies: - d3-path "1" - -d3-time-format@2, d3-time-format@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz" - dependencies: - d3-time "1" - -"d3-time-format@2 - 4", d3-time-format@4: - version "4.1.0" - resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz" - dependencies: - d3-time "1 - 3" - -d3-time@1, d3-time@1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz" - -"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz" - dependencies: - d3-array "2 - 3" - -d3-timer@1, d3-timer@1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz" - -"d3-timer@1 - 3", d3-timer@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" - -d3-transition@1, d3-transition@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz" - dependencies: - d3-color "1" - d3-dispatch "1" - d3-ease "1" - d3-interpolate "1" - d3-selection "^1.1.0" - d3-timer "1" - -"d3-transition@2 - 3", d3-transition@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz" - dependencies: - d3-color "1 - 3" - d3-dispatch "1 - 3" - d3-ease "1 - 3" - d3-interpolate "1 - 3" - d3-timer "1 - 3" - -d3-voronoi@1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz" - -d3-zoom@1.7.1: - version "1.7.1" - resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz" - dependencies: - d3-dispatch "1" - d3-drag "1" - d3-interpolate "1" - d3-selection "1" - d3-transition "1" - -d3-zoom@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz" - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "2 - 3" - d3-transition "2 - 3" - -d3@^4.13.0: - version "4.13.0" - resolved "https://registry.npmjs.org/d3/-/d3-4.13.0.tgz" - dependencies: - d3-array "1.2.1" - d3-axis "1.0.8" - d3-brush "1.0.4" - d3-chord "1.0.4" - d3-collection "1.0.4" - d3-color "1.0.3" - d3-dispatch "1.0.3" - d3-drag "1.2.1" - d3-dsv "1.0.8" - d3-ease "1.0.3" - d3-force "1.1.0" - d3-format "1.2.2" - d3-geo "1.9.1" - d3-hierarchy "1.1.5" - d3-interpolate "1.1.6" - d3-path "1.0.5" - d3-polygon "1.0.3" - d3-quadtree "1.0.3" - d3-queue "3.0.7" - d3-random "1.1.0" - d3-request "1.0.6" - d3-scale "1.0.7" - d3-selection "1.3.0" - d3-shape "1.2.0" - d3-time "1.0.8" - d3-time-format "2.1.1" - d3-timer "1.0.7" - d3-transition "1.1.1" - d3-voronoi "1.1.2" - d3-zoom "1.7.1" - -d3@^7.6.1: - version "7.6.1" - resolved "https://registry.npmjs.org/d3/-/d3-7.6.1.tgz" - dependencies: - d3-array "3" - d3-axis "3" - d3-brush "3" - d3-chord "3" - d3-color "3" - d3-contour "4" - d3-delaunay "6" - d3-dispatch "3" - d3-drag "3" - d3-dsv "3" - d3-ease "3" - d3-fetch "3" - d3-force "3" - d3-format "3" - d3-geo "3" - d3-hierarchy "3" - d3-interpolate "3" - d3-path "3" - d3-polygon "3" - d3-quadtree "3" - d3-random "3" - d3-scale "4" - d3-scale-chromatic "3" - d3-selection "3" - d3-shape "3" - d3-time "3" - d3-time-format "4" - d3-timer "3" - d3-transition "3" - d3-zoom "3" - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" - -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - dependencies: - ms "2.1.2" - -debug@=3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" - dependencies: - ms "2.0.0" - -debug@^2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - dependencies: - ms "2.0.0" - -debug@^3.1.0, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - -deep-eql@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.2.tgz#270ceb902f87724077e6f6449aed81463f42fc1c" - dependencies: - type-detect "^4.0.0" - -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delaunator@5: - version "5.0.0" - resolved "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz" - dependencies: - robust-predicates "^3.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz" - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -detect-it@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/detect-it/-/detect-it-4.0.1.tgz" - -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz" - -detect-passive-events@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/detect-passive-events/-/detect-passive-events-2.0.3.tgz" - dependencies: - detect-it "^4.0.1" - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -doc-head-extract@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/doc-head-extract/-/doc-head-extract-1.0.4.tgz" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - dependencies: - esutils "^2.0.2" - -dom-helpers@^5.0.1: - version "5.2.1" - resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domain-browser@^4.22.0: - version "4.22.0" - resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz" - -domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" - -domhandler@^4.0.0, domhandler@^4.2.0: - version "4.3.1" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" - dependencies: - domelementtype "^2.2.0" - -domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" - dependencies: - domelementtype "^2.3.0" - -domutils@^2.5.2: - version "2.8.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz" - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.1" - -duplexify@^3.5.1, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz" - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -duplexify@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz" - dependencies: - end-of-stream "^1.4.1" - inherits "^2.0.3" - readable-stream "^3.1.1" - stream-shift "^1.0.0" - -ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" - dependencies: - safe-buffer "^5.0.1" - -elliptic@^6.5.3, elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - dependencies: - once "^1.4.0" - -ent@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" - -entities@^4.2.0, entities@^4.3.0: - version "4.3.1" - resolved "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz" - -entities@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" - -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-object-assign@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - -escodegen@^1.13.0: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-airbnb-base@^13.2.0: - version "13.2.0" - resolved "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.2.0.tgz" - dependencies: - confusing-browser-globals "^1.0.5" - object.assign "^4.1.0" - object.entries "^1.1.0" - -eslint-config-airbnb@^17.1.1: - version "17.1.1" - resolved "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-17.1.1.tgz" - dependencies: - eslint-config-airbnb-base "^13.2.0" - object.assign "^4.1.0" - object.entries "^1.1.0" - -eslint-import-resolver-meteor@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/eslint-import-resolver-meteor/-/eslint-import-resolver-meteor-0.4.0.tgz" - dependencies: - object-assign "^4.0.1" - resolve "^1.1.6" - -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz" - dependencies: - debug "^3.2.7" - resolve "^1.20.0" - -eslint-module-utils@^2.7.3: - version "2.7.3" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz" - dependencies: - debug "^3.2.7" - find-up "^2.1.0" - -eslint-plugin-import@^2.23.3: - version "2.26.0" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz" - dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" - has "^1.0.3" - is-core-module "^2.8.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-jsx-a11y@^6.6.1: - version "6.6.1" - resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz" - dependencies: - "@babel/runtime" "^7.18.9" - aria-query "^4.2.2" - array-includes "^3.1.5" - ast-types-flow "^0.0.7" - axe-core "^4.4.3" - axobject-query "^2.2.0" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - has "^1.0.3" - jsx-ast-utils "^3.3.2" - language-tags "^1.0.5" - minimatch "^3.1.2" - semver "^6.3.0" - -eslint-plugin-meteor@^7.3.0: - version "7.3.0" - resolved "https://registry.npmjs.org/eslint-plugin-meteor/-/eslint-plugin-meteor-7.3.0.tgz" - dependencies: - invariant "2.2.4" - -eslint-plugin-react@^7.31.10: - version "7.31.10" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz#6782c2c7fe91c09e715d536067644bbb9491419a" - dependencies: - array-includes "^3.1.5" - array.prototype.flatmap "^1.3.0" - doctrine "^2.1.0" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.1" - object.values "^1.1.5" - prop-types "^15.8.1" - resolve "^2.0.0-next.3" - semver "^6.3.0" - string.prototype.matchall "^4.0.7" - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-utils@^1.3.1: - version "1.4.3" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz" - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - -eslint@^5.16.0: - version "5.16.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz" - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" - -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz" - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - -espree@^9.0.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - -esquery@^1.0.1: - version "1.4.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1, estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - -estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz" - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" - -events@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -extend@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - -fast-text-encoding@^1.0.0, fast-text-encoding@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.4.tgz" - -faye-websocket@0.11.4: - version "0.11.4" - resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" - dependencies: - websocket-driver ">=0.5.1" - -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz" - dependencies: - fbjs "^3.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz" - -fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.4" - resolved "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz" - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.30" - -fibers@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/fibers/-/fibers-5.0.3.tgz#2fd03acb255db66fe693d15beafbf5ae92193fd7" - dependencies: - detect-libc "^1.0.3" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz" - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz" - dependencies: - flat-cache "^2.0.1" - -find-cache-dir@^3.0.0: - version "3.3.2" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -firebase-admin@^11.2.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-11.2.0.tgz#eeabeddcca03cb50cc04564e8d6f0db4d25878cf" - dependencies: - "@fastify/busboy" "^1.1.0" - "@firebase/database-compat" "^0.2.6" - "@firebase/database-types" "^0.9.13" - "@types/node" ">=12.12.47" - jsonwebtoken "^8.5.1" - jwks-rsa "^2.1.4" - node-forge "^1.3.1" - uuid "^9.0.0" - optionalDependencies: - "@google-cloud/firestore" "^6.4.0" - "@google-cloud/storage" "^6.5.2" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz" - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz" - -flux@^4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz" - dependencies: - fbemitter "^3.0.0" - fbjs "^3.0.1" - -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz" - dependencies: - debug "=3.1.0" - -follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - dependencies: - is-callable "^1.1.3" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -framesync@^4.0.0, framesync@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/framesync/-/framesync-4.1.0.tgz" - dependencies: - hey-listen "^1.0.5" - -fs-extra@8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - -gaxios@^4.0.0: - version "4.3.3" - resolved "https://registry.npmjs.org/gaxios/-/gaxios-4.3.3.tgz" - dependencies: - abort-controller "^3.0.0" - extend "^3.0.2" - https-proxy-agent "^5.0.0" - is-stream "^2.0.0" - node-fetch "^2.6.7" - -gaxios@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/gaxios/-/gaxios-5.0.1.tgz" - dependencies: - extend "^3.0.2" - https-proxy-agent "^5.0.0" - is-stream "^2.0.0" - node-fetch "^2.6.7" - -gaxios@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-5.0.2.tgz#ca3a40e851c728d31d7001c2357062d46bf966d1" - dependencies: - extend "^3.0.2" - https-proxy-agent "^5.0.0" - is-stream "^2.0.0" - node-fetch "^2.6.7" - -gcp-metadata@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.0.0.tgz" - dependencies: - gaxios "^5.0.0" - json-bigint "^1.0.0" - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz" - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -glob@^7.1.2, glob@^7.1.3: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^8.0.0: - version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -globals@^11.1.0, globals@^11.7.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - -google-auth-library@^8.0.1: - version "8.1.1" - resolved "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.1.1.tgz" - dependencies: - arrify "^2.0.0" - base64-js "^1.3.0" - ecdsa-sig-formatter "^1.0.11" - fast-text-encoding "^1.0.0" - gaxios "^5.0.0" - gcp-metadata "^5.0.0" - gtoken "^6.0.0" - jws "^4.0.0" - lru-cache "^6.0.0" - -google-auth-library@^8.0.2: - version "8.6.0" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-8.6.0.tgz#79cc4c8bacffee26bac244f25f4968ac87218bb8" - dependencies: - arrify "^2.0.0" - base64-js "^1.3.0" - ecdsa-sig-formatter "^1.0.11" - fast-text-encoding "^1.0.0" - gaxios "^5.0.0" - gcp-metadata "^5.0.0" - gtoken "^6.1.0" - jws "^4.0.0" - lru-cache "^6.0.0" - -google-gax@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-3.5.2.tgz#7c3ad61dbf366a55527b803caead276668b160d8" - dependencies: - "@grpc/grpc-js" "~1.7.0" - "@grpc/proto-loader" "^0.7.0" - "@types/long" "^4.0.0" - abort-controller "^3.0.0" - duplexify "^4.0.0" - fast-text-encoding "^1.0.3" - google-auth-library "^8.0.2" - is-stream-ended "^0.1.4" - node-fetch "^2.6.1" - object-hash "^3.0.0" - proto3-json-serializer "^1.0.0" - protobufjs "7.1.2" - protobufjs-cli "1.0.2" - retry-request "^5.0.0" - -google-p12-pem@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.0.tgz" - dependencies: - node-forge "^1.3.1" - -graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: - version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - -gtoken@^6.0.0: - version "6.1.0" - resolved "https://registry.npmjs.org/gtoken/-/gtoken-6.1.0.tgz" - dependencies: - gaxios "^4.0.0" - google-p12-pem "^4.0.0" - jws "^4.0.0" - -gtoken@^6.1.0: - version "6.1.2" - resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-6.1.2.tgz#aeb7bdb019ff4c3ba3ac100bbe7b6e74dce0e8bc" - dependencies: - gaxios "^5.0.1" - google-p12-pem "^4.0.0" - jws "^4.0.0" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hey-listen@^1.0.5, hey-listen@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz" - -history@^3.0.0: - version "3.3.0" - resolved "https://registry.npmjs.org/history/-/history-3.3.0.tgz" - dependencies: - invariant "^2.2.1" - loose-envify "^1.2.0" - query-string "^4.2.2" - warning "^3.0.0" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" - dependencies: - react-is "^16.7.0" - -htmlparser2@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -htmlparser2@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz" - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - domutils "^3.0.1" - entities "^4.3.0" - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" - dependencies: - agent-base "6" - debug "4" - -iconv-lite@0.4, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@0.6: - version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" - -import-fresh@^3.0.0: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz" - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -int53@^0.2.4: - version "0.2.4" - resolved "https://registry.npmjs.org/int53/-/int53-0.2.4.tgz" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -"internmap@1 - 2": - version "2.0.3" - resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz" - -invariant@2.2.4, invariant@^2.2.1: - version "2.2.4" - resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" - dependencies: - loose-envify "^1.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" - -is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz" - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - dependencies: - is-extglob "^2.1.1" - -is-nan@^1.2.1: - version "1.3.2" - resolved "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz" - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" - dependencies: - has-tostringtag "^1.0.0" - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" - dependencies: - isobject "^3.0.1" - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" - dependencies: - call-bind "^1.0.2" - -is-stream-ended@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.3, is-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.20.0" - for-each "^0.3.3" - has-tostringtag "^1.0.0" - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" - dependencies: - call-bind "^1.0.2" - -is-what@^3.3.1: - version "3.14.1" - resolved "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz" - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" - -jose@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/jose/-/jose-2.0.6.tgz#894ba19169af339d3911be933f913dd02fc57c7c" - dependencies: - "@panva/asn1.js" "^1.0.0" - -jquery@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.1.tgz#fab0408f8b45fc19f956205773b62b292c147a16" - -js-sha256@^0.9.0: - version "0.9.0" - resolved "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - -js-yaml@^3.13.0: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js2xmlparser@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a" - dependencies: - xmlcreate "^2.0.4" - -jsdoc@^3.6.3: - version "3.6.11" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.11.tgz#8bbb5747e6f579f141a5238cbad4e95e004458ce" - dependencies: - "@babel/parser" "^7.9.4" - "@types/markdown-it" "^12.2.3" - bluebird "^3.7.2" - catharsis "^0.9.0" - escape-string-regexp "^2.0.0" - js2xmlparser "^4.0.2" - klaw "^3.0.0" - markdown-it "^12.3.2" - markdown-it-anchor "^8.4.1" - marked "^4.0.10" - mkdirp "^1.0.4" - requizzle "^0.2.3" - strip-json-comments "^3.1.0" - taffydb "2.6.2" - underscore "~1.13.2" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz" - dependencies: - bignumber.js "^9.0.0" - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" - dependencies: - minimist "^1.2.0" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" - -jsonwebtoken@^8.5.1: - version "8.5.1" - resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz" - dependencies: - jws "^3.2.2" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^5.6.0" - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: - version "3.3.2" - resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz" - dependencies: - array-includes "^3.1.5" - object.assign "^4.1.2" - -jwa@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jwa@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz" - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jwks-rsa@^2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/jwks-rsa/-/jwks-rsa-2.1.5.tgz#bb7bf8c5767836bc273bf5b27870066aca39c1bb" - dependencies: - "@types/express" "^4.17.14" - "@types/jsonwebtoken" "^8.5.9" - debug "^4.3.4" - jose "^2.0.6" - limiter "^1.1.5" - lru-memoizer "^2.1.4" - -jws@^3.2.2: - version "3.2.2" - resolved "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz" - dependencies: - jwa "^1.4.1" - safe-buffer "^5.0.1" - -jws@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz" - dependencies: - jwa "^2.0.0" - safe-buffer "^5.0.1" - -klaw@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" - dependencies: - graceful-fs "^4.1.9" - -language-subtag-registry@~0.3.2: - version "0.3.22" - resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" - -language-tags@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" - dependencies: - language-subtag-registry "~0.3.2" - -ledger-cosmos-js@^2.1.8: - version "2.1.8" - resolved "https://registry.npmjs.org/ledger-cosmos-js/-/ledger-cosmos-js-2.1.8.tgz" - dependencies: - "@babel/runtime" "^7.11.2" - "@ledgerhq/hw-transport" "^5.25.0" - bech32 "^1.1.4" - ripemd160 "^2.0.2" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -limiter@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz" - -linkify-it@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" - dependencies: - uc.micro "^1.0.1" - -lit-element@^3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/lit-element/-/lit-element-3.2.1.tgz" - dependencies: - "@lit/reactive-element" "^1.3.0" - lit-html "^2.2.0" - -lit-html@^2.2.0: - version "2.2.6" - resolved "https://registry.npmjs.org/lit-html/-/lit-html-2.2.6.tgz" - dependencies: - "@types/trusted-types" "^2.0.2" - -lit@^2.2.3: - version "2.2.7" - resolved "https://registry.npmjs.org/lit/-/lit-2.2.7.tgz" - dependencies: - "@lit/reactive-element" "^1.3.0" - lit-element "^3.2.0" - lit-html "^2.2.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - dependencies: - p-locate "^4.1.0" - -lodash-es@^4.17.15: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" - -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" - -lodash.curry@^4.0.1: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz" - -lodash.flow@^3.3.0: - version "3.5.0" - resolved "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz" - -lodash.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" - -lodash.isboolean@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" - -lodash.isinteger@^4.0.4: - version "4.0.4" - resolved "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz" - -lodash.isnumber@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz" - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" - -lodash.once@^4.0.0: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" - -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" - -long@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/long/-/long-5.2.0.tgz" - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz" - dependencies: - get-func-name "^2.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - dependencies: - yallist "^4.0.0" - -lru-cache@~4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz" - dependencies: - pseudomap "^1.0.1" - yallist "^2.0.0" - -lru-memoizer@^2.1.4: - version "2.1.4" - resolved "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.4.tgz" - dependencies: - lodash.clonedeep "^4.5.0" - lru-cache "~4.0.0" - -make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - dependencies: - semver "^6.0.0" - -markdown-it-anchor@^8.4.1: - version "8.6.5" - resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz#30c4bc5bbff327f15ce3c429010ec7ba75e7b5f8" - -markdown-it@^12.3.2: - version "12.3.2" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" - dependencies: - argparse "^2.0.1" - entities "~2.1.0" - linkify-it "^3.0.1" - mdurl "^1.0.1" - uc.micro "^1.0.5" - -marked@^0.5.1: - version "0.5.2" - resolved "https://registry.npmjs.org/marked/-/marked-0.5.2.tgz" - -marked@^4.0.10: - version "4.1.1" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.1.1.tgz#2f709a4462abf65a283f2453dc1c42ab177d302e" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdurl@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - -memoize-one@^5.0.0: - version "5.2.1" - resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" - -merge-anything@^2.2.4: - version "2.4.4" - resolved "https://registry.npmjs.org/merge-anything/-/merge-anything-2.4.4.tgz" - dependencies: - is-what "^3.3.1" - -mersenne-twister@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/mersenne-twister/-/mersenne-twister-1.1.0.tgz" - -meteor-node-stubs@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.5.tgz" - dependencies: - assert "^2.0.0" - browserify-zlib "^0.2.0" - buffer "^5.7.1" - console-browserify "^1.2.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.12.0" - domain-browser "^4.22.0" - elliptic "^6.5.4" - events "^3.3.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "^1.0.0" - process "^0.11.10" - punycode "^1.4.1" - querystring-es3 "^0.2.1" - readable-stream "^3.6.0" - stream-browserify "^3.0.0" - stream-http "^3.2.0" - string_decoder "^1.3.0" - timers-browserify "^2.0.12" - tty-browserify "0.0.1" - url "^0.11.0" - util "^0.12.4" - vm-browserify "^1.1.2" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - -mime-types@^2.0.8, mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - dependencies: - mime-db "1.52.0" - -mime@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" - -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - dependencies: - minimist "^1.2.6" - -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - -moment-timezone@^0.5.38: - version "0.5.38" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.38.tgz#9674a5397b8be7c13de820fd387d8afa0f725aad" - dependencies: - moment ">= 2.9.0" - -"moment@>= 2.9.0", moment@^2.29.4: - version "2.29.4" - resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz" - -mongo-object@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mongo-object/-/mongo-object-3.0.0.tgz#7cb751ec77174e4d1894a1a0b165ab5deb762509" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - -ms@2.1.2, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - -ndjson@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/ndjson/-/ndjson-1.5.0.tgz" - dependencies: - json-stringify-safe "^5.0.1" - minimist "^1.2.0" - split2 "^2.1.0" - through2 "^2.0.3" - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" - -node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" - -node-gyp-build@^4.2.0: - version "4.5.0" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" - dependencies: - boolbase "^1.0.0" - -numbro@^2.3.2: - version "2.3.6" - resolved "https://registry.npmjs.org/numbro/-/numbro-2.3.6.tgz" - dependencies: - bignumber.js "^8.1.1" - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" - -object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" - -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.entries@^1.1.0, object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.fromentries@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.hasown@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz" - dependencies: - define-properties "^1.1.4" - es-abstract "^1.19.5" - -object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -old@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/old/-/old-0.1.3.tgz" - dependencies: - object-assign "^4.1.0" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz" - dependencies: - mimic-fn "^1.0.0" - -optionator@^0.8.1, optionator@^0.8.2: - version "0.8.3" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.1: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - dependencies: - yocto-queue "^0.1.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - dependencies: - p-limit "^2.2.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz" - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" - dependencies: - domhandler "^5.0.2" - parse5 "^7.0.0" - -parse5@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz" - dependencies: - entities "^4.3.0" - -path-browserify@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" - -path-parse@^1.0.6, path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" - -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -picomatch@^2.3.0: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" - dependencies: - find-up "^4.0.0" - -plottable@^3.9.0: - version "3.13.0" - resolved "https://registry.npmjs.org/plottable/-/plottable-3.13.0.tgz" - dependencies: - "@types/d3" "^4.13.0" - "@types/d3-shape" "^1.2.5" - "@types/is-plain-object" "^0.0.2" - d3 "^4.13.0" - d3-ease "^1.0.0" - d3-shape "^1.0.0" - is-plain-object "^2.0.4" - lodash-es "^4.17.15" - tslib "~2.3.1" - typesettable "4.1.0" - -popmotion-pose@^3.4.10: - version "3.4.11" - resolved "https://registry.npmjs.org/popmotion-pose/-/popmotion-pose-3.4.11.tgz" - dependencies: - "@popmotion/easing" "^1.0.1" - hey-listen "^1.0.5" - popmotion "^8.7.1" - pose-core "^2.1.1" - style-value-types "^3.0.6" - ts-essentials "^1.0.3" - tslib "^1.10.0" - -popmotion@^8.7.1: - version "8.7.6" - resolved "https://registry.npmjs.org/popmotion/-/popmotion-8.7.6.tgz" - dependencies: - "@popmotion/easing" "^1.0.1" - "@popmotion/popcorn" "^0.4.4" - framesync "^4.0.0" - hey-listen "^1.0.5" - style-value-types "^3.1.7" - stylefire "^7.0.1" - tslib "^1.10.0" - -popper.js@^1.0.2: - version "1.16.1" - resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz" - -pose-core@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/pose-core/-/pose-core-2.1.1.tgz" - dependencies: - "@types/invariant" "^2.2.29" - "@types/node" "^10.0.5" - hey-listen "^1.0.5" - rollup-plugin-typescript2 "^0.25.2" - tslib "^1.10.0" - typescript "^3.7.2" - -postcss-value-parser@^3.3.0: - version "3.3.1" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" - dependencies: - asap "~2.0.3" - -prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -proto3-json-serializer@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proto3-json-serializer/-/proto3-json-serializer-1.1.0.tgz#52d9c73b24d25ff925639e1e5a01ac883460149f" - dependencies: - protobufjs "^7.0.0" - -protobufjs-cli@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/protobufjs-cli/-/protobufjs-cli-1.0.2.tgz#905fc49007cf4aaf3c45d5f250eb294eedeea062" - dependencies: - chalk "^4.0.0" - escodegen "^1.13.0" - espree "^9.0.0" - estraverse "^5.1.0" - glob "^8.0.0" - jsdoc "^3.6.3" - minimist "^1.2.0" - semver "^7.1.2" - tmp "^0.2.1" - uglify-js "^3.7.7" - -protobufjs@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.1.2.tgz#a0cf6aeaf82f5625bffcf5a38b7cd2a7de05890c" - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" - -protobufjs@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-7.0.0.tgz" - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^5.0.0" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - -pseudomap@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.5: - version "1.5.1" - resolved "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz" - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - -pure-color@^1.2.0: - version "1.3.0" - resolved "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz" - -query-string@^4.2.2: - version "4.3.4" - resolved "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz" - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -raw-loader@^0.5.1: - version "0.5.1" - resolved "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz" - -react-3d-viewer@^1.0.12: - version "1.0.12" - resolved "https://registry.npmjs.org/react-3d-viewer/-/react-3d-viewer-1.0.12.tgz" - dependencies: - marked "^0.5.1" - raw-loader "^0.5.1" - react-router "^3.2.1" - react-scroll-up "^1.3.3" - three "^0.95.0" - -react-base16-styling@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz" - dependencies: - base16 "^1.0.0" - lodash.curry "^4.0.1" - lodash.flow "^3.3.0" - pure-color "^1.2.0" - -react-chartjs-2@^4.0.1: - version "4.3.1" - resolved "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-4.3.1.tgz" - -react-dom@^16.13.1: - version "16.14.0" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz" - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.1" - -react-fast-compare@^3.0.1, react-fast-compare@^3.1.1: - version "3.2.0" - resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" - -react-google-tag-manager@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/react-google-tag-manager/-/react-google-tag-manager-2.2.1.tgz" - -react-helmet@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz" - dependencies: - object-assign "^4.1.1" - prop-types "^15.7.2" - react-fast-compare "^3.1.1" - react-side-effect "^2.1.0" - -react-is@^16.13.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - -react-jazzicon@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/react-jazzicon/-/react-jazzicon-0.1.3.tgz" - dependencies: - color "^0.11.0" - mersenne-twister "^1.1.0" - prop-types "^15.5.10" - -react-json-view@^1.21.3: - version "1.21.3" - resolved "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz" - dependencies: - flux "^4.0.1" - react-base16-styling "^0.6.0" - react-lifecycles-compat "^3.0.4" - react-textarea-autosize "^8.3.2" - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" - -react-loadingg@^1.7.2: - version "1.7.2" - resolved "https://registry.npmjs.org/react-loadingg/-/react-loadingg-1.7.2.tgz" - dependencies: - styled-components "^4.3.2" - -react-popper@^2.2.4: - version "2.3.0" - resolved "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz" - dependencies: - react-fast-compare "^3.0.1" - warning "^4.0.2" - -react-pose@^4.0.10: - version "4.0.10" - resolved "https://registry.npmjs.org/react-pose/-/react-pose-4.0.10.tgz" - dependencies: - "@emotion/is-prop-valid" "^0.7.3" - hey-listen "^1.0.5" - popmotion-pose "^3.4.10" - tslib "^1.10.0" - -react-responsive-pagination@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/react-responsive-pagination/-/react-responsive-pagination-1.8.0.tgz#adb4f5536b24041767f5c7a8998c73a22edfa895" - dependencies: - prop-types "^15.8.1" - resize-observer-polyfill "^1.5.1" - -react-router-dom@^6.4.3: - version "6.4.3" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.4.3.tgz#70093b5f65f85f1df9e5d4182eb7ff3a08299275" - dependencies: - "@remix-run/router" "1.0.3" - react-router "6.4.3" - -react-router@6.4.3: - version "6.4.3" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.4.3.tgz#9ed3ee4d6e95889e9b075a5d63e29acc7def0d49" - dependencies: - "@remix-run/router" "1.0.3" - -react-router@^3.2.1: - version "3.2.6" - resolved "https://registry.npmjs.org/react-router/-/react-router-3.2.6.tgz" - dependencies: - create-react-class "^15.5.1" - history "^3.0.0" - hoist-non-react-statics "^3.3.2" - invariant "^2.2.1" - loose-envify "^1.2.0" - prop-types "^15.7.2" - react-is "^16.13.0" - warning "^3.0.0" - -react-scroll-up@^1.3.3: - version "1.3.7" - resolved "https://registry.npmjs.org/react-scroll-up/-/react-scroll-up-1.3.7.tgz" - dependencies: - detect-passive-events "^2.0.2" - object-assign "^4.0.1" - prop-types "^15.5.8" - tween-functions "^1.1.0" - -react-showdown@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/react-showdown/-/react-showdown-2.3.1.tgz" - dependencies: - domhandler "^4.0.0" - htmlparser2 "^6.0.1" - showdown "^1.9.1" - -react-side-effect@^2.1.0: - version "2.1.2" - resolved "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz" - -react-sidebar@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/react-sidebar/-/react-sidebar-3.0.2.tgz" - dependencies: - "@babel/runtime" ">=7.0.0-beta.56" - prop-types "^15.6.2" - -react-textarea-autosize@^8.3.2: - version "8.3.4" - resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz" - dependencies: - "@babel/runtime" "^7.10.2" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - -react-toastify@^9.0.8: - version "9.0.8" - resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-9.0.8.tgz#3876c89fc6211a29027b3075010b5ec39ebe4f7e" - dependencies: - clsx "^1.1.1" - -react-transition-group@^4.4.2: - version "4.4.5" - resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" - -react@^16.14.0: - version "16.14.0" - resolved "https://registry.npmjs.org/react/-/react-16.14.0.tgz" - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - -reactstrap@^9.1.5: - version "9.1.5" - resolved "https://registry.yarnpkg.com/reactstrap/-/reactstrap-9.1.5.tgz#d52343ebc244dd4bb82ce272c69640c8146952bf" - dependencies: - "@babel/runtime" "^7.12.5" - "@popperjs/core" "^2.6.0" - classnames "^2.2.3" - prop-types "^15.5.8" - react-popper "^2.2.4" - react-transition-group "^4.4.2" - -readable-stream@^2.0.0, readable-stream@^2.3.3, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" - 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" - -readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz" - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" - -regenerator-runtime@^0.13.10, regenerator-runtime@^0.13.4: - version "0.13.10" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" - -regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" - -requizzle@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded" - dependencies: - lodash "^4.17.14" - -resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - -resolve@1.12.0: - version "1.12.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz" - dependencies: - path-parse "^1.0.6" - -resolve@^1.1.6, resolve@^1.12.0, resolve@^1.20.0, resolve@^1.22.0: - version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.3: - version "2.0.0-next.4" - resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -retry-request@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/retry-request/-/retry-request-5.0.1.tgz" - dependencies: - debug "^4.1.1" - extend "^3.0.2" - -retry@0.13.1: - version "0.13.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" - dependencies: - glob "^7.1.3" - -rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -robust-predicates@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz" - -rollup-plugin-typescript2@^0.25.2: - version "0.25.3" - resolved "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.25.3.tgz" - dependencies: - find-cache-dir "^3.0.0" - fs-extra "8.1.0" - resolve "1.12.0" - rollup-pluginutils "2.8.1" - tslib "1.10.0" - -rollup-pluginutils@2.8.1: - version "2.8.1" - resolved "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz" - dependencies: - estree-walker "^0.6.1" - -rollup@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.2.5.tgz#9452168ac083218c8212bf53d2448bdc6b8b0de7" - optionalDependencies: - fsevents "~2.3.2" - -run-async@^2.2.0: - version "2.4.1" - resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" - -rw@1: - version "1.3.3" - resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" - -rxjs@6, rxjs@^6.4.0: - version "6.6.7" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" - dependencies: - tslib "^1.9.0" - -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - -scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz" - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -secp256k1@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - -semver@^7.1.2: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.5: - version "7.3.7" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - dependencies: - lru-cache "^6.0.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" - -setimmediate@^1.0.4, setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" - -showdown@^1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz" - dependencies: - yargs "^14.2" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - -simpl-schema@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/simpl-schema/-/simpl-schema-3.0.1.tgz#c30a8bd69d5bf86c044915dc2ab00b0b1344c60f" - dependencies: - clone "^2.1.2" - mongo-object "^3.0.0" - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz" - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -split2@^2.1.0: - version "2.2.0" - resolved "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz" - dependencies: - through2 "^2.0.2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - -stream-browserify@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz" - dependencies: - inherits "~2.0.4" - readable-stream "^3.5.0" - -stream-events@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz" - dependencies: - stubs "^3.0.0" - -stream-http@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz" - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.4" - readable-stream "^3.6.0" - xtend "^4.0.2" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" - -string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.matchall@^4.0.7: - version "4.0.7" - resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.1" - side-channel "^1.0.4" - -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz" - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string_decoder@^1.1.1, string_decoder@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - -strip-json-comments@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - -strip-json-comments@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - -stubs@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz" - -style-value-types@^3.0.6, style-value-types@^3.1.7: - version "3.2.0" - resolved "https://registry.npmjs.org/style-value-types/-/style-value-types-3.2.0.tgz" - dependencies: - hey-listen "^1.0.8" - tslib "^1.10.0" - -styled-components@^4.3.2, styled-components@^4.4.1: - version "4.4.1" - resolved "https://registry.npmjs.org/styled-components/-/styled-components-4.4.1.tgz" - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@emotion/is-prop-valid" "^0.8.1" - "@emotion/unitless" "^0.7.0" - babel-plugin-styled-components ">= 1" - css-to-react-native "^2.2.2" - memoize-one "^5.0.0" - merge-anything "^2.2.4" - prop-types "^15.5.4" - react-is "^16.6.0" - stylis "^3.5.0" - stylis-rule-sheet "^0.0.10" - supports-color "^5.5.0" - -stylefire@^7.0.1: - version "7.0.3" - resolved "https://registry.npmjs.org/stylefire/-/stylefire-7.0.3.tgz" - dependencies: - "@popmotion/popcorn" "^0.4.4" - framesync "^4.0.0" - hey-listen "^1.0.8" - style-value-types "^3.1.7" - tslib "^1.10.0" - -stylis-rule-sheet@^0.0.10: - version "0.0.10" - resolved "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz" - -stylis@^3.5.0: - version "3.5.4" - resolved "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz" - -supercop.js@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/supercop.js/-/supercop.js-2.0.1.tgz" - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.npmjs.org/table/-/table-5.4.6.tgz" - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -taffydb@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268" - -teeny-request@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.0.tgz" - dependencies: - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - node-fetch "^2.6.1" - stream-events "^1.0.5" - uuid "^8.0.0" - -tendermint@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/tendermint/-/tendermint-5.0.2.tgz" - dependencies: - axios "^0.19.0" - camelcase "^4.0.0" - create-hash "^1.1.3" - debug "^3.1.0" - json-stable-stringify "^1.0.1" - ndjson "^1.5.0" - old "^0.1.3" - pumpify "^1.3.5" - supercop.js "^2.0.1" - varstruct "^6.1.1" - websocket-stream "^5.1.1" - -text-decoding@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/text-decoding/-/text-decoding-1.0.0.tgz" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - -three@^0.144.0: - version "0.144.0" - resolved "https://registry.yarnpkg.com/three/-/three-0.144.0.tgz#2818517169f8ff94eea5f664f6ff1fcdcd436cc8" - -three@^0.95.0: - version "0.95.0" - resolved "https://registry.npmjs.org/three/-/three-0.95.0.tgz" - -through2@^2.0.2, through2@^2.0.3: - version "2.0.5" - resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - -timers-browserify@^2.0.12: - version "2.0.12" - resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" - dependencies: - setimmediate "^1.0.4" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" - dependencies: - os-tmpdir "~1.0.2" - -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - dependencies: - rimraf "^3.0.0" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - -tooltip.js@^1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/tooltip.js/-/tooltip.js-1.3.3.tgz" - dependencies: - popper.js "^1.0.2" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - -ts-essentials@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz" - -tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz" - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@1.10.0: - version "1.10.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz" - -tslib@^1.10.0, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - -tslib@^2.1.0: - version "2.4.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" - -tslib@~2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" - -tty-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz" - -tween-functions@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" - dependencies: - prelude-ls "~1.1.2" - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" - -typescript@^3.7.2: - version "3.9.10" - resolved "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz" - -typesettable@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/typesettable/-/typesettable-4.1.0.tgz" - -ua-parser-js@^0.7.30: - version "0.7.31" - resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz" - -uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" - -uglify-js@^3.7.7: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz" - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -underscore@~1.13.2: - version "1.13.6" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - dependencies: - punycode "^2.1.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz" - -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz" - dependencies: - use-isomorphic-layout-effect "^1.1.1" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - -util@^0.12.0, util@^0.12.4: - version "0.12.4" - resolved "https://registry.npmjs.org/util/-/util-0.12.4.tgz" - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - -uuid@^8.0.0: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - -uuid@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" - -varstruct@^6.1.1: - version "6.1.3" - resolved "https://registry.npmjs.org/varstruct/-/varstruct-6.1.3.tgz" - dependencies: - int53 "^0.2.4" - safe-buffer "^5.1.1" - -vm-browserify@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" - -voca@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/voca/-/voca-1.4.0.tgz" - -warning@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" - dependencies: - loose-envify "^1.0.0" - -warning@^4.0.2: - version "4.0.3" - resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" - dependencies: - loose-envify "^1.0.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - -websocket-driver@>=0.5.1: - version "0.7.4" - resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" - -websocket-stream@^5.1.1: - version "5.5.2" - resolved "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.5.2.tgz" - dependencies: - duplexify "^3.5.1" - inherits "^2.0.1" - readable-stream "^2.3.3" - safe-buffer "^5.1.2" - ws "^3.2.0" - xtend "^4.0.0" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" - -which-typed-array@^1.1.2: - version "1.1.8" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.20.0" - for-each "^0.3.3" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.9" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - dependencies: - isexe "^2.0.0" - -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - -write@1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/write/-/write-1.0.3.tgz" - dependencies: - mkdirp "^0.5.1" - -ws@^3.2.0: - version "3.3.3" - resolved "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz" - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - -xmlcreate@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" - -xmlhttprequest@1: - version "1.8.0" - resolved "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" - -xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - -yallist@^2.0.0: - version "2.1.2" - resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - -yargs-parser@^15.0.1: - version "15.0.3" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz" - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - -yargs@^14.2: - version "14.2.3" - resolved "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz" - dependencies: - cliui "^5.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^15.0.1" - -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"